Change mesh providers based on cmd flag

This commit is contained in:
stefanprodan
2019-03-17 10:52:52 +02:00
parent 337c94376d
commit 7d340c5e61
6 changed files with 31 additions and 18 deletions
+1
View File
@@ -134,6 +134,7 @@ func main() {
metricsServer,
logger,
slack,
meshProvider,
)
flaggerInformerFactory.Start(stopCh)
+3
View File
@@ -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{
+3 -4
View File
@@ -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
}
+7 -7
View File
@@ -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,
+2 -2
View File
@@ -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,
+15 -5
View File
@@ -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,
}
}