From e8aba087acf6c4e17a9c47db97b544247f1a796d Mon Sep 17 00:00:00 2001 From: "jonny.langefeld" Date: Thu, 16 Mar 2023 16:52:33 -0700 Subject: [PATCH] Enable updates for labels and annotations Fix #1386 Signed-off-by: jonny.langefeld Signed-off-by: Jonny Langefeld Signed-off-by: Sanskar Jaiswal --- pkg/router/appmesh.go | 34 ++++++++++-------- pkg/router/appmesh_v1beta2.go | 35 +++++++++++-------- pkg/router/contour.go | 36 +++++++++++-------- pkg/router/gateway_api.go | 34 ++++++++++-------- pkg/router/gateway_api_v1beta1.go | 34 ++++++++++-------- pkg/router/gloo.go | 36 +++++++++++-------- pkg/router/istio.go | 44 ++++++++++++++--------- pkg/router/kuma.go | 58 ++++++++++++++++++------------- pkg/router/traefik.go | 37 +++++++++++--------- pkg/router/traefik_test.go | 2 +- 10 files changed, 205 insertions(+), 145 deletions(-) diff --git a/pkg/router/appmesh.go b/pkg/router/appmesh.go index c64244b18..7a351e222 100644 --- a/pkg/router/appmesh.go +++ b/pkg/router/appmesh.go @@ -143,25 +143,26 @@ func (ar *AppMeshRouter) reconcileVirtualNode(canary *flaggerv1.Canary, name str virtualnode, err := ar.appmeshClient.AppmeshV1beta1().VirtualNodes(canary.Namespace).Get(context.TODO(), name, metav1.GetOptions{}) + newMetadata := canary.Spec.Service.Apex + if newMetadata == nil { + newMetadata = &flaggerv1.CustomMetadata{} + } + if newMetadata.Labels == nil { + newMetadata.Labels = make(map[string]string) + } + if newMetadata.Annotations == nil { + newMetadata.Annotations = make(map[string]string) + } + newMetadata.Annotations = filterMetadata(newMetadata.Annotations) + // create virtual node if errors.IsNotFound(err) { - metadata := canary.Spec.Service.Apex - if metadata == nil { - metadata = &flaggerv1.CustomMetadata{} - } - if metadata.Labels == nil { - metadata.Labels = make(map[string]string) - } - if metadata.Annotations == nil { - metadata.Annotations = make(map[string]string) - } - virtualnode = &appmeshv1.VirtualNode{ ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: canary.Namespace, - Labels: metadata.Labels, - Annotations: filterMetadata(metadata.Annotations), + Labels: newMetadata.Labels, + Annotations: newMetadata.Annotations, }, Spec: vnSpec, } @@ -187,9 +188,14 @@ func (ar *AppMeshRouter) reconcileVirtualNode(canary *flaggerv1.Canary, name str // update virtual node if virtualnode != nil { - if diff := cmp.Diff(vnSpec, virtualnode.Spec); diff != "" { + specDiff := cmp.Diff(vnSpec, virtualnode.Spec) + labelsDiff := cmp.Diff(newMetadata.Labels, virtualnode.Labels, cmpopts.EquateEmpty()) + annotationsDiff := cmp.Diff(newMetadata.Labels, virtualnode.Annotations, cmpopts.EquateEmpty()) + if specDiff != "" || labelsDiff != "" || annotationsDiff != "" { vnClone := virtualnode.DeepCopy() vnClone.Spec = vnSpec + vnClone.ObjectMeta.Annotations = newMetadata.Annotations + vnClone.ObjectMeta.Labels = newMetadata.Labels _, err = ar.appmeshClient.AppmeshV1beta1().VirtualNodes(canary.Namespace).Update(context.TODO(), vnClone, metav1.UpdateOptions{}) if err != nil { return fmt.Errorf("VirtualNode %s update error %w", name, err) diff --git a/pkg/router/appmesh_v1beta2.go b/pkg/router/appmesh_v1beta2.go index 018258601..88eea3605 100644 --- a/pkg/router/appmesh_v1beta2.go +++ b/pkg/router/appmesh_v1beta2.go @@ -157,25 +157,26 @@ func (ar *AppMeshv1beta2Router) reconcileVirtualNode(canary *flaggerv1.Canary, n virtualnode, err := ar.appmeshClient.AppmeshV1beta2().VirtualNodes(canary.Namespace).Get(context.TODO(), name, metav1.GetOptions{}) + newMetadata := canary.Spec.Service.Apex + if newMetadata == nil { + newMetadata = &flaggerv1.CustomMetadata{} + } + if newMetadata.Labels == nil { + newMetadata.Labels = make(map[string]string) + } + if newMetadata.Annotations == nil { + newMetadata.Annotations = make(map[string]string) + } + newMetadata.Annotations = filterMetadata(newMetadata.Annotations) + // create virtual node if errors.IsNotFound(err) { - metadata := canary.Spec.Service.Apex - if metadata == nil { - metadata = &flaggerv1.CustomMetadata{} - } - if metadata.Labels == nil { - metadata.Labels = make(map[string]string) - } - if metadata.Annotations == nil { - metadata.Annotations = make(map[string]string) - } - virtualnode = &appmeshv1.VirtualNode{ ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: canary.Namespace, - Labels: metadata.Labels, - Annotations: filterMetadata(metadata.Annotations), + Labels: newMetadata.Labels, + Annotations: newMetadata.Annotations, }, Spec: vnSpec, } @@ -201,12 +202,16 @@ func (ar *AppMeshv1beta2Router) reconcileVirtualNode(canary *flaggerv1.Canary, n // update virtual node if virtualnode != nil { - if diff := cmp.Diff(vnSpec, virtualnode.Spec, - cmpopts.IgnoreFields(appmeshv1.VirtualNodeSpec{}, "AWSName", "MeshRef")); diff != "" { + specDiff := cmp.Diff(vnSpec, virtualnode.Spec, cmpopts.IgnoreFields(appmeshv1.VirtualNodeSpec{}, "AWSName", "MeshRef")) + labelsDiff := cmp.Diff(newMetadata.Labels, virtualnode.Labels, cmpopts.EquateEmpty()) + annotationsDiff := cmp.Diff(newMetadata.Annotations, virtualnode.Annotations, cmpopts.EquateEmpty()) + if specDiff != "" || labelsDiff != "" || annotationsDiff != "" { vnClone := virtualnode.DeepCopy() vnClone.Spec = vnSpec vnClone.Spec.AWSName = virtualnode.Spec.AWSName vnClone.Spec.MeshRef = virtualnode.Spec.MeshRef + vnClone.ObjectMeta.Annotations = newMetadata.Annotations + vnClone.ObjectMeta.Labels = newMetadata.Labels _, err = ar.appmeshClient.AppmeshV1beta2().VirtualNodes(canary.Namespace).Update(context.TODO(), vnClone, metav1.UpdateOptions{}) if err != nil { return fmt.Errorf("VirtualNode %s update error %w", name, err) diff --git a/pkg/router/contour.go b/pkg/router/contour.go index 8e30acffb..ebb2ddea7 100644 --- a/pkg/router/contour.go +++ b/pkg/router/contour.go @@ -151,25 +151,26 @@ func (cr *ContourRouter) Reconcile(canary *flaggerv1.Canary) error { } } + newMetadata := canary.Spec.Service.Apex + if newMetadata == nil { + newMetadata = &flaggerv1.CustomMetadata{} + } + if newMetadata.Labels == nil { + newMetadata.Labels = make(map[string]string) + } + if newMetadata.Annotations == nil { + newMetadata.Annotations = make(map[string]string) + } + newMetadata.Annotations = filterMetadata(newMetadata.Annotations) + proxy, err := cr.contourClient.ProjectcontourV1().HTTPProxies(canary.Namespace).Get(context.TODO(), apexName, metav1.GetOptions{}) if errors.IsNotFound(err) { - metadata := canary.Spec.Service.Apex - if metadata == nil { - metadata = &flaggerv1.CustomMetadata{} - } - if metadata.Labels == nil { - metadata.Labels = make(map[string]string) - } - if metadata.Annotations == nil { - metadata.Annotations = make(map[string]string) - } - proxy = &contourv1.HTTPProxy{ ObjectMeta: metav1.ObjectMeta{ Name: apexName, Namespace: canary.Namespace, - Labels: metadata.Labels, - Annotations: filterMetadata(metadata.Annotations), + Labels: newMetadata.Labels, + Annotations: newMetadata.Annotations, }, Spec: newSpec, Status: contourv1.HTTPProxyStatus{ @@ -207,13 +208,18 @@ func (cr *ContourRouter) Reconcile(canary *flaggerv1.Canary) error { // update HTTPProxy but keep the original destination weights if proxy != nil { - if diff := cmp.Diff( + specDiff := cmp.Diff( newSpec, proxy.Spec, cmpopts.IgnoreFields(contourv1.Service{}, "Weight"), - ); diff != "" { + ) + labelsDiff := cmp.Diff(newMetadata.Labels, proxy.Labels, cmpopts.EquateEmpty()) + annotationsDiff := cmp.Diff(newMetadata.Annotations, proxy.Annotations, cmpopts.EquateEmpty()) + if specDiff != "" || labelsDiff != "" || annotationsDiff != "" { clone := proxy.DeepCopy() clone.Spec = newSpec + clone.ObjectMeta.Annotations = newMetadata.Annotations + clone.ObjectMeta.Labels = newMetadata.Labels _, err = cr.contourClient.ProjectcontourV1().HTTPProxies(canary.Namespace).Update(context.TODO(), clone, metav1.UpdateOptions{}) if err != nil { diff --git a/pkg/router/gateway_api.go b/pkg/router/gateway_api.go index d1027542e..b29142071 100644 --- a/pkg/router/gateway_api.go +++ b/pkg/router/gateway_api.go @@ -123,23 +123,25 @@ func (gwr *GatewayAPIRouter) Reconcile(canary *flaggerv1.Canary) error { context.TODO(), apexSvcName, metav1.GetOptions{}, ) + newMetadata := canary.Spec.Service.Apex + if newMetadata == nil { + newMetadata = &flaggerv1.CustomMetadata{} + } + if newMetadata.Labels == nil { + newMetadata.Labels = make(map[string]string) + } + if newMetadata.Annotations == nil { + newMetadata.Annotations = make(map[string]string) + } + newMetadata.Annotations = filterMetadata(newMetadata.Annotations) + if errors.IsNotFound(err) { - metadata := canary.Spec.Service.Apex - if metadata == nil { - metadata = &flaggerv1.CustomMetadata{} - } - if metadata.Labels == nil { - metadata.Labels = make(map[string]string) - } - if metadata.Annotations == nil { - metadata.Annotations = make(map[string]string) - } route := &v1alpha2.HTTPRoute{ ObjectMeta: metav1.ObjectMeta{ Name: apexSvcName, Namespace: hrNamespace, - Labels: metadata.Labels, - Annotations: filterMetadata(metadata.Annotations), + Labels: newMetadata.Labels, + Annotations: newMetadata.Annotations, }, Spec: httpRouteSpec, } @@ -167,13 +169,17 @@ func (gwr *GatewayAPIRouter) Reconcile(canary *flaggerv1.Canary) error { } if httpRoute != nil { - diff := cmp.Diff( + specDiff := cmp.Diff( httpRoute.Spec, httpRouteSpec, cmpopts.IgnoreFields(v1alpha2.BackendRef{}, "Weight"), ) - if diff != "" && httpRoute.Name != "" { + labelsDiff := cmp.Diff(newMetadata.Labels, httpRoute.Labels, cmpopts.EquateEmpty()) + annotationsDiff := cmp.Diff(newMetadata.Annotations, httpRoute.Annotations, cmpopts.EquateEmpty()) + if (specDiff != "" && httpRoute.Name != "") || labelsDiff != "" || annotationsDiff != "" { hrClone := httpRoute.DeepCopy() hrClone.Spec = httpRouteSpec + hrClone.ObjectMeta.Annotations = newMetadata.Annotations + hrClone.ObjectMeta.Labels = newMetadata.Labels _, err := gwr.gatewayAPIClient.GatewayapiV1alpha2().HTTPRoutes(hrNamespace). Update(context.TODO(), hrClone, metav1.UpdateOptions{}) if err != nil { diff --git a/pkg/router/gateway_api_v1beta1.go b/pkg/router/gateway_api_v1beta1.go index a6bd70b57..19ed8c701 100644 --- a/pkg/router/gateway_api_v1beta1.go +++ b/pkg/router/gateway_api_v1beta1.go @@ -117,23 +117,25 @@ func (gwr *GatewayAPIV1Beta1Router) Reconcile(canary *flaggerv1.Canary) error { context.TODO(), apexSvcName, metav1.GetOptions{}, ) + newMetadata := canary.Spec.Service.Apex + if newMetadata == nil { + newMetadata = &flaggerv1.CustomMetadata{} + } + if newMetadata.Labels == nil { + newMetadata.Labels = make(map[string]string) + } + if newMetadata.Annotations == nil { + newMetadata.Annotations = make(map[string]string) + } + newMetadata.Annotations = filterMetadata(newMetadata.Annotations) + if errors.IsNotFound(err) { - metadata := canary.Spec.Service.Apex - if metadata == nil { - metadata = &flaggerv1.CustomMetadata{} - } - if metadata.Labels == nil { - metadata.Labels = make(map[string]string) - } - if metadata.Annotations == nil { - metadata.Annotations = make(map[string]string) - } route := &v1beta1.HTTPRoute{ ObjectMeta: metav1.ObjectMeta{ Name: apexSvcName, Namespace: hrNamespace, - Labels: metadata.Labels, - Annotations: filterMetadata(metadata.Annotations), + Labels: newMetadata.Labels, + Annotations: newMetadata.Annotations, }, Spec: httpRouteSpec, } @@ -161,13 +163,17 @@ func (gwr *GatewayAPIV1Beta1Router) Reconcile(canary *flaggerv1.Canary) error { } if httpRoute != nil { - diff := cmp.Diff( + specDiff := cmp.Diff( httpRoute.Spec, httpRouteSpec, cmpopts.IgnoreFields(v1beta1.BackendRef{}, "Weight"), ) - if diff != "" && httpRoute.Name != "" { + labelsDiff := cmp.Diff(newMetadata.Labels, httpRoute.Labels, cmpopts.EquateEmpty()) + annotationsDiff := cmp.Diff(newMetadata.Annotations, httpRoute.Annotations, cmpopts.EquateEmpty()) + if (specDiff != "" && httpRoute.Name != "") || labelsDiff != "" || annotationsDiff != "" { hrClone := httpRoute.DeepCopy() hrClone.Spec = httpRouteSpec + hrClone.ObjectMeta.Annotations = newMetadata.Annotations + hrClone.ObjectMeta.Labels = newMetadata.Labels _, err := gwr.gatewayAPIClient.GatewayapiV1beta1().HTTPRoutes(hrNamespace). Update(context.TODO(), hrClone, metav1.UpdateOptions{}) if err != nil { diff --git a/pkg/router/gloo.go b/pkg/router/gloo.go index 519a4a1d0..ce0d59c48 100644 --- a/pkg/router/gloo.go +++ b/pkg/router/gloo.go @@ -98,25 +98,26 @@ func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { }, } + newMetadata := canary.Spec.Service.Apex + if newMetadata == nil { + newMetadata = &flaggerv1.CustomMetadata{} + } + if newMetadata.Labels == nil { + newMetadata.Labels = make(map[string]string) + } + if newMetadata.Annotations == nil { + newMetadata.Annotations = make(map[string]string) + } + newMetadata.Annotations = filterMetadata(newMetadata.Annotations) + routeTable, err := gr.glooClient.GatewayV1().RouteTables(canary.Namespace).Get(context.TODO(), apexName, metav1.GetOptions{}) if errors.IsNotFound(err) { - metadata := canary.Spec.Service.Apex - if metadata == nil { - metadata = &flaggerv1.CustomMetadata{} - } - if metadata.Labels == nil { - metadata.Labels = make(map[string]string) - } - if metadata.Annotations == nil { - metadata.Annotations = make(map[string]string) - } - routeTable = &gatewayv1.RouteTable{ ObjectMeta: metav1.ObjectMeta{ Name: apexName, Namespace: canary.Namespace, - Labels: metadata.Labels, - Annotations: filterMetadata(metadata.Annotations), + Labels: newMetadata.Labels, + Annotations: newMetadata.Annotations, }, Spec: newSpec, } @@ -143,13 +144,18 @@ func (gr *GlooRouter) Reconcile(canary *flaggerv1.Canary) error { // update routeTable but keep the original destination weights if routeTable != nil { - if diff := cmp.Diff( + specDiff := cmp.Diff( newSpec, routeTable.Spec, cmpopts.IgnoreFields(gatewayv1.WeightedDestination{}, "Weight"), - ); diff != "" { + ) + labelsDiff := cmp.Diff(newMetadata.Labels, routeTable.Labels, cmpopts.EquateEmpty()) + annotationsDiff := cmp.Diff(newMetadata.Annotations, routeTable.Annotations, cmpopts.EquateEmpty()) + if specDiff != "" || labelsDiff != "" || annotationsDiff != "" { clone := routeTable.DeepCopy() clone.Spec = newSpec + clone.ObjectMeta.Annotations = newMetadata.Annotations + clone.ObjectMeta.Labels = newMetadata.Labels _, err = gr.glooClient.GatewayV1().RouteTables(canary.Namespace).Update(context.TODO(), clone, metav1.UpdateOptions{}) if err != nil { diff --git a/pkg/router/istio.go b/pkg/router/istio.go index 5cf21e425..572a13db8 100644 --- a/pkg/router/istio.go +++ b/pkg/router/istio.go @@ -191,6 +191,18 @@ func (ir *IstioRouter) reconcileVirtualService(canary *flaggerv1.Canary) error { }, } + newMetadata := canary.Spec.Service.Apex + if newMetadata == nil { + newMetadata = &flaggerv1.CustomMetadata{} + } + if newMetadata.Labels == nil { + newMetadata.Labels = make(map[string]string) + } + if newMetadata.Annotations == nil { + newMetadata.Annotations = make(map[string]string) + } + newMetadata.Annotations = filterMetadata(newMetadata.Annotations) + if len(canary.GetAnalysis().Match) > 0 { canaryMatch := mergeMatchConditions(canary.GetAnalysis().Match, canary.Spec.Service.Match) newSpec.Http = []istiov1alpha3.HTTPRoute{ @@ -220,23 +232,12 @@ func (ir *IstioRouter) reconcileVirtualService(canary *flaggerv1.Canary) error { virtualService, err := ir.istioClient.NetworkingV1alpha3().VirtualServices(canary.Namespace).Get(context.TODO(), apexName, metav1.GetOptions{}) // insert if errors.IsNotFound(err) { - metadata := canary.Spec.Service.Apex - if metadata == nil { - metadata = &flaggerv1.CustomMetadata{} - } - if metadata.Labels == nil { - metadata.Labels = make(map[string]string) - } - if metadata.Annotations == nil { - metadata.Annotations = make(map[string]string) - } - virtualService = &istiov1alpha3.VirtualService{ ObjectMeta: metav1.ObjectMeta{ Name: apexName, Namespace: canary.Namespace, - Labels: metadata.Labels, - Annotations: filterMetadata(metadata.Annotations), + Labels: newMetadata.Labels, + Annotations: newMetadata.Annotations, }, Spec: newSpec, } @@ -282,20 +283,31 @@ func (ir *IstioRouter) reconcileVirtualService(canary *flaggerv1.Canary) error { ignoreCmpOptions = append(ignoreCmpOptions, ignoreSlice) ignoreCmpOptions = append(ignoreCmpOptions, cmpopts.IgnoreFields(istiov1alpha3.HTTPRouteDestination{}, "Headers")) } + if v, ok := virtualService.Annotations[kubectlAnnotation]; ok { + newMetadata.Annotations[kubectlAnnotation] = v + } + if v, ok := virtualService.Annotations[configAnnotation]; ok { + newMetadata.Annotations[configAnnotation] = v + } // update service but keep the original destination weights and mirror if virtualService != nil { - if diff := cmp.Diff( + specDiff := cmp.Diff( newSpec, virtualService.Spec, ignoreCmpOptions..., - ); diff != "" { + ) + labelsDiff := cmp.Diff(newMetadata.Labels, virtualService.Labels, cmpopts.EquateEmpty()) + annotationsDiff := cmp.Diff(newMetadata.Annotations, virtualService.Annotations, cmpopts.EquateEmpty()) + if specDiff != "" || labelsDiff != "" || annotationsDiff != "" { vtClone := virtualService.DeepCopy() vtClone.Spec = newSpec + vtClone.ObjectMeta.Annotations = newMetadata.Annotations + vtClone.ObjectMeta.Labels = newMetadata.Labels //If annotation kubectl.kubernetes.io/last-applied-configuration is present no need to duplicate //serialization. If not present store the serialized object in annotation //flagger.kubernetes.app/original-configuration - if _, ok := vtClone.Annotations[kubectlAnnotation]; !ok { + if _, ok := vtClone.Annotations[kubectlAnnotation]; !ok && specDiff != "" { b, err := json.Marshal(virtualService.Spec) if err != nil { ir.logger.Warnf("Unable to marshal VS %s for orig-configuration annotation", virtualService.Name) diff --git a/pkg/router/kuma.go b/pkg/router/kuma.go index 7025808d5..fe25f2a21 100644 --- a/pkg/router/kuma.go +++ b/pkg/router/kuma.go @@ -63,22 +63,22 @@ func (kr *KumaRouter) Reconcile(canary *flaggerv1.Canary) error { }, } + newMetadata := canary.Spec.Service.Apex + if newMetadata == nil { + newMetadata = &flaggerv1.CustomMetadata{} + } + if newMetadata.Labels == nil { + newMetadata.Labels = make(map[string]string) + } + if newMetadata.Annotations == nil { + newMetadata.Annotations = make(map[string]string) + } + newMetadata.Annotations = filterMetadata(newMetadata.Annotations) + tr, err := kr.kumaClient.KumaV1alpha1().TrafficRoutes().Get(context.TODO(), apexName, metav1.GetOptions{}) // create TrafficRoute if errors.IsNotFound(err) { - metadata := canary.Spec.Service.Apex - if metadata == nil { - metadata = &flaggerv1.CustomMetadata{} - } - if metadata.Labels == nil { - metadata.Labels = make(map[string]string) - } - if metadata.Annotations == nil { - metadata.Annotations = make(map[string]string) - metadata.Annotations[fmt.Sprintf("%d.service.kuma.io", canary.Spec.Service.Port)] = "http" - } - meshName, ok := canary.Annotations["kuma.io/mesh"] if !ok { meshName = "default" @@ -88,7 +88,8 @@ func (kr *KumaRouter) Reconcile(canary *flaggerv1.Canary) error { t := &kumav1alpha1.TrafficRoute{ ObjectMeta: metav1.ObjectMeta{ Name: apexName, - Annotations: filterMetadata(metadata.Annotations), + Labels: newMetadata.Labels, + Annotations: newMetadata.Annotations, }, Spec: trSpec, Mesh: meshName, @@ -108,19 +109,26 @@ func (kr *KumaRouter) Reconcile(canary *flaggerv1.Canary) error { } // update TrafficRoute - if diff := cmp.Diff(trSpec, tr.Spec, cmpopts.IgnoreFields(kumav1alpha1.TrafficRouteSplit{}, "Weight")); diff != "" { - trClone := tr.DeepCopy() - trClone.Spec = trSpec - - _, err := kr.kumaClient.KumaV1alpha1().TrafficRoutes().Update(context.TODO(), trClone, metav1.UpdateOptions{}) - - if err != nil { - return fmt.Errorf("TrafficRoute %s update error: %w", apexName, err) + if tr != nil { + specDiff := cmp.Diff(trSpec, tr.Spec, cmpopts.IgnoreFields(kumav1alpha1.TrafficRouteSplit{}, "Weight")) + labelsDiff := cmp.Diff(newMetadata.Labels, tr.Labels, cmpopts.EquateEmpty()) + annotationsDiff := cmp.Diff(newMetadata.Annotations, tr.Annotations, cmpopts.EquateEmpty()) + if specDiff != "" || labelsDiff != "" || annotationsDiff != "" { + trClone := tr.DeepCopy() + trClone.Spec = trSpec + trClone.ObjectMeta.Annotations = newMetadata.Annotations + trClone.ObjectMeta.Labels = newMetadata.Labels + + _, err := kr.kumaClient.KumaV1alpha1().TrafficRoutes().Update(context.TODO(), trClone, metav1.UpdateOptions{}) + + if err != nil { + return fmt.Errorf("TrafficRoute %s update error: %w", apexName, err) + } + + kr.logger.With("canary", fmt.Sprintf("%s.%s", canary.Name, canary.Namespace)). + Infof("TrafficRoute %s.%s updated", apexName, canary.Namespace) + return nil } - - kr.logger.With("canary", fmt.Sprintf("%s.%s", canary.Name, canary.Namespace)). - Infof("TrafficRoute %s.%s updated", apexName, canary.Namespace) - return nil } return nil diff --git a/pkg/router/traefik.go b/pkg/router/traefik.go index ecc744478..0625fecbe 100644 --- a/pkg/router/traefik.go +++ b/pkg/router/traefik.go @@ -55,25 +55,26 @@ func (tr *TraefikRouter) Reconcile(canary *flaggerv1.Canary) error { }, } + newMetadata := canary.Spec.Service.Apex + if newMetadata == nil { + newMetadata = &flaggerv1.CustomMetadata{} + } + if newMetadata.Labels == nil { + newMetadata.Labels = make(map[string]string) + } + if newMetadata.Annotations == nil { + newMetadata.Annotations = make(map[string]string) + } + newMetadata.Annotations = filterMetadata(newMetadata.Annotations) + traefikService, err := tr.traefikClient.TraefikV1alpha1().TraefikServices(canary.Namespace).Get(context.TODO(), apexName, metav1.GetOptions{}) if errors.IsNotFound(err) { - tsMetadata := canary.Spec.Service.Apex - if tsMetadata == nil { - tsMetadata = &flaggerv1.CustomMetadata{} - } - if tsMetadata.Labels == nil { - tsMetadata.Labels = make(map[string]string) - } - if tsMetadata.Annotations == nil { - tsMetadata.Annotations = make(map[string]string) - } - traefikService = &traefikv1alpha1.TraefikService{ ObjectMeta: metav1.ObjectMeta{ Name: apexName, Namespace: canary.Namespace, - Labels: tsMetadata.Labels, - Annotations: filterMetadata(tsMetadata.Annotations), + Labels: newMetadata.Labels, + Annotations: newMetadata.Annotations, }, Spec: newSpec, } @@ -112,14 +113,18 @@ func (tr *TraefikRouter) Reconcile(canary *flaggerv1.Canary) error { ) } - if diff := cmp.Diff( + specDiff := cmp.Diff( newSpec, traefikService.Spec, cmpopts.IgnoreFields(traefikv1alpha1.Service{}, "Weight"), - ); diff != "" { - + ) + labelsDiff := cmp.Diff(newMetadata.Labels, traefikService.Labels, cmpopts.EquateEmpty()) + annotationsDiff := cmp.Diff(newMetadata.Annotations, traefikService.Annotations, cmpopts.EquateEmpty()) + if specDiff != "" || labelsDiff != "" || annotationsDiff != "" { clone := traefikService.DeepCopy() clone.Spec = newSpec + clone.ObjectMeta.Annotations = newMetadata.Annotations + clone.ObjectMeta.Labels = newMetadata.Labels _, err = tr.traefikClient.TraefikV1alpha1().TraefikServices(canary.Namespace).Update(context.TODO(), clone, metav1.UpdateOptions{}) if err != nil { diff --git a/pkg/router/traefik_test.go b/pkg/router/traefik_test.go index 9e172cfcd..dcd7a7ca5 100644 --- a/pkg/router/traefik_test.go +++ b/pkg/router/traefik_test.go @@ -52,7 +52,7 @@ func TestTraefikRouter_Reconcile(t *testing.T) { assert.Equal(t, uint(100), services[0].Weight) assert.Equal(t, ts.ObjectMeta.Labels, mocks.canary.Spec.Service.Apex.Labels) - assert.Equal(t, ts.ObjectMeta.Annotations, filterMetadata(mocks.canary.Spec.Service.Apex.Annotations)) + assert.Equal(t, filterMetadata(ts.ObjectMeta.Annotations), filterMetadata(mocks.canary.Spec.Service.Apex.Annotations)) for _, tt := range []struct { name string