apps.sh 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. #!/usr/bin/env bash
  2. # Copyright 2018 The Kubernetes Authors.
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. set -o errexit
  16. set -o nounset
  17. set -o pipefail
  18. run_daemonset_tests() {
  19. set -o nounset
  20. set -o errexit
  21. create_and_use_new_namespace
  22. kube::log::status "Testing kubectl(v1:daemonsets)"
  23. ### Create a rolling update DaemonSet
  24. # Pre-condition: no DaemonSet exists
  25. kube::test::get_object_assert daemonsets "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  26. # Command
  27. kubectl apply -f hack/testdata/rollingupdate-daemonset.yaml "${kube_flags[@]:?}"
  28. # Template Generation should be 1
  29. kube::test::get_object_assert 'daemonsets bind' "{{${generation_field:?}}}" '1'
  30. kubectl apply -f hack/testdata/rollingupdate-daemonset.yaml "${kube_flags[@]:?}"
  31. # Template Generation should stay 1
  32. kube::test::get_object_assert 'daemonsets bind' "{{${generation_field:?}}}" '1'
  33. # Test set commands
  34. kubectl set image daemonsets/bind "${kube_flags[@]:?}" "*=k8s.gcr.io/pause:test-cmd"
  35. kube::test::get_object_assert 'daemonsets bind' "{{${generation_field:?}}}" '2'
  36. kubectl set env daemonsets/bind "${kube_flags[@]:?}" foo=bar
  37. kube::test::get_object_assert 'daemonsets bind' "{{${generation_field:?}}}" '3'
  38. kubectl set resources daemonsets/bind "${kube_flags[@]:?}" --limits=cpu=200m,memory=512Mi
  39. kube::test::get_object_assert 'daemonsets bind' "{{${generation_field:?}}}" '4'
  40. # Rollout restart should change generation
  41. kubectl rollout restart daemonset/bind "${kube_flags[@]:?}"
  42. kube::test::get_object_assert 'daemonsets bind' "{{${generation_field:?}}}" '5'
  43. # Clean up
  44. kubectl delete -f hack/testdata/rollingupdate-daemonset.yaml "${kube_flags[@]:?}"
  45. set +o nounset
  46. set +o errexit
  47. }
  48. run_daemonset_history_tests() {
  49. set -o nounset
  50. set -o errexit
  51. create_and_use_new_namespace
  52. kube::log::status "Testing kubectl(v1:daemonsets, v1:controllerrevisions)"
  53. ### Test rolling back a DaemonSet
  54. # Pre-condition: no DaemonSet or its pods exists
  55. kube::test::get_object_assert daemonsets "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  56. # Command
  57. # Create a DaemonSet (revision 1)
  58. kubectl apply -f hack/testdata/rollingupdate-daemonset.yaml --record "${kube_flags[@]:?}"
  59. kube::test::wait_object_assert controllerrevisions "{{range.items}}{{${annotations_field:?}}}:{{end}}" ".*rollingupdate-daemonset.yaml --record.*"
  60. # Rollback to revision 1 - should be no-op
  61. kubectl rollout undo daemonset --to-revision=1 "${kube_flags[@]:?}"
  62. kube::test::get_object_assert daemonset "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_PAUSE_V2}:"
  63. kube::test::get_object_assert daemonset "{{range.items}}{{${container_len:?}}}{{end}}" "1"
  64. # Update the DaemonSet (revision 2)
  65. kubectl apply -f hack/testdata/rollingupdate-daemonset-rv2.yaml --record "${kube_flags[@]:?}"
  66. kube::test::wait_object_assert daemonset "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DAEMONSET_R2}:"
  67. kube::test::wait_object_assert daemonset "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_DAEMONSET_R2_2}:"
  68. kube::test::get_object_assert daemonset "{{range.items}}{{${container_len:?}}}{{end}}" "2"
  69. kube::test::wait_object_assert controllerrevisions "{{range.items}}{{${annotations_field:?}}}:{{end}}" ".*rollingupdate-daemonset-rv2.yaml --record.*"
  70. # Rollback to revision 1 with dry-run - should be no-op
  71. kubectl rollout undo daemonset --dry-run=client "${kube_flags[@]:?}"
  72. kubectl rollout undo daemonset --dry-run=server "${kube_flags[@]:?}"
  73. kube::test::get_object_assert daemonset "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DAEMONSET_R2}:"
  74. kube::test::get_object_assert daemonset "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_DAEMONSET_R2_2}:"
  75. kube::test::get_object_assert daemonset "{{range.items}}{{${container_len:?}}}{{end}}" "2"
  76. # Rollback to revision 1
  77. kubectl rollout undo daemonset --to-revision=1 "${kube_flags[@]:?}"
  78. kube::test::wait_object_assert daemonset "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_PAUSE_V2}:"
  79. kube::test::get_object_assert daemonset "{{range.items}}{{${container_len:?}}}{{end}}" "1"
  80. # Rollback to revision 1000000 - should fail
  81. output_message=$(! kubectl rollout undo daemonset --to-revision=1000000 "${kube_flags[@]:?}" 2>&1)
  82. kube::test::if_has_string "${output_message}" "unable to find specified revision"
  83. kube::test::get_object_assert daemonset "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_PAUSE_V2}:"
  84. kube::test::get_object_assert daemonset "{{range.items}}{{${container_len:?}}}{{end}}" "1"
  85. # Rollback to last revision
  86. kubectl rollout undo daemonset "${kube_flags[@]:?}"
  87. kube::test::wait_object_assert daemonset "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DAEMONSET_R2}:"
  88. kube::test::wait_object_assert daemonset "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_DAEMONSET_R2_2}:"
  89. kube::test::get_object_assert daemonset "{{range.items}}{{${container_len:?}}}{{end}}" "2"
  90. # Clean up
  91. kubectl delete -f hack/testdata/rollingupdate-daemonset.yaml "${kube_flags[@]:?}"
  92. set +o nounset
  93. set +o errexit
  94. }
  95. run_kubectl_apply_deployments_tests() {
  96. set -o nounset
  97. set -o errexit
  98. create_and_use_new_namespace
  99. kube::log::status "Testing kubectl apply deployments"
  100. ## kubectl apply should propagate user defined null values
  101. # Pre-Condition: no Deployments, ReplicaSets, Pods exist
  102. kube::test::get_object_assert deployments "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  103. kube::test::get_object_assert replicasets "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  104. kube::test::get_object_assert pods "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  105. # apply base deployment
  106. kubectl apply -f hack/testdata/null-propagation/deployment-l1.yaml "${kube_flags[@]:?}"
  107. # check right deployment exists
  108. kube::test::get_object_assert 'deployments my-depl' "{{${id_field:?}}}" 'my-depl'
  109. # check right labels exists
  110. kube::test::get_object_assert 'deployments my-depl' "{{.spec.template.metadata.labels.l1}}" 'l1'
  111. kube::test::get_object_assert 'deployments my-depl' "{{.spec.selector.matchLabels.l1}}" 'l1'
  112. kube::test::get_object_assert 'deployments my-depl' "{{.metadata.labels.l1}}" 'l1'
  113. # apply new deployment with new template labels
  114. kubectl apply -f hack/testdata/null-propagation/deployment-l2.yaml "${kube_flags[@]:?}"
  115. # check right labels exists
  116. kube::test::get_object_assert 'deployments my-depl' "{{.spec.template.metadata.labels.l1}}" 'l1'
  117. kube::test::get_object_assert 'deployments my-depl' "{{.spec.selector.matchLabels.l1}}" 'l1'
  118. kube::test::get_object_assert 'deployments my-depl' "{{.metadata.labels.l1}}" '<no value>'
  119. # cleanup
  120. # need to explicitly remove replicasets and pods because we changed the deployment selector and orphaned things
  121. kubectl delete deployments,rs,pods --all --cascade=false --grace-period=0
  122. # Post-Condition: no Deployments, ReplicaSets, Pods exist
  123. kube::test::wait_object_assert deployments "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  124. kube::test::wait_object_assert replicasets "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  125. kube::test::get_object_assert pods "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  126. # kubectl apply deployment --overwrite=true --force=true
  127. # Pre-Condition: no deployment exists
  128. kube::test::get_object_assert deployments "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  129. # apply deployment nginx
  130. kubectl apply -f hack/testdata/deployment-label-change1.yaml "${kube_flags[@]:?}"
  131. # check right deployment exists
  132. kube::test::get_object_assert 'deployment nginx' "{{${id_field:?}}}" 'nginx'
  133. # apply deployment with new labels and a conflicting resourceVersion
  134. output_message=$(! kubectl apply -f hack/testdata/deployment-label-change2.yaml 2>&1 "${kube_flags[@]:?}")
  135. kube::test::if_has_string "${output_message}" 'Error from server (Conflict)'
  136. # apply deployment with --force and --overwrite will succeed
  137. kubectl apply -f hack/testdata/deployment-label-change2.yaml --overwrite=true --force=true --grace-period=10
  138. # check the changed deployment
  139. output_message=$(kubectl apply view-last-applied deploy/nginx -o json 2>&1 "${kube_flags[@]:?}" |grep nginx2)
  140. kube::test::if_has_string "${output_message}" '"name": "nginx2"'
  141. # applying a resource (with --force) that is both conflicting and invalid will
  142. # cause the server to only return a "Conflict" error when we attempt to patch.
  143. # This means that we will delete the existing resource after receiving 5 conflict
  144. # errors in a row from the server, and will attempt to create the modified
  145. # resource that we are passing to "apply". Since the modified resource is also
  146. # invalid, we will receive an invalid error when we attempt to create it, after
  147. # having deleted the old resource. Ensure that when this case is reached, the
  148. # old resource is restored once again, and the validation error is printed.
  149. output_message=$(! kubectl apply -f hack/testdata/deployment-label-change3.yaml --force 2>&1 "${kube_flags[@]:?}")
  150. kube::test::if_has_string "${output_message}" 'Invalid value'
  151. # Ensure that the old object has been restored
  152. kube::test::get_object_assert 'deployment nginx' "{{${template_labels:?}}}" 'nginx2'
  153. # cleanup
  154. kubectl delete deployments --all --grace-period=10
  155. set +o nounset
  156. set +o errexit
  157. }
  158. run_deployment_tests() {
  159. set -o nounset
  160. set -o errexit
  161. create_and_use_new_namespace
  162. kube::log::status "Testing deployments"
  163. # Test kubectl create deployment (using default - old generator)
  164. kubectl create deployment test-nginx-extensions --image=k8s.gcr.io/nginx:test-cmd
  165. # Post-Condition: Deployment "nginx" is created.
  166. kube::test::get_object_assert 'deploy test-nginx-extensions' "{{${container_name_field:?}}}" 'nginx'
  167. # and old generator was used, iow. old defaults are applied
  168. output_message=$(kubectl get deployment.apps/test-nginx-extensions -o jsonpath='{.spec.revisionHistoryLimit}')
  169. kube::test::if_has_not_string "${output_message}" '2'
  170. # Ensure we can interact with deployments through apps endpoints
  171. output_message=$(kubectl get deployment.apps -o=jsonpath='{.items[0].apiVersion}' 2>&1 "${kube_flags[@]:?}")
  172. kube::test::if_has_string "${output_message}" 'apps/v1'
  173. # Clean up
  174. kubectl delete deployment test-nginx-extensions "${kube_flags[@]:?}"
  175. # Test kubectl create deployment
  176. kubectl create deployment test-nginx-apps --image=k8s.gcr.io/nginx:test-cmd --generator=deployment-basic/apps.v1
  177. # Post-Condition: Deployment "nginx" is created.
  178. kube::test::get_object_assert 'deploy test-nginx-apps' "{{${container_name_field:?}}}" 'nginx'
  179. # and new generator was used, iow. new defaults are applied
  180. output_message=$(kubectl get deployment/test-nginx-apps -o jsonpath='{.spec.revisionHistoryLimit}')
  181. kube::test::if_has_string "${output_message}" '10'
  182. # Ensure we can interact with deployments through apps endpoints
  183. output_message=$(kubectl get deployment.apps -o=jsonpath='{.items[0].apiVersion}' 2>&1 "${kube_flags[@]:?}")
  184. kube::test::if_has_string "${output_message}" 'apps/v1'
  185. # Describe command (resource only) should print detailed information
  186. kube::test::describe_resource_assert rs "Name:" "Pod Template:" "Labels:" "Selector:" "Controlled By" "Replicas:" "Pods Status:" "Volumes:"
  187. # Describe command (resource only) should print detailed information
  188. kube::test::describe_resource_assert pods "Name:" "Image:" "Node:" "Labels:" "Status:" "Controlled By"
  189. # Clean up
  190. kubectl delete deployment test-nginx-apps "${kube_flags[@]:?}"
  191. ### Test kubectl create deployment with image and command
  192. # Pre-Condition: No deployment exists.
  193. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  194. # Dry-run command
  195. kubectl create deployment nginx-with-command --dry-run=client --image=k8s.gcr.io/nginx:test-cmd -- /bin/sleep infinity
  196. kubectl create deployment nginx-with-command --dry-run=server --image=k8s.gcr.io/nginx:test-cmd -- /bin/sleep infinity
  197. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  198. # Command
  199. kubectl create deployment nginx-with-command --image=k8s.gcr.io/nginx:test-cmd -- /bin/sleep infinity
  200. # Post-Condition: Deployment "nginx" is created.
  201. kube::test::get_object_assert 'deploy nginx-with-command' "{{${container_name_field:?}}}" 'nginx'
  202. # Clean up
  203. kubectl delete deployment nginx-with-command "${kube_flags[@]:?}"
  204. ### Test kubectl create deployment should not fail validation
  205. # Pre-Condition: No deployment exists.
  206. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  207. # Command
  208. kubectl create -f hack/testdata/deployment-with-UnixUserID.yaml "${kube_flags[@]:?}"
  209. # Post-Condition: Deployment "deployment-with-unixuserid" is created.
  210. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" 'deployment-with-unixuserid:'
  211. # Clean up
  212. kubectl delete deployment deployment-with-unixuserid "${kube_flags[@]:?}"
  213. ### Test cascading deletion
  214. ## Test that rs is deleted when deployment is deleted.
  215. # Pre-condition: no deployment exists
  216. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  217. # Create deployment
  218. kubectl create -f test/fixtures/doc-yaml/user-guide/deployment.yaml "${kube_flags[@]:?}"
  219. # Wait for rs to come up.
  220. kube::test::wait_object_assert rs "{{range.items}}{{${rs_replicas_field:?}}}{{end}}" '3'
  221. # Deleting the deployment should delete the rs.
  222. kubectl delete deployment nginx-deployment "${kube_flags[@]:?}"
  223. kube::test::wait_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  224. ## Test that rs is not deleted when deployment is deleted with cascade set to false.
  225. # Pre-condition: no deployment and rs exist
  226. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  227. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  228. # Create deployment
  229. kubectl create deployment nginx-deployment --image=k8s.gcr.io/nginx:test-cmd
  230. # Wait for rs to come up.
  231. kube::test::wait_object_assert rs "{{range.items}}{{${rs_replicas_field:?}}}{{end}}" '1'
  232. # Delete the deployment with cascade set to false.
  233. kubectl delete deployment nginx-deployment "${kube_flags[@]:?}" --cascade=false
  234. # Wait for the deployment to be deleted and then verify that rs is not
  235. # deleted.
  236. kube::test::wait_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  237. kube::test::get_object_assert rs "{{range.items}}{{${rs_replicas_field:?}}}{{end}}" '1'
  238. # Cleanup
  239. # Find the name of the rs to be deleted.
  240. output_message=$(kubectl get rs "${kube_flags[@]:?}" -o template --template="{{range.items}}{{${id_field:?}}}{{end}}")
  241. kubectl delete rs "${output_message}" "${kube_flags[@]:?}"
  242. ### Auto scale deployment
  243. # Pre-condition: no deployment exists
  244. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  245. # Pre-condition: no hpa exists
  246. kube::test::get_object_assert 'hpa' "{{range.items}}{{ if eq $id_field \\\"nginx-deployment\\\" }}found{{end}}{{end}}:" ':'
  247. # Command
  248. kubectl create -f test/fixtures/doc-yaml/user-guide/deployment.yaml "${kube_flags[@]:?}"
  249. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" 'nginx-deployment:'
  250. # Dry-run autoscale
  251. kubectl-with-retry autoscale deployment nginx-deployment --dry-run=client "${kube_flags[@]:?}" --min=2 --max=3
  252. kubectl-with-retry autoscale deployment nginx-deployment --dry-run=server "${kube_flags[@]:?}" --min=2 --max=3
  253. kube::test::get_object_assert 'hpa' "{{range.items}}{{ if eq $id_field \\\"nginx-deployment\\\" }}found{{end}}{{end}}:" ':'
  254. # autoscale 2~3 pods, no CPU utilization specified
  255. kubectl-with-retry autoscale deployment nginx-deployment "${kube_flags[@]:?}" --min=2 --max=3
  256. kube::test::get_object_assert 'hpa nginx-deployment' "{{${hpa_min_field:?}}} {{${hpa_max_field:?}}} {{${hpa_cpu_field:?}}}" '2 3 80'
  257. # Clean up
  258. # Note that we should delete hpa first, otherwise it may fight with the deployment reaper.
  259. kubectl delete hpa nginx-deployment "${kube_flags[@]:?}"
  260. kubectl delete deployment.apps nginx-deployment "${kube_flags[@]:?}"
  261. ### Rollback a deployment
  262. # Pre-condition: no deployment exists
  263. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  264. # Command
  265. # Create a deployment (revision 1)
  266. kubectl create -f hack/testdata/deployment-revision1.yaml "${kube_flags[@]:?}"
  267. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" 'nginx:'
  268. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:"
  269. # Rollback to revision 1 - should be no-op
  270. kubectl rollout undo deployment nginx --to-revision=1 "${kube_flags[@]:?}"
  271. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:"
  272. # Update the deployment (revision 2)
  273. kubectl apply -f hack/testdata/deployment-revision2.yaml "${kube_flags[@]:?}"
  274. kube::test::get_object_assert deployment.apps "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:"
  275. # Rollback to revision 1 with dry-run - should be no-op
  276. kubectl rollout undo deployment nginx --dry-run=client "${kube_flags[@]:?}" | grep "test-cmd"
  277. kubectl rollout undo deployment nginx --dry-run=server "${kube_flags[@]:?}"
  278. kube::test::get_object_assert deployment.apps "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:"
  279. # Rollback to revision 1
  280. kubectl rollout undo deployment nginx --to-revision=1 "${kube_flags[@]:?}"
  281. sleep 1
  282. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:"
  283. # Rollback to revision 1000000 - should be no-op
  284. ! kubectl rollout undo deployment nginx --to-revision=1000000 "${kube_flags[@]:?}" || exit 1
  285. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:"
  286. # Rollback to last revision
  287. kubectl rollout undo deployment nginx "${kube_flags[@]:?}"
  288. sleep 1
  289. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:"
  290. # Pause the deployment
  291. kubectl-with-retry rollout pause deployment nginx "${kube_flags[@]:?}"
  292. # A paused deployment cannot be rolled back
  293. ! kubectl rollout undo deployment nginx "${kube_flags[@]:?}" || exit 1
  294. # A paused deployment cannot be restarted
  295. ! kubectl rollout restart deployment nginx "${kube_flags[@]:?}" || exit 1
  296. # Resume the deployment
  297. kubectl-with-retry rollout resume deployment nginx "${kube_flags[@]:?}"
  298. # The resumed deployment can now be rolled back
  299. kubectl rollout undo deployment nginx "${kube_flags[@]:?}"
  300. # Check that the new replica set has all old revisions stored in an annotation
  301. newrs="$(kubectl describe deployment nginx | grep NewReplicaSet | awk '{print $2}')"
  302. kubectl get rs "${newrs}" -o yaml | grep "deployment.kubernetes.io/revision-history: 1,3"
  303. # Check that trying to watch the status of a superseded revision returns an error
  304. ! kubectl rollout status deployment/nginx --revision=3 || exit 1
  305. # Restarting the deployment creates a new replicaset
  306. kubectl rollout restart deployment/nginx
  307. sleep 1
  308. newrs="$(kubectl describe deployment nginx | grep NewReplicaSet | awk '{print $2}')"
  309. rs="$(kubectl get rs "${newrs}" -o yaml)"
  310. kube::test::if_has_string "${rs}" "deployment.kubernetes.io/revision: \"6\""
  311. ${SED} "s/name: nginx$/name: nginx2/" hack/testdata/deployment-revision1.yaml | kubectl create -f - "${kube_flags[@]:?}"
  312. # Deletion of both deployments should not be blocked
  313. kubectl delete deployment nginx2 "${kube_flags[@]:?}"
  314. # Clean up
  315. kubectl delete deployment nginx "${kube_flags[@]:?}"
  316. ### Set image of a deployment
  317. # Pre-condition: no deployment exists
  318. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  319. # Create a deployment
  320. kubectl create -f hack/testdata/deployment-multicontainer.yaml "${kube_flags[@]:?}"
  321. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" 'nginx-deployment:'
  322. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:"
  323. kube::test::get_object_assert deployment "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_PERL}:"
  324. # Dry-run set the deployment's image
  325. kubectl set image deployment nginx-deployment nginx="${IMAGE_DEPLOYMENT_R2}" --dry-run=client "${kube_flags[@]:?}"
  326. kubectl set image deployment nginx-deployment nginx="${IMAGE_DEPLOYMENT_R2}" --dry-run=server "${kube_flags[@]:?}"
  327. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:"
  328. kube::test::get_object_assert deployment "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_PERL}:"
  329. # Set the deployment's image
  330. kubectl set image deployment nginx-deployment nginx="${IMAGE_DEPLOYMENT_R2}" "${kube_flags[@]:?}"
  331. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:"
  332. kube::test::get_object_assert deployment "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_PERL}:"
  333. # Set non-existing container should fail
  334. ! kubectl set image deployment nginx-deployment redis=redis "${kube_flags[@]:?}" || exit 1
  335. # Set image of deployments without specifying name
  336. kubectl set image deployments --all nginx="${IMAGE_DEPLOYMENT_R1}" "${kube_flags[@]:?}"
  337. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:"
  338. kube::test::get_object_assert deployment "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_PERL}:"
  339. # Set image of a deployment specified by file
  340. kubectl set image -f hack/testdata/deployment-multicontainer.yaml nginx="${IMAGE_DEPLOYMENT_R2}" "${kube_flags[@]:?}"
  341. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:"
  342. kube::test::get_object_assert deployment "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_PERL}:"
  343. # Set image of a local file without talking to the server
  344. kubectl set image -f hack/testdata/deployment-multicontainer.yaml nginx="${IMAGE_DEPLOYMENT_R1}" "${kube_flags[@]:?}" --local -o yaml
  345. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R2}:"
  346. kube::test::get_object_assert deployment "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_PERL}:"
  347. # Set image of all containers of the deployment
  348. kubectl set image deployment nginx-deployment "*=${IMAGE_DEPLOYMENT_R1}" "${kube_flags[@]:?}"
  349. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:"
  350. kube::test::get_object_assert deployment "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:"
  351. # Set image of all containers of the deployment again when image not change
  352. kubectl set image deployment nginx-deployment "*=${IMAGE_DEPLOYMENT_R1}" "${kube_flags[@]:?}"
  353. kube::test::get_object_assert deployment "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:"
  354. kube::test::get_object_assert deployment "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:"
  355. # Clean up
  356. kubectl delete deployment nginx-deployment "${kube_flags[@]:?}"
  357. ### Set env of a deployment
  358. # Pre-condition: no deployment exists
  359. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  360. # Create a deployment
  361. kubectl create -f hack/testdata/deployment-multicontainer.yaml "${kube_flags[@]:?}"
  362. kubectl create -f hack/testdata/configmap.yaml "${kube_flags[@]:?}"
  363. kubectl create -f hack/testdata/secret.yaml "${kube_flags[@]:?}"
  364. kube::test::get_object_assert deployment "{{range.items}}{{${id_field:?}}}:{{end}}" 'nginx-deployment:'
  365. #configmap is special here due to controller will create kube-root-ca.crt for each namespace automatically
  366. kube::test::get_object_assert 'configmaps/test-set-env-config' "{{${id_field:?}}}" 'test-set-env-config'
  367. kube::test::get_object_assert secret "{{range.items}}{{${id_field:?}}}:{{end}}" 'test-set-env-secret:'
  368. # Set env of deployments by configmap from keys
  369. kubectl set env deployment nginx-deployment --keys=key-2 --from=configmap/test-set-env-config "${kube_flags[@]:?}"
  370. # Assert correct value in deployment env
  371. kube::test::get_object_assert 'deploy nginx-deployment' "{{ (index (index .spec.template.spec.containers 0).env 0).name}}" 'KEY_2'
  372. # Assert single value in deployment env
  373. kube::test::get_object_assert 'deploy nginx-deployment' "{{ len (index .spec.template.spec.containers 0).env }}" '1'
  374. # Dry-run set env
  375. kubectl set env deployment nginx-deployment --dry-run=client --from=configmap/test-set-env-config "${kube_flags[@]:?}"
  376. kubectl set env deployment nginx-deployment --dry-run=server --from=configmap/test-set-env-config "${kube_flags[@]:?}"
  377. kube::test::get_object_assert 'deploy nginx-deployment' "{{ len (index .spec.template.spec.containers 0).env }}" '1'
  378. # Set env of deployments by configmap
  379. kubectl set env deployment nginx-deployment --from=configmap/test-set-env-config "${kube_flags[@]:?}"
  380. # Assert all values in deployment env
  381. kube::test::get_object_assert 'deploy nginx-deployment' "{{ len (index .spec.template.spec.containers 0).env }}" '2'
  382. # Set env of deployments for all container
  383. kubectl set env deployment nginx-deployment env=prod "${kube_flags[@]:?}"
  384. # Set env of deployments for specific container
  385. kubectl set env deployment nginx-deployment superenv=superprod -c=nginx "${kube_flags[@]:?}"
  386. # Set env of deployments by secret from keys
  387. kubectl set env deployment nginx-deployment --keys=username --from=secret/test-set-env-secret "${kube_flags[@]:?}"
  388. # Set env of deployments by secret
  389. kubectl set env deployment nginx-deployment --from=secret/test-set-env-secret "${kube_flags[@]:?}"
  390. # Remove specific env of deployment
  391. kubectl set env deployment nginx-deployment env-
  392. # Clean up
  393. kubectl delete deployment nginx-deployment "${kube_flags[@]:?}"
  394. kubectl delete configmap test-set-env-config "${kube_flags[@]:?}"
  395. kubectl delete secret test-set-env-secret "${kube_flags[@]:?}"
  396. set +o nounset
  397. set +o errexit
  398. }
  399. run_statefulset_history_tests() {
  400. set -o nounset
  401. set -o errexit
  402. create_and_use_new_namespace
  403. kube::log::status "Testing kubectl(v1:statefulsets, v1:controllerrevisions)"
  404. ### Test rolling back a StatefulSet
  405. # Pre-condition: no statefulset or its pods exists
  406. kube::test::get_object_assert statefulset "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  407. # Command
  408. # Create a StatefulSet (revision 1)
  409. kubectl apply -f hack/testdata/rollingupdate-statefulset.yaml --record "${kube_flags[@]:?}"
  410. kube::test::wait_object_assert controllerrevisions "{{range.items}}{{${annotations_field:?}}}:{{end}}" ".*rollingupdate-statefulset.yaml --record.*"
  411. # Rollback to revision 1 - should be no-op
  412. kubectl rollout undo statefulset --to-revision=1 "${kube_flags[@]:?}"
  413. kube::test::get_object_assert statefulset "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_STATEFULSET_R1}:"
  414. kube::test::get_object_assert statefulset "{{range.items}}{{${container_len:?}}}{{end}}" "1"
  415. # Update the statefulset (revision 2)
  416. kubectl apply -f hack/testdata/rollingupdate-statefulset-rv2.yaml --record "${kube_flags[@]:?}"
  417. kube::test::wait_object_assert statefulset "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_STATEFULSET_R2}:"
  418. kube::test::wait_object_assert statefulset "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_PAUSE_V2}:"
  419. kube::test::get_object_assert statefulset "{{range.items}}{{${container_len:?}}}{{end}}" "2"
  420. kube::test::wait_object_assert controllerrevisions "{{range.items}}{{${annotations_field:?}}}:{{end}}" ".*rollingupdate-statefulset-rv2.yaml --record.*"
  421. # Rollback to revision 1 with dry-run - should be no-op
  422. kubectl rollout undo statefulset --dry-run=client "${kube_flags[@]:?}"
  423. kubectl rollout undo statefulset --dry-run=server "${kube_flags[@]:?}"
  424. kube::test::get_object_assert statefulset "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_STATEFULSET_R2}:"
  425. kube::test::get_object_assert statefulset "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_PAUSE_V2}:"
  426. kube::test::get_object_assert statefulset "{{range.items}}{{${container_len:?}}}{{end}}" "2"
  427. # Rollback to revision 1
  428. kubectl rollout undo statefulset --to-revision=1 "${kube_flags[@]:?}"
  429. kube::test::wait_object_assert statefulset "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_STATEFULSET_R1}:"
  430. kube::test::get_object_assert statefulset "{{range.items}}{{${container_len:?}}}{{end}}" "1"
  431. # Rollback to revision 1000000 - should fail
  432. output_message=$(! kubectl rollout undo statefulset --to-revision=1000000 "${kube_flags[@]:?}" 2>&1)
  433. kube::test::if_has_string "${output_message}" "unable to find specified revision"
  434. kube::test::get_object_assert statefulset "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_STATEFULSET_R1}:"
  435. kube::test::get_object_assert statefulset "{{range.items}}{{${container_len:?}}}{{end}}" "1"
  436. # Rollback to last revision
  437. kubectl rollout undo statefulset "${kube_flags[@]:?}"
  438. kube::test::wait_object_assert statefulset "{{range.items}}{{${image_field0:?}}}:{{end}}" "${IMAGE_STATEFULSET_R2}:"
  439. kube::test::wait_object_assert statefulset "{{range.items}}{{${image_field1:?}}}:{{end}}" "${IMAGE_PAUSE_V2}:"
  440. kube::test::get_object_assert statefulset "{{range.items}}{{${container_len:?}}}{{end}}" "2"
  441. # Clean up - delete newest configuration
  442. kubectl delete -f hack/testdata/rollingupdate-statefulset-rv2.yaml "${kube_flags[@]:?}"
  443. # Post-condition: no pods from statefulset controller
  444. wait-for-pods-with-label "app=nginx-statefulset" ""
  445. set +o nounset
  446. set +o errexit
  447. }
  448. run_stateful_set_tests() {
  449. set -o nounset
  450. set -o errexit
  451. create_and_use_new_namespace
  452. kube::log::status "Testing kubectl(v1:statefulsets)"
  453. ### Create and stop statefulset, make sure it doesn't leak pods
  454. # Pre-condition: no statefulset exists
  455. kube::test::get_object_assert statefulset "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  456. # Command: create statefulset
  457. kubectl create -f hack/testdata/rollingupdate-statefulset.yaml "${kube_flags[@]:?}"
  458. ### Scale statefulset test with current-replicas and replicas
  459. # Pre-condition: 0 replicas
  460. kube::test::get_object_assert 'statefulset nginx' "{{${statefulset_replicas_field:?}}}" '0'
  461. kube::test::wait_object_assert 'statefulset nginx' "{{${statefulset_observed_generation:?}}}" '1'
  462. # Command: Scale up
  463. kubectl scale --current-replicas=0 --replicas=1 statefulset nginx "${kube_flags[@]:?}"
  464. # Post-condition: 1 replica, named nginx-0
  465. kube::test::get_object_assert 'statefulset nginx' "{{${statefulset_replicas_field:?}}}" '1'
  466. kube::test::wait_object_assert 'statefulset nginx' "{{${statefulset_observed_generation:?}}}" '2'
  467. # Typically we'd wait and confirm that N>1 replicas are up, but this framework
  468. # doesn't start the scheduler, so pet-0 will block all others.
  469. # TODO: test robust scaling in an e2e.
  470. wait-for-pods-with-label "app=nginx-statefulset" "nginx-0"
  471. # Rollout restart should change generation
  472. kubectl rollout restart statefulset nginx "${kube_flags[@]}"
  473. kube::test::get_object_assert 'statefulset nginx' "{{$statefulset_observed_generation}}" '3'
  474. ### Clean up
  475. kubectl delete -f hack/testdata/rollingupdate-statefulset.yaml "${kube_flags[@]:?}"
  476. # Post-condition: no pods from statefulset controller
  477. wait-for-pods-with-label "app=nginx-statefulset" ""
  478. set +o nounset
  479. set +o errexit
  480. }
  481. run_rs_tests() {
  482. set -o nounset
  483. set -o errexit
  484. create_and_use_new_namespace
  485. kube::log::status "Testing kubectl(v1:replicasets)"
  486. ### Create and stop a replica set, make sure it doesn't leak pods
  487. # Pre-condition: no replica set exists
  488. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  489. # Command
  490. kubectl create -f hack/testdata/frontend-replicaset.yaml "${kube_flags[@]:?}"
  491. kube::log::status "Deleting rs"
  492. kubectl delete rs frontend "${kube_flags[@]:?}"
  493. # Post-condition: no pods from frontend replica set
  494. kube::test::wait_object_assert 'pods -l "tier=frontend"' "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  495. ### Create and then delete a replica set with cascade=false, make sure it doesn't delete pods.
  496. # Pre-condition: no replica set exists
  497. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  498. # Command
  499. kubectl create -f hack/testdata/frontend-replicaset.yaml "${kube_flags[@]}"
  500. # wait for all 3 pods to be set up
  501. kube::test::wait_object_assert 'pods -l "tier=frontend"' "{{range.items}}{{${pod_container_name_field:?}}}:{{end}}" 'php-redis:php-redis:php-redis:'
  502. kube::log::status "Deleting rs"
  503. kubectl delete rs frontend "${kube_flags[@]:?}" --cascade=false
  504. # Wait for the rs to be deleted.
  505. kube::test::wait_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  506. # Post-condition: All 3 pods still remain from frontend replica set
  507. kube::test::get_object_assert 'pods -l "tier=frontend"' "{{range.items}}{{$pod_container_name_field}}:{{end}}" 'php-redis:php-redis:php-redis:'
  508. # Cleanup
  509. kubectl delete pods -l "tier=frontend" "${kube_flags[@]:?}"
  510. kube::test::get_object_assert pods "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  511. ### Create replica set frontend from YAML
  512. # Pre-condition: no replica set exists
  513. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  514. # Command
  515. kubectl create -f hack/testdata/frontend-replicaset.yaml "${kube_flags[@]:?}"
  516. # Post-condition: frontend replica set is created
  517. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" 'frontend:'
  518. # Describe command should print detailed information
  519. kube::test::describe_object_assert rs 'frontend' "Name:" "Pod Template:" "Labels:" "Selector:" "Replicas:" "Pods Status:" "Volumes:"
  520. # Describe command should print events information by default
  521. kube::test::describe_object_events_assert rs 'frontend'
  522. # Describe command should not print events information when show-events=false
  523. kube::test::describe_object_events_assert rs 'frontend' false
  524. # Describe command should print events information when show-events=true
  525. kube::test::describe_object_events_assert rs 'frontend' true
  526. # Describe command (resource only) should print detailed information
  527. kube::test::describe_resource_assert rs "Name:" "Pod Template:" "Labels:" "Selector:" "Replicas:" "Pods Status:" "Volumes:"
  528. # Describe command should print events information by default
  529. kube::test::describe_resource_events_assert rs
  530. # Describe command should not print events information when show-events=false
  531. kube::test::describe_resource_events_assert rs false
  532. # Describe command should print events information when show-events=true
  533. kube::test::describe_resource_events_assert rs true
  534. # Describe command (resource only) should print detailed information
  535. kube::test::describe_resource_assert pods "Name:" "Image:" "Node:" "Labels:" "Status:" "Controlled By"
  536. ### Scale replica set frontend with current-replicas and replicas
  537. # Pre-condition: 3 replicas
  538. kube::test::get_object_assert 'rs frontend' "{{${rs_replicas_field:?}}}" '3'
  539. # Command
  540. kubectl scale --current-replicas=3 --replicas=2 replicasets frontend "${kube_flags[@]:?}"
  541. # Post-condition: 2 replicas
  542. kube::test::get_object_assert 'rs frontend' "{{${rs_replicas_field:?}}}" '2'
  543. # Set up three deploy, two deploy have same label
  544. kubectl create -f hack/testdata/scale-deploy-1.yaml "${kube_flags[@]:?}"
  545. kubectl create -f hack/testdata/scale-deploy-2.yaml "${kube_flags[@]:?}"
  546. kubectl create -f hack/testdata/scale-deploy-3.yaml "${kube_flags[@]:?}"
  547. kube::test::get_object_assert 'deploy scale-1' "{{.spec.replicas}}" '1'
  548. kube::test::get_object_assert 'deploy scale-2' "{{.spec.replicas}}" '1'
  549. kube::test::get_object_assert 'deploy scale-3' "{{.spec.replicas}}" '1'
  550. # Test kubectl scale --selector
  551. kubectl scale deploy --replicas=2 -l run=hello
  552. kube::test::get_object_assert 'deploy scale-1' "{{.spec.replicas}}" '2'
  553. kube::test::get_object_assert 'deploy scale-2' "{{.spec.replicas}}" '2'
  554. kube::test::get_object_assert 'deploy scale-3' "{{.spec.replicas}}" '1'
  555. # Test kubectl scale --all
  556. kubectl scale deploy --replicas=3 --all
  557. kube::test::get_object_assert 'deploy scale-1' "{{.spec.replicas}}" '3'
  558. kube::test::get_object_assert 'deploy scale-2' "{{.spec.replicas}}" '3'
  559. kube::test::get_object_assert 'deploy scale-3' "{{.spec.replicas}}" '3'
  560. # Clean-up
  561. kubectl delete rs frontend "${kube_flags[@]:?}"
  562. kubectl delete deploy scale-1 scale-2 scale-3 "${kube_flags[@]:?}"
  563. ### Expose replica set as service
  564. kubectl create -f hack/testdata/frontend-replicaset.yaml "${kube_flags[@]:?}"
  565. # Pre-condition: 3 replicas
  566. kube::test::get_object_assert 'rs frontend' "{{${rs_replicas_field:?}}}" '3'
  567. # Command
  568. kubectl expose rs frontend --port=80 "${kube_flags[@]:?}"
  569. # Post-condition: service exists and the port is unnamed
  570. kube::test::get_object_assert 'service frontend' "{{${port_name:?}}} {{${port_field:?}}}" '<no value> 80'
  571. # Create a service using service/v1 generator
  572. kubectl expose rs frontend --port=80 --name=frontend-2 --generator=service/v1 "${kube_flags[@]:?}"
  573. # Post-condition: service exists and the port is named default.
  574. kube::test::get_object_assert 'service frontend-2' "{{${port_name:?}}} {{${port_field:?}}}" 'default 80'
  575. # Cleanup services
  576. kubectl delete service frontend{,-2} "${kube_flags[@]:?}"
  577. # Test set commands
  578. # Pre-condition: frontend replica set exists at generation 1
  579. kube::test::get_object_assert 'rs frontend' "{{${generation_field:?}}}" '1'
  580. kubectl set image rs/frontend "${kube_flags[@]:?}" "*=k8s.gcr.io/pause:test-cmd"
  581. kube::test::get_object_assert 'rs frontend' "{{${generation_field:?}}}" '2'
  582. kubectl set env rs/frontend "${kube_flags[@]:?}" foo=bar
  583. kube::test::get_object_assert 'rs frontend' "{{${generation_field:?}}}" '3'
  584. kubectl set resources rs/frontend --dry-run=client "${kube_flags[@]:?}" --limits=cpu=200m,memory=512Mi
  585. kubectl set resources rs/frontend --dry-run=server "${kube_flags[@]:?}" --limits=cpu=200m,memory=512Mi
  586. kube::test::get_object_assert 'rs frontend' "{{${generation_field:?}}}" '3'
  587. kubectl set resources rs/frontend "${kube_flags[@]:?}" --limits=cpu=200m,memory=512Mi
  588. kube::test::get_object_assert 'rs frontend' "{{${generation_field:?}}}" '4'
  589. kubectl set serviceaccount rs/frontend --dry-run=client "${kube_flags[@]:?}" serviceaccount1
  590. kubectl set serviceaccount rs/frontend --dry-run=server "${kube_flags[@]:?}" serviceaccount1
  591. kube::test::get_object_assert 'rs frontend' "{{${generation_field:?}}}" '4'
  592. kubectl set serviceaccount rs/frontend "${kube_flags[@]:?}" serviceaccount1
  593. kube::test::get_object_assert 'rs frontend' "{{${generation_field:?}}}" '5'
  594. ### Delete replica set with id
  595. # Pre-condition: frontend replica set exists
  596. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" 'frontend:'
  597. # Command
  598. kubectl delete rs frontend "${kube_flags[@]:?}"
  599. # Post-condition: no replica set exists
  600. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  601. ### Create two replica sets
  602. # Pre-condition: no replica set exists
  603. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  604. # Command
  605. kubectl create -f hack/testdata/frontend-replicaset.yaml "${kube_flags[@]:?}"
  606. kubectl create -f hack/testdata/redis-slave-replicaset.yaml "${kube_flags[@]:?}"
  607. # Post-condition: frontend and redis-slave
  608. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" 'frontend:redis-slave:'
  609. ### Delete multiple replica sets at once
  610. # Pre-condition: frontend and redis-slave
  611. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" 'frontend:redis-slave:'
  612. # Command
  613. kubectl delete rs frontend redis-slave "${kube_flags[@]:?}" # delete multiple replica sets at once
  614. # Post-condition: no replica set exists
  615. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  616. if kube::test::if_supports_resource "horizontalpodautoscalers" ; then
  617. ### Auto scale replica set
  618. # Pre-condition: no replica set exists
  619. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" ''
  620. # Command
  621. kubectl create -f hack/testdata/frontend-replicaset.yaml "${kube_flags[@]:?}"
  622. kube::test::get_object_assert rs "{{range.items}}{{${id_field:?}}}:{{end}}" 'frontend:'
  623. # autoscale 1~2 pods, CPU utilization 70%, replica set specified by file
  624. kubectl autoscale -f hack/testdata/frontend-replicaset.yaml "${kube_flags[@]:?}" --max=2 --cpu-percent=70
  625. kube::test::get_object_assert 'hpa frontend' "{{${hpa_min_field:?}}} {{${hpa_max_field:?}}} {{${hpa_cpu_field:?}}}" '1 2 70'
  626. kubectl delete hpa frontend "${kube_flags[@]:?}"
  627. # autoscale 2~3 pods, no CPU utilization specified, replica set specified by name
  628. kubectl autoscale rs frontend "${kube_flags[@]:?}" --min=2 --max=3
  629. kube::test::get_object_assert 'hpa frontend' "{{${hpa_min_field:?}}} {{${hpa_max_field:?}}} {{${hpa_cpu_field:?}}}" '2 3 80'
  630. kubectl delete hpa frontend "${kube_flags[@]:?}"
  631. # autoscale without specifying --max should fail
  632. ! kubectl autoscale rs frontend "${kube_flags[@]:?}" || exit 1
  633. # Clean up
  634. kubectl delete rs frontend "${kube_flags[@]:?}"
  635. fi
  636. set +o nounset
  637. set +o errexit
  638. }