github.com/docker/compose-on-kubernetes@v0.5.0/internal/e2e/cluster/namespace.go (about)

     1  package cluster
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/docker/compose-on-kubernetes/internal/e2e/wait"
     7  	"github.com/onsi/ginkgo"
     8  	v1 "k8s.io/api/core/v1"
     9  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    10  	corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
    11  	"k8s.io/client-go/rest"
    12  )
    13  
    14  // By is an alias to ginkgo.By
    15  var By = ginkgo.By
    16  
    17  // CreateNamespace creates a namespace
    18  func CreateNamespace(createConfig, config *rest.Config, name string) (*Namespace, func(), error) {
    19  	coreV1Set, err := corev1.NewForConfig(createConfig)
    20  	if err != nil {
    21  		return nil, nil, err
    22  	}
    23  
    24  	namespaces := coreV1Set.Namespaces()
    25  
    26  	_, err = namespaces.Get(name, metav1.GetOptions{})
    27  	if err == nil {
    28  		err := DeleteNamespace(namespaces, name, true)
    29  		if err != nil {
    30  			return nil, nil, err
    31  		}
    32  	}
    33  
    34  	By(fmt.Sprintf("Creating namespace %q for this suite.", name))
    35  	_, err = namespaces.Create(&v1.Namespace{
    36  		ObjectMeta: metav1.ObjectMeta{
    37  			Name: name,
    38  		},
    39  	})
    40  	if err != nil {
    41  		return nil, nil, err
    42  	}
    43  
    44  	namespace, err := newNamespace(config, name)
    45  	if err != nil {
    46  		return nil, nil, err
    47  	}
    48  
    49  	return namespace, func() {
    50  		namespace.DeleteStacks()
    51  		DeleteNamespace(namespaces, name, true) // Ignore err
    52  	}, nil
    53  }
    54  
    55  // DeleteNamespace deletes a namespace
    56  func DeleteNamespace(namespaces corev1.NamespaceInterface, ns string, waitForDeletion bool) error {
    57  	By(fmt.Sprintf("Destroying namespace %q for this suite.", ns))
    58  	err := namespaces.Delete(ns, &metav1.DeleteOptions{})
    59  	if err != nil {
    60  		return err
    61  	}
    62  
    63  	if !waitForDeletion {
    64  		return nil
    65  	}
    66  
    67  	return wait.For(30, func() (bool, error) {
    68  		return isDeleted(namespaces, ns)
    69  	})
    70  }
    71  
    72  func isDeleted(namespaces corev1.NamespaceInterface, ns string) (bool, error) {
    73  	_, err := namespaces.Get(ns, metav1.GetOptions{})
    74  	return err != nil, nil
    75  }