From 3e0867040f8be490d19b9c61cc6b60b2dedf4787 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 28 Feb 2020 11:31:47 +0200 Subject: [PATCH] Add unit tests for canary phases --- pkg/controller/scheduler_common_test.go | 20 ++++ pkg/controller/scheduler_deployment_test.go | 110 ++++++++++++++++++++ 2 files changed, 130 insertions(+) diff --git a/pkg/controller/scheduler_common_test.go b/pkg/controller/scheduler_common_test.go index 512a0f4c..f0c50e07 100644 --- a/pkg/controller/scheduler_common_test.go +++ b/pkg/controller/scheduler_common_test.go @@ -1,5 +1,25 @@ package controller +import ( + "fmt" + flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1" + clientset "github.com/weaveworks/flagger/pkg/client/clientset/versioned" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func assertPhase(flaggerClient clientset.Interface, canary string, phase flaggerv1.CanaryPhase) error { + c, err := flaggerClient.FlaggerV1beta1().Canaries("default").Get(canary, metav1.GetOptions{}) + if err != nil { + return err + } + + if c.Status.Phase != phase { + return fmt.Errorf("Got canary state %v wanted %v", c.Status.Phase, phase) + } + + return nil +} + func alwaysReady() bool { return true } diff --git a/pkg/controller/scheduler_deployment_test.go b/pkg/controller/scheduler_deployment_test.go index da72f375..b1171942 100644 --- a/pkg/controller/scheduler_deployment_test.go +++ b/pkg/controller/scheduler_deployment_test.go @@ -144,6 +144,116 @@ func TestScheduler_DeploymentSkipAnalysis(t *testing.T) { } } +func TestScheduler_DeploymentAnalysisPhases(t *testing.T) { + cd := newDeploymentTestCanary() + cd.Spec.Analysis = &flaggerv1.CanaryAnalysis{ + Interval: "1m", + StepWeight: 100, + } + mocks := newDeploymentFixture(cd) + + // init + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseInitialized); err != nil { + t.Fatal(err.Error()) + } + + // update + dep2 := newDeploymentTestDeploymentV2() + _, err := mocks.kubeClient.AppsV1().Deployments("default").Update(dep2) + if err != nil { + t.Fatal(err.Error()) + } + + // detect changes + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseProgressing); err != nil { + t.Fatal(err.Error()) + } + + // progressing + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseProgressing); err != nil { + t.Fatal(err.Error()) + } + + // promoting + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhasePromoting); err != nil { + t.Fatal(err.Error()) + } + + // finalising + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseFinalising); err != nil { + t.Fatal(err.Error()) + } + + // succeeded + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseSucceeded); err != nil { + t.Fatal(err.Error()) + } +} + +func TestScheduler_DeploymentBlueGreenAnalysisPhases(t *testing.T) { + cd := newDeploymentTestCanary() + cd.Spec.Analysis = &flaggerv1.CanaryAnalysis{ + Interval: "1m", + Iterations: 1, + } + mocks := newDeploymentFixture(cd) + + // init + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseInitialized); err != nil { + t.Fatal(err.Error()) + } + + // update + dep2 := newDeploymentTestDeploymentV2() + _, err := mocks.kubeClient.AppsV1().Deployments("default").Update(dep2) + if err != nil { + t.Fatal(err.Error()) + } + + // detect changes (progressing) + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseProgressing); err != nil { + t.Fatal(err.Error()) + } + + // advance (progressing) + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseProgressing); err != nil { + t.Fatal(err.Error()) + } + + // route traffic to primary (progressing) + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseProgressing); err != nil { + t.Fatal(err.Error()) + } + + // promoting + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhasePromoting); err != nil { + t.Fatal(err.Error()) + } + + // finalising + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseFinalising); err != nil { + t.Fatal(err.Error()) + } + + // succeeded + mocks.ctrl.advanceCanary("podinfo", "default", true) + if err := assertPhase(mocks.flaggerClient, "podinfo", flaggerv1.CanaryPhaseSucceeded); err != nil { + t.Fatal(err.Error()) + } +} + func TestScheduler_DeploymentNewRevisionReset(t *testing.T) { mocks := newDeploymentFixture(nil) // init