Merge pull request #62487 from juanvallejo/jvallejo/wire-print-flags-apply.go
Automatic merge from submit-queue (batch tested with PRs 62642, 62855, 62487, 62858, 62873). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. wire print flags through apply cmd **Release note**: ```release-note NONE ``` Depends on https://github.com/kubernetes/kubernetes/pull/62300 Adds PrintFlags to `apply` command. cc @soltysh @deads2k
This commit is contained in:
		| @@ -49,21 +49,23 @@ import ( | |||||||
| 	"k8s.io/kubernetes/pkg/kubectl/resource" | 	"k8s.io/kubernetes/pkg/kubectl/resource" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/scheme" | 	"k8s.io/kubernetes/pkg/kubectl/scheme" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
|  | 	"k8s.io/kubernetes/pkg/printers" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type ApplyOptions struct { | type ApplyOptions struct { | ||||||
| 	RecordFlags     *genericclioptions.RecordFlags | 	RecordFlags *genericclioptions.RecordFlags | ||||||
| 	FilenameOptions resource.FilenameOptions | 	Recorder    genericclioptions.Recorder | ||||||
|  |  | ||||||
| 	Recorder genericclioptions.Recorder | 	PrintFlags *printers.PrintFlags | ||||||
|  | 	ToPrinter  func(string) (printers.ResourcePrinterFunc, error) | ||||||
|  |  | ||||||
|  | 	DeleteFlags   *DeleteFlags | ||||||
|  | 	DeleteOptions *DeleteOptions | ||||||
|  |  | ||||||
| 	Selector       string | 	Selector       string | ||||||
| 	Force          bool | 	DryRun         bool | ||||||
| 	Prune          bool | 	Prune          bool | ||||||
| 	Cascade        bool |  | ||||||
| 	GracePeriod    int |  | ||||||
| 	PruneResources []pruneResource | 	PruneResources []pruneResource | ||||||
| 	Timeout        time.Duration |  | ||||||
| 	cmdBaseName    string | 	cmdBaseName    string | ||||||
| 	All            bool | 	All            bool | ||||||
| 	Overwrite      bool | 	Overwrite      bool | ||||||
| @@ -113,10 +115,10 @@ var ( | |||||||
| func NewApplyOptions(out, errout io.Writer) *ApplyOptions { | func NewApplyOptions(out, errout io.Writer) *ApplyOptions { | ||||||
| 	return &ApplyOptions{ | 	return &ApplyOptions{ | ||||||
| 		RecordFlags: genericclioptions.NewRecordFlags(), | 		RecordFlags: genericclioptions.NewRecordFlags(), | ||||||
|  | 		DeleteFlags: NewDeleteFlags("that contains the configuration to apply"), | ||||||
|  | 		PrintFlags:  printers.NewPrintFlags("created"), | ||||||
|  |  | ||||||
| 		Overwrite:    true, | 		Overwrite:    true, | ||||||
| 		Cascade:      true, |  | ||||||
| 		GracePeriod:  -1, |  | ||||||
| 		OpenApiPatch: true, | 		OpenApiPatch: true, | ||||||
|  |  | ||||||
| 		Recorder: genericclioptions.NoopRecorder{}, | 		Recorder: genericclioptions.NoopRecorder{}, | ||||||
| @@ -140,32 +142,27 @@ func NewCmdApply(baseName string, f cmdutil.Factory, out, errOut io.Writer) *cob | |||||||
| 		Long:    applyLong, | 		Long:    applyLong, | ||||||
| 		Example: applyExample, | 		Example: applyExample, | ||||||
| 		Run: func(cmd *cobra.Command, args []string) { | 		Run: func(cmd *cobra.Command, args []string) { | ||||||
|  | 			cmdutil.CheckErr(o.Complete(f, cmd)) | ||||||
| 			cmdutil.CheckErr(validateArgs(cmd, args)) | 			cmdutil.CheckErr(validateArgs(cmd, args)) | ||||||
| 			cmdutil.CheckErr(validatePruneAll(o.Prune, o.All, o.Selector)) | 			cmdutil.CheckErr(validatePruneAll(o.Prune, o.All, o.Selector)) | ||||||
| 			cmdutil.CheckErr(o.Complete(f, cmd)) |  | ||||||
| 			cmdutil.CheckErr(o.Run(f, cmd)) | 			cmdutil.CheckErr(o.Run(f, cmd)) | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// bind flag structs | 	// bind flag structs | ||||||
|  | 	o.DeleteFlags.AddFlags(cmd) | ||||||
| 	o.RecordFlags.AddFlags(cmd) | 	o.RecordFlags.AddFlags(cmd) | ||||||
|  | 	o.PrintFlags.AddFlags(cmd) | ||||||
|  |  | ||||||
| 	usage := "that contains the configuration to apply" |  | ||||||
| 	cmdutil.AddFilenameOptionFlags(cmd, &o.FilenameOptions, usage) |  | ||||||
| 	cmd.MarkFlagRequired("filename") | 	cmd.MarkFlagRequired("filename") | ||||||
| 	cmd.Flags().BoolVar(&o.Overwrite, "overwrite", o.Overwrite, "Automatically resolve conflicts between the modified and live configuration by using values from the modified configuration") | 	cmd.Flags().BoolVar(&o.Overwrite, "overwrite", o.Overwrite, "Automatically resolve conflicts between the modified and live configuration by using values from the modified configuration") | ||||||
| 	cmd.Flags().BoolVar(&o.Prune, "prune", o.Prune, "Automatically delete resource objects, including the uninitialized ones, that do not appear in the configs and are created by either apply or create --save-config. Should be used with either -l or --all.") | 	cmd.Flags().BoolVar(&o.Prune, "prune", o.Prune, "Automatically delete resource objects, including the uninitialized ones, that do not appear in the configs and are created by either apply or create --save-config. Should be used with either -l or --all.") | ||||||
| 	cmd.Flags().BoolVar(&o.Cascade, "cascade", o.Cascade, "Only relevant during a prune or a force apply. If true, cascade the deletion of the resources managed by pruned or deleted resources (e.g. Pods created by a ReplicationController).") |  | ||||||
| 	cmd.Flags().IntVar(&o.GracePeriod, "grace-period", o.GracePeriod, "Only relevant during a prune or a force apply. Period of time in seconds given to pruned or deleted resources to terminate gracefully. Ignored if negative.") |  | ||||||
| 	cmd.Flags().BoolVar(&o.Force, "force", o.Force, fmt.Sprintf("Delete and re-create the specified resource, when PATCH encounters conflict and has retried for %d times.", maxPatchRetry)) |  | ||||||
| 	cmd.Flags().DurationVar(&o.Timeout, "timeout", o.Timeout, "Only relevant during a force apply. The length of time to wait before giving up on a delete of the old resource, zero means determine a timeout from the size of the object. Any other values should contain a corresponding time unit (e.g. 1s, 2m, 3h).") |  | ||||||
| 	cmdutil.AddValidateFlags(cmd) | 	cmdutil.AddValidateFlags(cmd) | ||||||
| 	cmd.Flags().StringVarP(&o.Selector, "selector", "l", o.Selector, "Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)") | 	cmd.Flags().StringVarP(&o.Selector, "selector", "l", o.Selector, "Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)") | ||||||
| 	cmd.Flags().BoolVar(&o.All, "all", o.All, "Select all resources in the namespace of the specified resource types.") | 	cmd.Flags().BoolVar(&o.All, "all", o.All, "Select all resources in the namespace of the specified resource types.") | ||||||
| 	cmd.Flags().StringArrayVar(&o.PruneWhitelist, "prune-whitelist", o.PruneWhitelist, "Overwrite the default whitelist with <group/version/kind> for --prune") | 	cmd.Flags().StringArrayVar(&o.PruneWhitelist, "prune-whitelist", o.PruneWhitelist, "Overwrite the default whitelist with <group/version/kind> for --prune") | ||||||
| 	cmd.Flags().BoolVar(&o.OpenApiPatch, "openapi-patch", o.OpenApiPatch, "If true, use openapi to calculate diff when the openapi presents and the resource can be found in the openapi spec. Otherwise, fall back to use baked-in types.") | 	cmd.Flags().BoolVar(&o.OpenApiPatch, "openapi-patch", o.OpenApiPatch, "If true, use openapi to calculate diff when the openapi presents and the resource can be found in the openapi spec. Otherwise, fall back to use baked-in types.") | ||||||
| 	cmdutil.AddDryRunFlag(cmd) | 	cmdutil.AddDryRunFlag(cmd) | ||||||
| 	cmdutil.AddPrinterFlags(cmd) |  | ||||||
| 	cmdutil.AddIncludeUninitializedFlag(cmd) | 	cmdutil.AddIncludeUninitializedFlag(cmd) | ||||||
|  |  | ||||||
| 	// apply subcommands | 	// apply subcommands | ||||||
| @@ -176,6 +173,34 @@ func NewCmdApply(baseName string, f cmdutil.Factory, out, errOut io.Writer) *cob | |||||||
| 	return cmd | 	return cmd | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (o *ApplyOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) error { | ||||||
|  | 	o.DryRun = cmdutil.GetDryRunFlag(cmd) | ||||||
|  |  | ||||||
|  | 	// allow for a success message operation to be specified at print time | ||||||
|  | 	o.ToPrinter = func(operation string) (printers.ResourcePrinterFunc, error) { | ||||||
|  | 		o.PrintFlags.NamePrintFlags.Operation = operation | ||||||
|  | 		if o.DryRun { | ||||||
|  | 			o.PrintFlags.Complete("%s (dry run)") | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		printer, err := o.PrintFlags.ToPrinter() | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		return printer.PrintObj, nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var err error | ||||||
|  | 	o.RecordFlags.Complete(f.Command(cmd, false)) | ||||||
|  | 	o.Recorder, err = o.RecordFlags.ToRecorder() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	o.DeleteOptions = o.DeleteFlags.ToOptions(o.Out, o.ErrOut) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| func validateArgs(cmd *cobra.Command, args []string) error { | func validateArgs(cmd *cobra.Command, args []string) error { | ||||||
| 	if len(args) != 0 { | 	if len(args) != 0 { | ||||||
| 		return cmdutil.UsageErrorf(cmd, "Unexpected args: %v", args) | 		return cmdutil.UsageErrorf(cmd, "Unexpected args: %v", args) | ||||||
| @@ -224,18 +249,6 @@ func parsePruneResources(mapper meta.RESTMapper, gvks []string) ([]pruneResource | |||||||
| 	return pruneResources, nil | 	return pruneResources, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (o *ApplyOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) error { |  | ||||||
| 	var err error |  | ||||||
|  |  | ||||||
| 	o.RecordFlags.Complete(f.Command(cmd, false)) |  | ||||||
| 	o.Recorder, err = o.RecordFlags.ToRecorder() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // TODO(juanvallejo): break dependency on factory and cmd | // TODO(juanvallejo): break dependency on factory and cmd | ||||||
| func (o *ApplyOptions) Run(f cmdutil.Factory, cmd *cobra.Command) error { | func (o *ApplyOptions) Run(f cmdutil.Factory, cmd *cobra.Command) error { | ||||||
| 	schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) | 	schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) | ||||||
| @@ -264,7 +277,7 @@ func (o *ApplyOptions) Run(f cmdutil.Factory, cmd *cobra.Command) error { | |||||||
| 		Schema(schema). | 		Schema(schema). | ||||||
| 		ContinueOnError(). | 		ContinueOnError(). | ||||||
| 		NamespaceParam(cmdNamespace).DefaultNamespace(). | 		NamespaceParam(cmdNamespace).DefaultNamespace(). | ||||||
| 		FilenameParam(enforceNamespace, &o.FilenameOptions). | 		FilenameParam(enforceNamespace, &o.DeleteOptions.FilenameOptions). | ||||||
| 		LabelSelectorParam(o.Selector). | 		LabelSelectorParam(o.Selector). | ||||||
| 		IncludeUninitialized(includeUninitialized). | 		IncludeUninitialized(includeUninitialized). | ||||||
| 		Flatten(). | 		Flatten(). | ||||||
| @@ -280,7 +293,6 @@ func (o *ApplyOptions) Run(f cmdutil.Factory, cmd *cobra.Command) error { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	dryRun := cmdutil.GetDryRunFlag(cmd) |  | ||||||
| 	output := cmdutil.GetFlagString(cmd, "output") | 	output := cmdutil.GetFlagString(cmd, "output") | ||||||
| 	shortOutput := output == "name" | 	shortOutput := output == "name" | ||||||
|  |  | ||||||
| @@ -326,7 +338,7 @@ func (o *ApplyOptions) Run(f cmdutil.Factory, cmd *cobra.Command) error { | |||||||
| 				return cmdutil.AddSourceToErr("creating", info.Source, err) | 				return cmdutil.AddSourceToErr("creating", info.Source, err) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if !dryRun { | 			if !o.DryRun { | ||||||
| 				// Then create the resource and skip the three-way merge | 				// Then create the resource and skip the three-way merge | ||||||
| 				obj, err := resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, true, info.Object) | 				obj, err := resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, true, info.Object) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| @@ -341,14 +353,15 @@ func (o *ApplyOptions) Run(f cmdutil.Factory, cmd *cobra.Command) error { | |||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			count++ | 			count++ | ||||||
| 			if printObject { |  | ||||||
| 				return cmdutil.PrintObject(cmd, info.Object, o.Out) | 			printer, err := o.ToPrinter("created") | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
| 			} | 			} | ||||||
| 			cmdutil.PrintSuccess(shortOutput, o.Out, info.Object, dryRun, "created") | 			return printer.PrintObj(info.AsVersioned(), o.Out) | ||||||
| 			return nil |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if !dryRun { | 		if !o.DryRun { | ||||||
| 			annotationMap, err := info.Mapping.MetadataAccessor.Annotations(info.Object) | 			annotationMap, err := info.Mapping.MetadataAccessor.Annotations(info.Object) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| @@ -370,10 +383,10 @@ func (o *ApplyOptions) Run(f cmdutil.Factory, cmd *cobra.Command) error { | |||||||
| 				clientsetFunc: f.ClientSet, | 				clientsetFunc: f.ClientSet, | ||||||
| 				overwrite:     o.Overwrite, | 				overwrite:     o.Overwrite, | ||||||
| 				backOff:       clockwork.NewRealClock(), | 				backOff:       clockwork.NewRealClock(), | ||||||
| 				force:         o.Force, | 				force:         o.DeleteOptions.ForceDeletion, | ||||||
| 				cascade:       o.Cascade, | 				cascade:       o.DeleteOptions.Cascade, | ||||||
| 				timeout:       o.Timeout, | 				timeout:       o.DeleteOptions.Timeout, | ||||||
| 				gracePeriod:   o.GracePeriod, | 				gracePeriod:   o.DeleteOptions.GracePeriod, | ||||||
| 				openapiSchema: openapiSchema, | 				openapiSchema: openapiSchema, | ||||||
| 				scaleClient:   scaler, | 				scaleClient:   scaler, | ||||||
| 			} | 			} | ||||||
| @@ -393,16 +406,21 @@ func (o *ApplyOptions) Run(f cmdutil.Factory, cmd *cobra.Command) error { | |||||||
|  |  | ||||||
| 			if string(patchBytes) == "{}" && !printObject { | 			if string(patchBytes) == "{}" && !printObject { | ||||||
| 				count++ | 				count++ | ||||||
| 				cmdutil.PrintSuccess(shortOutput, o.Out, info.Object, false, "unchanged") |  | ||||||
| 				return nil | 				printer, err := o.ToPrinter("unchanged") | ||||||
|  | 				if err != nil { | ||||||
|  | 					return err | ||||||
|  | 				} | ||||||
|  | 				return printer.PrintObj(info.AsVersioned(), o.Out) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		count++ | 		count++ | ||||||
| 		if printObject { |  | ||||||
| 			return cmdutil.PrintObject(cmd, info.Object, o.Out) | 		printer, err := o.ToPrinter("configured") | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
| 		} | 		} | ||||||
| 		cmdutil.PrintSuccess(shortOutput, o.Out, info.Object, dryRun, "configured") | 		return printer.PrintObj(info.AsVersioned(), o.Out) | ||||||
| 		return nil |  | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -424,9 +442,11 @@ func (o *ApplyOptions) Run(f cmdutil.Factory, cmd *cobra.Command) error { | |||||||
| 		labelSelector: o.Selector, | 		labelSelector: o.Selector, | ||||||
| 		visitedUids:   visitedUids, | 		visitedUids:   visitedUids, | ||||||
|  |  | ||||||
| 		cascade:     o.Cascade, | 		cascade:     o.DeleteOptions.Cascade, | ||||||
| 		dryRun:      dryRun, | 		dryRun:      o.DryRun, | ||||||
| 		gracePeriod: o.GracePeriod, | 		gracePeriod: o.DeleteOptions.GracePeriod, | ||||||
|  |  | ||||||
|  | 		toPrinter: o.ToPrinter, | ||||||
|  |  | ||||||
| 		out: o.Out, | 		out: o.Out, | ||||||
| 	} | 	} | ||||||
| @@ -438,13 +458,13 @@ func (o *ApplyOptions) Run(f cmdutil.Factory, cmd *cobra.Command) error { | |||||||
|  |  | ||||||
| 	for n := range visitedNamespaces { | 	for n := range visitedNamespaces { | ||||||
| 		for _, m := range namespacedRESTMappings { | 		for _, m := range namespacedRESTMappings { | ||||||
| 			if err := p.prune(f, n, m, shortOutput, includeUninitialized); err != nil { | 			if err := p.prune(f, n, m, includeUninitialized); err != nil { | ||||||
| 				return fmt.Errorf("error pruning namespaced object %v: %v", m.GroupVersionKind, err) | 				return fmt.Errorf("error pruning namespaced object %v: %v", m.GroupVersionKind, err) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	for _, m := range nonNamespacedRESTMappings { | 	for _, m := range nonNamespacedRESTMappings { | ||||||
| 		if err := p.prune(f, metav1.NamespaceNone, m, shortOutput, includeUninitialized); err != nil { | 		if err := p.prune(f, metav1.NamespaceNone, m, includeUninitialized); err != nil { | ||||||
| 			return fmt.Errorf("error pruning nonNamespaced object %v: %v", m.GroupVersionKind, err) | 			return fmt.Errorf("error pruning nonNamespaced object %v: %v", m.GroupVersionKind, err) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -515,10 +535,12 @@ type pruner struct { | |||||||
| 	dryRun      bool | 	dryRun      bool | ||||||
| 	gracePeriod int | 	gracePeriod int | ||||||
|  |  | ||||||
|  | 	toPrinter func(string) (printers.ResourcePrinterFunc, error) | ||||||
|  |  | ||||||
| 	out io.Writer | 	out io.Writer | ||||||
| } | } | ||||||
|  |  | ||||||
| func (p *pruner) prune(f cmdutil.Factory, namespace string, mapping *meta.RESTMapping, shortOutput, includeUninitialized bool) error { | func (p *pruner) prune(f cmdutil.Factory, namespace string, mapping *meta.RESTMapping, includeUninitialized bool) error { | ||||||
| 	c, err := p.clientFunc(mapping) | 	c, err := p.clientFunc(mapping) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| @@ -572,7 +594,12 @@ func (p *pruner) prune(f cmdutil.Factory, namespace string, mapping *meta.RESTMa | |||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		cmdutil.PrintSuccess(shortOutput, p.out, obj, p.dryRun, "pruned") |  | ||||||
|  | 		printer, err := p.toPrinter("pruned") | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		printer.PrintObj(obj, p.out) | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Kubernetes Submit Queue
					Kubernetes Submit Queue