diff --git a/hack/lib/test.sh b/hack/lib/test.sh index 575664a4dc0..6e69fc4dd28 100644 --- a/hack/lib/test.sh +++ b/hack/lib/test.sh @@ -286,6 +286,18 @@ kube::test::if_has_not_string() { fi } +kube::test::if_empty_string() { + local match=$1 + if [ -n "$match" ]; then + echo "$match is not empty" + caller + return 1 + else + echo "Successful" + return 0 + fi +} + # Returns true if the required resource is part of supported resources. # Expects env vars: # SUPPORTED_RESOURCES: Array of all resources supported by the apiserver. "*" diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index 5a507a46868..a46446cb8a0 100644 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -71,6 +71,7 @@ statefulsets="statefulsets" static="static" storageclass="storageclass" subjectaccessreviews="subjectaccessreviews" +selfsubjectaccessreviews="selfsubjectaccessreviews" thirdpartyresources="thirdpartyresources" customresourcedefinitions="customresourcedefinitions" daemonsets="daemonsets" @@ -4492,6 +4493,27 @@ runTests() { record_command run_authorization_tests fi + # kubectl auth can-i + # kube-apiserver is started with authorization mode AlwaysAllow, so kubectl can-i always returns yes + if kube::test::if_supports_resource "${subjectaccessreviews}" ; then + output_message=$(kubectl auth can-i '*' '*' 2>&1 "${kube_flags[@]}") + kube::test::if_has_string "${output_message}" "yes" + + output_message=$(kubectl auth can-i get pods --subresource=log 2>&1 "${kube_flags[@]}") + kube::test::if_has_string "${output_message}" "yes" + + output_message=$(kubectl auth can-i get invalid_resource 2>&1 "${kube_flags[@]}") + kube::test::if_has_string "${output_message}" "the server doesn't have a resource type" + + output_message=$(kubectl auth can-i get /logs/ 2>&1 "${kube_flags[@]}") + kube::test::if_has_string "${output_message}" "yes" + + output_message=$(! kubectl auth can-i get /logs/ --subresource=log 2>&1 "${kube_flags[@]}") + kube::test::if_has_string "${output_message}" "subresource can not be used with nonResourceURL" + + output_message=$(kubectl auth can-i list jobs.batch/bar -n foo --quiet 2>&1 "${kube_flags[@]}") + kube::test::if_empty_string "${output_message}" + fi ##################### # Retrieve multiple #