k8s.io/kubernetes@v1.29.3/test/cmd/create.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 # Runs tests related to kubectl create --dry-run. 22 run_kubectl_create_dry_run_tests() { 23 set -o nounset 24 set -o errexit 25 26 create_and_use_new_namespace 27 kube::log::status "Testing kubectl create dry-run" 28 29 # Pre-Condition: no POD exists 30 kube::test::get_object_assert pods "{{range.items}}{{${id_field:?}}}:{{end}}" '' 31 # dry-run create 32 kubectl create --dry-run=client -f hack/testdata/pod.yaml "${kube_flags[@]:?}" 33 kubectl create --dry-run=server -f hack/testdata/pod.yaml "${kube_flags[@]:?}" 34 # check no POD exists 35 kube::test::get_object_assert pods "{{range.items}}{{${id_field:?}}}:{{end}}" '' 36 37 set +o nounset 38 set +o errexit 39 } 40 41 # Runs tests related to kubectl create --filename(-f) --selector(-l). 42 run_kubectl_create_filter_tests() { 43 set -o nounset 44 set -o errexit 45 46 create_and_use_new_namespace 47 kube::log::status "Testing kubectl create filter" 48 ## kubectl create -f with label selector should only create matching objects 49 # Pre-Condition: no POD exists 50 kube::test::get_object_assert pods "{{range.items}}{{${id_field:?}}}:{{end}}" '' 51 # create 52 kubectl create -l unique-label=bingbang -f hack/testdata/filter "${kube_flags[@]:?}" 53 # check right pod exists 54 kube::test::get_object_assert 'pods selector-test-pod' "{{${labels_field:?}.name}}" 'selector-test-pod' 55 # check wrong pod doesn't exist 56 output_message=$(! kubectl get pods selector-test-pod-dont-apply 2>&1 "${kube_flags[@]}") 57 kube::test::if_has_string "${output_message}" 'pods "selector-test-pod-dont-apply" not found' 58 # cleanup 59 kubectl delete pods selector-test-pod 60 61 set +o nounset 62 set +o errexit 63 } 64 65 run_kubectl_create_error_tests() { 66 set -o nounset 67 set -o errexit 68 69 create_and_use_new_namespace 70 kube::log::status "Testing kubectl create with error" 71 72 # Passing no arguments to create is an error 73 ! kubectl create || exit 1 74 75 # Posting a pod to namespaces should fail. Also tests --raw forcing the post location 76 grep -q 'the object provided is unrecognized (must be of type Namespace)' <<< "$( kubectl create "${kube_flags[@]}" --raw /api/v1/namespaces -f test/fixtures/doc-yaml/admin/limitrange/valid-pod.yaml --v=8 2>&1 )" 77 78 grep -q "raw and --edit are mutually exclusive" <<< "$( kubectl create "${kube_flags[@]}" --raw /api/v1/namespaces -f test/fixtures/doc-yaml/admin/limitrange/valid-pod.yaml --edit 2>&1 )" 79 80 set +o nounset 81 set +o errexit 82 } 83 84 # Runs kubectl create job tests 85 run_create_job_tests() { 86 set -o nounset 87 set -o errexit 88 89 create_and_use_new_namespace 90 91 # Test kubectl create job 92 kubectl create job test-job --image=registry.k8s.io/nginx:test-cmd 93 # Post-Condition: job nginx is created 94 kube::test::get_object_assert 'job test-job' "{{${image_field0:?}}}" 'registry.k8s.io/nginx:test-cmd' 95 # Clean up 96 kubectl delete job test-job "${kube_flags[@]}" 97 98 # Test kubectl create job with command 99 kubectl create job test-job-pi "--image=$IMAGE_PERL" -- perl -Mbignum=bpi -wle 'print bpi(20)' 100 kube::test::get_object_assert 'job test-job-pi' "{{$image_field0}}" "$IMAGE_PERL" 101 # Clean up 102 kubectl delete job test-job-pi 103 104 # Test kubectl create job from cronjob 105 # Pre-Condition: create a cronjob 106 kubectl create cronjob test-pi --schedule="* */5 * * *" "--image=$IMAGE_PERL" -- perl -Mbignum=bpi -wle 'print bpi(10)' 107 kubectl create job my-pi --from=cronjob/test-pi 108 # Post-condition: container args contain expected command 109 output_message=$(kubectl get job my-pi -o go-template='{{(index .spec.template.spec.containers 0).command}}' "${kube_flags[@]}") 110 kube::test::if_has_string "${output_message}" "perl -Mbignum=bpi -wle print bpi(10)" 111 112 # Clean up 113 kubectl delete job my-pi 114 kubectl delete cronjob test-pi 115 116 set +o nounset 117 set +o errexit 118 } 119 120 run_kubectl_create_kustomization_directory_tests() { 121 set -o nounset 122 set -o errexit 123 124 ## kubectl create -k <dir> for kustomization directory 125 # Pre-Condition: No configmaps with name=test-the-map, no Deployment, Service exist 126 kube::test::get_object_assert 'configmaps --field-selector=metadata.name=test-the-map' "{{range.items}}{{${id_field:?}}}:{{end}}" '' 127 kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" '' 128 kube::test::get_object_assert services "{{range.items}}{{$id_field}}:{{end}}" '' 129 # Command 130 kubectl create -k hack/testdata/kustomize 131 # Post-condition: test-the-map, test-the-deployment, test-the-service exist 132 133 # Check that all items in the list are printed 134 kube::test::get_object_assert 'configmap test-the-map' "{{${id_field}}}" 'test-the-map' 135 kube::test::get_object_assert 'deployment test-the-deployment' "{{${id_field}}}" 'test-the-deployment' 136 kube::test::get_object_assert 'service test-the-service' "{{${id_field}}}" 'test-the-service' 137 138 # cleanup 139 kubectl delete -k hack/testdata/kustomize 140 141 set +o nounset 142 set +o errexit 143 } 144 145 has_one_of_error_message() { 146 local message=$1 147 local match1=$2 148 local match2=$3 149 150 if (grep -q "${match1}" <<< "${message}") || (grep -q "${match2}" <<< "${message}"); then 151 echo "Successful" 152 echo "message:${message}" 153 echo "has either:${match1}" 154 echo "or:${match2}" 155 return 0 156 else 157 echo "FAIL!" 158 echo "message:${message}" 159 echo "has neither:${match1}" 160 echo "nor:${match2}" 161 caller 162 return 1 163 fi 164 } 165 166 # Runs tests related to kubectl create --validate 167 run_kubectl_create_validate_tests() { 168 set -o nounset 169 set -o errexit 170 171 create_and_use_new_namespace 172 173 ## test --validate no value expects default strict is used 174 kube::log::status "Testing kubectl create --validate" 175 # create and verify 176 output_message=$(! kubectl create -f hack/testdata/invalid-deployment-unknown-and-duplicate-fields.yaml --validate 2>&1) 177 has_one_of_error_message "${output_message}" 'strict decoding error' 'error validating data' 178 179 ## test --validate=true 180 kube::log::status "Testing kubectl create --validate=true" 181 # create and verify 182 output_message=$(! kubectl create -f hack/testdata/invalid-deployment-unknown-and-duplicate-fields.yaml --validate=true 2>&1) 183 has_one_of_error_message "${output_message}" 'strict decoding error' 'error validating data' 184 185 ## test --validate=false 186 kube::log::status "Testing kubectl create --validate=false" 187 # create and verify 188 output_message=$(kubectl create -f hack/testdata/invalid-deployment-unknown-and-duplicate-fields.yaml --validate=false) 189 kube::test::if_has_string "${output_message}" "deployment.apps/invalid-nginx-deployment created" 190 # cleanup 191 kubectl delete deployment invalid-nginx-deployment 192 193 ## test --validate=strict 194 kube::log::status "Testing kubectl create --validate=strict" 195 # create and verify 196 output_message=$(! kubectl create -f hack/testdata/invalid-deployment-unknown-and-duplicate-fields.yaml --validate=strict 2>&1) 197 has_one_of_error_message "${output_message}" 'strict decoding error' 'error validating data' 198 199 ## test --validate=warn 200 kube::log::status "Testing kubectl create --validate=warn" 201 # create and verify 202 output_message=$(kubectl create -f hack/testdata/invalid-deployment-unknown-and-duplicate-fields.yaml --validate=warn) 203 kube::test::if_has_string "${output_message}" "deployment.apps/invalid-nginx-deployment created" 204 # cleanup 205 kubectl delete deployment invalid-nginx-deployment 206 207 ## test --validate=ignore 208 kube::log::status "Testing kubectl create --validate=ignore" 209 # create and verify 210 output_message=$(kubectl create -f hack/testdata/invalid-deployment-unknown-and-duplicate-fields.yaml --validate=ignore) 211 kube::test::if_has_string "${output_message}" "deployment.apps/invalid-nginx-deployment created" 212 # cleanup 213 kubectl delete deployment invalid-nginx-deployment 214 215 ## test default is strict validation 216 kube::log::status "Testing kubectl create" 217 # create and verify 218 output_message=$(! kubectl create -f hack/testdata/invalid-deployment-unknown-and-duplicate-fields.yaml 2>&1) 219 has_one_of_error_message "${output_message}" 'strict decoding error' 'error validating data' 220 221 ## test invalid validate value 222 kube::log::status "Testing kubectl create --validate=foo" 223 # create and verify 224 output_message=$(! kubectl create -f hack/testdata/invalid-deployment-unknown-and-duplicate-fields.yaml --validate=foo 2>&1) 225 kube::test::if_has_string "${output_message}" 'invalid - validate option "foo"' 226 227 set +o nounset 228 set +o errexit 229 }