...

Text file src/k8s.io/kubernetes/test/cmd/discovery.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_RESTMapper_evaluation_tests() {
    22  set -o nounset
    23  set -o errexit
    24
    25  create_and_use_new_namespace
    26  kube::log::status "Testing RESTMapper"
    27
    28  RESTMAPPER_ERROR_FILE="${KUBE_TEMP}/restmapper-error"
    29
    30  ### Non-existent resource type should give a recognizable error
    31  # Pre-condition: None
    32  # Command
    33  kubectl get "${kube_flags[@]:?}" unknownresourcetype 2>"${RESTMAPPER_ERROR_FILE}" || true
    34  if grep -q "the server doesn't have a resource type" "${RESTMAPPER_ERROR_FILE}"; then
    35    kube::log::status "\"kubectl get unknownresourcetype\" returns error as expected: $(cat "${RESTMAPPER_ERROR_FILE}")"
    36  else
    37    kube::log::status "\"kubectl get unknownresourcetype\" returns unexpected error or non-error: $(cat "${RESTMAPPER_ERROR_FILE}")"
    38    exit 1
    39  fi
    40  rm "${RESTMAPPER_ERROR_FILE}"
    41  # Post-condition: None
    42
    43  set +o nounset
    44  set +o errexit
    45}
    46
    47run_assert_short_name_tests() {
    48  set -o nounset
    49  set -o errexit
    50
    51  create_and_use_new_namespace
    52  kube::log::status "Testing assert short name"
    53
    54  kube::log::status "Testing propagation of short names for resources"
    55  output_message=$(kubectl get --raw=/api/v1)
    56
    57  ## test if a short name is exported during discovery
    58  kube::test::if_has_string "${output_message}" '{"name":"configmaps","singularName":"configmap","namespaced":true,"kind":"ConfigMap","verbs":\["create","delete","deletecollection","get","list","patch","update","watch"\],"shortNames":\["cm"\],"storageVersionHash":'
    59
    60  # check that there is no pod with the name test-crd-example
    61  output_message=$(kubectl get pod)
    62  kube::test::if_has_not_string "${output_message}" "test-crd-example"
    63
    64    kubectl create -f - << __EOF__
    65apiVersion: apiextensions.k8s.io/v1
    66kind: CustomResourceDefinition
    67metadata:
    68  name: examples.test.com
    69spec:
    70  group: test.com
    71  scope: Namespaced
    72  versions:
    73    - name: v1
    74      served: true
    75      storage: true
    76      schema:
    77        openAPIV3Schema:
    78          type: object
    79          properties:
    80            spec:
    81              type: object
    82              properties:
    83                test:
    84                  type: string
    85  names:
    86    plural: examples
    87    singular: example
    88    shortNames:
    89      - pod
    90    kind: Example
    91__EOF__
    92
    93  # Test that we can list this new custom resource
    94  kube::test::wait_object_assert customresourcedefinitions "{{range.items}}{{if eq ${id_field:?} \"examples.test.com\"}}{{$id_field}}:{{end}}{{end}}" 'examples.test.com:'
    95
    96  kubectl create -f - << __EOF__
    97apiVersion: test.com/v1
    98kind: Example
    99metadata:
   100  name: test-crd-example
   101spec:
   102  test: test
   103__EOF__
   104
   105  # Test that we can list this new custom resource
   106  kube::test::wait_object_assert examples "{{range.items}}{{${id_field:?}}}:{{end}}" 'test-crd-example:'
   107
   108  output_message=$(kubectl get examples)
   109  kube::test::if_has_string "${output_message}" "test-crd-example"
   110
   111  # test that get pod returns v1/pod instead crd
   112  output_message=$(kubectl get pod)
   113  kube::test::if_has_not_string "${output_message}" "test-crd-example"
   114
   115  # invalidate cache and assure that still correct resource is shown
   116  kubectl api-resources
   117
   118  # retest the above cases after invalidating cache
   119  output_message=$(kubectl get examples)
   120  kube::test::if_has_string "${output_message}" "test-crd-example"
   121
   122  output_message=$(kubectl get pod)
   123  kube::test::if_has_not_string "${output_message}" "test-crd-example"
   124
   125  # Cleanup
   126  kubectl delete examples/test-crd-example
   127  kubectl delete customresourcedefinition examples.test.com
   128
   129  set +o nounset
   130  set +o errexit
   131}
   132
   133run_assert_singular_name_tests() {
   134  set -o nounset
   135  set -o errexit
   136
   137  create_and_use_new_namespace
   138  kube::log::status "Testing assert singular name"
   139
   140  # check that there is no pod with the name test-crd-example
   141  output_message=$(kubectl get pod)
   142  kube::test::if_has_not_string "${output_message}" "test-crd-example"
   143
   144  kubectl create -f - << __EOF__
   145apiVersion: apiextensions.k8s.io/v1
   146kind: CustomResourceDefinition
   147metadata:
   148  name: examples.test.com
   149spec:
   150  group: test.com
   151  scope: Namespaced
   152  versions:
   153    - name: v1
   154      served: true
   155      storage: true
   156      schema:
   157        openAPIV3Schema:
   158          type: object
   159          properties:
   160            spec:
   161              type: object
   162              properties:
   163                test:
   164                  type: string
   165  names:
   166    plural: examples
   167    singular: pod
   168    kind: Example
   169__EOF__
   170
   171  # Test that we can list this new custom resource
   172  kube::test::wait_object_assert customresourcedefinitions "{{range.items}}{{if eq ${id_field:?} \"examples.test.com\"}}{{$id_field}}:{{end}}{{end}}" 'examples.test.com:'
   173
   174  kubectl create -f - << __EOF__
   175apiVersion: test.com/v1
   176kind: Example
   177metadata:
   178  name: test-crd-example
   179spec:
   180  test: test
   181__EOF__
   182
   183  # Test that we can list this new custom resource
   184  kube::test::wait_object_assert examples "{{range.items}}{{$id_field}}:{{end}}" 'test-crd-example:'
   185
   186  output_message=$(kubectl get examples)
   187  kube::test::if_has_string "${output_message}" "test-crd-example"
   188
   189  output_message=$(kubectl get pod)
   190  kube::test::if_has_not_string "${output_message}" "test-crd-example"
   191
   192  # invalidate cache and assure that still correct resource is shown
   193  kubectl api-resources
   194
   195  output_message=$(kubectl get examples)
   196  kube::test::if_has_string "${output_message}" "test-crd-example"
   197
   198  output_message=$(kubectl get pod)
   199  kube::test::if_has_not_string "${output_message}" "test-crd-example"
   200
   201  # Cleanup
   202  kubectl delete examples/test-crd-example
   203  kubectl delete customresourcedefinition examples.test.com
   204
   205  set +o nounset
   206  set +o errexit
   207}
   208
   209run_assert_categories_tests() {
   210  set -o nounset
   211  set -o errexit
   212
   213  kube::log::status "Testing propagation of categories for resources"
   214  output_message=$(kubectl get --raw=/api/v1 | grep -o '"name":"pods"[^}]*}')
   215  kube::test::if_has_string "${output_message}" '"categories":\["all"\]'
   216
   217  set +o nounset
   218  set +o errexit
   219}
   220
   221run_resource_aliasing_tests() {
   222  set -o nounset
   223  set -o errexit
   224
   225  create_and_use_new_namespace
   226  kube::log::status "Testing resource aliasing"
   227  kubectl create -f test/e2e/testing-manifests/statefulset/cassandra/controller.yaml "${kube_flags[@]}"
   228  kubectl create -f test/e2e/testing-manifests/statefulset/cassandra/service.yaml "${kube_flags[@]}"
   229
   230  object="all -l app=cassandra"
   231  request="{{range.items}}{{range .metadata.labels}}{{.}}:{{end}}{{end}}"
   232
   233  # all 4 cassandra's might not be in the request immediately...
   234  # :? suffix is for possible service.kubernetes.io/headless
   235  # label with "" value
   236  kube::test::get_object_assert "$object" "$request" '(cassandra:){2}(cassandra:(cassandra::?)?)?'
   237
   238  kubectl delete all -l app=cassandra "${kube_flags[@]}"
   239
   240  set +o nounset
   241  set +o errexit
   242}
   243
   244run_crd_deletion_recreation_tests() {
   245  set -o nounset
   246  set -o errexit
   247
   248  create_and_use_new_namespace
   249  kube::log::status "Testing resource creation, deletion, and re-creation"
   250
   251  output_message=$(kubectl apply -f hack/testdata/CRD/example-crd-1-cluster-scoped.yaml)
   252  kube::test::if_has_string "${output_message}" 'created'
   253  output_message=$(kubectl apply -f hack/testdata/CRD/example-crd-1-cluster-scoped-resource.yaml)
   254  kube::test::if_has_string "${output_message}" 'created'
   255  output_message=$(kubectl delete -f hack/testdata/CRD/example-crd-1-cluster-scoped.yaml)
   256  kube::test::if_has_string "${output_message}" 'deleted'
   257  # Invalidate local cache because cluster scoped CRD in cache is stale.
   258  # Invalidation of cache may take up to 6 hours and we are manually
   259  # invalidate cache and expect that scope changed CRD should be created without problem.
   260  kubectl api-resources
   261  output_message=$(kubectl apply -f hack/testdata/CRD/example-crd-1-namespaced.yaml)
   262  kube::test::if_has_string "${output_message}" 'created'
   263  output_message=$(kubectl apply -f hack/testdata/CRD/example-crd-1-namespaced-resource.yaml)
   264  kube::test::if_has_string "${output_message}" 'created'
   265
   266  # Cleanup
   267  kubectl delete -f hack/testdata/CRD/example-crd-1-namespaced-resource.yaml
   268  kubectl delete -f hack/testdata/CRD/example-crd-1-namespaced.yaml
   269
   270  set +o nounset
   271  set +o errexit
   272}
   273
   274run_kubectl_explain_tests() {
   275  set -o nounset
   276  set -o errexit
   277
   278  kube::log::status "Testing kubectl(v1:explain)"
   279  kubectl explain pods
   280  # shortcuts work
   281  kubectl explain po
   282  kubectl explain po.status.message
   283  # cronjob work
   284  kubectl explain cronjob
   285
   286  set +o nounset
   287  set +o errexit
   288}
   289
   290run_swagger_tests() {
   291  set -o nounset
   292  set -o errexit
   293
   294  kube::log::status "Testing swagger"
   295
   296  # Verify schema
   297  file="${KUBE_TEMP}/schema.json"
   298  curl -kfsS -H 'Authorization: Bearer admin-token' "https://127.0.0.1:${SECURE_API_PORT}/openapi/v2" > "${file}"
   299  grep -q "list of returned" "${file}"
   300  grep -q "List of services" "${file}"
   301  grep -q "Watch for changes to the described resources" "${file}"
   302
   303  set +o nounset
   304  set +o errexit
   305}
   306
   307run_ambiguous_shortname_tests() {
   308  set -o nounset
   309  set -o errexit
   310
   311  create_and_use_new_namespace
   312  kube::log::status "Testing ambiguous short name"
   313
   314  kubectl create -f - << __EOF__
   315apiVersion: apiextensions.k8s.io/v1
   316kind: CustomResourceDefinition
   317metadata:
   318  name: foos.bar.com
   319spec:
   320  group: bar.com
   321  scope: Namespaced
   322  versions:
   323    - name: v1
   324      served: true
   325      storage: true
   326      schema:
   327        openAPIV3Schema:
   328          type: object
   329          properties:
   330            spec:
   331              type: object
   332              properties:
   333                test:
   334                  type: string
   335  names:
   336    plural: foos
   337    singular: foo
   338    shortNames:
   339      - exmp
   340    kind: Foo
   341    categories:
   342      - all
   343__EOF__
   344
   345  # Test that we can list this new custom resource
   346  kube::test::wait_object_assert customresourcedefinitions "{{range.items}}{{if eq ${id_field:?} \"foos.bar.com\"}}{{$id_field}}:{{end}}{{end}}" 'foos.bar.com:'
   347
   348  kubectl create -f - << __EOF__
   349apiVersion: bar.com/v1
   350kind: Foo
   351metadata:
   352  name: test-crd-foo
   353spec:
   354  test: test
   355__EOF__
   356
   357  # Test that we can list this new custom resource
   358  kube::test::wait_object_assert foos "{{range.items}}{{$id_field}}:{{end}}" 'test-crd-foo:'
   359
   360  output_message=$(kubectl get exmp)
   361  kube::test::if_has_string "${output_message}" "test-crd-foo"
   362
   363  kubectl create -f - << __EOF__
   364apiVersion: apiextensions.k8s.io/v1
   365kind: CustomResourceDefinition
   366metadata:
   367  name: examples.test.com
   368spec:
   369  group: test.com
   370  scope: Namespaced
   371  versions:
   372    - name: v1
   373      served: true
   374      storage: true
   375      schema:
   376        openAPIV3Schema:
   377          type: object
   378          properties:
   379            spec:
   380              type: object
   381              properties:
   382                test:
   383                  type: string
   384  names:
   385    plural: examples
   386    singular: example
   387    shortNames:
   388      - exmp
   389    kind: Example
   390__EOF__
   391
   392  # Test that we can list this new custom resource
   393  kube::test::wait_object_assert customresourcedefinitions "{{range.items}}{{if eq ${id_field:?} \"examples.test.com\"}}{{$id_field}}:{{end}}{{end}}" 'examples.test.com:'
   394
   395  output_message=$(kubectl  get examples 2>&1 "${kube_flags[@]}")
   396  kube::test::if_has_string "${output_message}" 'No resources found'
   397
   398  output_message=$(kubectl get exmp 2>&1)
   399  kube::test::if_has_string "${output_message}" "test-crd-foo"
   400  kube::test::if_has_string "${output_message}" "short name \"exmp\" could also match lower priority resource examples.test.com"
   401
   402  # Cleanup
   403  kubectl delete foos/test-crd-foo
   404  kubectl delete customresourcedefinition foos.bar.com
   405  kubectl delete customresourcedefinition examples.test.com
   406
   407  set +o nounset
   408  set +o errexit
   409}

View as plain text