Add cascading deletion test cases to kubectl tests

This commit is contained in:
nikhiljindal 2017-02-21 22:32:09 -08:00
parent 20aa573865
commit b6e2a09c2b
2 changed files with 101 additions and 24 deletions

View File

@ -42,22 +42,53 @@ kube::test::get_caller() {
# Force exact match of a returned result for a object query. Wrap this with || to support multiple # Force exact match of a returned result for a object query. Wrap this with || to support multiple
# valid return types. # valid return types.
# This runs `kubectl get` once and asserts that the result is as expected.
## $1: Object on which get should be run
# $2: The go-template to run on the result
# $3: The expected output
# $4: Additional args to be passed to kubectl
kube::test::get_object_assert() { kube::test::get_object_assert() {
local object=$1 kube::test::object_assert 1 "$@"
local request=$2 }
local expected=$3
local args=${4:-}
# Asserts that the output of a given get query is as expected.
# Runs the query multiple times before failing it.
# $1: Object on which get should be run
# $2: The go-template to run on the result
# $3: The expected output
# $4: Additional args to be passed to kubectl
kube::test::wait_object_assert() {
kube::test::object_assert 10 "$@"
}
# Asserts that the output of a given get query is as expected.
# Can run the query multiple times before failing it.
# $1: Number of times the query should be run before failing it.
# $2: Object on which get should be run
# $3: The go-template to run on the result
# $4: The expected output
# $5: Additional args to be passed to kubectl
kube::test::object_assert() {
local tries=$1
local object=$2
local request=$3
local expected=$4
local args=${5:-}
for j in $(seq 1 ${tries}); do
res=$(eval kubectl get "${kube_flags[@]}" ${args} $object -o go-template=\"$request\") res=$(eval kubectl get "${kube_flags[@]}" ${args} $object -o go-template=\"$request\")
if [[ "$res" =~ ^$expected$ ]]; then if [[ "$res" =~ ^$expected$ ]]; then
echo -n ${green} echo -n ${green}
echo "$(kube::test::get_caller): Successful get $object $request: $res" echo "$(kube::test::get_caller 3): Successful get $object $request: $res"
echo -n ${reset} echo -n ${reset}
return 0 return 0
else fi
echo "Waiting for Get $object $request $args: expected: $expected, got: $res"
sleep $((${j}-1))
done
echo ${bold}${red} echo ${bold}${red}
echo "$(kube::test::get_caller): FAIL!" echo "$(kube::test::get_caller 3): FAIL!"
echo "Get $object $request" echo "Get $object $request"
echo " Expected: $expected" echo " Expected: $expected"
echo " Got: $res" echo " Got: $res"
@ -65,7 +96,6 @@ kube::test::get_object_assert() {
caller caller
echo ${reset} echo ${reset}
return 1 return 1
fi
} }
kube::test::get_object_jsonpath_assert() { kube::test::get_object_jsonpath_assert() {

View File

@ -947,8 +947,8 @@ run_kubectl_apply_deployments_tests() {
# need to explicitly remove replicasets and pods because we changed the deployment selector and orphaned things # need to explicitly remove replicasets and pods because we changed the deployment selector and orphaned things
kubectl delete deployments,rs,pods --all --cascade=false --grace-period=0 kubectl delete deployments,rs,pods --all --cascade=false --grace-period=0
# Post-Condition: no Deployments, ReplicaSets, Pods exist # Post-Condition: no Deployments, ReplicaSets, Pods exist
kube::test::get_object_assert deployments "{{range.items}}{{$id_field}}:{{end}}" '' kube::test::wait_object_assert deployments "{{range.items}}{{$id_field}}:{{end}}" ''
kube::test::get_object_assert replicasets "{{range.items}}{{$id_field}}:{{end}}" '' kube::test::wait_object_assert replicasets "{{range.items}}{{$id_field}}:{{end}}" ''
kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" '' kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
} }
@ -2273,6 +2273,37 @@ run_deployment_tests() {
# Clean up # Clean up
kubectl delete deployment test-nginx "${kube_flags[@]}" kubectl delete deployment test-nginx "${kube_flags[@]}"
### Test cascading deletion
## Test that rs is deleted when deployment is deleted.
# Pre-condition: no deployment exists
kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" ''
# Create deployment
kubectl create -f test/fixtures/doc-yaml/user-guide/deployment.yaml "${kube_flags[@]}"
# Wait for rs to come up.
kube::test::wait_object_assert rs "{{range.items}}{{$rs_replicas_field}}{{end}}" '3'
# Deleting the deployment should delete the rs.
kubectl delete deployment nginx-deployment "${kube_flags[@]}"
kube::test::wait_object_assert rs "{{range.items}}{{$id_field}}:{{end}}" ''
## Test that rs is not deleted when deployment is deleted with cascade set to false.
# Pre-condition: no deployment and rs exist
kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" ''
kube::test::get_object_assert rs "{{range.items}}{{$id_field}}:{{end}}" ''
# Create deployment
kubectl create deployment nginx-deployment --image=gcr.io/google-containers/nginx:test-cmd
# Wait for rs to come up.
kube::test::wait_object_assert rs "{{range.items}}{{$rs_replicas_field}}{{end}}" '1'
# Delete the deployment with cascade set to false.
kubectl delete deployment nginx-deployment "${kube_flags[@]}" --cascade=false
# Wait for the deployment to be deleted and then verify that rs is not
# deleted.
kube::test::wait_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" ''
kube::test::get_object_assert rs "{{range.items}}{{$rs_replicas_field}}{{end}}" '1'
# Cleanup
# Find the name of the rs to be deleted.
output_message=$(kubectl get rs "${kube_flags[@]}" -o template --template={{range.items}}{{$id_field}}{{end}})
kubectl delete rs ${output_message} "${kube_flags[@]}"
### Auto scale deployment ### Auto scale deployment
# Pre-condition: no deployment exists # Pre-condition: no deployment exists
kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" '' kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" ''
@ -2385,6 +2416,21 @@ run_rs_tests() {
# Post-condition: no pods from frontend replica set # Post-condition: no pods from frontend replica set
kube::test::get_object_assert 'pods -l "tier=frontend"' "{{range.items}}{{$id_field}}:{{end}}" '' kube::test::get_object_assert 'pods -l "tier=frontend"' "{{range.items}}{{$id_field}}:{{end}}" ''
### Create and then delete a replica set with cascade=false, make sure it doesn't delete pods.
# Pre-condition: no replica set exists
kube::test::get_object_assert rs "{{range.items}}{{$id_field}}:{{end}}" ''
# Command
kubectl create -f hack/testdata/frontend-replicaset.yaml "${kube_flags[@]}"
kube::log::status "Deleting rs"
kubectl delete rs frontend "${kube_flags[@]}" --cascade=false
# Wait for the rs to be deleted.
kube::test::wait_object_assert rs "{{range.items}}{{$id_field}}:{{end}}" ''
# Post-condition: All 3 pods still remain from frontend replica set
kube::test::get_object_assert 'pods -l "tier=frontend"' "{{range.items}}{{$pod_container_name_field}}:{{end}}" 'php-redis:php-redis:php-redis:'
# Cleanup
kubectl delete pods -l "tier=frontend" "${kube_flags[@]}"
kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" ''
### Create replica set frontend from YAML ### Create replica set frontend from YAML
# Pre-condition: no replica set exists # Pre-condition: no replica set exists
kube::test::get_object_assert rs "{{range.items}}{{$id_field}}:{{end}}" '' kube::test::get_object_assert rs "{{range.items}}{{$id_field}}:{{end}}" ''
@ -2662,7 +2708,7 @@ runTests() {
i=0 i=0
create_and_use_new_namespace() { create_and_use_new_namespace() {
i=$(($i+1)) i=$(($i+1))
kube::log::status "Creating namespace" kube::log::status "Creating namespace namespace${i}"
kubectl create namespace "namespace${i}" kubectl create namespace "namespace${i}"
kubectl config set-context "${CONTEXT}" --namespace="namespace${i}" kubectl config set-context "${CONTEXT}" --namespace="namespace${i}"
} }
@ -2690,6 +2736,7 @@ runTests() {
second_port_field="(index .spec.ports 1).port" second_port_field="(index .spec.ports 1).port"
second_port_name="(index .spec.ports 1).name" second_port_name="(index .spec.ports 1).name"
image_field="(index .spec.containers 0).image" image_field="(index .spec.containers 0).image"
pod_container_name_field="(index .spec.containers 0).name"
container_name_field="(index .spec.template.spec.containers 0).name" container_name_field="(index .spec.template.spec.containers 0).name"
hpa_min_field=".spec.minReplicas" hpa_min_field=".spec.minReplicas"
hpa_max_field=".spec.maxReplicas" hpa_max_field=".spec.maxReplicas"