diff --git a/pkg/canary/deployer.go b/pkg/canary/deployer.go index 83e549de..4b8ea18b 100644 --- a/pkg/canary/deployer.go +++ b/pkg/canary/deployer.go @@ -32,7 +32,7 @@ type Deployer struct { // Initialize creates the primary deployment, hpa, // scales to zero the canary deployment and returns the pod selector label and container ports -func (c *Deployer) Initialize(cd *flaggerv1.Canary) (label string, ports *map[string]int32, err error) { +func (c *Deployer) Initialize(cd *flaggerv1.Canary, skipLivenessChecks bool) (label string, ports *map[string]int32, err error) { primaryName := fmt.Sprintf("%s-primary", cd.Spec.TargetRef.Name) label, ports, err = c.createPrimaryDeployment(cd) if err != nil { @@ -40,9 +40,11 @@ func (c *Deployer) Initialize(cd *flaggerv1.Canary) (label string, ports *map[st } if cd.Status.Phase == "" { - _, readyErr := c.IsPrimaryReady(cd) - if readyErr != nil { - return "", ports, readyErr + if !skipLivenessChecks { + _, readyErr := c.IsPrimaryReady(cd) + if readyErr != nil { + return "", ports, readyErr + } } c.Logger.With("canary", fmt.Sprintf("%s.%s", cd.Name, cd.Namespace)).Infof("Scaling down %s.%s", cd.Spec.TargetRef.Name, cd.Namespace) diff --git a/pkg/canary/deployer_test.go b/pkg/canary/deployer_test.go index cba0bb5d..d6164dd8 100644 --- a/pkg/canary/deployer_test.go +++ b/pkg/canary/deployer_test.go @@ -9,7 +9,7 @@ import ( func TestCanaryDeployer_Sync(t *testing.T) { mocks := SetupMocks() - _, _, err := mocks.deployer.Initialize(mocks.canary) + _, _, err := mocks.deployer.Initialize(mocks.canary, true) if err != nil { t.Fatal(err.Error()) } @@ -95,7 +95,7 @@ func TestCanaryDeployer_Sync(t *testing.T) { func TestCanaryDeployer_IsNewSpec(t *testing.T) { mocks := SetupMocks() - _, _, err := mocks.deployer.Initialize(mocks.canary) + _, _, err := mocks.deployer.Initialize(mocks.canary, true) if err != nil { t.Fatal(err.Error()) } @@ -118,7 +118,7 @@ func TestCanaryDeployer_IsNewSpec(t *testing.T) { func TestCanaryDeployer_Promote(t *testing.T) { mocks := SetupMocks() - _, _, err := mocks.deployer.Initialize(mocks.canary) + _, _, err := mocks.deployer.Initialize(mocks.canary, true) if err != nil { t.Fatal(err.Error()) } @@ -163,7 +163,7 @@ func TestCanaryDeployer_Promote(t *testing.T) { func TestCanaryDeployer_IsReady(t *testing.T) { mocks := SetupMocks() - _, _, err := mocks.deployer.Initialize(mocks.canary) + _, _, err := mocks.deployer.Initialize(mocks.canary, true) if err != nil { t.Error("Expected primary readiness check to fail") } @@ -181,7 +181,7 @@ func TestCanaryDeployer_IsReady(t *testing.T) { func TestCanaryDeployer_SetFailedChecks(t *testing.T) { mocks := SetupMocks() - _, _, err := mocks.deployer.Initialize(mocks.canary) + _, _, err := mocks.deployer.Initialize(mocks.canary, true) if err != nil { t.Fatal(err.Error()) } @@ -203,7 +203,7 @@ func TestCanaryDeployer_SetFailedChecks(t *testing.T) { func TestCanaryDeployer_SetState(t *testing.T) { mocks := SetupMocks() - _, _, err := mocks.deployer.Initialize(mocks.canary) + _, _, err := mocks.deployer.Initialize(mocks.canary, true) if err != nil { t.Fatal(err.Error()) } @@ -225,7 +225,7 @@ func TestCanaryDeployer_SetState(t *testing.T) { func TestCanaryDeployer_SyncStatus(t *testing.T) { mocks := SetupMocks() - _, _, err := mocks.deployer.Initialize(mocks.canary) + _, _, err := mocks.deployer.Initialize(mocks.canary, true) if err != nil { t.Fatal(err.Error()) } @@ -264,7 +264,7 @@ func TestCanaryDeployer_SyncStatus(t *testing.T) { func TestCanaryDeployer_Scale(t *testing.T) { mocks := SetupMocks() - _, _, err := mocks.deployer.Initialize(mocks.canary) + _, _, err := mocks.deployer.Initialize(mocks.canary, true) if err != nil { t.Fatal(err.Error()) } diff --git a/pkg/controller/scheduler.go b/pkg/controller/scheduler.go index 777f27ab..421632f3 100644 --- a/pkg/controller/scheduler.go +++ b/pkg/controller/scheduler.go @@ -91,7 +91,12 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh primaryName := fmt.Sprintf("%s-primary", cd.Spec.TargetRef.Name) // create primary deployment and hpa if needed - label, ports, err := c.deployer.Initialize(cd) + // skip primary check for Istio since the deployment will become ready after the ClusterIP are created + skipPrimaryCheck := false + if skipLivenessChecks || c.meshProvider == "istio" { + skipPrimaryCheck = true + } + label, ports, err := c.deployer.Initialize(cd, skipPrimaryCheck) if err != nil { c.recordEventWarningf(cd, "%v", err) return @@ -269,7 +274,7 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh } // canary fix routing: A/B testing - if len(cd.Spec.CanaryAnalysis.Match) > 0 { + if len(cd.Spec.CanaryAnalysis.Match) > 0 || cd.Spec.CanaryAnalysis.Iterations > 0 { // route traffic to canary and increment iterations if cd.Spec.CanaryAnalysis.Iterations > cd.Status.Iterations { if err := meshRouter.SetRoutes(cd, 0, 100); err != nil { @@ -614,7 +619,7 @@ func (c *Controller) analyseCanary(r *flaggerv1.Canary) bool { c.recordEventWarningf(r, "Halt advancement no values found for metric %s probably %s.%s is not receiving traffic", metric.Name, r.Spec.TargetRef.Name, r.Namespace) } else { - c.recordEventErrorf(r, "Metrics server %s query failed: %v", c.observerFactory.Client.GetMetricsServer(), err) + c.recordEventErrorf(r, "Metrics server %s query failed for %s: %v", c.observerFactory.Client.GetMetricsServer(), metric.Name, err) } return false }