diff --git a/pkg/kubectl/cmd/delete/delete.go b/pkg/kubectl/cmd/delete/delete.go index 78bd507601..df4f4cc203 100644 --- a/pkg/kubectl/cmd/delete/delete.go +++ b/pkg/kubectl/cmd/delete/delete.go @@ -106,6 +106,7 @@ type DeleteOptions struct { ForceDeletion bool WaitForDeletion bool Quiet bool + WarnClusterScope bool GracePeriod int Timeout time.Duration @@ -149,6 +150,8 @@ func (o *DeleteOptions) Complete(f cmdutil.Factory, args []string, cmd *cobra.Co return err } + o.WarnClusterScope = enforceNamespace && !o.DeleteAllNamespaces + if o.DeleteAll || len(o.LabelSelector) > 0 || len(o.FieldSelector) > 0 { if f := cmd.Flags().Lookup("ignore-not-found"); f != nil && !f.Changed { // If the user didn't explicitly set the option, default to ignoring NotFound errors when used with --all, -l, or --field-selector @@ -216,6 +219,7 @@ func (o *DeleteOptions) Validate() error { case o.ForceDeletion: fmt.Fprintf(o.ErrOut, "warning: --force is ignored because --grace-period is not 0.\n") } + return nil } @@ -228,6 +232,7 @@ func (o *DeleteOptions) DeleteResult(r *resource.Result) error { if o.IgnoreNotFound { r = r.IgnoreErrors(errors.IsNotFound) } + warnClusterScope := o.WarnClusterScope deletedInfos := []*resource.Info{} uidMap := cmdwait.UIDMap{} err := r.Visit(func(info *resource.Info, err error) error { @@ -247,6 +252,10 @@ func (o *DeleteOptions) DeleteResult(r *resource.Result) error { } options.PropagationPolicy = &policy + if warnClusterScope && info.Mapping.Scope.Name() == meta.RESTScopeNameRoot { + fmt.Fprintf(o.ErrOut, "warning: deleting cluster-scoped resources, not scoped to the provided namespace\n") + warnClusterScope = false + } response, err := o.deleteResource(info, options) if err != nil { return err diff --git a/test/cmd/core.sh b/test/cmd/core.sh index 125c2923de..6a7ce8c25c 100755 --- a/test/cmd/core.sh +++ b/test/cmd/core.sh @@ -1326,6 +1326,12 @@ run_namespace_tests() { output_message=$(! kubectl get ns/my-namespace 2>&1 "${kube_flags[@]}") kube::test::if_has_string "${output_message}" ' not found' + kubectl create namespace my-namespace + kube::test::get_object_assert 'namespaces/my-namespace' "{{$id_field}}" 'my-namespace' + output_message=$(! kubectl delete namespace -n my-namespace --all 2>&1 "${kube_flags[@]}") + kube::test::if_has_string "${output_message}" 'warning: deleting cluster-scoped resources' + kube::test::if_has_string "${output_message}" 'namespace "my-namespace" deleted' + ###################### # Pods in Namespaces # ###################### diff --git a/test/cmd/rbac.sh b/test/cmd/rbac.sh index e874c7e8be..7df349909e 100755 --- a/test/cmd/rbac.sh +++ b/test/cmd/rbac.sh @@ -30,6 +30,12 @@ run_clusterroles_tests() { kube::test::get_object_assert clusterrolebindings/cluster-admin "{{.metadata.name}}" 'cluster-admin' # test `kubectl create clusterrole` + kubectl create "${kube_flags[@]}" clusterrole pod-admin --verb=* --resource=pods + kube::test::get_object_assert clusterrole/pod-admin "{{range.rules}}{{range.verbs}}{{.}}:{{end}}{{end}}" '\*:' + output_message=$(kubectl delete clusterrole pod-admin -n test 2>&1 "${kube_flags[@]}") + kube::test::if_has_string "${output_message}" 'warning: deleting cluster-scoped resources' + kube::test::if_has_string "${output_message}" 'clusterrole.rbac.authorization.k8s.io "pod-admin" deleted' + kubectl create "${kube_flags[@]}" clusterrole pod-admin --verb=* --resource=pods kube::test::get_object_assert clusterrole/pod-admin "{{range.rules}}{{range.verbs}}{{.}}:{{end}}{{end}}" '\*:' kube::test::get_object_assert clusterrole/pod-admin "{{range.rules}}{{range.resources}}{{.}}:{{end}}{{end}}" 'pods:' diff --git a/test/cmd/storage.sh b/test/cmd/storage.sh index ce387e2e61..d9c0553972 100755 --- a/test/cmd/storage.sh +++ b/test/cmd/storage.sh @@ -41,6 +41,13 @@ run_persistent_volumes_tests() { # Post-condition: no PVs kube::test::get_object_assert pv "{{range.items}}{{$id_field}}:{{end}}" '' + kubectl create -f test/fixtures/doc-yaml/user-guide/persistent-volumes/volumes/local-01.yaml "${kube_flags[@]}" + kube::test::get_object_assert pv "{{range.items}}{{$id_field}}:{{end}}" 'pv0001:' + output_message=$(kubectl delete pv -n test --all 2>&1 "${kube_flags[@]}") + kube::test::if_has_string "${output_message}" 'warning: deleting cluster-scoped resources' + kube::test::if_has_string "${output_message}" 'persistentvolume "pv0001" deleted' + kube::test::get_object_assert pv "{{range.items}}{{$id_field}}:{{end}}" '' + set +o nounset set +o errexit }