-
Notifications
You must be signed in to change notification settings - Fork 257
/
namespace.go
115 lines (97 loc) · 3.25 KB
/
namespace.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
Copyright The CloudNativePG Contributors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package utils
import (
"errors"
"fmt"
"strings"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"sigs.k8s.io/controller-runtime/pkg/client"
)
// CreateUniqueNamespace creates a namespace by using the passed prefix.
// Return the namespace name and any errors encountered.
func (env TestingEnvironment) CreateUniqueNamespace(
namespacePrefix string,
opts ...client.CreateOption,
) (string, error) {
name := env.createdNamespaces.generateUniqueName(namespacePrefix)
return name, env.CreateNamespace(name, opts...)
}
// CreateNamespace creates a namespace.
// Prefer CreateUniqueNamespace instead, unless you need a
// specific namespace name. If so, make sure there is no collision
// potential
func (env TestingEnvironment) CreateNamespace(name string, opts ...client.CreateOption) error {
// Exit immediately if the name is empty
if name == "" {
return errors.New("cannot create namespace with empty name")
}
u := &unstructured.Unstructured{}
u.SetName(name)
u.SetGroupVersionKind(schema.GroupVersionKind{
Group: "",
Version: "v1",
Kind: "Namespace",
})
_, err := CreateObject(&env, u, opts...)
return err
}
// EnsureNamespace checks for the presence of a namespace, and if it does not
// exist, creates it
func (env TestingEnvironment) EnsureNamespace(namespace string) error {
var nsList corev1.NamespaceList
err := GetObjectList(&env, &nsList)
if err != nil {
return err
}
for _, ns := range nsList.Items {
if ns.Name == namespace {
return nil
}
}
return env.CreateNamespace(namespace)
}
// DeleteNamespace deletes a namespace if existent
func (env TestingEnvironment) DeleteNamespace(name string, opts ...client.DeleteOption) error {
// Exit immediately if the name is empty
if name == "" {
return errors.New("cannot delete namespace with empty name")
}
// Exit immediately if the namespace is listed in PreserveNamespaces
for _, v := range env.PreserveNamespaces {
if strings.HasPrefix(name, v) {
return nil
}
}
u := &unstructured.Unstructured{}
u.SetName(name)
u.SetGroupVersionKind(schema.GroupVersionKind{
Group: "",
Version: "v1",
Kind: "Namespace",
})
return DeleteObject(&env, u, opts...)
}
// DeleteNamespaceAndWait deletes a namespace if existent and returns when deletion is completed
func (env TestingEnvironment) DeleteNamespaceAndWait(name string, timeoutSeconds int) error {
// Exit immediately if the namespace is listed in PreserveNamespaces
for _, v := range env.PreserveNamespaces {
if strings.HasPrefix(name, v) {
return nil
}
}
_, _, err := Run(fmt.Sprintf("kubectl delete namespace %v --wait=true --timeout %vs", name, timeoutSeconds))
return err
}