k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/test/cmd/get.sh (about) 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 17 set -o errexit 18 set -o nounset 19 set -o pipefail 20 21 run_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 243 run_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 256 run_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 298 run_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 401 run_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 461 run_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 }