k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/cluster/addons/addon-manager/kube-addons-test.sh (about) 1 #!/usr/bin/env bash 2 3 # Copyright 2020 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 # These tests enforce behavior of kube-addon-manager functions against a real 18 # cluster. A working Kubernetes cluster must be set up with kubectl configured. 19 # To run with the released version of kubectl, use `make test`. 20 21 set -o errexit 22 set -o pipefail 23 set -o nounset 24 25 # Default kubectl to the test users installation if needed. 26 KUBECTL_BIN="${KUBECTL_BIN:-kubectl}" 27 28 # Disabling shellcheck following files as the full path would be required. 29 # shellcheck disable=SC1091 30 source "kube-addons.sh" 31 32 TEST_NS="kube-addon-manager-test" 33 34 function retry() { 35 local tries=10 36 while [ "${tries}" -gt 0 ]; do 37 "$@" && return 0; 38 (( tries-- )) 39 sleep 1 40 done 41 } 42 43 function setup(){ 44 retry kubectl create namespace "${TEST_NS}" 45 } 46 47 function teardown() { 48 retry kubectl delete namespace "${TEST_NS}" 49 } 50 51 function error() { 52 echo -e "\e[31m$*\e[0m" 53 } 54 55 function echo_green() { 56 echo -e "\e[32m$*\e[0m" 57 } 58 59 function echo_blue() { 60 echo -e "\e[34m$*\e[0m" 61 } 62 63 function test_create_resource_reconcile() { 64 local limitrange 65 read -r -d '' limitrange << EOF 66 apiVersion: "v1" 67 kind: "LimitRange" 68 metadata: 69 name: "limits" 70 namespace: "${TEST_NS}" 71 labels: 72 addonmanager.kubernetes.io/mode: Reconcile 73 spec: 74 limits: 75 - type: "Container" 76 defaultRequest: 77 cpu: "100m" 78 EOF 79 80 # arguments are yaml text, number of tries, delay, name of file, and namespace 81 echo_blue "Creating initial resource to test Reconcile mode" 82 create_resource_from_string "${limitrange}" "10" "1" "limitrange.yaml" "${TEST_NS}" 83 if ! (kubectl get limits/limits -n "${TEST_NS}"); then 84 error "failed to create limits w/ reconcile" 85 return 1 86 elif ! (kubectl get limits/limits -n ${TEST_NS} -o yaml | grep --silent "100m"); then 87 error "limits does not match applied config" 88 return 1 89 fi 90 91 # Changes to addons with mode reconcile should be reflected. 92 echo_blue "Changes to manifest should be reflected in the cluster" 93 limitrange="${limitrange//100m/50m}" 94 create_resource_from_string "${limitrange}" "10" "1" "limitrange.yaml" "${TEST_NS}" 95 if kubectl get limits/limits -n ${TEST_NS} -o yaml | grep --silent "100m"; then 96 error "failed to update resource, still has 100m" 97 return 1 98 elif ! (kubectl get limits/limits -n ${TEST_NS} -o yaml | grep --silent "50m"); then 99 error "failed to update resource, 50m limit was not reflected" 100 return 1 101 fi 102 103 # Finally, the users configuration will not be respected. 104 echo_blue "Changes the user makes should be overwritten by kube-addon-manager" 105 EDITOR="sed -i 's/50m/600m/'" kubectl edit limits/limits -n ${TEST_NS} 106 if kubectl get limits/limits -n ${TEST_NS} -o yaml | grep --silent "50m"; then 107 error "failed to edit resource with sed -- test is broken" 108 return 1 109 fi 110 create_resource_from_string "${limitrange}" "10" "1" "limitrange.yaml" "${TEST_NS}" 111 if ! ( kubectl get limits/limits -n ${TEST_NS} -o yaml | grep --silent "50m"); then 112 error "failed to update resource, user config was respected when it should have been rewritten" 113 return 1 114 fi 115 } 116 117 function test_create_resource_ensureexists() { 118 local limitrange 119 read -r -d '' limitrange << EOF 120 apiVersion: "v1" 121 kind: "LimitRange" 122 metadata: 123 name: "limits" 124 namespace: "${TEST_NS}" 125 labels: 126 addonmanager.kubernetes.io/mode: EnsureExists 127 spec: 128 limits: 129 - type: "Container" 130 defaultRequest: 131 cpu: "100m" 132 EOF 133 134 # arguments are yaml text, number of tries, delay, name of file, and namespace 135 echo_blue "Creating initial resource to test mode EnsureExists" 136 create_resource_from_string "${limitrange}" "10" "1" "limitrange.yaml" "${TEST_NS}" 137 if ! (kubectl get limits/limits -n "${TEST_NS}"); then 138 error "failed to create limits w/ EnsureExists" 139 return 1 140 elif ! (kubectl get limits/limits -n ${TEST_NS} -o yaml | grep --silent "100m"); then 141 error "limits does not match applied config" 142 return 1 143 fi 144 145 # Changes to addons with mode EnsureExists should NOT be reflected. 146 echo_blue "Changes to the manifest should not be reconciled with the cluster" 147 limitrange="${limitrange//100m/50m}" 148 create_resource_from_string "${limitrange}" "10" "1" "limitrange.yaml" "${TEST_NS}" 149 if kubectl get limits/limits -n ${TEST_NS} -o yaml | grep --silent "50m"; then 150 error "failed to respect existing resource, was overwritten despite EnsureExists" 151 return 1 152 fi 153 154 # the users configuration must be respected 155 echo_blue "User configuration will be persisted for EnsureExists" 156 EDITOR="sed -i 's/100m/600m/'" kubectl edit limits/limits -n ${TEST_NS} 157 if kubectl get limits/limits -n ${TEST_NS} -o yaml | grep --silent "100m"; then 158 error "failed to edit resource with sed -- test is broken" 159 return 1 160 fi 161 create_resource_from_string "${limitrange}" "10" "1" "limitrange.yaml" "${TEST_NS}" 162 if kubectl get limits/limits -n ${TEST_NS} -o yaml | grep --silent "100m"; then 163 error "failed to respect user changes to EnsureExists object" 164 return 1 165 fi 166 167 # unless they delete the object, in which case it should return 168 echo_blue "Missing EnsureExists resources will be re-created" 169 kubectl delete limits/limits -n ${TEST_NS} 170 if kubectl get limits/limits -n ${TEST_NS}; then 171 error "failed to delete limitrange" 172 return 1 173 fi 174 create_resource_from_string "${limitrange}" "10" "1" "limitrange.yaml" "${TEST_NS}" 175 if ! kubectl get limits/limits -n ${TEST_NS}; then 176 error "failed to recreate deleted EnsureExists resource" 177 return 1 178 fi 179 } 180 181 function test_create_multiresource() { 182 local limitrange 183 read -r -d '' limitrange << EOF 184 apiVersion: "v1" 185 kind: "LimitRange" 186 metadata: 187 name: "limits" 188 namespace: "${TEST_NS}" 189 labels: 190 addonmanager.kubernetes.io/mode: EnsureExists 191 spec: 192 limits: 193 - type: "Container" 194 defaultRequest: 195 cpu: "100m" 196 --- 197 apiVersion: "v1" 198 kind: "LimitRange" 199 metadata: 200 name: "limits2" 201 namespace: "${TEST_NS}" 202 labels: 203 addonmanager.kubernetes.io/mode: Reconcile 204 spec: 205 limits: 206 - type: "Container" 207 defaultRequest: 208 cpu: "100m" 209 EOF 210 211 # arguments are yaml text, number of tries, delay, name of file, and namespace 212 echo_blue "Creating initial resources from multi-resource manifest" 213 create_resource_from_string "${limitrange}" "10" "1" "limitrange.yaml" "${TEST_NS}" 214 if ! (kubectl get limits/limits -n "${TEST_NS}"); then 215 error "failed to create limits w/ EnsureExists" 216 return 1 217 elif ! (kubectl get limits/limits2 -n "${TEST_NS}"); then 218 error "failed to create limits2 w/ Reconcile" 219 return 1 220 fi 221 222 # Changes to addons with mode EnsureExists should NOT be reflected. 223 # However, the mode=Reconcile addon should be changed. 224 echo_blue "Multi-resource manifest changes should apply to EnsureExists, not Reconcile" 225 limitrange="${limitrange//100m/50m}" 226 create_resource_from_string "${limitrange}" "10" "1" "limitrange.yaml" "${TEST_NS}" 227 if kubectl get limits/limits -n ${TEST_NS} -o yaml | grep --silent "50m"; then 228 error "failed to respect existing resource, was overwritten despite EnsureExists" 229 return 1 230 elif kubectl get limits/limits2 -n ${TEST_NS} | grep --silent "100m"; then 231 error "failed to update resource with mode Reconcile" 232 return 1 233 fi 234 235 # the users configuration must be respected for EnsureExists 236 echo_blue "Multi-resource manifest should not overwrite user config in EnsureExists" 237 EDITOR="sed -i 's/100m/600m/'" kubectl edit limits/limits -n ${TEST_NS} 238 if kubectl get limits/limits -n ${TEST_NS} -o yaml | grep --silent "100m"; then 239 error "failed to edit resource with sed -- test is broken" 240 return 1 241 fi 242 create_resource_from_string "${limitrange}" "10" "1" "limitrange.yaml" "${TEST_NS}" 243 if kubectl get limits/limits -n ${TEST_NS} -o yaml | grep --silent "100m"; then 244 error "failed to respect user changes to EnsureExists object" 245 return 1 246 fi 247 248 # But not for Reconcile. 249 echo_blue "Multi-resource manifest should overwrite user config in EnsureExists" 250 EDITOR="sed -i 's/50m/600m/'" kubectl edit limits/limits2 -n ${TEST_NS} 251 if kubectl get limits/limits2 -n ${TEST_NS} -o yaml | grep --silent "50m"; then 252 error "failed to edit resource with sed -- test is broken" 253 return 1 254 fi 255 create_resource_from_string "${limitrange}" "10" "1" "limitrange.yaml" "${TEST_NS}" 256 if ! ( kubectl get limits/limits2 -n ${TEST_NS} -o yaml | grep --silent "50m"); then 257 error "failed to update resource, user config was respected when it should have been rewritten" 258 return 1 259 fi 260 } 261 262 function test_func() { 263 local -r name="${1}" 264 265 echo_blue "=== TEST ${name}" 266 setup 267 if ! "${name}"; then 268 failures=$((failures+1)) 269 error "=== FAIL" 270 else 271 echo_green "=== PASS" 272 fi 273 teardown 274 } 275 276 failures=0 277 test_func test_create_resource_reconcile 278 test_func test_create_resource_ensureexists 279 test_func test_create_multiresource 280 if [ "${failures}" -gt 0 ]; then 281 error "no. failed tests: ${failures}" 282 error "FAIL" 283 exit 1 284 else 285 echo_green "PASS" 286 fi