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 }