diff --git a/pkg/router/kubernetes_default.go b/pkg/router/kubernetes_default.go index f6c9fcb3a..c29d0ec68 100644 --- a/pkg/router/kubernetes_default.go +++ b/pkg/router/kubernetes_default.go @@ -206,9 +206,11 @@ func (c *KubernetesDefaultRouter) reconcileService(canary *flaggerv1.Canary, nam portsDiff := cmp.Diff(svcSpec.Ports, svc.Spec.Ports, cmpopts.SortSlices(sortPorts)) selectorsDiff := cmp.Diff(svcSpec.Selector, svc.Spec.Selector) - if portsDiff != "" || selectorsDiff != "" { + trafficDistributionDiff := cmp.Diff(svcSpec.TrafficDistribution, svc.Spec.TrafficDistribution) + if portsDiff != "" || selectorsDiff != "" || trafficDistributionDiff != "" { svcClone.Spec.Ports = svcSpec.Ports svcClone.Spec.Selector = svcSpec.Selector + svcClone.Spec.TrafficDistribution = svcSpec.TrafficDistribution updateService = true } diff --git a/pkg/router/kubernetes_default_test.go b/pkg/router/kubernetes_default_test.go index c9864f776..8f2fcbc17 100644 --- a/pkg/router/kubernetes_default_test.go +++ b/pkg/router/kubernetes_default_test.go @@ -97,6 +97,51 @@ func TestServiceRouter_TrafficDistribution(t *testing.T) { assert.Equal(t, trafficDistribution, *apexSvc.Spec.TrafficDistribution) } +func TestServiceRouter_UpdateTrafficDistribution(t *testing.T) { + mocks := newFixture(nil) + router := &KubernetesDefaultRouter{ + kubeClient: mocks.kubeClient, + flaggerClient: mocks.flaggerClient, + logger: mocks.logger, + } + + err := router.Initialize(mocks.canary) + require.NoError(t, err) + + err = router.Reconcile(mocks.canary) + require.NoError(t, err) + + canary, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Get(context.TODO(), "podinfo", metav1.GetOptions{}) + require.NoError(t, err) + + canaryClone := canary.DeepCopy() + trafficDistribution := "PreferClose" + canaryClone.Spec.Service.TrafficDistribution = trafficDistribution + + updatedCanary, err := mocks.flaggerClient.FlaggerV1beta1().Canaries("default").Update(context.TODO(), canaryClone, metav1.UpdateOptions{}) + require.NoError(t, err) + + err = router.Initialize(updatedCanary) + require.NoError(t, err) + err = router.Reconcile(updatedCanary) + require.NoError(t, err) + + canarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get(context.TODO(), "podinfo-canary", metav1.GetOptions{}) + require.NoError(t, err) + require.NotNil(t, canarySvc.Spec.TrafficDistribution) + assert.Equal(t, trafficDistribution, *canarySvc.Spec.TrafficDistribution) + + primarySvc, err := mocks.kubeClient.CoreV1().Services("default").Get(context.TODO(), "podinfo-primary", metav1.GetOptions{}) + require.NoError(t, err) + require.NotNil(t, primarySvc.Spec.TrafficDistribution) + assert.Equal(t, trafficDistribution, *primarySvc.Spec.TrafficDistribution) + + apexSvc, err := mocks.kubeClient.CoreV1().Services("default").Get(context.TODO(), "podinfo", metav1.GetOptions{}) + require.NoError(t, err) + require.NotNil(t, apexSvc.Spec.TrafficDistribution) + assert.Equal(t, trafficDistribution, *apexSvc.Spec.TrafficDistribution) +} + func TestServiceRouter_Update(t *testing.T) { mocks := newFixture(nil) router := &KubernetesDefaultRouter{