mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-26 21:17:23 +00:00
Merge pull request #60360 from dixudx/kubectl_apply_flag_value_bind
Automatic merge from submit-queue (batch tested with PRs 61003, 61031, 60360, 58349, 60922). 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>. flag value bindings for kubectl apply commands **What this PR does / why we need it**: /kind cleanup /sig cli xxxOptions did not get bound as default value for some flags. This PR cleans those flag bindings for `kubectl apply` commands. **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: xref #60366 **Special notes for your reviewer**: /assign @deads2k **Release note**: ```release-note None ```
This commit is contained in:
commit
4159be8a5a
@ -59,7 +59,10 @@ type ApplyOptions struct {
|
|||||||
PruneResources []pruneResource
|
PruneResources []pruneResource
|
||||||
Timeout time.Duration
|
Timeout time.Duration
|
||||||
cmdBaseName string
|
cmdBaseName string
|
||||||
all bool
|
All bool
|
||||||
|
Overwrite bool
|
||||||
|
OpenApiPatch bool
|
||||||
|
PruneWhitelist []string
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -98,8 +101,17 @@ var (
|
|||||||
warningNoLastAppliedConfigAnnotation = "Warning: %[1]s apply should be used on resource created by either %[1]s create --save-config or %[1]s apply\n"
|
warningNoLastAppliedConfigAnnotation = "Warning: %[1]s apply should be used on resource created by either %[1]s create --save-config or %[1]s apply\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func NewApplyOptions() *ApplyOptions {
|
||||||
|
return &ApplyOptions{
|
||||||
|
Overwrite: true,
|
||||||
|
Cascade: true,
|
||||||
|
GracePeriod: -1,
|
||||||
|
OpenApiPatch: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func NewCmdApply(baseName string, f cmdutil.Factory, out, errOut io.Writer) *cobra.Command {
|
func NewCmdApply(baseName string, f cmdutil.Factory, out, errOut io.Writer) *cobra.Command {
|
||||||
var options ApplyOptions
|
options := NewApplyOptions()
|
||||||
|
|
||||||
// Store baseName for use in printing warnings / messages involving the base command name.
|
// Store baseName for use in printing warnings / messages involving the base command name.
|
||||||
// This is useful for downstream command that wrap this one.
|
// This is useful for downstream command that wrap this one.
|
||||||
@ -113,25 +125,25 @@ func NewCmdApply(baseName string, f cmdutil.Factory, out, errOut io.Writer) *cob
|
|||||||
Example: applyExample,
|
Example: applyExample,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
cmdutil.CheckErr(validateArgs(cmd, args))
|
cmdutil.CheckErr(validateArgs(cmd, args))
|
||||||
cmdutil.CheckErr(validatePruneAll(options.Prune, options.all, options.Selector))
|
cmdutil.CheckErr(validatePruneAll(options.Prune, options.All, options.Selector))
|
||||||
cmdutil.CheckErr(RunApply(f, cmd, out, errOut, &options))
|
cmdutil.CheckErr(RunApply(f, cmd, out, errOut, options))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
usage := "that contains the configuration to apply"
|
usage := "that contains the configuration to apply"
|
||||||
cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, usage)
|
cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, usage)
|
||||||
cmd.MarkFlagRequired("filename")
|
cmd.MarkFlagRequired("filename")
|
||||||
cmd.Flags().Bool("overwrite", true, "Automatically resolve conflicts between the modified and live configuration by using values from the modified configuration")
|
cmd.Flags().BoolVar(&options.Overwrite, "overwrite", options.Overwrite, "Automatically resolve conflicts between the modified and live configuration by using values from the modified configuration")
|
||||||
cmd.Flags().BoolVar(&options.Prune, "prune", false, "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(&options.Prune, "prune", options.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(&options.Cascade, "cascade", true, "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().BoolVar(&options.Cascade, "cascade", options.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(&options.GracePeriod, "grace-period", -1, "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().IntVar(&options.GracePeriod, "grace-period", options.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(&options.Force, "force", false, fmt.Sprintf("Delete and re-create the specified resource, when PATCH encounters conflict and has retried for %d times.", maxPatchRetry))
|
cmd.Flags().BoolVar(&options.Force, "force", options.Force, fmt.Sprintf("Delete and re-create the specified resource, when PATCH encounters conflict and has retried for %d times.", maxPatchRetry))
|
||||||
cmd.Flags().DurationVar(&options.Timeout, "timeout", 0, "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).")
|
cmd.Flags().DurationVar(&options.Timeout, "timeout", options.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(&options.Selector, "selector", "l", options.Selector, "Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)")
|
cmd.Flags().StringVarP(&options.Selector, "selector", "l", options.Selector, "Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)")
|
||||||
cmd.Flags().BoolVar(&options.all, "all", options.all, "Select all resources in the namespace of the specified resource types.")
|
cmd.Flags().BoolVar(&options.All, "all", options.All, "Select all resources in the namespace of the specified resource types.")
|
||||||
cmd.Flags().StringArray("prune-whitelist", []string{}, "Overwrite the default whitelist with <group/version/kind> for --prune")
|
cmd.Flags().StringArrayVar(&options.PruneWhitelist, "prune-whitelist", options.PruneWhitelist, "Overwrite the default whitelist with <group/version/kind> for --prune")
|
||||||
cmd.Flags().Bool("openapi-patch", true, "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(&options.OpenApiPatch, "openapi-patch", options.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.AddPrinterFlags(cmd)
|
||||||
cmdutil.AddRecordFlag(cmd)
|
cmdutil.AddRecordFlag(cmd)
|
||||||
@ -201,7 +213,7 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti
|
|||||||
}
|
}
|
||||||
|
|
||||||
var openapiSchema openapi.Resources
|
var openapiSchema openapi.Resources
|
||||||
if cmdutil.GetFlagBool(cmd, "openapi-patch") {
|
if options.OpenApiPatch {
|
||||||
openapiSchema, err = f.OpenAPISchema()
|
openapiSchema, err = f.OpenAPISchema()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
openapiSchema = nil
|
openapiSchema = nil
|
||||||
@ -231,7 +243,7 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti
|
|||||||
}
|
}
|
||||||
|
|
||||||
if options.Prune {
|
if options.Prune {
|
||||||
options.PruneResources, err = parsePruneResources(r.Mapper().RESTMapper, cmdutil.GetFlagStringArray(cmd, "prune-whitelist"))
|
options.PruneResources, err = parsePruneResources(r.Mapper().RESTMapper, options.PruneWhitelist)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -312,7 +324,6 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti
|
|||||||
if _, ok := annotationMap[api.LastAppliedConfigAnnotation]; !ok {
|
if _, ok := annotationMap[api.LastAppliedConfigAnnotation]; !ok {
|
||||||
fmt.Fprintf(errOut, warningNoLastAppliedConfigAnnotation, options.cmdBaseName)
|
fmt.Fprintf(errOut, warningNoLastAppliedConfigAnnotation, options.cmdBaseName)
|
||||||
}
|
}
|
||||||
overwrite := cmdutil.GetFlagBool(cmd, "overwrite")
|
|
||||||
helper := resource.NewHelper(info.Client, info.Mapping)
|
helper := resource.NewHelper(info.Client, info.Mapping)
|
||||||
patcher := &patcher{
|
patcher := &patcher{
|
||||||
encoder: encoder,
|
encoder: encoder,
|
||||||
@ -321,7 +332,7 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti
|
|||||||
helper: helper,
|
helper: helper,
|
||||||
clientFunc: f.UnstructuredClientForMapping,
|
clientFunc: f.UnstructuredClientForMapping,
|
||||||
clientsetFunc: f.ClientSet,
|
clientsetFunc: f.ClientSet,
|
||||||
overwrite: overwrite,
|
overwrite: options.Overwrite,
|
||||||
backOff: clockwork.NewRealClock(),
|
backOff: clockwork.NewRealClock(),
|
||||||
force: options.Force,
|
force: options.Force,
|
||||||
cascade: options.Cascade,
|
cascade: options.Cascade,
|
||||||
|
@ -60,7 +60,9 @@ var (
|
|||||||
|
|
||||||
func NewCmdApplyEditLastApplied(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command {
|
func NewCmdApplyEditLastApplied(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command {
|
||||||
options := &editor.EditOptions{
|
options := &editor.EditOptions{
|
||||||
EditMode: editor.ApplyEditMode,
|
EditMode: editor.ApplyEditMode,
|
||||||
|
Output: "yaml",
|
||||||
|
WindowsLineEndings: runtime.GOOS == "windows",
|
||||||
}
|
}
|
||||||
validArgs := cmdutil.ValidArgList(f)
|
validArgs := cmdutil.ValidArgList(f)
|
||||||
|
|
||||||
@ -85,8 +87,8 @@ func NewCmdApplyEditLastApplied(f cmdutil.Factory, out, errOut io.Writer) *cobra
|
|||||||
|
|
||||||
usage := "to use to edit the resource"
|
usage := "to use to edit the resource"
|
||||||
cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, usage)
|
cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, usage)
|
||||||
cmd.Flags().StringVarP(&options.Output, "output", "o", "yaml", "Output format. One of: yaml|json.")
|
cmd.Flags().StringVarP(&options.Output, "output", "o", options.Output, "Output format. One of: yaml|json.")
|
||||||
cmd.Flags().BoolVar(&options.WindowsLineEndings, "windows-line-endings", runtime.GOOS == "windows",
|
cmd.Flags().BoolVar(&options.WindowsLineEndings, "windows-line-endings", options.WindowsLineEndings,
|
||||||
"Defaults to the line ending native to your platform.")
|
"Defaults to the line ending native to your platform.")
|
||||||
cmdutil.AddRecordVarFlag(cmd, &options.Record)
|
cmdutil.AddRecordVarFlag(cmd, &options.Record)
|
||||||
cmdutil.AddIncludeUninitializedFlag(cmd)
|
cmdutil.AddIncludeUninitializedFlag(cmd)
|
||||||
|
@ -99,7 +99,7 @@ func NewCmdApplySetLastApplied(f cmdutil.Factory, out, err io.Writer) *cobra.Com
|
|||||||
cmdutil.AddDryRunFlag(cmd)
|
cmdutil.AddDryRunFlag(cmd)
|
||||||
cmdutil.AddRecordFlag(cmd)
|
cmdutil.AddRecordFlag(cmd)
|
||||||
cmdutil.AddPrinterFlags(cmd)
|
cmdutil.AddPrinterFlags(cmd)
|
||||||
cmd.Flags().BoolVar(&options.CreateAnnotation, "create-annotation", false, "Will create 'last-applied-configuration' annotations if current objects doesn't have one")
|
cmd.Flags().BoolVar(&options.CreateAnnotation, "create-annotation", options.CreateAnnotation, "Will create 'last-applied-configuration' annotations if current objects doesn't have one")
|
||||||
usage := "that contains the last-applied-configuration annotations"
|
usage := "that contains the last-applied-configuration annotations"
|
||||||
kubectl.AddJsonFilenameFlag(cmd, &options.FilenameOptions.Filenames, "Filename, directory, or URL to files "+usage)
|
kubectl.AddJsonFilenameFlag(cmd, &options.FilenameOptions.Filenames, "Filename, directory, or URL to files "+usage)
|
||||||
|
|
||||||
|
@ -57,8 +57,16 @@ var (
|
|||||||
kubectl apply view-last-applied -f deploy.yaml -o json`))
|
kubectl apply view-last-applied -f deploy.yaml -o json`))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func NewViewLastAppliedOptions(out, err io.Writer) *ViewLastAppliedOptions {
|
||||||
|
return &ViewLastAppliedOptions{
|
||||||
|
Out: out,
|
||||||
|
ErrOut: err,
|
||||||
|
OutputFormat: "yaml",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func NewCmdApplyViewLastApplied(f cmdutil.Factory, out, err io.Writer) *cobra.Command {
|
func NewCmdApplyViewLastApplied(f cmdutil.Factory, out, err io.Writer) *cobra.Command {
|
||||||
options := &ViewLastAppliedOptions{Out: out, ErrOut: err}
|
options := NewViewLastAppliedOptions(out, err)
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "view-last-applied (TYPE [NAME | -l label] | TYPE/NAME | -f FILENAME)",
|
Use: "view-last-applied (TYPE [NAME | -l label] | TYPE/NAME | -f FILENAME)",
|
||||||
DisableFlagsInUseLine: true,
|
DisableFlagsInUseLine: true,
|
||||||
@ -66,23 +74,22 @@ func NewCmdApplyViewLastApplied(f cmdutil.Factory, out, err io.Writer) *cobra.Co
|
|||||||
Long: applyViewLastAppliedLong,
|
Long: applyViewLastAppliedLong,
|
||||||
Example: applyViewLastAppliedExample,
|
Example: applyViewLastAppliedExample,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
cmdutil.CheckErr(options.ValidateOutputArgs(cmd))
|
cmdutil.CheckErr(options.Complete(cmd, f, args))
|
||||||
cmdutil.CheckErr(options.Complete(f, args))
|
|
||||||
cmdutil.CheckErr(options.Validate(cmd))
|
cmdutil.CheckErr(options.Validate(cmd))
|
||||||
cmdutil.CheckErr(options.RunApplyViewLastApplied())
|
cmdutil.CheckErr(options.RunApplyViewLastApplied(cmd))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.Flags().StringP("output", "o", "", "Output format. Must be one of yaml|json")
|
cmd.Flags().StringVarP(&options.OutputFormat, "output", "o", options.OutputFormat, "Output format. Must be one of yaml|json")
|
||||||
cmd.Flags().StringVarP(&options.Selector, "selector", "l", "", "Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)")
|
cmd.Flags().StringVarP(&options.Selector, "selector", "l", options.Selector, "Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)")
|
||||||
cmd.Flags().BoolVar(&options.All, "all", false, "Select all resources in the namespace of the specified resource types")
|
cmd.Flags().BoolVar(&options.All, "all", options.All, "Select all resources in the namespace of the specified resource types")
|
||||||
usage := "that contains the last-applied-configuration annotations"
|
usage := "that contains the last-applied-configuration annotations"
|
||||||
cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, usage)
|
cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, usage)
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *ViewLastAppliedOptions) Complete(f cmdutil.Factory, args []string) error {
|
func (o *ViewLastAppliedOptions) Complete(cmd *cobra.Command, f cmdutil.Factory, args []string) error {
|
||||||
cmdNamespace, enforceNamespace, err := f.DefaultNamespace()
|
cmdNamespace, enforceNamespace, err := f.DefaultNamespace()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -130,7 +137,7 @@ func (o *ViewLastAppliedOptions) Validate(cmd *cobra.Command) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *ViewLastAppliedOptions) RunApplyViewLastApplied() error {
|
func (o *ViewLastAppliedOptions) RunApplyViewLastApplied(cmd *cobra.Command) error {
|
||||||
for _, str := range o.LastAppliedConfigurationList {
|
for _, str := range o.LastAppliedConfigurationList {
|
||||||
switch o.OutputFormat {
|
switch o.OutputFormat {
|
||||||
case "json":
|
case "json":
|
||||||
@ -146,23 +153,13 @@ func (o *ViewLastAppliedOptions) RunApplyViewLastApplied() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Fprint(o.Out, string(yamlOutput))
|
fmt.Fprint(o.Out, string(yamlOutput))
|
||||||
|
default:
|
||||||
|
return cmdutil.UsageErrorf(
|
||||||
|
cmd,
|
||||||
|
"Unexpected -o output mode: %s, the flag 'output' must be one of yaml|json",
|
||||||
|
o.OutputFormat)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *ViewLastAppliedOptions) ValidateOutputArgs(cmd *cobra.Command) error {
|
|
||||||
format := cmdutil.GetFlagString(cmd, "output")
|
|
||||||
switch format {
|
|
||||||
case "json":
|
|
||||||
o.OutputFormat = "json"
|
|
||||||
return nil
|
|
||||||
// If flag -o is not specified, use yaml as default
|
|
||||||
case "yaml", "":
|
|
||||||
o.OutputFormat = "yaml"
|
|
||||||
return nil
|
|
||||||
default:
|
|
||||||
return cmdutil.UsageErrorf(cmd, "Unexpected -o output mode: %s, the flag 'output' must be one of yaml|json", format)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user