mirror of
https://github.com/fluxcd/flagger.git
synced 2026-04-15 06:57:34 +00:00
Merge pull request #530 from weaveworks/remove-skipLivenessChecks-param
pkg/{canary,controller}: remove unused skipLivenessChecks
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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{})
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user