...
1#!/usr/bin/env bash
2
3# Copyright 2018 The Kubernetes Authors.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17set -o errexit
18set -o nounset
19set -o pipefail
20
21run_kubectl_get_tests() {
22 set -o nounset
23 set -o errexit
24
25 create_and_use_new_namespace
26 kube::log::status "Testing kubectl get"
27 ### Test retrieval of non-existing pods
28 # Pre-condition: no POD exists
29 kube::test::get_object_assert pods "{{range.items}}{{${id_field:?}}}:{{end}}" ''
30 # Command
31 output_message=$(! kubectl get pods abc 2>&1 "${kube_flags[@]:?}")
32 # Post-condition: POD abc should error since it doesn't exist
33 kube::test::if_has_string "${output_message}" 'pods "abc" not found'
34
35 ### Test retrieval of non-existing POD with output flag specified
36 # Pre-condition: no POD exists
37 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
38 # Command
39 output_message=$(! kubectl get pods abc 2>&1 "${kube_flags[@]}" -o name)
40 # Post-condition: POD abc should error since it doesn't exist
41 kube::test::if_has_string "${output_message}" 'pods "abc" not found'
42
43 ### Test retrieval of pods when none exist with non-human readable output format flag specified
44 # Pre-condition: no pods exist
45 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
46 # Command
47 output_message=$(kubectl get pods 2>&1 "${kube_flags[@]}" -o json)
48 # Post-condition: The text "No resources found" should not be part of the output
49 kube::test::if_has_not_string "${output_message}" 'No resources found'
50 # Command
51 output_message=$(kubectl get pods 2>&1 "${kube_flags[@]}" -o yaml)
52 # Post-condition: The text "No resources found" should not be part of the output
53 kube::test::if_has_not_string "${output_message}" 'No resources found'
54 # Command
55 output_message=$(kubectl get pods 2>&1 "${kube_flags[@]}" -o name)
56 # Post-condition: The text "No resources found" should not be part of the output
57 kube::test::if_has_not_string "${output_message}" 'No resources found'
58 # Command
59 output_message=$(kubectl get pods 2>&1 "${kube_flags[@]}" -o jsonpath='{.items}')
60 # Post-condition: The text "No resources found" should not be part of the output
61 kube::test::if_has_not_string "${output_message}" 'No resources found'
62 # Command
63 output_message=$(kubectl get pods 2>&1 "${kube_flags[@]}" -o go-template='{{.items}}')
64 # Post-condition: The text "No resources found" should not be part of the output
65 kube::test::if_has_not_string "${output_message}" 'No resources found'
66 # Command
67 output_message=$(kubectl get pods 2>&1 "${kube_flags[@]}" -o custom-columns=NAME:.metadata.name)
68 # Post-condition: The text "No resources found" should not be part of the output
69 kube::test::if_has_not_string "${output_message}" 'No resources found'
70
71 ### Test retrieval of pods when none exist, with human-readable output format flag specified
72 # Pre-condition: no pods exist
73 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
74 # Command
75 output_message=$(! kubectl get foobar 2>&1 "${kube_flags[@]}")
76 # Post-condition: The text "No resources found" should not be part of the output when an error occurs
77 kube::test::if_has_not_string "${output_message}" 'No resources found'
78 # Command
79 output_message=$(kubectl get pods 2>&1 "${kube_flags[@]}")
80 # Post-condition: The text "No resources found" should be part of the output
81 kube::test::if_has_string "${output_message}" 'No resources found'
82 # Command
83 output_message=$(kubectl get pods --ignore-not-found 2>&1 "${kube_flags[@]}")
84 # Post-condition: The text "No resources found" should not be part of the output
85 kube::test::if_has_not_string "${output_message}" 'No resources found'
86 # Command
87 output_message=$(kubectl get pods 2>&1 "${kube_flags[@]}" -o wide)
88 # Post-condition: The text "No resources found" should be part of the output
89 kube::test::if_has_string "${output_message}" 'No resources found'
90
91 ### Test retrieval of non-existing POD with json output flag specified
92 # Pre-condition: no POD exists
93 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
94 # Command
95 output_message=$(! kubectl get pods abc 2>&1 "${kube_flags[@]}" -o json)
96 # Post-condition: POD abc should error since it doesn't exist
97 kube::test::if_has_string "${output_message}" 'pods "abc" not found'
98 # Post-condition: make sure we don't display an empty List
99 kube::test::if_has_not_string "${output_message}" 'List'
100
101 ### Test kubectl get all
102 output_message=$(kubectl --v=6 --namespace default get all --chunk-size=0 2>&1 "${kube_flags[@]}")
103 # Post-condition: Check if we get 200 OK from all the url(s)
104 kube::test::if_has_string "${output_message}" "/api/v1/namespaces/default/pods 200 OK"
105 kube::test::if_has_string "${output_message}" "/api/v1/namespaces/default/replicationcontrollers 200 OK"
106 kube::test::if_has_string "${output_message}" "/api/v1/namespaces/default/services 200 OK"
107 kube::test::if_has_string "${output_message}" "/apis/apps/v1/namespaces/default/daemonsets 200 OK"
108 kube::test::if_has_string "${output_message}" "/apis/apps/v1/namespaces/default/deployments 200 OK"
109 kube::test::if_has_string "${output_message}" "/apis/apps/v1/namespaces/default/replicasets 200 OK"
110 kube::test::if_has_string "${output_message}" "/apis/apps/v1/namespaces/default/statefulsets 200 OK"
111 kube::test::if_has_string "${output_message}" "/apis/autoscaling/v2/namespaces/default/horizontalpodautoscalers 200"
112 kube::test::if_has_string "${output_message}" "/apis/batch/v1/namespaces/default/jobs 200 OK"
113 kube::test::if_has_not_string "${output_message}" "/apis/extensions/v1beta1/namespaces/default/daemonsets 200 OK"
114 kube::test::if_has_not_string "${output_message}" "/apis/extensions/v1beta1/namespaces/default/deployments 200 OK"
115 kube::test::if_has_not_string "${output_message}" "/apis/extensions/v1beta1/namespaces/default/replicasets 200 OK"
116
117 ### Test kubectl get chunk size
118 output_message=$(kubectl --v=6 get clusterrole --chunk-size=10 2>&1 "${kube_flags[@]}")
119 # Post-condition: Check if we get a limit and continue
120 kube::test::if_has_string "${output_message}" "/clusterroles?limit=10 200 OK"
121 kube::test::if_has_string "${output_message}" "/v1/clusterroles?continue="
122
123 ### Test kubectl get chunk size defaults to 500
124 output_message=$(kubectl --v=6 get clusterrole 2>&1 "${kube_flags[@]}")
125 # Post-condition: Check if we get a limit and continue
126 kube::test::if_has_string "${output_message}" "/clusterroles?limit=500 200 OK"
127
128 ### Test kubectl get accumulates pages
129 output_message=$(kubectl get namespaces --chunk-size=1 --no-headers "${kube_flags[@]}")
130 # Post-condition: Check we got multiple pages worth of namespaces
131 kube::test::if_has_string "${output_message}" "default"
132 kube::test::if_has_string "${output_message}" "kube-public"
133 kube::test::if_has_string "${output_message}" "kube-system"
134
135 ### Test kubectl get chunk size does not result in a --watch error when resource list is served in multiple chunks
136 # Pre-condition: ConfigMap one two tree does not exist
137 kube::test::get_object_assert 'configmaps' "{{range.items}}{{ if eq $id_field \"one\" }}found{{end}}{{end}}:" ':'
138 kube::test::get_object_assert 'configmaps' "{{range.items}}{{ if eq $id_field \"two\" }}found{{end}}{{end}}:" ':'
139 kube::test::get_object_assert 'configmaps' "{{range.items}}{{ if eq $id_field \"three\" }}found{{end}}{{end}}:" ':'
140
141 # Post-condition: Create three configmaps and ensure that we can --watch them with a --chunk-size of 1
142 kubectl create cm one "${kube_flags[@]}"
143 kubectl create cm two "${kube_flags[@]}"
144 kubectl create cm three "${kube_flags[@]}"
145 output_message=$(kubectl get configmap --chunk-size=1 --watch --request-timeout=1s 2>&1 "${kube_flags[@]}")
146 kube::test::if_has_not_string "${output_message}" "watch is only supported on individual resources"
147 output_message=$(kubectl get configmap --chunk-size=1 --watch-only --request-timeout=1s 2>&1 "${kube_flags[@]}")
148 kube::test::if_has_not_string "${output_message}" "watch is only supported on individual resources"
149
150 ### Test --allow-missing-template-keys
151 # Pre-condition: no POD exists
152 create_and_use_new_namespace
153 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
154 # Command
155 kubectl create -f test/fixtures/doc-yaml/admin/limitrange/valid-pod.yaml "${kube_flags[@]}"
156 # Post-condition: valid-pod POD is created
157 kubectl get "${kube_flags[@]}" pods -o json
158 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'valid-pod:'
159
160 ## check --allow-missing-template-keys defaults to true for jsonpath templates
161 kubectl get "${kube_flags[@]}" pod valid-pod -o jsonpath='{.missing}'
162
163 ## check --allow-missing-template-keys defaults to true for go templates
164 kubectl get "${kube_flags[@]}" pod valid-pod -o go-template='{{.missing}}'
165
166 ## check --template flag causes go-template to be printed, even when no --output value is provided
167 output_message=$(kubectl get "${kube_flags[@]}" pod valid-pod --template="{{$id_field}}:")
168 kube::test::if_has_string "${output_message}" 'valid-pod:'
169
170 ## check --allow-missing-template-keys=false results in an error for a missing key with jsonpath
171 output_message=$(! kubectl get pod valid-pod --allow-missing-template-keys=false -o jsonpath='{.missing}' 2>&1 "${kube_flags[@]}")
172 kube::test::if_has_string "${output_message}" 'missing is not found'
173
174 ## check --allow-missing-template-keys=false results in an error for a missing key with go
175 output_message=$(! kubectl get pod valid-pod --allow-missing-template-keys=false -o go-template='{{.missing}}' "${kube_flags[@]}")
176 kube::test::if_has_string "${output_message}" 'map has no entry for key "missing"'
177
178 ## check --subresource=status works
179 output_message=$(kubectl get "${kube_flags[@]}" pod valid-pod --subresource=status)
180 kube::test::if_has_string "${output_message}" 'valid-pod'
181
182 ## check --subresource=scale returns an error for pods
183 output_message=$(! kubectl get pod valid-pod --subresource=scale 2>&1 "${kube_flags[@]:?}")
184 kube::test::if_has_string "${output_message}" 'the server could not find the requested resource'
185
186 ### Test kubectl get watch
187 output_message=$(kubectl get pods -w --request-timeout=1 "${kube_flags[@]}")
188 kube::test::if_has_string "${output_message}" 'STATUS' # headers
189 kube::test::if_has_string "${output_message}" 'valid-pod' # pod details
190 output_message=$(kubectl get pods/valid-pod -o name -w --request-timeout=1 "${kube_flags[@]}")
191 kube::test::if_has_not_string "${output_message}" 'STATUS' # no headers
192 kube::test::if_has_string "${output_message}" 'pod/valid-pod' # resource name
193 output_message=$(kubectl get pods/valid-pod -o yaml -w --request-timeout=1 "${kube_flags[@]}")
194 kube::test::if_has_not_string "${output_message}" 'STATUS' # no headers
195 kube::test::if_has_string "${output_message}" 'name: valid-pod' # yaml
196 output_message=$(! kubectl get pods/invalid-pod -w --request-timeout=1 "${kube_flags[@]}" 2>&1)
197 kube::test::if_has_string "${output_message}" '"invalid-pod" not found'
198
199 # cleanup
200 kubectl delete pods valid-pod "${kube_flags[@]}"
201
202 ### Test 'kubectl get -f <file> -o <non default printer>' prints all the items in the file's list
203 # Pre-condition: no POD exists
204 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
205 # Command
206 kubectl create -f test/fixtures/doc-yaml/user-guide/multi-pod.yaml "${kube_flags[@]}"
207 # Post-condition: PODs redis-master and valid-pod exist
208
209 # Check that all items in the list are printed
210 output_message=$(kubectl get -f test/fixtures/doc-yaml/user-guide/multi-pod.yaml -o jsonpath="{..metadata.name}" "${kube_flags[@]}")
211 kube::test::if_has_string "${output_message}" "redis-master valid-pod"
212
213 # cleanup
214 kubectl delete pods redis-master valid-pod "${kube_flags[@]}"
215
216 ### Test 'kubectl get -k <dir>' prints all the items built from a kustomization directory
217 # Pre-Condition: No configmaps with name=test-the-map, no Deployment, Service exist
218 kube::test::get_object_assert 'configmaps --field-selector=metadata.name=test-the-map' "{{range.items}}{{${id_field:?}}}:{{end}}" ''
219 kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" ''
220 kube::test::get_object_assert services "{{range.items}}{{$id_field}}:{{end}}" ''
221 # Command
222 kubectl apply -k hack/testdata/kustomize
223 # Post-condition: test-the-map, test-the-deployment, test-the-service exist
224
225 # Check that all items in the list are printed
226 output_message=$(kubectl get -k hack/testdata/kustomize -o jsonpath="{..metadata.name}" "${kube_flags[@]}")
227 kube::test::if_has_string "${output_message}" "test-the-map"
228 kube::test::if_has_string "${output_message}" "test-the-deployment"
229 kube::test::if_has_string "${output_message}" "test-the-service"
230
231 # cleanup
232 kubectl delete -k hack/testdata/kustomize
233
234 # Check that all items in the list are deleted
235 kube::test::get_object_assert 'configmaps --field-selector=metadata.name=test-the-map' "{{range.items}}{{${id_field:?}}}:{{end}}" ''
236 kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" ''
237 kube::test::get_object_assert services "{{range.items}}{{$id_field}}:{{end}}" ''
238
239 set +o nounset
240 set +o errexit
241}
242
243run_retrieve_multiple_tests() {
244 set -o nounset
245 set -o errexit
246
247 # switch back to the default namespace
248 kubectl config set-context "${CONTEXT}" --namespace=""
249 kube::log::status "Testing kubectl(v1:multiget)"
250 kube::test::get_object_assert 'nodes/127.0.0.1 service/kubernetes' "{{range.items}}{{$id_field}}:{{end}}" '127.0.0.1:kubernetes:'
251
252 set +o nounset
253 set +o errexit
254}
255
256run_kubectl_response_compression_tests() {
257 set -o nounset
258 set -o errexit
259
260 create_and_use_new_namespace
261 kube::log::status "Testing kubectl get objects with/without response compression"
262
263 ### Test creation of large configmap objects
264 # Pre-condition: no configmaps exists
265 kube::test::get_object_assert configmaps "{{range.items}}{{${id_field:?}}}:{{end}}" ''
266 # Commands to create 3 configmaps each of size 50KB. Sum of their sizes should be >128KB (defaultGzipThresholdBytes)
267 # for apiserver to allow gzip compression of the response. This is required to test the disable-compression option
268 # from client-side
269 some_string=$(dd status=none if=/dev/urandom bs=1K count=50 2>/dev/null | base64)
270 kubectl create configmap "cm-one" --from-literal=somekey="${some_string}"
271 kubectl create configmap "cm-two" --from-literal=somekey="${some_string}"
272 kubectl create configmap "cm-three" --from-literal=somekey="${some_string}"
273 output_message=$(kubectl get configmaps 2>&1 "${kube_flags[@]:?}")
274 # Post-condition: All configmaps should be created
275 kube::test::if_has_string "${output_message}" "cm-one"
276 kube::test::if_has_string "${output_message}" "cm-two"
277 kube::test::if_has_string "${output_message}" "cm-three"
278
279 ### Test list call WITH compression
280 output_message=$(kubectl get configmaps --v=8 2>&1 "${kube_flags[@]:?}")
281 # Post-condition: Response headers should include "accept-encoding" header
282 kube::test::if_has_string "${output_message}" "Vary: Accept-Encoding"
283
284 ### Test list call WITHOUT compression
285 output_message=$(kubectl get configmaps --disable-compression=true --v=8 2>&1 "${kube_flags[@]:?}")
286 # Post-condition: Response headers should NOT include "accept-encoding" header
287 kube::test::if_has_not_string "${output_message}" "Vary: Accept-Encoding"
288
289 # cleanup
290 kubectl delete configmap "cm-one"
291 kubectl delete configmap "cm-two"
292 kubectl delete configmap "cm-three"
293
294 set +o nounset
295 set +o errexit
296}
297
298run_kubectl_sort_by_tests() {
299 set -o nounset
300 set -o errexit
301
302 kube::log::status "Testing kubectl --sort-by"
303
304 ### sort-by should not panic if no pod exists
305 # Pre-condition: no POD exists
306 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
307 # Command
308 kubectl get pods --sort-by="{metadata.name}"
309 kubectl get pods --sort-by="{metadata.creationTimestamp}"
310
311 ### sort-by should works if pod exists
312 # Create POD
313 # Pre-condition: no POD exists
314 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
315 # Command
316 kubectl create "${kube_flags[@]}" -f test/fixtures/doc-yaml/admin/limitrange/valid-pod.yaml
317 # Post-condition: valid-pod is created
318 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'valid-pod:'
319 # Check output of sort-by
320 output_message=$(kubectl get pods --sort-by="{metadata.name}")
321 kube::test::if_has_string "${output_message}" "valid-pod"
322 # ensure sort-by receivers objects as Table
323 output_message=$(kubectl get pods --v=8 --sort-by="{metadata.name}" 2>&1)
324 kube::test::if_has_string "${output_message}" "as=Table"
325 # ensure sort-by requests the full object
326 kube::test::if_has_string "${output_message}" "includeObject=Object"
327 ### Clean up
328 # Pre-condition: valid-pod exists
329 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'valid-pod:'
330 # Command
331 kubectl delete "${kube_flags[@]}" pod valid-pod --grace-period=0 --force
332 # Post-condition: valid-pod doesn't exist
333 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
334
335 ### sort-by should works by sorting by name
336 # Create three PODs
337 # Pre-condition: no POD exists
338 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
339 # Command
340 kubectl create "${kube_flags[@]}" -f hack/testdata/sorted-pods/sorted-pod1.yaml
341 # Post-condition: sorted-pod1 is created
342 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'sorted-pod1:'
343 # Command
344 kubectl create "${kube_flags[@]}" -f hack/testdata/sorted-pods/sorted-pod2.yaml
345 # Post-condition: sorted-pod1 is created
346 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'sorted-pod1:sorted-pod2:'
347 # Command
348 kubectl create "${kube_flags[@]}" -f hack/testdata/sorted-pods/sorted-pod3.yaml
349 # Post-condition: sorted-pod1 is created
350 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'sorted-pod1:sorted-pod2:sorted-pod3:'
351
352 # Check output of sort-by '{metadata.name}'
353 output_message=$(kubectl get pods --sort-by="{metadata.name}")
354 kube::test::if_sort_by_has_correct_order "${output_message}" "sorted-pod1:sorted-pod2:sorted-pod3:"
355
356 # Check output of sort-by '{metadata.labels.name}'
357 output_message=$(kubectl get pods --sort-by="{metadata.labels.name}")
358 kube::test::if_sort_by_has_correct_order "${output_message}" "sorted-pod3:sorted-pod2:sorted-pod1:"
359
360 # if sorting, we should be able to use any field in our objects
361 output_message=$(kubectl get pods --sort-by="{spec.containers[0].name}")
362 kube::test::if_sort_by_has_correct_order "${output_message}" "sorted-pod2:sorted-pod1:sorted-pod3:"
363
364 # ensure sorting by creation timestamps works
365 output_message=$(kubectl get pods --sort-by="{metadata.creationTimestamp}")
366 kube::test::if_sort_by_has_correct_order "${output_message}" "sorted-pod1:sorted-pod2:sorted-pod3:"
367
368 # ensure sorting by resource memory request works
369 output_message=$(kubectl get pods --sort-by="{.spec.containers[0].resources.requests.memory}")
370 kube::test::if_sort_by_has_correct_order "${output_message}" "sorted-pod3:sorted-pod1:sorted-pod2:"
371
372 # ensure sorting by resource cpu request works
373 output_message=$(kubectl get pods --sort-by="{.spec.containers[0].resources.requests.cpu}")
374 kube::test::if_sort_by_has_correct_order "${output_message}" "sorted-pod3:sorted-pod1:sorted-pod2:"
375
376 # ensure sorting by resource memory limit works
377 output_message=$(kubectl get pods --sort-by="{.spec.containers[0].resources.limits.memory}")
378 kube::test::if_sort_by_has_correct_order "${output_message}" "sorted-pod3:sorted-pod1:sorted-pod2:"
379
380 # ensure sorting by resource cpu limit works
381 output_message=$(kubectl get pods --sort-by="{.spec.containers[0].resources.limits.cpu}")
382 kube::test::if_sort_by_has_correct_order "${output_message}" "sorted-pod3:sorted-pod1:sorted-pod2:"
383
384 # ensure sorting using fallback codepath still works
385 output_message=$(kubectl get pods --sort-by="{spec.containers[0].name}" --server-print=false --v=8 2>&1)
386 kube::test::if_sort_by_has_correct_order "${output_message}" "sorted-pod2:sorted-pod1:sorted-pod3:"
387 kube::test::if_has_not_string "${output_message}" "Table"
388
389 ### Clean up
390 # Pre-condition: valid-pod exists
391 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'sorted-pod1:sorted-pod2:sorted-pod3:'
392 # Command
393 kubectl delete "${kube_flags[@]}" pod --grace-period=0 --force --all
394 # Post-condition: valid-pod doesn't exist
395 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
396
397 set +o nounset
398 set +o errexit
399}
400
401run_kubectl_all_namespace_tests() {
402 set -o nounset
403 set -o errexit
404
405 kube::log::status "Testing kubectl --all-namespace"
406
407 # Pre-condition: the "default" namespace exists
408 kube::test::get_object_assert namespaces "{{range.items}}{{if eq $id_field \"default\"}}{{$id_field}}:{{end}}{{end}}" 'default:'
409
410 ### Create POD
411 # Pre-condition: no POD exists
412 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
413 # Command
414 kubectl create "${kube_flags[@]}" -f test/fixtures/doc-yaml/admin/limitrange/valid-pod.yaml
415 # Post-condition: valid-pod is created
416 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'valid-pod:'
417
418 ### Verify a specific namespace is ignored when all-namespaces is provided
419 # Command
420 kubectl get pods --all-namespaces --namespace=default
421
422 ### Check --all-namespaces option shows namespaces
423 # Create objects in multiple namespaces
424 kubectl create "${kube_flags[@]}" namespace all-ns-test-1
425 kubectl create "${kube_flags[@]}" serviceaccount test -n all-ns-test-1
426 kubectl create "${kube_flags[@]}" namespace all-ns-test-2
427 kubectl create "${kube_flags[@]}" serviceaccount test -n all-ns-test-2
428 # Ensure listing across namespaces displays the namespace (--all-namespaces)
429 output_message=$(kubectl get serviceaccounts --all-namespaces "${kube_flags[@]}")
430 kube::test::if_has_string "${output_message}" "all-ns-test-1"
431 kube::test::if_has_string "${output_message}" "all-ns-test-2"
432 # Ensure listing across namespaces displays the namespace (-A)
433 output_message=$(kubectl get serviceaccounts -A "${kube_flags[@]}")
434 kube::test::if_has_string "${output_message}" "all-ns-test-1"
435 kube::test::if_has_string "${output_message}" "all-ns-test-2"
436 # Clean up
437 kubectl delete "${kube_flags[@]}" namespace all-ns-test-1
438 kubectl delete "${kube_flags[@]}" namespace all-ns-test-2
439
440 ### Clean up
441 # Pre-condition: valid-pod exists
442 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'valid-pod:'
443 # Command
444 kubectl delete "${kube_flags[@]}" pod valid-pod --grace-period=0 --force
445 # Post-condition: valid-pod doesn't exist
446 kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
447
448 ### Verify flag all-namespaces is ignored for rootScoped resources
449 # Pre-condition: node exists
450 kube::test::get_object_assert nodes "{{range.items}}{{$id_field}}:{{end}}" '127.0.0.1:'
451 # Command
452 output_message=$(kubectl get nodes --all-namespaces 2>&1)
453 # Post-condition: output with no NAMESPACE field
454 kube::test::if_has_not_string "${output_message}" "NAMESPACE"
455
456 set +o nounset
457 set +o errexit
458}
459
460
461run_deprecated_api_tests() {
462 set -o nounset
463 set -o errexit
464
465 kube::log::status "Testing deprecated APIs"
466
467 # Create deprecated CRD
468 kubectl "${kube_flags_with_token[@]:?}" create -f - << __EOF__
469{
470 "kind": "CustomResourceDefinition",
471 "apiVersion": "apiextensions.k8s.io/v1",
472 "metadata": {
473 "name": "deprecated.example.com"
474 },
475 "spec": {
476 "group": "example.com",
477 "scope": "Namespaced",
478 "names": {
479 "plural": "deprecated",
480 "kind": "DeprecatedKind"
481 },
482 "versions": [
483 {
484 "name": "v1",
485 "served": true,
486 "storage": true,
487 "schema": {
488 "openAPIV3Schema": {
489 "x-kubernetes-preserve-unknown-fields": true,
490 "type": "object"
491 }
492 }
493 },
494 {
495 "name": "v1beta1",
496 "deprecated": true,
497 "served": true,
498 "storage": false,
499 "schema": {
500 "openAPIV3Schema": {
501 "x-kubernetes-preserve-unknown-fields": true,
502 "type": "object"
503 }
504 }
505 }
506 ]
507 }
508}
509__EOF__
510
511 # Ensure the API server has recognized and started serving the associated CR API
512 local tries=5
513 for i in $(seq 1 $tries); do
514 local output
515 output=$(kubectl "${kube_flags[@]:?}" api-resources --api-group example.com -oname || true)
516 if kube::test::if_has_string "$output" deprecated.example.com; then
517 break
518 fi
519 echo "${i}: Waiting for CR API to be available"
520 sleep "$i"
521 done
522
523 # Test deprecated API request output
524 output_message=$(kubectl get deprecated.v1beta1.example.com 2>&1 "${kube_flags[@]}")
525 kube::test::if_has_string "${output_message}" 'example.com/v1beta1 DeprecatedKind is deprecated'
526 output_message=$(! kubectl get deprecated.v1beta1.example.com --warnings-as-errors 2>&1 "${kube_flags[@]}")
527 kube::test::if_has_string "${output_message}" 'example.com/v1beta1 DeprecatedKind is deprecated'
528 kube::test::if_has_string "${output_message}" 'error: 1 warning received'
529
530 # Delete deprecated CRD
531 kubectl delete "${kube_flags[@]}" crd deprecated.example.com
532
533 set +o nounset
534 set +o errexit
535}
View as plain text