From 7fb675e8aa152dbda04744b057f754743f033ed9 Mon Sep 17 00:00:00 2001 From: mathetake Date: Sat, 7 Mar 2020 23:28:50 +0900 Subject: [PATCH] make deployment tests aligned with daemonset --- pkg/canary/daemonset_controller.go | 10 ++-- pkg/canary/daemonset_ready.go | 4 +- pkg/canary/deployment_controller.go | 8 +-- pkg/canary/deployment_controller_test.go | 62 ------------------------ pkg/canary/deployment_ready.go | 2 +- pkg/canary/deployment_ready_test.go | 19 ++++++++ pkg/canary/deployment_status_test.go | 61 +++++++++++++++++++++++ pkg/canary/service_controller.go | 8 +-- 8 files changed, 96 insertions(+), 78 deletions(-) create mode 100644 pkg/canary/deployment_ready_test.go create mode 100644 pkg/canary/deployment_status_test.go diff --git a/pkg/canary/daemonset_controller.go b/pkg/canary/daemonset_controller.go index 074d343a..1eded3eb 100644 --- a/pkg/canary/daemonset_controller.go +++ b/pkg/canary/daemonset_controller.go @@ -102,7 +102,7 @@ func (c *DaemonSetController) Promote(cd *flaggerv1.Canary) error { canary, err := c.kubeClient.AppsV1().DaemonSets(cd.Namespace).Get(targetName, metav1.GetOptions{}) if err != nil { - return fmt.Errorf("damonset %s.%s get query error %v", targetName, cd.Namespace, err) + return fmt.Errorf("damonset %s.%s get query error: %v", targetName, cd.Namespace, err) } label, err := c.getSelectorLabel(canary) @@ -112,7 +112,7 @@ func (c *DaemonSetController) Promote(cd *flaggerv1.Canary) error { primary, err := c.kubeClient.AppsV1().DaemonSets(cd.Namespace).Get(primaryName, metav1.GetOptions{}) if err != nil { - return fmt.Errorf("daemonset %s.%s get query error %w", primaryName, cd.Namespace, err) + return fmt.Errorf("daemonset %s.%s get query error: %w", primaryName, cd.Namespace, err) } // promote secrets and config maps @@ -160,7 +160,7 @@ func (c *DaemonSetController) HasTargetChanged(cd *flaggerv1.Canary) (bool, erro targetName := cd.Spec.TargetRef.Name canary, err := c.kubeClient.AppsV1().DaemonSets(cd.Namespace).Get(targetName, metav1.GetOptions{}) if err != nil { - return false, fmt.Errorf("daemonset %s.%s get query error %w", targetName, cd.Namespace, err) + return false, fmt.Errorf("daemonset %s.%s get query error: %w", targetName, cd.Namespace, err) } // ignore `daemonSetScaleDownNodeSelector` node selector @@ -182,7 +182,7 @@ func (c *DaemonSetController) GetMetadata(cd *flaggerv1.Canary) (string, map[str canaryDae, err := c.kubeClient.AppsV1().DaemonSets(cd.Namespace).Get(targetName, metav1.GetOptions{}) if err != nil { - return "", nil, fmt.Errorf("daemonset %s.%s get query error %w", targetName, cd.Namespace, err) + return "", nil, fmt.Errorf("daemonset %s.%s get query error: %w", targetName, cd.Namespace, err) } label, err := c.getSelectorLabel(canaryDae) @@ -203,7 +203,7 @@ func (c *DaemonSetController) createPrimaryDaemonSet(cd *flaggerv1.Canary) error canaryDae, err := c.kubeClient.AppsV1().DaemonSets(cd.Namespace).Get(targetName, metav1.GetOptions{}) if err != nil { - return fmt.Errorf("daemonset %s.%s get query error %w", targetName, cd.Namespace, err) + return fmt.Errorf("daemonset %s.%s get query error: %w", targetName, cd.Namespace, err) } if canaryDae.Spec.UpdateStrategy.Type != "" && diff --git a/pkg/canary/daemonset_ready.go b/pkg/canary/daemonset_ready.go index 81b892b1..7e68b6db 100644 --- a/pkg/canary/daemonset_ready.go +++ b/pkg/canary/daemonset_ready.go @@ -16,7 +16,7 @@ func (c *DaemonSetController) IsPrimaryReady(cd *flaggerv1.Canary) error { primaryName := fmt.Sprintf("%s-primary", cd.Spec.TargetRef.Name) primary, err := c.kubeClient.AppsV1().DaemonSets(cd.Namespace).Get(primaryName, metav1.GetOptions{}) if err != nil { - return fmt.Errorf("daemonset %s.%s get query error %w", primaryName, cd.Namespace, err) + return fmt.Errorf("daemonset %s.%s get query error: %w", primaryName, cd.Namespace, err) } _, err = c.isDaemonSetReady(cd, primary) @@ -32,7 +32,7 @@ func (c *DaemonSetController) IsCanaryReady(cd *flaggerv1.Canary) (bool, error) targetName := cd.Spec.TargetRef.Name canary, err := c.kubeClient.AppsV1().DaemonSets(cd.Namespace).Get(targetName, metav1.GetOptions{}) if err != nil { - return true, fmt.Errorf("daemonset %s.%s get query error %w", targetName, cd.Namespace, err) + return true, fmt.Errorf("daemonset %s.%s get query error: %w", targetName, cd.Namespace, err) } retriable, err := c.isDaemonSetReady(cd, canary) diff --git a/pkg/canary/deployment_controller.go b/pkg/canary/deployment_controller.go index 8364845d..c1dc5cc8 100644 --- a/pkg/canary/deployment_controller.go +++ b/pkg/canary/deployment_controller.go @@ -70,7 +70,7 @@ func (c *DeploymentController) Promote(cd *flaggerv1.Canary) error { canary, err := c.kubeClient.AppsV1().Deployments(cd.Namespace).Get(targetName, metav1.GetOptions{}) if err != nil { - return fmt.Errorf("deployment %s.%s query error %v", targetName, cd.Namespace, err) + return fmt.Errorf("deployment %s.%s query error: %v", targetName, cd.Namespace, err) } label, err := c.getSelectorLabel(canary) @@ -80,7 +80,7 @@ func (c *DeploymentController) Promote(cd *flaggerv1.Canary) error { primary, err := c.kubeClient.AppsV1().Deployments(cd.Namespace).Get(primaryName, metav1.GetOptions{}) if err != nil { - return fmt.Errorf("deployment %s.%s query error %v", primaryName, cd.Namespace, err) + return fmt.Errorf("deployment %s.%s query error: %v", primaryName, cd.Namespace, err) } // promote secrets and config maps @@ -188,7 +188,7 @@ func (c *DeploymentController) GetMetadata(cd *flaggerv1.Canary) (string, map[st canaryDep, err := c.kubeClient.AppsV1().Deployments(cd.Namespace).Get(targetName, metav1.GetOptions{}) if err != nil { - return "", nil, fmt.Errorf("deployment %s.%s get query error %w", targetName, cd.Namespace, err) + return "", nil, fmt.Errorf("deployment %s.%s get query error: %w", targetName, cd.Namespace, err) } label, err := c.getSelectorLabel(canaryDep) @@ -209,7 +209,7 @@ func (c *DeploymentController) createPrimaryDeployment(cd *flaggerv1.Canary) err canaryDep, err := c.kubeClient.AppsV1().Deployments(cd.Namespace).Get(targetName, metav1.GetOptions{}) if err != nil { - return fmt.Errorf("deplyoment %s.%s get query error %w", targetName, cd.Namespace, err) + return fmt.Errorf("deplyoment %s.%s get query error: %w", targetName, cd.Namespace, err) } label, err := c.getSelectorLabel(canaryDep) diff --git a/pkg/canary/deployment_controller_test.go b/pkg/canary/deployment_controller_test.go index fb8d574c..0c24d8e7 100644 --- a/pkg/canary/deployment_controller_test.go +++ b/pkg/canary/deployment_controller_test.go @@ -72,68 +72,6 @@ func TestDeploymentController_Promote(t *testing.T) { assert.Equal(t, int32(2), hpaPrimary.Spec.MaxReplicas) } -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") - - err = mocks.controller.IsPrimaryReady(mocks.canary) - require.Error(t, err) - - _, err = mocks.controller.IsCanaryReady(mocks.canary) - require.NoError(t, err) -} - -func TestDeploymentController_SetFailedChecks(t *testing.T) { - mocks := newDeploymentFixture() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) - - err = mocks.controller.SetStatusFailedChecks(mocks.canary, 1) - require.NoError(t, err) - - res, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) - require.NoError(t, err) - assert.Equal(t, 1, res.Status.FailedChecks) -} - -func TestDeploymentController_SetState(t *testing.T) { - mocks := newDeploymentFixture() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) - - err = mocks.controller.SetStatusPhase(mocks.canary, flaggerv1.CanaryPhaseProgressing) - require.NoError(t, err) - - res, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) - require.NoError(t, err) - assert.Equal(t, flaggerv1.CanaryPhaseProgressing, res.Status.Phase) -} - -func TestDeploymentController_SyncStatus(t *testing.T) { - mocks := newDeploymentFixture() - err := mocks.controller.Initialize(mocks.canary, true) - require.NoError(t, err) - - status := flaggerv1.CanaryStatus{ - Phase: flaggerv1.CanaryPhaseProgressing, - FailedChecks: 2, - } - err = mocks.controller.SyncStatus(mocks.canary, status) - require.NoError(t, err) - - res, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) - require.NoError(t, err) - assert.Equal(t, status.Phase, res.Status.Phase) - assert.Equal(t, status.FailedChecks, res.Status.FailedChecks) - - require.NotNil(t, res.Status.TrackedConfigs) - configs := *res.Status.TrackedConfigs - secret := newDeploymentControllerTestSecret() - _, exists := configs["secret/"+secret.GetName()] - assert.True(t, exists, "Secret %s not found in status", secret.GetName()) -} - func TestDeploymentController_ScaleToZero(t *testing.T) { mocks := newDeploymentFixture() err := mocks.controller.Initialize(mocks.canary, true) diff --git a/pkg/canary/deployment_ready.go b/pkg/canary/deployment_ready.go index 6fdd9d9a..78d7e5ae 100644 --- a/pkg/canary/deployment_ready.go +++ b/pkg/canary/deployment_ready.go @@ -17,7 +17,7 @@ func (c *DeploymentController) IsPrimaryReady(cd *flaggerv1.Canary) error { primaryName := fmt.Sprintf("%s-primary", cd.Spec.TargetRef.Name) primary, err := c.kubeClient.AppsV1().Deployments(cd.Namespace).Get(primaryName, metav1.GetOptions{}) if err != nil { - return fmt.Errorf("deployment %s.%s get query error %w", primaryName, cd.Namespace, err) + return fmt.Errorf("deployment %s.%s get query error: %w", primaryName, cd.Namespace, err) } _, err = c.isDeploymentReady(primary, cd.GetProgressDeadlineSeconds()) diff --git a/pkg/canary/deployment_ready_test.go b/pkg/canary/deployment_ready_test.go new file mode 100644 index 00000000..bb6e8d9f --- /dev/null +++ b/pkg/canary/deployment_ready_test.go @@ -0,0 +1,19 @@ +package canary + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +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") + + err = mocks.controller.IsPrimaryReady(mocks.canary) + require.Error(t, err) + + _, err = mocks.controller.IsCanaryReady(mocks.canary) + require.NoError(t, err) +} diff --git a/pkg/canary/deployment_status_test.go b/pkg/canary/deployment_status_test.go new file mode 100644 index 00000000..95b2b558 --- /dev/null +++ b/pkg/canary/deployment_status_test.go @@ -0,0 +1,61 @@ +package canary + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1" +) + +func TestDeploymentController_SyncStatus(t *testing.T) { + mocks := newDeploymentFixture() + err := mocks.controller.Initialize(mocks.canary, true) + require.NoError(t, err) + + status := flaggerv1.CanaryStatus{ + Phase: flaggerv1.CanaryPhaseProgressing, + FailedChecks: 2, + } + err = mocks.controller.SyncStatus(mocks.canary, status) + require.NoError(t, err) + + res, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) + require.NoError(t, err) + assert.Equal(t, status.Phase, res.Status.Phase) + assert.Equal(t, status.FailedChecks, res.Status.FailedChecks) + + require.NotNil(t, res.Status.TrackedConfigs) + configs := *res.Status.TrackedConfigs + secret := newDeploymentControllerTestSecret() + _, exists := configs["secret/"+secret.GetName()] + assert.True(t, exists, "Secret %s not found in status", secret.GetName()) +} + +func TestDeploymentController_SetFailedChecks(t *testing.T) { + mocks := newDeploymentFixture() + err := mocks.controller.Initialize(mocks.canary, true) + require.NoError(t, err) + + err = mocks.controller.SetStatusFailedChecks(mocks.canary, 1) + require.NoError(t, err) + + res, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) + require.NoError(t, err) + assert.Equal(t, 1, res.Status.FailedChecks) +} + +func TestDeploymentController_SetState(t *testing.T) { + mocks := newDeploymentFixture() + err := mocks.controller.Initialize(mocks.canary, true) + require.NoError(t, err) + + err = mocks.controller.SetStatusPhase(mocks.canary, flaggerv1.CanaryPhaseProgressing) + require.NoError(t, err) + + res, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get("podinfo", metav1.GetOptions{}) + require.NoError(t, err) + assert.Equal(t, flaggerv1.CanaryPhaseProgressing, res.Status.Phase) +} diff --git a/pkg/canary/service_controller.go b/pkg/canary/service_controller.go index cfd1703f..c62949a2 100644 --- a/pkg/canary/service_controller.go +++ b/pkg/canary/service_controller.go @@ -156,12 +156,12 @@ func (c *ServiceController) Promote(cd *flaggerv1.Canary) error { canary, err := c.kubeClient.CoreV1().Services(cd.Namespace).Get(targetName, metav1.GetOptions{}) if err != nil { - return fmt.Errorf("service %s.%s get query error %w", targetName, cd.Namespace, err) + return fmt.Errorf("service %s.%s get query error: %w", targetName, cd.Namespace, err) } primary, err := c.kubeClient.CoreV1().Services(cd.Namespace).Get(primaryName, metav1.GetOptions{}) if err != nil { - return fmt.Errorf("service %s.%s get query error %w", primaryName, cd.Namespace, err) + return fmt.Errorf("service %s.%s get query error: %w", primaryName, cd.Namespace, err) } primaryCopy := canary.DeepCopy() @@ -187,7 +187,7 @@ func (c *ServiceController) HasTargetChanged(cd *flaggerv1.Canary) (bool, error) targetName := cd.Spec.TargetRef.Name canary, err := c.kubeClient.CoreV1().Services(cd.Namespace).Get(targetName, metav1.GetOptions{}) if err != nil { - return false, fmt.Errorf("service %s.%s get query error %w", targetName, cd.Namespace, err) + return false, fmt.Errorf("service %s.%s get query error: %w", targetName, cd.Namespace, err) } return hasSpecChanged(cd, canary.Spec) } @@ -204,7 +204,7 @@ func (c *ServiceController) ScaleFromZero(_ *flaggerv1.Canary) error { func (c *ServiceController) SyncStatus(cd *flaggerv1.Canary, status flaggerv1.CanaryStatus) error { dep, err := c.kubeClient.CoreV1().Services(cd.Namespace).Get(cd.Spec.TargetRef.Name, metav1.GetOptions{}) if err != nil { - return fmt.Errorf("service %s.%s get query error %w", cd.Spec.TargetRef.Name, cd.Namespace, err) + return fmt.Errorf("service %s.%s get query error: %w", cd.Spec.TargetRef.Name, cd.Namespace, err) } return syncCanaryStatus(c.flaggerClient, cd, status, dep.Spec, func(cdCopy *flaggerv1.Canary) {})