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  }