From 7d340c5e614ad40163a35893f09bfefc6101a343 Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Sun, 17 Mar 2019 10:52:52 +0200 Subject: [PATCH] Change mesh providers based on cmd flag --- cmd/flagger/main.go | 1 + pkg/controller/controller.go | 3 +++ pkg/controller/scheduler.go | 7 +++---- pkg/router/appmesh.go | 14 +++++++------- pkg/router/appmesh_test.go | 4 ++-- pkg/router/factory.go | 20 +++++++++++++++----- 6 files changed, 31 insertions(+), 18 deletions(-) diff --git a/cmd/flagger/main.go b/cmd/flagger/main.go index 542182ca..3758bcb1 100644 --- a/cmd/flagger/main.go +++ b/cmd/flagger/main.go @@ -134,6 +134,7 @@ func main() { metricsServer, logger, slack, + meshProvider, ) flaggerInformerFactory.Start(stopCh) diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 3d26b7b5..35c0d060 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -44,6 +44,7 @@ type Controller struct { observer CanaryObserver recorder CanaryRecorder notifier *notifier.Slack + meshProvider string } func NewController( @@ -55,6 +56,7 @@ func NewController( metricServer string, logger *zap.SugaredLogger, notifier *notifier.Slack, + meshProvider string, ) *Controller { logger.Debug("Creating event broadcaster") @@ -100,6 +102,7 @@ func NewController( observer: observer, recorder: recorder, notifier: notifier, + meshProvider: meshProvider, } flaggerInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ diff --git a/pkg/controller/scheduler.go b/pkg/controller/scheduler.go index 6123f355..73d9334c 100644 --- a/pkg/controller/scheduler.go +++ b/pkg/controller/scheduler.go @@ -96,12 +96,11 @@ func (c *Controller) advanceCanary(name string, namespace string, skipLivenessCh } // init routers - rf := router.NewFactory(c.kubeClient, c.flaggerClient, c.logger, c.istioClient) - var meshRouter router.Interface - meshRouter = rf.IstioRouter() + routerFactory := router.NewFactory(c.kubeClient, c.flaggerClient, c.logger, c.istioClient) + meshRouter := routerFactory.MeshRouter(c.meshProvider) // create ClusterIP services and virtual service if needed - if err := rf.KubernetesRouter().Sync(cd); err != nil { + if err := routerFactory.KubernetesRouter().Sync(cd); err != nil { c.recordEventWarningf(cd, "%v", err) return } diff --git a/pkg/router/appmesh.go b/pkg/router/appmesh.go index d3851c99..231ae296 100644 --- a/pkg/router/appmesh.go +++ b/pkg/router/appmesh.go @@ -14,8 +14,8 @@ import ( "k8s.io/client-go/kubernetes" ) -// AppmeshRouter is managing AppMesh virtual services -type AppmeshRouter struct { +// AppMeshRouter is managing AppMesh virtual services +type AppMeshRouter struct { kubeClient kubernetes.Interface appmeshClient clientset.Interface flaggerClient clientset.Interface @@ -23,7 +23,7 @@ type AppmeshRouter struct { } // Sync creates or updates App Mesh virtual nodes and virtual services -func (ar *AppmeshRouter) Sync(canary *flaggerv1.Canary) error { +func (ar *AppMeshRouter) Sync(canary *flaggerv1.Canary) error { if canary.Spec.Service.MeshName == "" { return fmt.Errorf("mesh name cannot be empty") } @@ -67,7 +67,7 @@ func (ar *AppmeshRouter) Sync(canary *flaggerv1.Canary) error { // syncVirtualNode creates or updates a virtual node // the virtual node naming format is name-role-namespace -func (ar *AppmeshRouter) syncVirtualNode(canary *flaggerv1.Canary, name string, host string) error { +func (ar *AppMeshRouter) syncVirtualNode(canary *flaggerv1.Canary, name string, host string) error { backends := []appmeshv1alpha1.Backend{} for _, b := range canary.Spec.Service.Backends { backend := appmeshv1alpha1.Backend{ @@ -145,7 +145,7 @@ func (ar *AppmeshRouter) syncVirtualNode(canary *flaggerv1.Canary, name string, } // syncVirtualService creates or updates a virtual service -func (ar *AppmeshRouter) syncVirtualService(canary *flaggerv1.Canary, name string) error { +func (ar *AppMeshRouter) syncVirtualService(canary *flaggerv1.Canary, name string) error { targetName := canary.Spec.TargetRef.Name canaryVirtualNode := fmt.Sprintf("%s-canary-%s", targetName, canary.Namespace) primaryVirtualNode := fmt.Sprintf("%s-primary-%s", targetName, canary.Namespace) @@ -238,7 +238,7 @@ func (ar *AppmeshRouter) syncVirtualService(canary *flaggerv1.Canary, name strin } // GetRoutes returns the destinations weight for primary and canary -func (ar *AppmeshRouter) GetRoutes(canary *flaggerv1.Canary) ( +func (ar *AppMeshRouter) GetRoutes(canary *flaggerv1.Canary) ( primaryWeight int, canaryWeight int, err error, @@ -279,7 +279,7 @@ func (ar *AppmeshRouter) GetRoutes(canary *flaggerv1.Canary) ( } // SetRoutes updates the destinations weight for primary and canary -func (ar *AppmeshRouter) SetRoutes( +func (ar *AppMeshRouter) SetRoutes( canary *flaggerv1.Canary, primaryWeight int, canaryWeight int, diff --git a/pkg/router/appmesh_test.go b/pkg/router/appmesh_test.go index ad4618c3..13fd88b8 100644 --- a/pkg/router/appmesh_test.go +++ b/pkg/router/appmesh_test.go @@ -8,7 +8,7 @@ import ( func TestAppmeshRouter_Sync(t *testing.T) { mocks := setupfakeClients() - router := &AppmeshRouter{ + router := &AppMeshRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, appmeshClient: mocks.meshClient, @@ -132,7 +132,7 @@ func TestAppmeshRouter_Sync(t *testing.T) { func TestAppmeshRouter_GetSetRoutes(t *testing.T) { mocks := setupfakeClients() - router := &AppmeshRouter{ + router := &AppMeshRouter{ logger: mocks.logger, flaggerClient: mocks.flaggerClient, appmeshClient: mocks.meshClient, diff --git a/pkg/router/factory.go b/pkg/router/factory.go index 3a232845..99588428 100644 --- a/pkg/router/factory.go +++ b/pkg/router/factory.go @@ -8,7 +8,7 @@ import ( type Factory struct { kubeClient kubernetes.Interface - istioClient clientset.Interface + meshClient clientset.Interface flaggerClient clientset.Interface logger *zap.SugaredLogger } @@ -16,15 +16,16 @@ type Factory struct { func NewFactory(kubeClient kubernetes.Interface, flaggerClient clientset.Interface, logger *zap.SugaredLogger, - istioClient clientset.Interface) *Factory { + meshClient clientset.Interface) *Factory { return &Factory{ - istioClient: istioClient, + meshClient: meshClient, kubeClient: kubeClient, flaggerClient: flaggerClient, logger: logger, } } +// KubernetesRouter returns a ClusterIP service router func (factory *Factory) KubernetesRouter() *KubernetesRouter { return &KubernetesRouter{ logger: factory.logger, @@ -33,11 +34,20 @@ func (factory *Factory) KubernetesRouter() *KubernetesRouter { } } -func (factory *Factory) IstioRouter() *IstioRouter { +// MeshRouter returns a service mesh router (Istio or AppMesh) +func (factory *Factory) MeshRouter(provider string) Interface { + if provider == "appmesh" { + return &AppMeshRouter{ + logger: factory.logger, + flaggerClient: factory.flaggerClient, + kubeClient: factory.kubeClient, + appmeshClient: factory.meshClient, + } + } return &IstioRouter{ logger: factory.logger, flaggerClient: factory.flaggerClient, kubeClient: factory.kubeClient, - istioClient: factory.istioClient, + istioClient: factory.meshClient, } }