...

Text file src/k8s.io/kubernetes/test/cmd/get.sh

Documentation: k8s.io/kubernetes/test/cmd

     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