From 9b5bec1ddf7c00abd38584dd7952f6d0c4514ce9 Mon Sep 17 00:00:00 2001
From: "Song.Jin" <songjin@hotmail.com>
Date: Sun, 4 Nov 2018 11:23:34 +1100
Subject: [PATCH] check if crd exist before try creating them

---
 storage/kubernetes/storage.go | 62 +++++++++++++++++++----------------
 1 file changed, 33 insertions(+), 29 deletions(-)

diff --git a/storage/kubernetes/storage.go b/storage/kubernetes/storage.go
index 4c9399a0..211c736a 100644
--- a/storage/kubernetes/storage.go
+++ b/storage/kubernetes/storage.go
@@ -40,7 +40,6 @@ type Config struct {
 	InCluster      bool   `json:"inCluster"`
 	KubeConfigFile string `json:"kubeConfigFile"`
 	UseTPR         bool   `json:"useTPR"` // Flag option to use TPRs instead of CRDs
-	NoCrdCreation  bool   `json:"noCrdCreation"` // Flag to disable creation of CRDs at cluster level
 }
 
 // Open returns a storage using Kubernetes third party resource.
@@ -86,38 +85,37 @@ func (c *Config) open(logger logrus.FieldLogger, waitForResources bool) (*client
 	}
 
 	ctx, cancel := context.WithCancel(context.Background())
-	if !c.NoCrdCreation {
-		logger.Info("creating custom Kubernetes resources")
-		if !cli.registerCustomResources(c.UseTPR) {
-			if waitForResources {
-				cancel()
-				return nil, fmt.Errorf("failed creating custom resources")
-			}
 
-			// Try to synchronously create the custom resources once. This doesn't mean
-			// they'll immediately be available, but ensures that the client will actually try
-			// once.
-			logger.Errorf("failed creating custom resources: %v", err)
-			go func() {
-				for {
-					if cli.registerCustomResources(c.UseTPR) {
-						return
-					}
-
-					select {
-					case <-ctx.Done():
-						return
-					case <-time.After(30 * time.Second):
-					}
-				}
-			}()
+	logger.Info("creating custom Kubernetes resources")
+	if !cli.registerCustomResources(c.UseTPR) {
+		if waitForResources {
+			cancel()
+			return nil, fmt.Errorf("failed creating custom resources")
 		}
 
-		if waitForResources {
-			if err := cli.waitForCRDs(ctx); err != nil {
-				cancel()
-				return nil, err
+		// Try to synchronously create the custom resources once. This doesn't mean
+		// they'll immediately be available, but ensures that the client will actually try
+		// once.
+		logger.Errorf("failed creating custom resources: %v", err)
+		go func() {
+			for {
+				if cli.registerCustomResources(c.UseTPR) {
+					return
+				}
+
+				select {
+				case <-ctx.Done():
+					return
+				case <-time.After(30 * time.Second):
+				}
 			}
+		}()
+	}
+
+	if waitForResources {
+		if err := cli.waitForCRDs(ctx); err != nil {
+			cancel()
+			return nil, err
 		}
 	}
 
@@ -150,6 +148,12 @@ func (cli *client) registerCustomResources(useTPR bool) (ok bool) {
 			resourceName = r.ObjectMeta.Name
 		} else {
 			r := customResourceDefinitions[i]
+			var i interface{}
+			cli.logger.Infof("checking if resource %s has been created already...", r.ObjectMeta.Name)
+			if err := cli.list(r.Spec.Names.Plural, &i); err == nil {
+				cli.logger.Infof("The custom resource already created %s, hence continue", r.ObjectMeta.Name)
+				continue
+			}
 			err = cli.postResource("apiextensions.k8s.io/v1beta1", "", "customresourcedefinitions", r)
 			resourceName = r.ObjectMeta.Name
 		}
-- 
GitLab