diff --git a/pkg/canary/config_tracker_test.go b/pkg/canary/config_tracker_test.go index c8d017a65..e5f1affbf 100644 --- a/pkg/canary/config_tracker_test.go +++ b/pkg/canary/config_tracker_test.go @@ -15,8 +15,7 @@ func TestConfigTracker_ConfigMaps(t *testing.T) { configMap := newDeploymentControllerTestConfigMap() configMapProjected := newDeploymentControllerTestConfigProjected() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) + mocks.initializeCanary(t) depPrimary, err := mocks.kubeClient.AppsV1().Deployments("default").Get("podinfo-primary", metav1.GetOptions{}) require.NoError(t, err) @@ -53,7 +52,7 @@ func TestConfigTracker_ConfigMaps(t *testing.T) { configMap := newDaemonSetControllerTestConfigMap() configMapProjected := newDaemonSetControllerTestConfigProjected() - err := mocks.controller.Initialize(mocks.canary, true) + err := mocks.controller.Initialize(mocks.canary) require.NoError(t, err) depPrimary, err := mocks.kubeClient.AppsV1().DaemonSets("default").Get("podinfo-primary", metav1.GetOptions{}) @@ -93,8 +92,7 @@ func TestConfigTracker_Secrets(t *testing.T) { secret := newDeploymentControllerTestSecret() secretProjected := newDeploymentControllerTestSecretProjected() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) + mocks.initializeCanary(t) depPrimary, err := mocks.kubeClient.AppsV1().Deployments("default").Get("podinfo-primary", metav1.GetOptions{}) if assert.NoError(t, err) { @@ -131,8 +129,7 @@ func TestConfigTracker_Secrets(t *testing.T) { secret := newDaemonSetControllerTestSecret() secretProjected := newDaemonSetControllerTestSecretProjected() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) + mocks.controller.Initialize(mocks.canary) daePrimary, err := mocks.kubeClient.AppsV1().DaemonSets("default").Get("podinfo-primary", metav1.GetOptions{}) if assert.NoError(t, err) { diff --git a/pkg/canary/controller.go b/pkg/canary/controller.go index 635f1af10..988369916 100644 --- a/pkg/canary/controller.go +++ b/pkg/canary/controller.go @@ -13,7 +13,7 @@ type Controller interface { SetStatusWeight(canary *flaggerv1.Canary, val int) error SetStatusIterations(canary *flaggerv1.Canary, val int) error SetStatusPhase(canary *flaggerv1.Canary, phase flaggerv1.CanaryPhase) error - Initialize(canary *flaggerv1.Canary, skipLivenessChecks bool) error + Initialize(canary *flaggerv1.Canary) error Promote(canary *flaggerv1.Canary) error HasTargetChanged(canary *flaggerv1.Canary) (bool, error) HaveDependenciesChanged(canary *flaggerv1.Canary) (bool, error) diff --git a/pkg/canary/daemonset_controller.go b/pkg/canary/daemonset_controller.go index 2bbcf57a1..aea06f587 100644 --- a/pkg/canary/daemonset_controller.go +++ b/pkg/canary/daemonset_controller.go @@ -74,14 +74,14 @@ func (c *DaemonSetController) ScaleFromZero(cd *flaggerv1.Canary) error { // Initialize creates the primary DaemonSet, scales down the canary DaemonSet, // and returns the pod selector label and container ports -func (c *DaemonSetController) Initialize(cd *flaggerv1.Canary, skipLivenessChecks bool) (err error) { +func (c *DaemonSetController) Initialize(cd *flaggerv1.Canary) (err error) { err = c.createPrimaryDaemonSet(cd) if err != nil { return fmt.Errorf("createPrimaryDaemonSet failed: %w", err) } if cd.Status.Phase == "" || cd.Status.Phase == flaggerv1.CanaryPhaseInitializing { - if !skipLivenessChecks && !cd.SkipAnalysis() { + if !cd.SkipAnalysis() { if err := c.IsPrimaryReady(cd); err != nil { return fmt.Errorf("IsPrimaryReady failed: %w", err) } diff --git a/pkg/canary/daemonset_controller_test.go b/pkg/canary/daemonset_controller_test.go index 3899b1638..5ced78c0c 100644 --- a/pkg/canary/daemonset_controller_test.go +++ b/pkg/canary/daemonset_controller_test.go @@ -15,7 +15,7 @@ import ( func TestDaemonSetController_Sync(t *testing.T) { mocks := newDaemonSetFixture() - err := mocks.controller.Initialize(mocks.canary, true) + err := mocks.controller.Initialize(mocks.canary) require.NoError(t, err) daePrimary, err := mocks.kubeClient.AppsV1().DaemonSets("default").Get("podinfo-primary", metav1.GetOptions{}) @@ -29,7 +29,7 @@ func TestDaemonSetController_Sync(t *testing.T) { func TestDaemonSetController_Promote(t *testing.T) { mocks := newDaemonSetFixture() - err := mocks.controller.Initialize(mocks.canary, true) + err := mocks.controller.Initialize(mocks.canary) require.NoError(t, err) dae2 := newDaemonSetControllerTestPodInfoV2() @@ -60,7 +60,7 @@ func TestDaemonSetController_NoConfigTracking(t *testing.T) { mocks := newDaemonSetFixture() mocks.controller.configTracker = &NopTracker{} - err := mocks.controller.Initialize(mocks.canary, true) + err := mocks.controller.Initialize(mocks.canary) require.NoError(t, err) daePrimary, err := mocks.kubeClient.AppsV1().DaemonSets("default").Get("podinfo-primary", metav1.GetOptions{}) @@ -75,7 +75,7 @@ func TestDaemonSetController_NoConfigTracking(t *testing.T) { func TestDaemonSetController_HasTargetChanged(t *testing.T) { mocks := newDaemonSetFixture() - err := mocks.controller.Initialize(mocks.canary, true) + err := mocks.controller.Initialize(mocks.canary) require.NoError(t, err) // save last applied hash @@ -163,7 +163,7 @@ func TestDaemonSetController_HasTargetChanged(t *testing.T) { func TestDaemonSetController_Scale(t *testing.T) { t.Run("ScaleToZero", func(t *testing.T) { mocks := newDaemonSetFixture() - err := mocks.controller.Initialize(mocks.canary, true) + err := mocks.controller.Initialize(mocks.canary) require.NoError(t, err) err = mocks.controller.ScaleToZero(mocks.canary) @@ -179,7 +179,7 @@ func TestDaemonSetController_Scale(t *testing.T) { }) t.Run("ScaleFromZeo", func(t *testing.T) { mocks := newDaemonSetFixture() - err := mocks.controller.Initialize(mocks.canary, true) + err := mocks.controller.Initialize(mocks.canary) require.NoError(t, err) err = mocks.controller.ScaleFromZero(mocks.canary) @@ -197,7 +197,7 @@ func TestDaemonSetController_Scale(t *testing.T) { func TestDaemonSetController_Finalize(t *testing.T) { mocks := newDaemonSetFixture() - err := mocks.controller.Initialize(mocks.canary, true) + err := mocks.controller.Initialize(mocks.canary) require.NoError(t, err) err = mocks.controller.Finalize(mocks.canary) diff --git a/pkg/canary/daemonset_ready_test.go b/pkg/canary/daemonset_ready_test.go index 343e73b10..006c6046f 100644 --- a/pkg/canary/daemonset_ready_test.go +++ b/pkg/canary/daemonset_ready_test.go @@ -4,7 +4,6 @@ import ( "strings" "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" appsv1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -14,8 +13,8 @@ import ( func TestDaemonSetController_IsReady(t *testing.T) { mocks := newDaemonSetFixture() - err := mocks.controller.Initialize(mocks.canary, true) - assert.NoError(t, err, "Expected primary readiness check to fail") + err := mocks.controller.Initialize(mocks.canary) + require.NoError(t, err) err = mocks.controller.IsPrimaryReady(mocks.canary) require.NoError(t, err) diff --git a/pkg/canary/daemonset_status_test.go b/pkg/canary/daemonset_status_test.go index c8d8e1825..42e449a80 100644 --- a/pkg/canary/daemonset_status_test.go +++ b/pkg/canary/daemonset_status_test.go @@ -12,7 +12,7 @@ import ( func TestDaemonSetController_SyncStatus(t *testing.T) { mocks := newDaemonSetFixture() - err := mocks.controller.Initialize(mocks.canary, true) + err := mocks.controller.Initialize(mocks.canary) require.NoError(t, err) status := flaggerv1.CanaryStatus{ @@ -36,7 +36,7 @@ func TestDaemonSetController_SyncStatus(t *testing.T) { func TestDaemonSetController_SetFailedChecks(t *testing.T) { mocks := newDaemonSetFixture() - err := mocks.controller.Initialize(mocks.canary, true) + err := mocks.controller.Initialize(mocks.canary) require.NoError(t, err) err = mocks.controller.SetStatusFailedChecks(mocks.canary, 1) @@ -49,7 +49,7 @@ func TestDaemonSetController_SetFailedChecks(t *testing.T) { func TestDaemonSetController_SetState(t *testing.T) { mocks := newDaemonSetFixture() - err := mocks.controller.Initialize(mocks.canary, true) + err := mocks.controller.Initialize(mocks.canary) require.NoError(t, err) err = mocks.controller.SetStatusPhase(mocks.canary, flaggerv1.CanaryPhaseProgressing) diff --git a/pkg/canary/deployment_controller.go b/pkg/canary/deployment_controller.go index a4005271b..82c85e0c6 100644 --- a/pkg/canary/deployment_controller.go +++ b/pkg/canary/deployment_controller.go @@ -28,14 +28,14 @@ type DeploymentController struct { // Initialize creates the primary deployment, hpa, // scales to zero the canary deployment and returns the pod selector label and container ports -func (c *DeploymentController) Initialize(cd *flaggerv1.Canary, skipLivenessChecks bool) (err error) { +func (c *DeploymentController) Initialize(cd *flaggerv1.Canary) (err error) { primaryName := fmt.Sprintf("%s-primary", cd.Spec.TargetRef.Name) if err := c.createPrimaryDeployment(cd); err != nil { return fmt.Errorf("createPrimaryDeployment failed: %w", err) } if cd.Status.Phase == "" || cd.Status.Phase == flaggerv1.CanaryPhaseInitializing { - if !skipLivenessChecks && !cd.SkipAnalysis() { + if !cd.SkipAnalysis() { if err := c.IsPrimaryReady(cd); err != nil { return fmt.Errorf("IsPrimaryReady failed: %w", err) } diff --git a/pkg/canary/deployment_controller_test.go b/pkg/canary/deployment_controller_test.go index ed0aee50f..d2c7631cf 100644 --- a/pkg/canary/deployment_controller_test.go +++ b/pkg/canary/deployment_controller_test.go @@ -15,8 +15,7 @@ import ( func TestDeploymentController_Sync(t *testing.T) { mocks := newDeploymentFixture() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) + mocks.initializeCanary(t) depPrimary, err := mocks.kubeClient.AppsV1().Deployments("default").Get("podinfo-primary", metav1.GetOptions{}) require.NoError(t, err) @@ -33,11 +32,10 @@ func TestDeploymentController_Sync(t *testing.T) { func TestDeploymentController_Promote(t *testing.T) { mocks := newDeploymentFixture() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) + mocks.initializeCanary(t) dep2 := newDeploymentControllerTestV2() - _, err = mocks.kubeClient.AppsV1().Deployments("default").Update(dep2) + _, err := mocks.kubeClient.AppsV1().Deployments("default").Update(dep2) require.NoError(t, err) config2 := newDeploymentControllerTestConfigMapV2() @@ -74,10 +72,9 @@ func TestDeploymentController_Promote(t *testing.T) { func TestDeploymentController_ScaleToZero(t *testing.T) { mocks := newDeploymentFixture() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) + mocks.initializeCanary(t) - err = mocks.controller.ScaleToZero(mocks.canary) + err := mocks.controller.ScaleToZero(mocks.canary) require.NoError(t, err) c, err := mocks.kubeClient.AppsV1().Deployments("default").Get("podinfo", metav1.GetOptions{}) @@ -88,9 +85,7 @@ func TestDeploymentController_ScaleToZero(t *testing.T) { func TestDeploymentController_NoConfigTracking(t *testing.T) { mocks := newDeploymentFixture() mocks.controller.configTracker = &NopTracker{} - - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) + mocks.initializeCanary(t) depPrimary, err := mocks.kubeClient.AppsV1().Deployments("default").Get("podinfo-primary", metav1.GetOptions{}) require.NoError(t, err) @@ -104,8 +99,7 @@ func TestDeploymentController_NoConfigTracking(t *testing.T) { func TestDeploymentController_HasTargetChanged(t *testing.T) { mocks := newDeploymentFixture() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) + mocks.initializeCanary(t) // save last applied hash canary, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -190,46 +184,35 @@ func TestDeploymentController_HasTargetChanged(t *testing.T) { } func TestDeploymentController_Finalize(t *testing.T) { - mocks := newDeploymentFixture() - tables := []struct { + for _, tc := range []struct { mocks deploymentControllerFixture callInitialize bool shouldError bool expectedReplicas int32 canary *flaggerv1.Canary }{ - //Primary not found returns error + // primary not found returns error {mocks, false, false, 1, mocks.canary}, - //Happy path + // happy path {mocks, true, false, 1, mocks.canary}, - } - - for _, table := range tables { - if table.callInitialize { - err := mocks.controller.Initialize(table.canary, true) - if err != nil { - t.Fatal(err.Error()) - } + } { + if tc.callInitialize { + mocks.initializeCanary(t) } - err := mocks.controller.Finalize(table.canary) - - if table.shouldError && err == nil { - t.Error("Expected error while calling Finalize, but none was returned") - } else if !table.shouldError && err != nil { - t.Errorf("Expected no error would be returned while calling Finalize, but returned %s", err) + err := mocks.controller.Finalize(tc.canary) + if tc.shouldError { + require.Error(t, err) + } else { + require.NoError(t, err) } - if table.expectedReplicas > 0 { + if tc.expectedReplicas > 0 { c, err := mocks.kubeClient.AppsV1().Deployments(mocks.canary.Namespace).Get(mocks.canary.Name, metav1.GetOptions{}) - if err != nil { - t.Fatal(err.Error()) - } - if int32Default(c.Spec.Replicas) != table.expectedReplicas { - t.Errorf("Expected replicas %d recieved replicas %d", table.expectedReplicas, c.Spec.Replicas) - } + require.NoError(t, err) + require.Equal(t, tc.expectedReplicas, *c.Spec.Replicas) } } } diff --git a/pkg/canary/deployment_fixture_test.go b/pkg/canary/deployment_fixture_test.go index b2a0d6a62..92db6d16f 100644 --- a/pkg/canary/deployment_fixture_test.go +++ b/pkg/canary/deployment_fixture_test.go @@ -1,6 +1,10 @@ package canary import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" "go.uber.org/zap" appsv1 "k8s.io/api/apps/v1" hpav2 "k8s.io/api/autoscaling/v2beta1" @@ -24,6 +28,28 @@ type deploymentControllerFixture struct { logger *zap.SugaredLogger } +func (d deploymentControllerFixture) initializeCanary(t *testing.T) { + err := d.controller.Initialize(d.canary) + require.Error(t, err) // not ready yet + + primaryName := fmt.Sprintf("%s-primary", d.canary.Spec.TargetRef.Name) + p, err := d.controller.kubeClient.AppsV1(). + Deployments(d.canary.Namespace).Get(primaryName, metav1.GetOptions{}) + require.NoError(t, err) + + p.Status = appsv1.DeploymentStatus{ + Replicas: 1, + UpdatedReplicas: 1, + ReadyReplicas: 1, + AvailableReplicas: 1, + } + + _, err = d.controller.kubeClient.AppsV1().Deployments(d.canary.Namespace).Update(p) + require.NoError(t, err) + + require.NoError(t, d.controller.Initialize(d.canary)) +} + func newDeploymentFixture() deploymentControllerFixture { // init canary canary := newDeploymentControllerTestCanary() diff --git a/pkg/canary/deployment_ready_test.go b/pkg/canary/deployment_ready_test.go index bb6e8d9fa..8289f9827 100644 --- a/pkg/canary/deployment_ready_test.go +++ b/pkg/canary/deployment_ready_test.go @@ -8,12 +8,13 @@ import ( func TestDeploymentController_IsReady(t *testing.T) { mocks := newDeploymentFixture() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err, "Expected primary readiness check to fail") + mocks.controller.Initialize(mocks.canary) - err = mocks.controller.IsPrimaryReady(mocks.canary) + err := mocks.controller.IsPrimaryReady(mocks.canary) require.Error(t, err) _, err = mocks.controller.IsCanaryReady(mocks.canary) require.NoError(t, err) } + +// TODO: more detailed tests as daemonset diff --git a/pkg/canary/deployment_status_test.go b/pkg/canary/deployment_status_test.go index 95b2b5586..45c590ca0 100644 --- a/pkg/canary/deployment_status_test.go +++ b/pkg/canary/deployment_status_test.go @@ -12,14 +12,13 @@ import ( func TestDeploymentController_SyncStatus(t *testing.T) { mocks := newDeploymentFixture() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) + mocks.initializeCanary(t) status := flaggerv1.CanaryStatus{ Phase: flaggerv1.CanaryPhaseProgressing, FailedChecks: 2, } - err = mocks.controller.SyncStatus(mocks.canary, status) + err := mocks.controller.SyncStatus(mocks.canary, status) require.NoError(t, err) res, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -36,10 +35,9 @@ func TestDeploymentController_SyncStatus(t *testing.T) { func TestDeploymentController_SetFailedChecks(t *testing.T) { mocks := newDeploymentFixture() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) + mocks.initializeCanary(t) - err = mocks.controller.SetStatusFailedChecks(mocks.canary, 1) + err := mocks.controller.SetStatusFailedChecks(mocks.canary, 1) require.NoError(t, err) res, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -49,10 +47,9 @@ func TestDeploymentController_SetFailedChecks(t *testing.T) { func TestDeploymentController_SetState(t *testing.T) { mocks := newDeploymentFixture() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) + mocks.initializeCanary(t) - err = mocks.controller.SetStatusPhase(mocks.canary, flaggerv1.CanaryPhaseProgressing) + err := mocks.controller.SetStatusPhase(mocks.canary, flaggerv1.CanaryPhaseProgressing) require.NoError(t, err) res, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) diff --git a/pkg/canary/service_controller.go b/pkg/canary/service_controller.go index 94e14c736..a971440f1 100644 --- a/pkg/canary/service_controller.go +++ b/pkg/canary/service_controller.go @@ -47,7 +47,7 @@ func (c *ServiceController) GetMetadata(_ *flaggerv1.Canary) (string, map[string } // Initialize creates or updates the primary and canary services to prepare for the canary release process targeted on the K8s service -func (c *ServiceController) Initialize(cd *flaggerv1.Canary, _ bool) (err error) { +func (c *ServiceController) Initialize(cd *flaggerv1.Canary) (err error) { targetName := cd.Spec.TargetRef.Name primaryName := fmt.Sprintf("%s-primary", targetName) canaryName := fmt.Sprintf("%s-canary", targetName) diff --git a/pkg/controller/job.go b/pkg/controller/job.go index edd1c846c..0b54ea563 100644 --- a/pkg/controller/job.go +++ b/pkg/controller/job.go @@ -6,8 +6,7 @@ import "time" type CanaryJob struct { Name string Namespace string - SkipTests bool - function func(name string, namespace string, skipTests bool) + function func(name string, namespace string) done chan bool ticker *time.Ticker analysisInterval time.Duration @@ -17,11 +16,11 @@ type CanaryJob struct { func (j CanaryJob) Start() { go func() { // run the infra bootstrap on job creation - j.function(j.Name, j.Namespace, j.SkipTests) + j.function(j.Name, j.Namespace) for { select { case <-j.ticker.C: - j.function(j.Name, j.Namespace, j.SkipTests) + j.function(j.Name, j.Namespace) case <-j.done: return } diff --git a/pkg/controller/scheduler.go b/pkg/controller/scheduler.go index bba6b8699..99b67d1d3 100644 --- a/pkg/controller/scheduler.go +++ b/pkg/controller/scheduler.go @@ -83,7 +83,7 @@ func (c *Controller) scheduleCanaries() { } } -func (c *Controller) advanceCanary(name string, namespace string, skipLivenessChecks bool) { +func (c *Controller) advanceCanary(name string, namespace string) { begin := time.Now() // check if the canary exists cd, err := c.flaggerClient.FlaggerV1beta1().Canaries(namespace).Get(name, metav1.GetOptions{}) @@ -115,7 +115,7 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh } // create primary - err = canaryController.Initialize(cd, skipLivenessChecks) + err = canaryController.Initialize(cd) if err != nil { c.recordEventWarningf(cd, "%v", err) return @@ -160,7 +160,7 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh } // check primary status - if !skipLivenessChecks && !cd.SkipAnalysis() { + if !cd.SkipAnalysis() { if err := canaryController.IsPrimaryReady(cd); err != nil { c.recordEventWarningf(cd, "%v", err) return @@ -209,12 +209,10 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh // check canary status var retriable = true - if !skipLivenessChecks { - retriable, err = canaryController.IsCanaryReady(cd) - if err != nil && retriable { - c.recordEventWarningf(cd, "%v", err) - return - } + retriable, err = canaryController.IsCanaryReady(cd) + if err != nil && retriable { + c.recordEventWarningf(cd, "%v", err) + return } // check if analysis should be skipped diff --git a/pkg/controller/scheduler_daemonset_test.go b/pkg/controller/scheduler_daemonset_test.go index 3d650f45b..22fe19c4a 100644 --- a/pkg/controller/scheduler_daemonset_test.go +++ b/pkg/controller/scheduler_daemonset_test.go @@ -19,7 +19,7 @@ import ( func TestScheduler_DaemonSetInit(t *testing.T) { mocks := newDaemonSetFixture(nil) - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") _, err := mocks.kubeClient.AppsV1().DaemonSets("default").Get("podinfo-primary", metav1.GetOptions{}) require.NoError(t, err) @@ -27,7 +27,7 @@ func TestScheduler_DaemonSetInit(t *testing.T) { func TestScheduler_DaemonSetNewRevision(t *testing.T) { mocks := newDaemonSetFixture(nil) - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // update dae2 := newDaemonSetTestDaemonSetV2() @@ -35,7 +35,7 @@ func TestScheduler_DaemonSetNewRevision(t *testing.T) { require.NoError(t, err) // detect changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") _, err = mocks.kubeClient.AppsV1().DaemonSets("default").Get("podinfo", metav1.GetOptions{}) require.NoError(t, err) @@ -44,7 +44,7 @@ func TestScheduler_DaemonSetNewRevision(t *testing.T) { func TestScheduler_DaemonSetRollback(t *testing.T) { mocks := newDaemonSetFixture(nil) // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // update failed checks to max err := mocks.deployer.SyncStatus(mocks.canary, flaggerv1.CanaryStatus{Phase: flaggerv1.CanaryPhaseProgressing, FailedChecks: 10}) @@ -68,10 +68,10 @@ func TestScheduler_DaemonSetRollback(t *testing.T) { require.NoError(t, err) // run metric checks - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // finalise analysis - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check status c, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -82,7 +82,7 @@ func TestScheduler_DaemonSetRollback(t *testing.T) { func TestScheduler_DaemonSetSkipAnalysis(t *testing.T) { mocks := newDaemonSetFixture(nil) // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // enable skip cd, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -98,9 +98,9 @@ func TestScheduler_DaemonSetSkipAnalysis(t *testing.T) { require.NoError(t, err) // detect changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") c, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) require.NoError(t, err) @@ -111,7 +111,7 @@ func TestScheduler_DaemonSetSkipAnalysis(t *testing.T) { func TestScheduler_DaemonSetNewRevisionReset(t *testing.T) { mocks := newDaemonSetFixture(nil) // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // first update dae2 := newDaemonSetTestDaemonSetV2() @@ -119,9 +119,9 @@ func TestScheduler_DaemonSetNewRevisionReset(t *testing.T) { require.NoError(t, err) // detect changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") primaryWeight, canaryWeight, mirrored, err := mocks.router.GetRoutes(mocks.canary) require.NoError(t, err) @@ -135,7 +135,7 @@ func TestScheduler_DaemonSetNewRevisionReset(t *testing.T) { require.NoError(t, err) // detect changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") primaryWeight, canaryWeight, mirrored, err = mocks.router.GetRoutes(mocks.canary) require.NoError(t, err) @@ -148,7 +148,7 @@ func TestScheduler_DaemonSetPromotion(t *testing.T) { mocks := newDaemonSetFixture(nil) // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check initialized status c, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -161,7 +161,7 @@ func TestScheduler_DaemonSetPromotion(t *testing.T) { require.NoError(t, err) // detect pod spec changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") config2 := newDaemonSetTestConfigMapV2() _, err = mocks.kubeClient.CoreV1().ConfigMaps("default").Update(config2) @@ -172,7 +172,7 @@ func TestScheduler_DaemonSetPromotion(t *testing.T) { require.NoError(t, err) // detect configs changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") primaryWeight, canaryWeight, mirrored, err := mocks.router.GetRoutes(mocks.canary) require.NoError(t, err) @@ -183,7 +183,7 @@ func TestScheduler_DaemonSetPromotion(t *testing.T) { require.NoError(t, err) // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check progressing status c, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -191,7 +191,7 @@ func TestScheduler_DaemonSetPromotion(t *testing.T) { assert.Equal(t, flaggerv1.CanaryPhaseProgressing, c.Status.Phase) // promote - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check promoting status c, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -199,7 +199,7 @@ func TestScheduler_DaemonSetPromotion(t *testing.T) { assert.Equal(t, flaggerv1.CanaryPhasePromoting, c.Status.Phase) // finalise - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") primaryWeight, canaryWeight, mirrored, err = mocks.router.GetRoutes(mocks.canary) require.NoError(t, err) @@ -228,7 +228,7 @@ func TestScheduler_DaemonSetPromotion(t *testing.T) { assert.Equal(t, flaggerv1.CanaryPhaseFinalising, c.Status.Phase) // scale canary to zero - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") c, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) require.NoError(t, err) @@ -238,7 +238,7 @@ func TestScheduler_DaemonSetPromotion(t *testing.T) { func TestScheduler_DaemonSetMirroring(t *testing.T) { mocks := newDaemonSetFixture(newDaemonSetTestCanaryMirror()) // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // update dae2 := newDaemonSetTestDaemonSetV2() @@ -246,10 +246,10 @@ func TestScheduler_DaemonSetMirroring(t *testing.T) { require.NoError(t, err) // detect pod spec changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check if traffic is mirrored to canary primaryWeight, canaryWeight, mirrored, err := mocks.router.GetRoutes(mocks.canary) @@ -259,7 +259,7 @@ func TestScheduler_DaemonSetMirroring(t *testing.T) { assert.True(t, mirrored) // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check if traffic is mirrored to canary primaryWeight, canaryWeight, mirrored, err = mocks.router.GetRoutes(mocks.canary) @@ -272,7 +272,7 @@ func TestScheduler_DaemonSetMirroring(t *testing.T) { func TestScheduler_DaemonSetABTesting(t *testing.T) { mocks := newDaemonSetFixture(newDaemonSetTestCanaryAB()) // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // update dae2 := newDaemonSetTestDaemonSetV2() @@ -280,10 +280,10 @@ func TestScheduler_DaemonSetABTesting(t *testing.T) { require.NoError(t, err) // detect pod spec changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check if traffic is routed to canary primaryWeight, canaryWeight, mirrored, err := mocks.router.GetRoutes(mocks.canary) @@ -300,10 +300,10 @@ func TestScheduler_DaemonSetABTesting(t *testing.T) { require.NoError(t, err) // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // finalising - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check finalising status c, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -319,7 +319,7 @@ func TestScheduler_DaemonSetABTesting(t *testing.T) { assert.Equal(t, canaryImage, primaryImage) // shutdown canary - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check rollout status c, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -337,7 +337,7 @@ func TestScheduler_DaemonSetPortDiscovery(t *testing.T) { _, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Update(cd) require.NoError(t, err) - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") canarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get("podinfo-canary", metav1.GetOptions{}) require.NoError(t, err) @@ -370,7 +370,7 @@ func TestScheduler_DaemonSetTargetPortNumber(t *testing.T) { _, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Update(cd) require.NoError(t, err) - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") canarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get("podinfo-canary", metav1.GetOptions{}) require.NoError(t, err) @@ -403,7 +403,7 @@ func TestScheduler_DaemonSetTargetPortName(t *testing.T) { _, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Update(cd) require.NoError(t, err) - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") canarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get("podinfo-canary", metav1.GetOptions{}) require.NoError(t, err) @@ -464,5 +464,5 @@ func TestScheduler_DaemonSetAlerts(t *testing.T) { require.NoError(t, err) // init canary and send alerts - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") } diff --git a/pkg/controller/scheduler_deployment_fixture_test.go b/pkg/controller/scheduler_deployment_fixture_test.go index 3006d3eb9..136a66470 100644 --- a/pkg/controller/scheduler_deployment_fixture_test.go +++ b/pkg/controller/scheduler_deployment_fixture_test.go @@ -1,9 +1,12 @@ package controller import ( + "fmt" "sync" + "testing" "time" + "github.com/stretchr/testify/require" "go.uber.org/zap" appsv1 "k8s.io/api/apps/v1" hpav2 "k8s.io/api/autoscaling/v2beta1" @@ -40,6 +43,28 @@ type fixture struct { router router.Interface } +func (f fixture) makePrimaryReady(t *testing.T) { + primaryName := fmt.Sprintf("%s-primary", f.canary.Spec.TargetRef.Name) + f.makeReady(t, primaryName) +} + +func (f fixture) makeCanaryReady(t *testing.T) { + f.makeReady(t, f.canary.Spec.TargetRef.Name) +} + +func (f fixture) makeReady(t *testing.T, name string) { + p, err := f.kubeClient.AppsV1(). + Deployments("default"). + Get(name, metav1.GetOptions{}) + require.NoError(t, err) + + p.Status = appsv1.DeploymentStatus{Replicas: 1, UpdatedReplicas: 1, + ReadyReplicas: 1, AvailableReplicas: 1} + + _, err = f.kubeClient.AppsV1().Deployments("default").Update(p) + require.NoError(t, err) +} + func newDeploymentFixture(c *flaggerv1.Canary) fixture { if c == nil { c = newDeploymentTestCanary() diff --git a/pkg/controller/scheduler_deployment_test.go b/pkg/controller/scheduler_deployment_test.go index b65b6447f..b6774f763 100644 --- a/pkg/controller/scheduler_deployment_test.go +++ b/pkg/controller/scheduler_deployment_test.go @@ -19,7 +19,7 @@ import ( func TestScheduler_DeploymentInit(t *testing.T) { mocks := newDeploymentFixture(nil) - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") _, err := mocks.kubeClient.AppsV1().Deployments("default").Get("podinfo-primary", metav1.GetOptions{}) require.NoError(t, err) @@ -27,7 +27,15 @@ func TestScheduler_DeploymentInit(t *testing.T) { func TestScheduler_DeploymentNewRevision(t *testing.T) { mocks := newDeploymentFixture(nil) - mocks.ctrl.advanceCanary("podinfo", "default", true) + + // initializing ... + mocks.ctrl.advanceCanary("podinfo", "default") + + // make primary ready + mocks.makePrimaryReady(t) + + // initialization done + mocks.ctrl.advanceCanary("podinfo", "default") // update dep2 := newDeploymentTestDeploymentV2() @@ -35,7 +43,7 @@ func TestScheduler_DeploymentNewRevision(t *testing.T) { require.NoError(t, err) // detect changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") c, err := mocks.kubeClient.AppsV1().Deployments("default").Get("podinfo", metav1.GetOptions{}) require.NoError(t, err) @@ -44,8 +52,14 @@ func TestScheduler_DeploymentNewRevision(t *testing.T) { func TestScheduler_DeploymentRollback(t *testing.T) { mocks := newDeploymentFixture(nil) - // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + // initializing + mocks.ctrl.advanceCanary("podinfo", "default") + + // make primary ready + mocks.makePrimaryReady(t) + + // initialized + mocks.ctrl.advanceCanary("podinfo", "default") // update failed checks to max err := mocks.deployer.SyncStatus(mocks.canary, flaggerv1.CanaryStatus{Phase: flaggerv1.CanaryPhaseProgressing, FailedChecks: 10}) @@ -68,11 +82,11 @@ func TestScheduler_DeploymentRollback(t *testing.T) { require.NoError(t, err) // run metric checks - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, err) // finalise analysis - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, err) // check status @@ -84,8 +98,14 @@ func TestScheduler_DeploymentRollback(t *testing.T) { func TestScheduler_DeploymentSkipAnalysis(t *testing.T) { mocks := newDeploymentFixture(nil) - // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + // initializing + mocks.ctrl.advanceCanary("podinfo", "default") + + // make primary ready + mocks.makePrimaryReady(t) + + // initialized + mocks.ctrl.advanceCanary("podinfo", "default") // enable skip cd, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -100,9 +120,11 @@ func TestScheduler_DeploymentSkipAnalysis(t *testing.T) { require.NoError(t, err) // detect changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") + mocks.makeCanaryReady(t) + // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") c, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) require.NoError(t, err) @@ -118,8 +140,14 @@ func TestScheduler_DeploymentAnalysisPhases(t *testing.T) { } mocks := newDeploymentFixture(cd) - // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + // initializing + mocks.ctrl.advanceCanary("podinfo", "default") + + // make primary ready + mocks.makePrimaryReady(t) + + // initialized + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseInitialized)) // update @@ -128,23 +156,24 @@ func TestScheduler_DeploymentAnalysisPhases(t *testing.T) { require.NoError(t, err) // detect changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseProgressing)) + mocks.makeCanaryReady(t) // progressing - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseProgressing)) // promoting - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhasePromoting)) // finalising - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseFinalising)) // succeeded - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseSucceeded)) } @@ -156,8 +185,14 @@ func TestScheduler_DeploymentBlueGreenAnalysisPhases(t *testing.T) { } mocks := newDeploymentFixture(cd) - // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + // initializing + mocks.ctrl.advanceCanary("podinfo", "default") + + // make primary ready + mocks.makePrimaryReady(t) + + // initialized + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseInitialized)) // update @@ -166,34 +201,42 @@ func TestScheduler_DeploymentBlueGreenAnalysisPhases(t *testing.T) { require.NoError(t, err) // detect changes (progressing) - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseProgressing)) + mocks.makeCanaryReady(t) // advance (progressing) - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseProgressing)) // route traffic to primary (progressing) - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseProgressing)) // promoting - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhasePromoting)) // finalising - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseFinalising)) // succeeded - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") require.NoError(t, assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseSucceeded)) } func TestScheduler_DeploymentNewRevisionReset(t *testing.T) { mocks := newDeploymentFixture(nil) // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + // initializing + mocks.ctrl.advanceCanary("podinfo", "default") + + // make primary ready + mocks.makePrimaryReady(t) + + // initialized + mocks.ctrl.advanceCanary("podinfo", "default") // first update dep2 := newDeploymentTestDeploymentV2() @@ -201,9 +244,11 @@ func TestScheduler_DeploymentNewRevisionReset(t *testing.T) { require.NoError(t, err) // detect changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") + mocks.makeCanaryReady(t) + // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") primaryWeight, canaryWeight, mirrored, err := mocks.router.GetRoutes(mocks.canary) require.NoError(t, err) @@ -217,7 +262,7 @@ func TestScheduler_DeploymentNewRevisionReset(t *testing.T) { require.NoError(t, err) // detect changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") primaryWeight, canaryWeight, mirrored, err = mocks.router.GetRoutes(mocks.canary) require.NoError(t, err) @@ -229,8 +274,14 @@ func TestScheduler_DeploymentNewRevisionReset(t *testing.T) { func TestScheduler_DeploymentPromotion(t *testing.T) { mocks := newDeploymentFixture(nil) - // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + // initializing + mocks.ctrl.advanceCanary("podinfo", "default") + + // make primary ready + mocks.makePrimaryReady(t) + + // initialized + mocks.ctrl.advanceCanary("podinfo", "default") // check initialized status c, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -243,7 +294,8 @@ func TestScheduler_DeploymentPromotion(t *testing.T) { require.NoError(t, err) // detect pod spec changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") + mocks.makeCanaryReady(t) config2 := newDeploymentTestConfigMapV2() _, err = mocks.kubeClient.CoreV1().ConfigMaps("default").Update(config2) @@ -254,7 +306,7 @@ func TestScheduler_DeploymentPromotion(t *testing.T) { require.NoError(t, err) // detect configs changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") primaryWeight, canaryWeight, mirrored, err := mocks.router.GetRoutes(mocks.canary) require.NoError(t, err) @@ -265,7 +317,7 @@ func TestScheduler_DeploymentPromotion(t *testing.T) { require.NoError(t, err) // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check progressing status c, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -273,7 +325,7 @@ func TestScheduler_DeploymentPromotion(t *testing.T) { assert.Equal(t, flaggerv1.CanaryPhaseProgressing, c.Status.Phase) // promote - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check promoting status c, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -281,7 +333,7 @@ func TestScheduler_DeploymentPromotion(t *testing.T) { assert.Equal(t, flaggerv1.CanaryPhasePromoting, c.Status.Phase) // finalise - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") primaryWeight, canaryWeight, mirrored, err = mocks.router.GetRoutes(mocks.canary) require.NoError(t, err) @@ -310,7 +362,7 @@ func TestScheduler_DeploymentPromotion(t *testing.T) { assert.Equal(t, flaggerv1.CanaryPhaseFinalising, c.Status.Phase) // scale canary to zero - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") c, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) require.NoError(t, err) @@ -319,8 +371,15 @@ func TestScheduler_DeploymentPromotion(t *testing.T) { func TestScheduler_DeploymentMirroring(t *testing.T) { mocks := newDeploymentFixture(newDeploymentTestCanaryMirror()) - // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + + // initializing + mocks.ctrl.advanceCanary("podinfo", "default") + + // make primary ready + mocks.makePrimaryReady(t) + + // initialized + mocks.ctrl.advanceCanary("podinfo", "default") // update dep2 := newDeploymentTestDeploymentV2() @@ -328,10 +387,11 @@ func TestScheduler_DeploymentMirroring(t *testing.T) { require.NoError(t, err) // detect pod spec changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") + mocks.makeCanaryReady(t) // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check if traffic is mirrored to canary primaryWeight, canaryWeight, mirrored, err := mocks.router.GetRoutes(mocks.canary) @@ -341,7 +401,7 @@ func TestScheduler_DeploymentMirroring(t *testing.T) { assert.True(t, mirrored) // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check if traffic is mirrored to canary primaryWeight, canaryWeight, mirrored, err = mocks.router.GetRoutes(mocks.canary) @@ -353,8 +413,14 @@ func TestScheduler_DeploymentMirroring(t *testing.T) { func TestScheduler_DeploymentABTesting(t *testing.T) { mocks := newDeploymentFixture(newDeploymentTestCanaryAB()) - // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + // initializing + mocks.ctrl.advanceCanary("podinfo", "default") + + // make primary ready + mocks.makePrimaryReady(t) + + // initialized + mocks.ctrl.advanceCanary("podinfo", "default") // update dep2 := newDeploymentTestDeploymentV2() @@ -362,10 +428,11 @@ func TestScheduler_DeploymentABTesting(t *testing.T) { require.NoError(t, err) // detect pod spec changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") + mocks.makeCanaryReady(t) // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check if traffic is routed to canary primaryWeight, canaryWeight, mirrored, err := mocks.router.GetRoutes(mocks.canary) @@ -382,10 +449,10 @@ func TestScheduler_DeploymentABTesting(t *testing.T) { require.NoError(t, err) // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // finalising - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check finalising status c, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -401,7 +468,7 @@ func TestScheduler_DeploymentABTesting(t *testing.T) { assert.Equal(t, canaryImage, primaryImage) // shutdown canary - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check rollout status c, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -419,7 +486,7 @@ func TestScheduler_DeploymentPortDiscovery(t *testing.T) { _, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Update(cd) require.NoError(t, err) - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") canarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get("podinfo-canary", metav1.GetOptions{}) require.NoError(t, err) @@ -452,7 +519,7 @@ func TestScheduler_DeploymentTargetPortNumber(t *testing.T) { _, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Update(cd) require.NoError(t, err) - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") canarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get("podinfo-canary", metav1.GetOptions{}) require.NoError(t, err) @@ -485,7 +552,7 @@ func TestScheduler_DeploymentTargetPortName(t *testing.T) { _, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Update(cd) require.NoError(t, err) - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") canarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get("podinfo-canary", metav1.GetOptions{}) require.NoError(t, err) @@ -546,5 +613,5 @@ func TestScheduler_DeploymentAlerts(t *testing.T) { require.NoError(t, err) // init canary and send alerts - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") } diff --git a/pkg/controller/scheduler_svc_test.go b/pkg/controller/scheduler_svc_test.go index d1214adb0..15da4d2ec 100644 --- a/pkg/controller/scheduler_svc_test.go +++ b/pkg/controller/scheduler_svc_test.go @@ -14,7 +14,7 @@ func TestScheduler_ServicePromotion(t *testing.T) { mocks := newDeploymentFixture(newTestServiceCanary()) // init - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check initialized status c, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -27,7 +27,7 @@ func TestScheduler_ServicePromotion(t *testing.T) { require.NoError(t, err) // detect service spec changes - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") primaryWeight, canaryWeight, mirrored, err := mocks.router.GetRoutes(mocks.canary) require.NoError(t, err) @@ -38,7 +38,7 @@ func TestScheduler_ServicePromotion(t *testing.T) { require.NoError(t, err) // advance - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check progressing status c, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -46,7 +46,7 @@ func TestScheduler_ServicePromotion(t *testing.T) { assert.Equal(t, flaggerv1.CanaryPhaseProgressing, c.Status.Phase) // promote - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") // check promoting status c, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) @@ -54,7 +54,7 @@ func TestScheduler_ServicePromotion(t *testing.T) { assert.Equal(t, flaggerv1.CanaryPhasePromoting, c.Status.Phase) // finalise - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") primaryWeight, canaryWeight, mirrored, err = mocks.router.GetRoutes(mocks.canary) require.NoError(t, err) @@ -75,7 +75,7 @@ func TestScheduler_ServicePromotion(t *testing.T) { assert.Equal(t, flaggerv1.CanaryPhaseFinalising, c.Status.Phase) // scale canary to zero - mocks.ctrl.advanceCanary("podinfo", "default", true) + mocks.ctrl.advanceCanary("podinfo", "default") c, err = mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) require.NoError(t, err)