From 3f1a6a636d773ac3cbd54ad74bd3159780445b4a Mon Sep 17 00:00:00 2001
From: rawmind0 <rawmind@gmail.com>
Date: Mon, 16 Aug 2021 14:41:46 +0200
Subject: [PATCH] Updated nginx ingress addon to remove admission batch jobs if
 they exist

---
 cluster/addons.go | 20 +++++++++++++++++++-
 k8s/job.go        |  7 +++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/cluster/addons.go b/cluster/addons.go
index 83f1a87b..d9bed5c2 100644
--- a/cluster/addons.go
+++ b/cluster/addons.go
@@ -53,11 +53,15 @@ const (
 	Nodelocal       = "nodelocal"
 
 	NginxIngressAddonAppName                 = "ingress-nginx"
+	NginxIngressAddonAppNamespace            = "ingress-nginx"
 	NginxIngressAddonDefaultBackendName      = "default-http-backend"
 	NginxIngressAddonDefaultBackendNamespace = "ingress-nginx"
 )
 
-var DNSProviders = []string{KubeDNSProvider, CoreDNSProvider}
+var (
+	DNSProviders              = []string{KubeDNSProvider, CoreDNSProvider}
+	NginxIngressAddonJobNames = []string{"ingress-nginx-admission-create", "ingress-nginx-admission-patch"}
+)
 
 type ingressOptions struct {
 	RBACConfig                              string
@@ -613,6 +617,20 @@ func (c *Cluster) deployIngress(ctx context.Context, data map[string]interface{}
 		if version < "0.16.0" {
 			ingressConfig.AlpineImage = c.SystemImages.Alpine
 		}
+		// since nginx ingress controller 0.40.0, admission batch jobs are deployed.
+		// Before deployment of the new ingress controller based on the update strategy, remove admission batch jobs if they exist.
+		if version > "0.40.0" {
+			log.Infof(ctx, "[ingress] removing admission batch jobs if they exist")
+			kubeClient, err := k8s.NewClient(c.LocalKubeConfigPath, c.K8sWrapTransport)
+			if err != nil {
+				return err
+			}
+			for _, jobName := range NginxIngressAddonJobNames {
+				if err = k8s.DeleteK8sJobIfExists(kubeClient, jobName, NginxIngressAddonAppNamespace); err != nil {
+					return err
+				}
+			}
+		}
 	}
 	tmplt, err := templates.GetVersionedTemplates(kdm.NginxIngress, data, c.Version)
 	if err != nil {
diff --git a/k8s/job.go b/k8s/job.go
index d5298b1e..b7956fe1 100644
--- a/k8s/job.go
+++ b/k8s/job.go
@@ -71,6 +71,13 @@ func DeleteK8sSystemJob(jobYaml string, k8sClient *kubernetes.Clientset, timeout
 	return nil
 }
 
+func DeleteK8sJobIfExists(k8sClient *kubernetes.Clientset, name, namespace string) error {
+	if err := deleteK8sJob(k8sClient, name, namespace); err != nil && !apierrors.IsNotFound(err) {
+		return err
+	}
+	return nil
+}
+
 func ensureJobCompleted(k8sClient *kubernetes.Clientset, j interface{}) error {
 	job := j.(v1.Job)