@@ -68,7 +68,156 @@ spec:
68
68
})
69
69
}
70
70
71
- func Test_NamespaceDelete_AppWithResourcesInDifferentNamespaces (t * testing.T ) {
71
+ func Test_NamespaceDelete_AppWithResourcesInDifferentTerminatingNamespaces (t * testing.T ) {
72
+ env := e2e .BuildEnv (t )
73
+ logger := e2e.Logger {}
74
+ kapp := e2e.Kapp {t , env .Namespace , logger }
75
+ kubectl := e2e.Kubectl {t , env .Namespace , logger }
76
+
77
+ nsName1 := "ns-delete-1"
78
+ nsName2 := "ns-delete-2"
79
+ nsApp := "testnamespaces"
80
+ name := "resources-in-different-namespaces"
81
+
82
+ namespaceTemplate := `---
83
+ apiVersion: v1
84
+ kind: Namespace
85
+ metadata:
86
+ name: %v`
87
+ namespaceYAML := fmt .Sprintf (namespaceTemplate , nsName1 ) + "\n " + fmt .Sprintf (namespaceTemplate , nsName2 )
88
+
89
+ appYaml := fmt .Sprintf (`---
90
+ apiVersion: kappctrl.k14s.io/v1alpha1
91
+ kind: App
92
+ metadata:
93
+ name: %s
94
+ spec:
95
+ serviceAccountName: kappctrl-e2e-ns-sa
96
+ fetch:
97
+ - inline:
98
+ paths:
99
+ file.yml: |
100
+ apiVersion: v1
101
+ kind: ConfigMap
102
+ metadata:
103
+ name: configmap
104
+ namespace: %s
105
+ data:
106
+ key: value
107
+ ---
108
+ apiVersion: v1
109
+ kind: ConfigMap
110
+ metadata:
111
+ name: configmap
112
+ namespace: %s
113
+ data:
114
+ key: value
115
+ template:
116
+ - ytt: {}
117
+ deploy:
118
+ - kapp: {}` , name , nsName1 , nsName2 ) + e2e.ServiceAccounts {nsName1 }.ForClusterYAML ()
119
+
120
+ cleanUp := func () {
121
+ kapp .Run ([]string {"delete" , "-a" , name })
122
+ }
123
+
124
+ cleanUpTestNamespace := func () {
125
+ kapp .Run ([]string {"delete" , "-a" , name })
126
+ kapp .Run ([]string {"delete" , "-a" , nsApp })
127
+ }
128
+
129
+ cleanUp ()
130
+ defer cleanUp ()
131
+ defer cleanUpTestNamespace ()
132
+
133
+ logger .Section ("create namespace and deploy App" , func () {
134
+ kapp .RunWithOpts ([]string {"deploy" , "-a" , nsApp , "-f" , "-" }, e2e.RunOpts {StdinReader : strings .NewReader (namespaceYAML )})
135
+ kapp .RunWithOpts ([]string {"deploy" , "-f" , "-" , "-a" , name , "--into-ns" , nsName1 }, e2e.RunOpts {StdinReader : strings .NewReader (appYaml )})
136
+ })
137
+
138
+ logger .Section ("delete namespace" , func () {
139
+ // delete SA first to reduce flakiness, sometimes SA deletion happens after app is deleted
140
+ kubectl .RunWithOpts ([]string {"delete" , "serviceaccount" , "kappctrl-e2e-ns-sa" , "-n" , nsName1 },
141
+ e2e.RunOpts {NoNamespace : true })
142
+ kubectl .Run ([]string {"delete" , "ns" , nsName1 , nsName2 , "--timeout=1m" })
143
+ })
144
+ }
145
+
146
+ func Test_NamespaceDelete_AppWithClusterScopedResources (t * testing.T ) {
147
+ env := e2e .BuildEnv (t )
148
+ logger := e2e.Logger {}
149
+ kapp := e2e.Kapp {t , env .Namespace , logger }
150
+ kubectl := e2e.Kubectl {t , env .Namespace , logger }
151
+
152
+ nsName := "ns-delete-1"
153
+ name := "app-with-cluster-scoped-resource"
154
+ inAppNsName := "delete-test-ns"
155
+
156
+ namespaceYAML := fmt .Sprintf (`---
157
+ apiVersion: v1
158
+ kind: Namespace
159
+ metadata:
160
+ name: %v` , nsName )
161
+
162
+ appYaml := fmt .Sprintf (`---
163
+ apiVersion: kappctrl.k14s.io/v1alpha1
164
+ kind: App
165
+ metadata:
166
+ name: %s
167
+ spec:
168
+ serviceAccountName: kappctrl-e2e-ns-sa
169
+ fetch:
170
+ - inline:
171
+ paths:
172
+ file.yml: |
173
+ apiVersion: v1
174
+ kind: Namespace
175
+ metadata:
176
+ name: %s
177
+ ---
178
+ apiVersion: v1
179
+ kind: ConfigMap
180
+ metadata:
181
+ name: configmap
182
+ namespace: %s
183
+ data:
184
+ key: value
185
+ template:
186
+ - ytt: {}
187
+ deploy:
188
+ - kapp: {}` , name , inAppNsName , nsName ) + e2e.ServiceAccounts {nsName }.ForClusterYAML ()
189
+
190
+ cleanUp := func () {
191
+ kapp .Run ([]string {"delete" , "-a" , name })
192
+ }
193
+
194
+ cleanUpTestNamespace := func () {
195
+ kubectl .Run ([]string {"delete" , "ns" , inAppNsName })
196
+ kubectl .RunWithOpts ([]string {"patch" , "App" , name , "--type=json" , "--patch" , `[{ "op": "replace", "path": "/spec/noopDelete", "value": true}]` ,
197
+ "-n" , nsName }, e2e.RunOpts {NoNamespace : true })
198
+ kapp .Run ([]string {"delete" , "-a" , nsName })
199
+ }
200
+
201
+ cleanUp ()
202
+ defer cleanUp ()
203
+ defer cleanUpTestNamespace ()
204
+
205
+ logger .Section ("create namespace and deploy App" , func () {
206
+ kapp .RunWithOpts ([]string {"deploy" , "-a" , nsName , "-f" , "-" }, e2e.RunOpts {StdinReader : strings .NewReader (namespaceYAML )})
207
+ kapp .RunWithOpts ([]string {"deploy" , "-f" , "-" , "-a" , name , "--into-ns" , nsName }, e2e.RunOpts {StdinReader : strings .NewReader (appYaml )})
208
+ })
209
+
210
+ logger .Section ("delete namespace" , func () {
211
+ // delete SA first to reduce flakiness, sometimes SA deletion happens after app is deleted
212
+ kubectl .RunWithOpts ([]string {"delete" , "serviceaccount" , "kappctrl-e2e-ns-sa" , "-n" , nsName },
213
+ e2e.RunOpts {NoNamespace : true })
214
+ _ , err := kubectl .RunWithOpts ([]string {"delete" , "ns" , nsName , "--timeout=30s" },
215
+ e2e.RunOpts {AllowError : true })
216
+ assert .Error (t , err , "Expected to get time out error, but did not" )
217
+ })
218
+ }
219
+
220
+ func Test_NamespaceDelete_AppWithWithOneNonTerminatingAffectedNamespace (t * testing.T ) {
72
221
env := e2e .BuildEnv (t )
73
222
logger := e2e.Logger {}
74
223
kapp := e2e.Kapp {t , env .Namespace , logger }
0 commit comments