From e153b8a3df1be332862bfa1666ec8c4a0cfa71fe Mon Sep 17 00:00:00 2001 From: sopida-chotwanwirach Date: Wed, 13 Mar 2024 17:22:05 -0700 Subject: [PATCH] fix(gloo): Update reconciler to detect change in gloo upstream spec Signed-off-by: sopida-chotwanwirach --- pkg/router/gloo.go | 33 +++++++++++++++++++++++++++++++- test/gloo/test-canary.sh | 41 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/pkg/router/gloo.go b/pkg/router/gloo.go index 23658145c..b8a415280 100644 --- a/pkg/router/gloo.go +++ b/pkg/router/gloo.go @@ -275,7 +275,8 @@ func (gr *GlooRouter) createFlaggerUpstream(canary *flaggerv1.Canary, upstreamNa if err != nil { return fmt.Errorf("service %s.%s get query error: %w", svcName, canary.Namespace, err) } - _, err = upstreamClient.Get(context.TODO(), upstreamName, metav1.GetOptions{}) + curUpstream, err := upstreamClient.Get(context.TODO(), upstreamName, metav1.GetOptions{}) + if errors.IsNotFound(err) { glooUpstreamWithConfig, err := gr.getGlooConfigUpstream(canary) if err != nil { @@ -288,7 +289,37 @@ func (gr *GlooRouter) createFlaggerUpstream(canary *flaggerv1.Canary, upstreamNa } } else if err != nil { return fmt.Errorf("upstream %s.%s get query error: %w", upstreamName, canary.Namespace, err) + } else { + return gr.syncUpstreamSpec(curUpstream, canary) + } + return nil +} + +func (gr *GlooRouter) syncUpstreamSpec(curUpstream *gloov1.Upstream, canary *flaggerv1.Canary) error { + glooUpstreamWithConfig, err := gr.getGlooConfigUpstream(canary) + if err != nil { + return err + } + + if glooUpstreamWithConfig == nil { + return nil } + + glooUpstreamLB := glooUpstreamWithConfig.Spec.LoadBalancerConfig + loadBalancerDiff := cmp.Diff(glooUpstreamLB, curUpstream.Spec.LoadBalancerConfig) + + if loadBalancerDiff != "" { + gr.logger.Debugf("detect diff in upstream spec %s.%s %s", curUpstream.Name, canary.Namespace, loadBalancerDiff) + + cloneUpstream := curUpstream.DeepCopy() + cloneUpstream.Spec.LoadBalancerConfig = glooUpstreamLB + + _, err = gr.glooClient.GlooV1().Upstreams(canary.Namespace).Update(context.TODO(), cloneUpstream, metav1.UpdateOptions{}) + if err != nil { + return fmt.Errorf("upstream %s.%s spec update error: %w", curUpstream.Name, canary.Namespace, err) + } + } + return nil } diff --git a/test/gloo/test-canary.sh b/test/gloo/test-canary.sh index f3afd257b..047c58b9f 100755 --- a/test/gloo/test-canary.sh +++ b/test/gloo/test-canary.sh @@ -117,6 +117,47 @@ done echo '✔ Canary initialization test passed' +echo '>>> Waiting for primary spec to be updated' + +# Update gloo upstream on slow start config which will trigger update on flagger upstreams +cat <>> Triggering canary deployment' kubectl -n test set image deployment/podinfo podinfod=ghcr.io/stefanprodan/podinfo:6.0.1