Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
b6e2a09c
Commit
b6e2a09c
authored
Feb 21, 2017
by
nikhiljindal
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add cascading deletion test cases to kubectl tests
parent
20aa5738
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
101 additions
and
24 deletions
+101
-24
test.sh
hack/lib/test.sh
+51
-21
test-cmd-util.sh
hack/make-rules/test-cmd-util.sh
+50
-3
No files found.
hack/lib/test.sh
View file @
b6e2a09c
...
...
@@ -42,30 +42,60 @@ kube::test::get_caller() {
# Force exact match of a returned result for a object query. Wrap this with || to support multiple
# 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
()
{
local
object
=
$1
local
request
=
$2
local
expected
=
$3
local
args
=
${
4
:-}
kube::test::object_assert 1
"
$@
"
}
res
=
$(
eval
kubectl get
"
${
kube_flags
[@]
}
"
${
args
}
$object
-o
go-template
=
\"
$request
\"
)
# 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
"
$@
"
}
if
[[
"
$res
"
=
~ ^
$expected$
]]
;
then
echo
-n
${
green
}
echo
"
$(
kube::test::get_caller
)
: Successful get
$object
$request
:
$res
"
echo
-n
${
reset
}
return
0
else
echo
${
bold
}${
red
}
echo
"
$(
kube::test::get_caller
)
: FAIL!"
echo
"Get
$object
$request
"
echo
" Expected:
$expected
"
echo
" Got:
$res
"
echo
${
reset
}${
red
}
caller
echo
${
reset
}
return
1
fi
# 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
\"
)
if
[[
"
$res
"
=
~ ^
$expected$
]]
;
then
echo
-n
${
green
}
echo
"
$(
kube::test::get_caller 3
)
: Successful get
$object
$request
:
$res
"
echo
-n
${
reset
}
return
0
fi
echo
"Waiting for Get
$object
$request
$args
: expected:
$expected
, got:
$res
"
sleep
$((${
j
}
-
1
))
done
echo
${
bold
}${
red
}
echo
"
$(
kube::test::get_caller 3
)
: FAIL!"
echo
"Get
$object
$request
"
echo
" Expected:
$expected
"
echo
" Got:
$res
"
echo
${
reset
}${
red
}
caller
echo
${
reset
}
return
1
}
kube::test::get_object_jsonpath_assert
()
{
...
...
hack/make-rules/test-cmd-util.sh
View file @
b6e2a09c
...
...
@@ -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
kubectl delete deployments,rs,pods
--all
--cascade
=
false
--grace-period
=
0
# Post-Condition: no Deployments, ReplicaSets, Pods exist
kube::test::
ge
t_object_assert deployments
"{{range.items}}{{
$id_field
}}:{{end}}"
''
kube::test::
ge
t_object_assert replicasets
"{{range.items}}{{
$id_field
}}:{{end}}"
''
kube::test::
wai
t_object_assert deployments
"{{range.items}}{{
$id_field
}}:{{end}}"
''
kube::test::
wai
t_object_assert replicasets
"{{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
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
# Pre-condition: no deployment exists
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
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
# Pre-condition: no replica set exists
kube::test::get_object_assert rs
"{{range.items}}{{
$id_field
}}:{{end}}"
''
...
...
@@ -2662,7 +2708,7 @@ runTests() {
i
=
0
create_and_use_new_namespace
()
{
i
=
$((
$i
+
1
))
kube::log::status
"Creating namespace"
kube::log::status
"Creating namespace
namespace
${
i
}
"
kubectl create 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_name
=
"(index .spec.ports 1).name"
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"
hpa_min_field
=
".spec.minReplicas"
hpa_max_field
=
".spec.maxReplicas"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment