From b16bb45d003ba71e1413b97f7879c58159b2e535 Mon Sep 17 00:00:00 2001 From: Artiom Diomin Date: Mon, 18 Mar 2019 12:22:43 +0200 Subject: [PATCH] Re-initialize dynamic client to drop CRD cache see: https://github.com/kubernetes-sigs/controller-runtime/issues/321 Signed-off-by: Artiom Diomin --- pkg/templates/canal/canal.go | 18 +++++++++++++----- pkg/templates/machinecontroller/deployment.go | 4 +++- pkg/util/kubeconfig.go | 16 ++++++++++++---- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/pkg/templates/canal/canal.go b/pkg/templates/canal/canal.go index 9f8453896..c70ac2825 100644 --- a/pkg/templates/canal/canal.go +++ b/pkg/templates/canal/canal.go @@ -66,6 +66,8 @@ func Deploy(ctx *util.Context) error { return errors.New("kubernetes dynamic client is not initialized") } + var err error + // Populate Flannel network configuration tpl, err := template.New("base").Parse(flannelNetworkConfig) if err != nil { @@ -77,7 +79,7 @@ func Deploy(ctx *util.Context) error { } buf := bytes.Buffer{} - if err := tpl.Execute(&buf, variables); err != nil { + if err = tpl.Execute(&buf, variables); err != nil { return errors.Wrap(err, "failed to render canal config") } @@ -85,19 +87,19 @@ func Deploy(ctx *util.Context) error { // ConfigMap cm := configMap() cm.Data["net-conf.json"] = buf.String() - if err := simpleCreateOrUpdate(bgCtx, ctx.DynamicClient, cm); err != nil { + if err = simpleCreateOrUpdate(bgCtx, ctx.DynamicClient, cm); err != nil { return errors.Wrap(err, "failed to ensure canal ConfigMap") } // DaemonSet ds := daemonSet() - if err := simpleCreateOrUpdate(bgCtx, ctx.DynamicClient, ds); err != nil { + if err = simpleCreateOrUpdate(bgCtx, ctx.DynamicClient, ds); err != nil { return errors.Wrap(err, "failed to ensure canal DaemonSet") } // ServiceAccount sa := serviceAccount() - if err := simpleCreateOrUpdate(bgCtx, ctx.DynamicClient, sa); err != nil { + if err = simpleCreateOrUpdate(bgCtx, ctx.DynamicClient, sa); err != nil { return errors.Wrap(err, "failed to ensure canal ServiceAccount") } @@ -114,11 +116,17 @@ func Deploy(ctx *util.Context) error { } for _, crdGen := range crdGenerators { - if err := simpleCreateOrUpdate(bgCtx, ctx.DynamicClient, crdGen()); err != nil { + if err = simpleCreateOrUpdate(bgCtx, ctx.DynamicClient, crdGen()); err != nil { return errors.Wrap(err, "failed to ensure canal CustomResourceDefinition") } } + // HACK: re-init dynamic client in order to re-init RestMapper, to drop caches + err = util.HackIssue321InitDynamicClient(ctx) + if err != nil { + return errors.Wrap(err, "failed to re-init dynamic client") + } + // ClusterRoles crGenerators := []func() *rbacv1.ClusterRole{ calicoClusterRole, diff --git a/pkg/templates/machinecontroller/deployment.go b/pkg/templates/machinecontroller/deployment.go index b1c233329..12fa585e4 100644 --- a/pkg/templates/machinecontroller/deployment.go +++ b/pkg/templates/machinecontroller/deployment.go @@ -128,7 +128,9 @@ func Deploy(ctx *util.Context) error { } } - return nil + // HACK: re-init dynamic client in order to re-init RestMapper, to drop caches + err = util.HackIssue321InitDynamicClient(ctx) + return errors.Wrap(err, "failed to re-init dynamic client") } // WaitForMachineController waits for machine-controller-webhook to become running diff --git a/pkg/util/kubeconfig.go b/pkg/util/kubeconfig.go index 9efef818d..e9f720159 100644 --- a/pkg/util/kubeconfig.go +++ b/pkg/util/kubeconfig.go @@ -60,10 +60,18 @@ func BuildKubernetesClientset(ctx *Context) error { return errors.Wrap(err, "unable to build apiextension-apiserver clientset") } - ctx.DynamicClient, err = client.New(ctx.RESTConfig, client.Options{}) - if err != nil { - return errors.Wrap(err, "unable to build dynamic client") + err = HackIssue321InitDynamicClient(ctx) + return errors.Wrap(err, "unable to build dynamic client") +} + +// HackIssue321InitDynamicClient initialize controller-runtime/client +// name comes from: https://github.com/kubernetes-sigs/controller-runtime/issues/321 +func HackIssue321InitDynamicClient(ctx *Context) error { + if ctx.RESTConfig == nil { + return errors.New("rest config is not initialized") } - return nil + var err error + ctx.DynamicClient, err = client.New(ctx.RESTConfig, client.Options{}) + return errors.Wrap(err, "unable to build dynamic client") }