Parcourir la source

Merge pull request #2225 from porter-dev/nafees/hotfixes

[POR-594] `CreateNamespace` should check if an existing namespace is in the `Terminating` phase
abelanger5 il y a 3 ans
Parent
commit
90479940af
1 fichiers modifiés avec 40 ajouts et 2 suppressions
  1. 40 2
      internal/kubernetes/agent.go

+ 40 - 2
internal/kubernetes/agent.go

@@ -624,7 +624,39 @@ func (a *Agent) CreateNamespace(name string) (*v1.Namespace, error) {
 	)
 	)
 
 
 	if err == nil && checkNS != nil {
 	if err == nil && checkNS != nil {
-		return checkNS, nil
+		if checkNS.Status.Phase == v1.NamespaceTerminating {
+			// edge case for when the same namespace was previously created
+			// but was deleted and is currently in the "Terminating" phase
+
+			// let us wait for a maximum of 10 seconds
+			timeNow := time.Now().Add(10 * time.Second)
+			stillTerminating := true
+			for {
+				_, err := a.Clientset.CoreV1().Namespaces().Get(
+					context.TODO(),
+					name,
+					metav1.GetOptions{},
+				)
+
+				if err != nil && errors.IsNotFound(err) {
+					stillTerminating = false
+					break
+				}
+
+				time.Sleep(time.Second)
+
+				if time.Now().After(timeNow) {
+					break
+				}
+			}
+
+			if stillTerminating {
+				// the namespace has been in the "Terminating" phase
+				return nil, fmt.Errorf("cannot create namespace %s, stuck in \"Terminating\" phase", name)
+			}
+		} else {
+			return checkNS, nil
+		}
 	}
 	}
 
 
 	namespace := v1.Namespace{
 	namespace := v1.Namespace{
@@ -658,7 +690,7 @@ func (a *Agent) GetNamespace(name string) (*v1.Namespace, error) {
 // DeleteNamespace deletes the namespace given the name.
 // DeleteNamespace deletes the namespace given the name.
 func (a *Agent) DeleteNamespace(name string) error {
 func (a *Agent) DeleteNamespace(name string) error {
 	// check if namespace exists
 	// check if namespace exists
-	_, err := a.Clientset.CoreV1().Namespaces().Get(
+	checkNS, err := a.Clientset.CoreV1().Namespaces().Get(
 		context.TODO(),
 		context.TODO(),
 		name,
 		name,
 		metav1.GetOptions{},
 		metav1.GetOptions{},
@@ -669,6 +701,12 @@ func (a *Agent) DeleteNamespace(name string) error {
 		return nil
 		return nil
 	}
 	}
 
 
+	// if the namespace was found but is in the "Terminating" phase
+	// we should ignore it and not return an error
+	if checkNS != nil && checkNS.Status.Phase == v1.NamespaceTerminating {
+		return nil
+	}
+
 	return a.Clientset.CoreV1().Namespaces().Delete(
 	return a.Clientset.CoreV1().Namespaces().Delete(
 		context.TODO(),
 		context.TODO(),
 		name,
 		name,