diff --git a/addons/addons.go b/addons/addons.go index 81b7d2cf..bca4a787 100644 --- a/addons/addons.go +++ b/addons/addons.go @@ -7,6 +7,7 @@ import ( "github.com/rancher/rke/k8s" "github.com/rancher/rke/templates" + "github.com/sirupsen/logrus" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -25,7 +26,9 @@ func getAddonJob(addonName, nodeName, image string, isDelete bool) (string, erro "Image": image, "DeleteJob": strconv.FormatBool(isDelete), } - return templates.CompileTemplateFromMap(templates.AddonJobTemplate, jobConfig) + template, err := templates.CompileTemplateFromMap(templates.AddonJobTemplate, jobConfig) + logrus.Tracef("template for [%s] is: [%s]", addonName, template) + return template, err } func AddonJobExists(addonJobName, kubeConfigPath string, k8sWrapTransport transport.WrapperFunc) (bool, error) { diff --git a/cluster/addons.go b/cluster/addons.go index db740a95..a3806bdd 100644 --- a/cluster/addons.go +++ b/cluster/addons.go @@ -33,6 +33,8 @@ const ( IngressAddonJobName = "rke-ingress-controller-deploy-job" MetricsServerAddonJobName = "rke-metrics-addon-deploy-job" + UserAddonJobName = "rke-user-addon-deploy-job" + UserAddonIncludeJobName = "rke-user-includes-addons-deploy-job" MetricsServerAddonResourceName = "rke-metrics-addon" NginxIngressAddonAppName = "ingress-nginx" KubeDNSAddonAppName = "kube-dns" @@ -156,11 +158,35 @@ func (c *Cluster) deployUserAddOns(ctx context.Context) error { if err := c.doAddonDeploy(ctx, c.Addons, UserAddonResourceName, false); err != nil { return err } + } else { + addonJobExists, err := addons.AddonJobExists(UserAddonJobName, c.LocalKubeConfigPath, c.K8sWrapTransport) + if err != nil { + return nil + } + if addonJobExists { + log.Infof(ctx, "[addons] Removing user addons") + if err := c.doAddonDelete(ctx, UserAddonResourceName, false); err != nil { + return err + } + + log.Infof(ctx, "[addons] User addons removed successfully") + } } if len(c.AddonsInclude) > 0 { if err := c.deployAddonsInclude(ctx); err != nil { return err } + } else { + addonJobExists, err := addons.AddonJobExists(UserAddonIncludeJobName, c.LocalKubeConfigPath, c.K8sWrapTransport) + if err != nil { + return nil + } + + if addonJobExists { + if err := c.doAddonDelete(ctx, UserAddonsIncludeResourceName, false); err != nil { + return err + } + } } if c.Addons == "" && len(c.AddonsInclude) == 0 { log.Infof(ctx, "[addons] no user addons defined") @@ -469,7 +495,6 @@ func (c *Cluster) doAddonDelete(ctx context.Context, resourceName string, isCrit if err := k8s.DeleteK8sSystemJob(deleteJob, k8sClient, c.AddonJobTimeout); err != nil { return err } - return nil } diff --git a/templates/addonjob.go b/templates/addonjob.go index d8f728f8..7b778355 100644 --- a/templates/addonjob.go +++ b/templates/addonjob.go @@ -42,7 +42,7 @@ spec: image: {{$image}} {{- if eq .DeleteJob "true" }} command: ["/bin/sh"] - args: ["-c" ,"kubectl get --ignore-not-found=true -f /etc/config/{{$addonName}}.yaml -o name | xargs kubectl delete --ignore-not-found=true"] + args: ["-c" ,"kubectl get --ignore-not-found=true -f /etc/config/{{$addonName}}.yaml -o custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace,KIND:.kind --no-headers | while read name namespace kind; do if [ "x${namespace}" = "x" ]; then echo kubectl delete $kind $name; else echo kubectl -n $namespace delete $kind $name; fi; done"] {{- else }} command: [ "kubectl", "apply", "-f" , "/etc/config/{{$addonName}}.yaml"] {{- end }}