From d5dd0f7e512ca4a65fa7f568fce10db10ad97b71 Mon Sep 17 00:00:00 2001 From: Stephen Kitt Date: Thu, 5 Mar 2020 18:05:24 +0100 Subject: [PATCH] Retry dns-operator updates on conflicts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This uses the standard K8s retry pattern. It’s not the only place in subctl where we need to do this, I’ll follow up with another PR to fix the rest. Fixes: #236 Signed-off-by: Stephen Kitt (cherry picked from commit 2afe090c6679238129094db908c413007acebe00) --- pkg/subctl/lighthouse/dns/ensure.go | 43 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/pkg/subctl/lighthouse/dns/ensure.go b/pkg/subctl/lighthouse/dns/ensure.go index cf789879b..e3db87087 100644 --- a/pkg/subctl/lighthouse/dns/ensure.go +++ b/pkg/subctl/lighthouse/dns/ensure.go @@ -28,6 +28,7 @@ import ( clientset "k8s.io/client-go/kubernetes" clientsetifc "k8s.io/client-go/kubernetes/typed/apps/v1" "k8s.io/client-go/rest" + "k8s.io/client-go/util/retry" "github.com/submariner-io/submariner-operator/pkg/internal/cli" ) @@ -223,32 +224,30 @@ func setupOpenShift(status *cli.Status, clientSet *clientset.Clientset, repo str // Update operator deployment deployments := clientSet.AppsV1().Deployments("openshift-dns-operator") - if deployments == nil { - // Assume we're not on OpenShift - return nil - } - deployment, err := deployments.Get("dns-operator", metav1.GetOptions{}) - if err != nil { - return err - } - if deployment == nil { - // Assume we're not on OpenShift - return nil - } - for i, container := range deployment.Spec.Template.Spec.Containers { - if container.Name == "dns-operator" { - deployment.Spec.Template.Spec.Containers[i].Image = repo + operatorImage + ":" + version - for j, env := range container.Env { - if env.Name == "IMAGE" { - deployment.Spec.Template.Spec.Containers[i].Env[j].Value = repo + openShiftCoreDNSImage + ":" + version + retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error { + deployment, err := deployments.Get("dns-operator", metav1.GetOptions{}) + if errors.IsNotFound(err) { + // Assume we're not on OpenShift + return nil + } else if err != nil { + return err + } + for i, container := range deployment.Spec.Template.Spec.Containers { + if container.Name == "dns-operator" { + deployment.Spec.Template.Spec.Containers[i].Image = repo + operatorImage + ":" + version + for j, env := range container.Env { + if env.Name == "IMAGE" { + deployment.Spec.Template.Spec.Containers[i].Env[j].Value = repo + openShiftCoreDNSImage + ":" + version + } } + status.QueueSuccessMessage("Updated DNS operator deployment") } - status.QueueSuccessMessage("Updated DNS operator deployment") } - } - _, err = deployments.Update(deployment) - if err != nil { + _, err = deployments.Update(deployment) return err + }) + if retryErr != nil { + return fmt.Errorf("Error updating dns-operator deployment: %v", retryErr) } // Scale DNS operator down and back up