use LastTransitionTime for deadline calculation

and run goimports on several files
This commit is contained in:
mathetake
2020-02-26 12:57:26 +09:00
parent eec343f3aa
commit 9c8b887d30
10 changed files with 68 additions and 42 deletions
-6
View File
@@ -253,12 +253,6 @@ func (c *DaemonSetController) createPrimaryDaemonSet(cd *flaggerv1.Canary) error
primaryDep, err := c.kubeClient.AppsV1().DaemonSets(cd.Namespace).Get(primaryName, metav1.GetOptions{})
if errors.IsNotFound(err) {
if cd.GetProgressDeadlineSeconds() > 0 {
// (@mathetake): should we?
c.logger.With("canary", fmt.Sprintf("%s.%s", cd.Name, cd.Namespace)).
Infof("progressDeadlineSeconds is ignored for DaemonSet")
}
// create primary secrets and config maps
configRefs, err := c.configTracker.GetTargetConfigs(cd)
if err != nil {
+1 -1
View File
@@ -1,7 +1,6 @@
package canary
import (
"github.com/weaveworks/flagger/pkg/logger"
"go.uber.org/zap"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
@@ -13,6 +12,7 @@ import (
flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1"
clientset "github.com/weaveworks/flagger/pkg/client/clientset/versioned"
fakeFlagger "github.com/weaveworks/flagger/pkg/client/clientset/versioned/fake"
"github.com/weaveworks/flagger/pkg/logger"
)
type daemonSetControllerFixture struct {
+17 -8
View File
@@ -2,6 +2,7 @@ package canary
import (
"fmt"
"time"
appsv1 "k8s.io/api/apps/v1"
"k8s.io/apimachinery/pkg/api/errors"
@@ -22,7 +23,7 @@ func (c *DaemonSetController) IsPrimaryReady(cd *flaggerv1.Canary) (bool, error)
return true, fmt.Errorf("deployment %s.%s query error %v", primaryName, cd.Namespace, err)
}
retriable, err := c.isDaemonSetReady(primary)
retriable, err := c.isDaemonSetReady(cd, primary)
if err != nil {
return retriable, fmt.Errorf("halt advancement %s.%s %s", primaryName, cd.Namespace, err.Error())
}
@@ -41,7 +42,7 @@ func (c *DaemonSetController) IsCanaryReady(cd *flaggerv1.Canary) (bool, error)
return true, fmt.Errorf("daemonset %s.%s query error %v", targetName, cd.Namespace, err)
}
retriable, err := c.isDaemonSetReady(canary)
retriable, err := c.isDaemonSetReady(cd, canary)
if err != nil {
return retriable, fmt.Errorf("halt advancement %s.%s %s", targetName, cd.Namespace, err.Error())
}
@@ -49,13 +50,21 @@ func (c *DaemonSetController) IsCanaryReady(cd *flaggerv1.Canary) (bool, error)
}
// isDaemonSetReady determines if a daemonset is ready by checking the number of old version daemons
func (c *DaemonSetController) isDaemonSetReady(daemonSet *appsv1.DaemonSet) (bool, error) {
if daemonSet.Generation <= daemonSet.Status.ObservedGeneration {
if diff := daemonSet.Status.DesiredNumberScheduled - daemonSet.Status.UpdatedNumberScheduled; diff > 0 {
return true, fmt.Errorf("waiting for rollout to finish: %d old daemons not replaced yet", diff)
func (c *DaemonSetController) isDaemonSetReady(cd *flaggerv1.Canary, daemonSet *appsv1.DaemonSet) (bool, error) {
if diff := daemonSet.Status.DesiredNumberScheduled - daemonSet.Status.UpdatedNumberScheduled; diff > 0 || daemonSet.Status.NumberUnavailable > 0 {
from := cd.Status.LastTransitionTime
delta := time.Duration(cd.GetProgressDeadlineSeconds()) * time.Second
dl := from.Add(delta)
if dl.Before(time.Now()) {
return false, fmt.Errorf("daemonset %s exceeded its progress deadline", cd.GetName())
} else {
return true, fmt.Errorf(
"waiting for rollout to finish: desiredNumberScheduled=%d, updatedNumberScheduled=%d, numberUnavailable=%d",
daemonSet.Status.DesiredNumberScheduled,
daemonSet.Status.UpdatedNumberScheduled,
daemonSet.Status.NumberUnavailable,
)
}
} else {
return true, fmt.Errorf("waiting for rollout to finish: observed daemonset generation less then desired generation")
}
return true, nil
}
+40 -18
View File
@@ -4,7 +4,9 @@ import (
"testing"
appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1"
)
func TestDaemonSetController_IsReady(t *testing.T) {
@@ -26,32 +28,52 @@ func TestDaemonSetController_IsReady(t *testing.T) {
}
func TestDaemonSetController_isDaemonSetReady(t *testing.T) {
mocks := newDaemonSetFixture()
_, err := mocks.controller.isDaemonSetReady(&appsv1.DaemonSet{
ObjectMeta: v1.ObjectMeta{
Generation: 10,
},
ds := &appsv1.DaemonSet{
Status: appsv1.DaemonSetStatus{
ObservedGeneration: 10,
DesiredNumberScheduled: 1,
UpdatedNumberScheduled: 1,
},
})
}
cd := &flaggerv1.Canary{}
cd.Spec.ProgressDeadlineSeconds = int32p(1e5)
cd.Status.LastTransitionTime = metav1.Now()
// ready
mocks := newDaemonSetFixture()
_, err := mocks.controller.isDaemonSetReady(cd, ds)
if err != nil {
t.Fatal(err.Error())
}
_, err = mocks.controller.isDaemonSetReady(&appsv1.DaemonSet{
ObjectMeta: v1.ObjectMeta{
Generation: 9,
},
Status: appsv1.DaemonSetStatus{
ObservedGeneration: 10,
DesiredNumberScheduled: 2,
UpdatedNumberScheduled: 1,
},
})
// not ready but retriable
ds.Status.NumberUnavailable++
retrieable, err := mocks.controller.isDaemonSetReady(cd, ds)
if err == nil {
t.Fatal("expected error")
}
if !retrieable {
t.Fatal("expected retriable")
}
ds.Status.NumberUnavailable--
ds.Status.DesiredNumberScheduled++
retrieable, err = mocks.controller.isDaemonSetReady(cd, ds)
if err == nil {
t.Fatal("expected error")
}
if !retrieable {
t.Fatal("expected retriable")
}
// not ready and not retriable
cd.Status.LastTransitionTime = metav1.Now()
cd.Spec.ProgressDeadlineSeconds = int32p(-1e5)
retrieable, err = mocks.controller.isDaemonSetReady(cd, ds)
if err == nil {
t.Fatal("expected error")
}
if retrieable {
t.Fatal("expected not retriable")
}
}
+2 -1
View File
@@ -4,9 +4,10 @@ import (
"fmt"
ex "github.com/pkg/errors"
flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1"
)
// SyncStatus encodes the canary pod spec and updates the canary status
+2 -1
View File
@@ -3,8 +3,9 @@ package canary
import (
"testing"
flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1"
)
func TestDaemonSetController_SyncStatus(t *testing.T) {
+1 -1
View File
@@ -1,7 +1,6 @@
package canary
import (
"github.com/weaveworks/flagger/pkg/logger"
"go.uber.org/zap"
appsv1 "k8s.io/api/apps/v1"
hpav2 "k8s.io/api/autoscaling/v2beta1"
@@ -14,6 +13,7 @@ import (
flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1"
clientset "github.com/weaveworks/flagger/pkg/client/clientset/versioned"
fakeFlagger "github.com/weaveworks/flagger/pkg/client/clientset/versioned/fake"
"github.com/weaveworks/flagger/pkg/logger"
)
type deploymentControllerFixture struct {
@@ -4,8 +4,6 @@ import (
"sync"
"time"
"github.com/weaveworks/flagger/pkg/metrics/observers"
"go.uber.org/zap"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
@@ -25,6 +23,7 @@ import (
informers "github.com/weaveworks/flagger/pkg/client/informers/externalversions"
"github.com/weaveworks/flagger/pkg/logger"
"github.com/weaveworks/flagger/pkg/metrics"
"github.com/weaveworks/flagger/pkg/metrics/observers"
"github.com/weaveworks/flagger/pkg/router"
)
@@ -4,8 +4,6 @@ import (
"sync"
"time"
"github.com/weaveworks/flagger/pkg/metrics/observers"
"go.uber.org/zap"
appsv1 "k8s.io/api/apps/v1"
hpav2 "k8s.io/api/autoscaling/v2beta1"
@@ -26,6 +24,7 @@ import (
informers "github.com/weaveworks/flagger/pkg/client/informers/externalversions"
"github.com/weaveworks/flagger/pkg/logger"
"github.com/weaveworks/flagger/pkg/metrics"
"github.com/weaveworks/flagger/pkg/metrics/observers"
"github.com/weaveworks/flagger/pkg/router"
)
+3 -2
View File
@@ -3,12 +3,13 @@ package controller
import (
"encoding/json"
"fmt"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1"
"net/http"
"net/http/httptest"
"testing"
corev1 "k8s.io/api/core/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1"
)