diff --git a/pkg/kubectl/cmd/delete.go b/pkg/kubectl/cmd/delete.go index 7440edc834a..693a0e61a02 100644 --- a/pkg/kubectl/cmd/delete.go +++ b/pkg/kubectl/cmd/delete.go @@ -252,7 +252,8 @@ func ReapResult(r *resource.Result, f cmdutil.Factory, out io.Writer, isDefaultD if err != nil { // If there is no reaper for this resources and the user didn't explicitly ask for stop. if kubectl.IsNoSuchReaperError(err) && isDefaultDelete { - return deleteResource(info, out, shortOutput, mapper) + // No client side reaper found. Let the server do cascading deletion. + return cascadingDeleteResource(info, out, shortOutput, mapper) } return cmdutil.AddSourceToErr("reaping", info.Source, err) } @@ -292,7 +293,7 @@ func DeleteResult(r *resource.Result, out io.Writer, ignoreNotFound bool, shortO return err } found++ - return deleteResource(info, out, shortOutput, mapper) + return deleteResource(info, out, shortOutput, mapper, nil) }) if err != nil { return err @@ -303,8 +304,14 @@ func DeleteResult(r *resource.Result, out io.Writer, ignoreNotFound bool, shortO return nil } -func deleteResource(info *resource.Info, out io.Writer, shortOutput bool, mapper meta.RESTMapper) error { - if err := resource.NewHelper(info.Client, info.Mapping).Delete(info.Namespace, info.Name); err != nil { +func cascadingDeleteResource(info *resource.Info, out io.Writer, shortOutput bool, mapper meta.RESTMapper) error { + falseVar := false + deleteOptions := &metav1.DeleteOptions{OrphanDependents: &falseVar} + return deleteResource(info, out, shortOutput, mapper, deleteOptions) +} + +func deleteResource(info *resource.Info, out io.Writer, shortOutput bool, mapper meta.RESTMapper, deleteOptions *metav1.DeleteOptions) error { + if err := resource.NewHelper(info.Client, info.Mapping).DeleteWithOptions(info.Namespace, info.Name, deleteOptions); err != nil { return cmdutil.AddSourceToErr("deleting", info.Source, err) } cmdutil.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, false, "deleted") diff --git a/pkg/kubectl/resource/helper.go b/pkg/kubectl/resource/helper.go index 5bb68018387..2cbdd847471 100644 --- a/pkg/kubectl/resource/helper.go +++ b/pkg/kubectl/resource/helper.go @@ -20,6 +20,7 @@ import ( "strconv" "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -95,10 +96,15 @@ func (m *Helper) WatchSingle(namespace, name, resourceVersion string) (watch.Int } func (m *Helper) Delete(namespace, name string) error { + return m.DeleteWithOptions(namespace, name, nil) +} + +func (m *Helper) DeleteWithOptions(namespace, name string, options *metav1.DeleteOptions) error { return m.RESTClient.Delete(). NamespaceIfScoped(namespace, m.NamespaceScoped). Resource(m.Resource). Name(name). + Body(options). Do(). Error() }