From db399e4e87231735b16c67bf7a9af44cffecf8d9 Mon Sep 17 00:00:00 2001 From: juanvallejo Date: Wed, 4 Apr 2018 11:01:02 -0400 Subject: [PATCH] UPSTREAM: 61378: `--force` only takes effect when `--grace-period=0` --- .../kubernetes/pkg/kubectl/cmd/delete.go | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/delete.go b/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/delete.go index 80a9bd499205..d9ed5f45e790 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/delete.go +++ b/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/delete.go @@ -19,6 +19,7 @@ package cmd import ( "fmt" "io" + "strings" "time" "github.com/spf13/cobra" @@ -153,9 +154,9 @@ func NewCmdDelete(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command { cmd.Flags().BoolVar(&options.DeleteAll, "all", false, "Delete all resources, including uninitialized ones, in the namespace of the specified resource types.") cmd.Flags().BoolVar(&options.IgnoreNotFound, "ignore-not-found", false, "Treat \"resource not found\" as a successful delete. Defaults to \"true\" when --all is specified.") cmd.Flags().BoolVar(&options.Cascade, "cascade", true, "If true, cascade the deletion of the resources managed by this resource (e.g. Pods created by a ReplicationController). Default true.") - cmd.Flags().IntVar(&options.GracePeriod, "grace-period", -1, "Period of time in seconds given to the resource to terminate gracefully. Ignored if negative.") + cmd.Flags().IntVar(&options.GracePeriod, "grace-period", options.GracePeriod, "Period of time in seconds given to the resource to terminate gracefully. Ignored if negative. Set to 1 for immediate shutdown. Can only be set to 0 when --force is true (force deletion).") cmd.Flags().BoolVar(&options.DeleteNow, "now", false, "If true, resources are signaled for immediate shutdown (same as --grace-period=1).") - cmd.Flags().BoolVar(&options.ForceDeletion, "force", false, "Immediate deletion of some resources may result in inconsistency or data loss and requires confirmation.") + cmd.Flags().BoolVar(&options.ForceDeletion, "force", options.ForceDeletion, "Only used when grace-period=0. If true, immediately remove resources from API and bypass graceful deletion. Note that immediate deletion of some resources may result in inconsistency or data loss and requires confirmation.") cmd.Flags().DurationVar(&options.Timeout, "timeout", 0, "The length of time to wait before giving up on a delete, zero means determine a timeout from the size of the object") cmdutil.AddOutputVarFlagsForMutation(cmd, &options.Output) cmdutil.AddInclude3rdPartyVarFlags(cmd, &options.Include3rdParty) @@ -224,6 +225,8 @@ func (o *DeleteOptions) Validate(cmd *cobra.Command) error { o.WaitForDeletion = true o.GracePeriod = 1 } + } else if o.ForceDeletion { + fmt.Fprintf(o.ErrOut, "warning: --force is ignored because --grace-period is not 0.\n") } return nil } @@ -252,7 +255,7 @@ func ReapResult(r *resource.Result, f cmdutil.Factory, out io.Writer, isDefaultD // If there is no reaper for this resources and the user didn't explicitly ask for stop. if kubectl.IsNoSuchReaperError(err) && isDefaultDelete { // No client side reaper found. Let the server do cascading deletion. - return cascadingDeleteResource(info, f, out, shortOutput, mapper) + return cascadingDeleteResource(info, f, out, shortOutput, mapper, gracePeriod) } return cmdutil.AddSourceToErr("reaping", info.Source, err) } @@ -269,7 +272,7 @@ func ReapResult(r *resource.Result, f cmdutil.Factory, out io.Writer, isDefaultD } } if !quiet { - f.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, false, "deleted") + printDeletion(info, out, shortOutput, gracePeriod) } return nil }) @@ -300,7 +303,7 @@ func DeleteResult(r *resource.Result, f cmdutil.Factory, out io.Writer, ignoreNo options = metav1.NewDeleteOptions(int64(gracePeriod)) } options.OrphanDependents = &orphan - return deleteResource(info, f, out, shortOutput, mapper, options) + return deleteResource(info, out, shortOutput, options, gracePeriod) }) if err != nil { return err @@ -311,20 +314,42 @@ func DeleteResult(r *resource.Result, f cmdutil.Factory, out io.Writer, ignoreNo return nil } -func cascadingDeleteResource(info *resource.Info, f cmdutil.Factory, out io.Writer, shortOutput bool, mapper meta.RESTMapper) error { +func cascadingDeleteResource(info *resource.Info, f cmdutil.Factory, out io.Writer, shortOutput bool, mapper meta.RESTMapper, gracePeriod int) error { falseVar := false deleteOptions := &metav1.DeleteOptions{OrphanDependents: &falseVar} - return deleteResource(info, f, out, shortOutput, mapper, deleteOptions) + return deleteResource(info, out, shortOutput, deleteOptions, gracePeriod) } -func deleteResource(info *resource.Info, f cmdutil.Factory, out io.Writer, shortOutput bool, mapper meta.RESTMapper, deleteOptions *metav1.DeleteOptions) error { +func deleteResource(info *resource.Info, out io.Writer, shortOutput bool, deleteOptions *metav1.DeleteOptions, gracePeriod int) error { if err := resource.NewHelper(info.Client, info.Mapping).DeleteWithOptions(info.Namespace, info.Name, deleteOptions); err != nil { return cmdutil.AddSourceToErr("deleting", info.Source, err) } - f.PrintSuccess(mapper, shortOutput, out, info.Mapping.Resource, info.Name, false, "deleted") + printDeletion(info, out, shortOutput, gracePeriod) return nil } +func printDeletion(info *resource.Info, out io.Writer, shortOutput bool, gracePeriod int) { + operation := "deleted" + groupKind := info.Mapping.GroupVersionKind + kindString := fmt.Sprintf("%s.%s", strings.ToLower(groupKind.Kind), groupKind.Group) + if len(groupKind.Group) == 0 { + kindString = strings.ToLower(groupKind.Kind) + } + + if gracePeriod == 0 { + operation = "force deleted" + } + + if shortOutput { + // -o name: prints resource/name + fmt.Fprintf(out, "%s/%s\n", kindString, info.Name) + return + } + + // understandable output by default + fmt.Fprintf(out, "%s \"%s\" %s\n", kindString, info.Name, operation) +} + // objectDeletionWaitInterval is the interval to wait between checks for deletion. var objectDeletionWaitInterval = time.Second