diff --git a/artifacts/flagger/crd.yaml b/artifacts/flagger/crd.yaml index 3dffd621..b1467d67 100644 --- a/artifacts/flagger/crd.yaml +++ b/artifacts/flagger/crd.yaml @@ -45,6 +45,8 @@ spec: - service - canaryAnalysis properties: + provider: + type: string progressDeadlineSeconds: type: number targetRef: diff --git a/charts/flagger/templates/crd.yaml b/charts/flagger/templates/crd.yaml index 44b3a115..a6eb7409 100644 --- a/charts/flagger/templates/crd.yaml +++ b/charts/flagger/templates/crd.yaml @@ -46,6 +46,8 @@ spec: - service - canaryAnalysis properties: + provider: + type: string progressDeadlineSeconds: type: number targetRef: diff --git a/pkg/apis/flagger/v1alpha3/types.go b/pkg/apis/flagger/v1alpha3/types.go index a07900aa..3d5b0364 100755 --- a/pkg/apis/flagger/v1alpha3/types.go +++ b/pkg/apis/flagger/v1alpha3/types.go @@ -45,6 +45,10 @@ type Canary struct { // CanarySpec is the spec for a Canary resource type CanarySpec struct { + // if specified overwrites the -mesh-provider flag for this particular canary + // +optional + Provider string `json:"provider,omitempty"` + // reference to target resource TargetRef hpav1.CrossVersionObjectReference `json:"targetRef"` diff --git a/pkg/controller/scheduler.go b/pkg/controller/scheduler.go index a6f9ddd3..943a9809 100644 --- a/pkg/controller/scheduler.go +++ b/pkg/controller/scheduler.go @@ -90,10 +90,16 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh primaryName := fmt.Sprintf("%s-primary", cd.Spec.TargetRef.Name) + // override the global provider if one is specified in the canary spec + provider := c.meshProvider + if cd.Spec.Provider != "" { + provider = cd.Spec.Provider + } + // create primary deployment and hpa if needed // skip primary check for Istio since the deployment will become ready after the ClusterIP are created skipPrimaryCheck := false - if skipLivenessChecks || strings.Contains(c.meshProvider, "istio") { + if skipLivenessChecks || strings.Contains(provider, "istio") { skipPrimaryCheck = true } label, ports, err := c.deployer.Initialize(cd, skipPrimaryCheck) @@ -103,7 +109,7 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh } // init routers - meshRouter := c.routerFactory.MeshRouter(c.meshProvider) + meshRouter := c.routerFactory.MeshRouter(provider) // create or update ClusterIP services if err := c.routerFactory.KubernetesRouter(label, ports).Reconcile(cd); err != nil { diff --git a/pkg/router/factory.go b/pkg/router/factory.go index 0a13eead..a14fef68 100644 --- a/pkg/router/factory.go +++ b/pkg/router/factory.go @@ -47,6 +47,8 @@ func (factory *Factory) MeshRouter(provider string) Interface { switch { case provider == "none": return &NopRouter{} + case provider == "kubernetes": + return &NopRouter{} case provider == "nginx": return &IngressRouter{ logger: factory.logger,