Merge pull request #23798 from nak3/bash-completion

Bash completion updates
This commit is contained in:
Daniel Smith 2016-04-14 16:59:48 -07:00
commit bbe5299371
10 changed files with 272 additions and 20 deletions

View File

@ -313,7 +313,8 @@ __kubectl_require_pod_and_container()
__custom_func() { __custom_func() {
case ${last_command} in case ${last_command} in
kubectl_get | kubectl_describe | kubectl_delete | kubectl_label | kubectl_stop) kubectl_get | kubectl_describe | kubectl_delete | kubectl_label | kubectl_stop | kubectl_edit | kubectl_patch |\
kubectl_annotate | kubectl_expose)
__kubectl_get_resource __kubectl_get_resource
return return
;; ;;
@ -1155,7 +1156,74 @@ _kubectl_patch()
must_have_one_flag+=("--patch=") must_have_one_flag+=("--patch=")
must_have_one_flag+=("-p") must_have_one_flag+=("-p")
must_have_one_noun=() must_have_one_noun=()
must_have_one_noun+=("componentstatus")
must_have_one_noun+=("configmap")
must_have_one_noun+=("daemonset")
must_have_one_noun+=("deployment")
must_have_one_noun+=("endpoints")
must_have_one_noun+=("event")
must_have_one_noun+=("horizontalpodautoscaler")
must_have_one_noun+=("ingress")
must_have_one_noun+=("job")
must_have_one_noun+=("limitrange")
must_have_one_noun+=("namespace")
must_have_one_noun+=("node")
must_have_one_noun+=("persistentvolume")
must_have_one_noun+=("persistentvolumeclaim")
must_have_one_noun+=("pod")
must_have_one_noun+=("podsecuritypolicy")
must_have_one_noun+=("podtemplate")
must_have_one_noun+=("replicaset")
must_have_one_noun+=("replicationcontroller")
must_have_one_noun+=("resourcequota")
must_have_one_noun+=("secret")
must_have_one_noun+=("service")
must_have_one_noun+=("serviceaccount")
must_have_one_noun+=("thirdpartyresource")
must_have_one_noun+=("thirdpartyresourcedata")
noun_aliases=() noun_aliases=()
noun_aliases+=("componentstatuses")
noun_aliases+=("configmaps")
noun_aliases+=("cs")
noun_aliases+=("daemonsets")
noun_aliases+=("deployments")
noun_aliases+=("ds")
noun_aliases+=("endpoints")
noun_aliases+=("ep")
noun_aliases+=("ev")
noun_aliases+=("events")
noun_aliases+=("horizontalpodautoscalers")
noun_aliases+=("hpa")
noun_aliases+=("ing")
noun_aliases+=("ingresses")
noun_aliases+=("jobs")
noun_aliases+=("limitranges")
noun_aliases+=("limits")
noun_aliases+=("namespaces")
noun_aliases+=("no")
noun_aliases+=("nodes")
noun_aliases+=("ns")
noun_aliases+=("persistentvolumeclaims")
noun_aliases+=("persistentvolumes")
noun_aliases+=("po")
noun_aliases+=("pods")
noun_aliases+=("podsecuritypolicies")
noun_aliases+=("podtemplates")
noun_aliases+=("pv")
noun_aliases+=("pvc")
noun_aliases+=("quota")
noun_aliases+=("rc")
noun_aliases+=("replicasets")
noun_aliases+=("replicationcontrollers")
noun_aliases+=("resourcequotas")
noun_aliases+=("rs")
noun_aliases+=("sa")
noun_aliases+=("secrets")
noun_aliases+=("serviceaccounts")
noun_aliases+=("services")
noun_aliases+=("svc")
noun_aliases+=("thirdpartyresourcedatas")
noun_aliases+=("thirdpartyresources")
} }
_kubectl_delete() _kubectl_delete()
@ -1342,7 +1410,74 @@ _kubectl_edit()
must_have_one_flag=() must_have_one_flag=()
must_have_one_noun=() must_have_one_noun=()
must_have_one_noun+=("componentstatus")
must_have_one_noun+=("configmap")
must_have_one_noun+=("daemonset")
must_have_one_noun+=("deployment")
must_have_one_noun+=("endpoints")
must_have_one_noun+=("event")
must_have_one_noun+=("horizontalpodautoscaler")
must_have_one_noun+=("ingress")
must_have_one_noun+=("job")
must_have_one_noun+=("limitrange")
must_have_one_noun+=("namespace")
must_have_one_noun+=("node")
must_have_one_noun+=("persistentvolume")
must_have_one_noun+=("persistentvolumeclaim")
must_have_one_noun+=("pod")
must_have_one_noun+=("podsecuritypolicy")
must_have_one_noun+=("podtemplate")
must_have_one_noun+=("replicaset")
must_have_one_noun+=("replicationcontroller")
must_have_one_noun+=("resourcequota")
must_have_one_noun+=("secret")
must_have_one_noun+=("service")
must_have_one_noun+=("serviceaccount")
must_have_one_noun+=("thirdpartyresource")
must_have_one_noun+=("thirdpartyresourcedata")
noun_aliases=() noun_aliases=()
noun_aliases+=("componentstatuses")
noun_aliases+=("configmaps")
noun_aliases+=("cs")
noun_aliases+=("daemonsets")
noun_aliases+=("deployments")
noun_aliases+=("ds")
noun_aliases+=("endpoints")
noun_aliases+=("ep")
noun_aliases+=("ev")
noun_aliases+=("events")
noun_aliases+=("horizontalpodautoscalers")
noun_aliases+=("hpa")
noun_aliases+=("ing")
noun_aliases+=("ingresses")
noun_aliases+=("jobs")
noun_aliases+=("limitranges")
noun_aliases+=("limits")
noun_aliases+=("namespaces")
noun_aliases+=("no")
noun_aliases+=("nodes")
noun_aliases+=("ns")
noun_aliases+=("persistentvolumeclaims")
noun_aliases+=("persistentvolumes")
noun_aliases+=("po")
noun_aliases+=("pods")
noun_aliases+=("podsecuritypolicies")
noun_aliases+=("podtemplates")
noun_aliases+=("pv")
noun_aliases+=("pvc")
noun_aliases+=("quota")
noun_aliases+=("rc")
noun_aliases+=("replicasets")
noun_aliases+=("replicationcontrollers")
noun_aliases+=("resourcequotas")
noun_aliases+=("rs")
noun_aliases+=("sa")
noun_aliases+=("secrets")
noun_aliases+=("serviceaccounts")
noun_aliases+=("services")
noun_aliases+=("svc")
noun_aliases+=("thirdpartyresourcedatas")
noun_aliases+=("thirdpartyresources")
} }
_kubectl_apply() _kubectl_apply()
@ -2144,7 +2279,21 @@ _kubectl_expose()
must_have_one_flag=() must_have_one_flag=()
must_have_one_noun=() must_have_one_noun=()
must_have_one_noun+=("deployment")
must_have_one_noun+=("pod")
must_have_one_noun+=("replicaset")
must_have_one_noun+=("replicationcontroller")
must_have_one_noun+=("service")
noun_aliases=() noun_aliases=()
noun_aliases+=("deployments")
noun_aliases+=("po")
noun_aliases+=("pods")
noun_aliases+=("rc")
noun_aliases+=("replicasets")
noun_aliases+=("replicationcontrollers")
noun_aliases+=("rs")
noun_aliases+=("services")
noun_aliases+=("svc")
} }
_kubectl_autoscale() _kubectl_autoscale()
@ -2684,7 +2833,42 @@ _kubectl_annotate()
must_have_one_flag=() must_have_one_flag=()
must_have_one_noun=() must_have_one_noun=()
must_have_one_noun+=("componentstatuse")
must_have_one_noun+=("event")
must_have_one_noun+=("horizontalpodautoscaler")
must_have_one_noun+=("limitrange")
must_have_one_noun+=("node")
must_have_one_noun+=("persistentvolume")
must_have_one_noun+=("persistentvolumeclaim")
must_have_one_noun+=("pod")
must_have_one_noun+=("replicationcontroller")
must_have_one_noun+=("resourcequota")
must_have_one_noun+=("secret")
must_have_one_noun+=("service")
noun_aliases=() noun_aliases=()
noun_aliases+=("componentstatuses")
noun_aliases+=("cs")
noun_aliases+=("ev")
noun_aliases+=("events")
noun_aliases+=("horizontalpodautoscalers")
noun_aliases+=("hpa")
noun_aliases+=("limitranges")
noun_aliases+=("limits")
noun_aliases+=("no")
noun_aliases+=("nodes")
noun_aliases+=("persistentvolumeclaims")
noun_aliases+=("persistentvolumes")
noun_aliases+=("po")
noun_aliases+=("pods")
noun_aliases+=("pv")
noun_aliases+=("pvc")
noun_aliases+=("quota")
noun_aliases+=("rc")
noun_aliases+=("replicationcontrollers")
noun_aliases+=("resourcequotas")
noun_aliases+=("secrets")
noun_aliases+=("services")
noun_aliases+=("svc")
} }
_kubectl_config_view() _kubectl_config_view()

View File

@ -22,10 +22,11 @@ If \-\-overwrite is true, then existing annotations can be overwritten, otherwis
If \-\-resource\-version is specified, then updates will use this resource version, otherwise the existing resource\-version will be used. If \-\-resource\-version is specified, then updates will use this resource version, otherwise the existing resource\-version will be used.
.PP .PP
Possible resources include (case insensitive): pods (po), services (svc), Possible resources include (case insensitive):
replicationcontrollers (rc), nodes (no), events (ev), componentstatuses (cs), pod (po), service (svc), replicationcontroller (rc),
limitranges (limits), persistentvolumes (pv), persistentvolumeclaims (pvc), node (no), event (ev), componentstatuse (cs),
horizontalpodautoscalers (hpa), resourcequotas (quota) or secrets. limitrange (limits), persistentvolume (pv), persistentvolumeclaim (pvc),
horizontalpodautoscaler (hpa), resourcequota (quota), secret
.SH OPTIONS .SH OPTIONS

View File

@ -13,7 +13,7 @@ kubectl expose \- Take a replication controller, service, deployment or pod and
.SH DESCRIPTION .SH DESCRIPTION
.PP .PP
Take a deployment, service, replica set, replication controller, or pod and expose it as a new Kubernetes service. Expose a resource as a new Kubernetes service.
.PP .PP
Looks up a deployment, service, replica set, replication controller or pod by name and uses the selector Looks up a deployment, service, replica set, replication controller or pod by name and uses the selector
@ -23,6 +23,11 @@ i.e. when the selector contains only the matchLabels component. Note that if no
\-\-port and the exposed resource has multiple ports, all will be re\-used by the new service. Also if no \-\-port and the exposed resource has multiple ports, all will be re\-used by the new service. Also if no
labels are specified, the new service will re\-use the labels from the resource it exposes. labels are specified, the new service will re\-use the labels from the resource it exposes.
.PP
Possible resources include (case insensitive):
pod (po), service (svc), replicationcontroller (rc),
deployment, replicaset (rs)
.SH OPTIONS .SH OPTIONS
.PP .PP

View File

@ -46,10 +46,12 @@ It is intended to store non-identifying auxiliary data, especially data manipula
If --overwrite is true, then existing annotations can be overwritten, otherwise attempting to overwrite an annotation will result in an error. If --overwrite is true, then existing annotations can be overwritten, otherwise attempting to overwrite an annotation will result in an error.
If --resource-version is specified, then updates will use this resource version, otherwise the existing resource-version will be used. If --resource-version is specified, then updates will use this resource version, otherwise the existing resource-version will be used.
Possible resources include (case insensitive): pods (po), services (svc), Possible resources include (case insensitive):
replicationcontrollers (rc), nodes (no), events (ev), componentstatuses (cs), pod (po), service (svc), replicationcontroller (rc),
limitranges (limits), persistentvolumes (pv), persistentvolumeclaims (pvc), node (no), event (ev), componentstatuse (cs),
horizontalpodautoscalers (hpa), resourcequotas (quota) or secrets. limitrange (limits), persistentvolume (pv), persistentvolumeclaim (pvc),
horizontalpodautoscaler (hpa), resourcequota (quota), secret
``` ```
kubectl annotate [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version] kubectl annotate [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]
@ -131,7 +133,7 @@ kubectl annotate pods foo description-
* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager
###### Auto generated by spf13/cobra on 30-Mar-2016 ###### Auto generated by spf13/cobra on 10-Apr-2016
<!-- BEGIN MUNGE: GENERATED_ANALYTICS --> <!-- BEGIN MUNGE: GENERATED_ANALYTICS -->
[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_annotate.md?pixel)]() [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_annotate.md?pixel)]()

View File

@ -39,7 +39,7 @@ Take a replication controller, service, deployment or pod and expose it as a new
### Synopsis ### Synopsis
Take a deployment, service, replica set, replication controller, or pod and expose it as a new Kubernetes service. Expose a resource as a new Kubernetes service.
Looks up a deployment, service, replica set, replication controller or pod by name and uses the selector Looks up a deployment, service, replica set, replication controller or pod by name and uses the selector
for that resource as the selector for a new service on the specified port. A deployment or replica set for that resource as the selector for a new service on the specified port. A deployment or replica set
@ -48,6 +48,11 @@ i.e. when the selector contains only the matchLabels component. Note that if no
--port and the exposed resource has multiple ports, all will be re-used by the new service. Also if no --port and the exposed resource has multiple ports, all will be re-used by the new service. Also if no
labels are specified, the new service will re-use the labels from the resource it exposes. labels are specified, the new service will re-use the labels from the resource it exposes.
Possible resources include (case insensitive):
pod (po), service (svc), replicationcontroller (rc),
deployment, replicaset (rs)
``` ```
kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type] kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]
``` ```
@ -139,7 +144,7 @@ kubectl expose deployment nginx --port=80 --target-port=8000
* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager * [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager
###### Auto generated by spf13/cobra on 30-Mar-2016 ###### Auto generated by spf13/cobra on 10-Apr-2016
<!-- BEGIN MUNGE: GENERATED_ANALYTICS --> <!-- BEGIN MUNGE: GENERATED_ANALYTICS -->
[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_expose.md?pixel)]() [![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/user-guide/kubectl/kubectl_expose.md?pixel)]()

View File

@ -21,6 +21,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
"regexp"
"strings" "strings"
"github.com/golang/glog" "github.com/golang/glog"
@ -58,6 +59,13 @@ type AnnotateOptions struct {
} }
const ( const (
annotate_resources = `
pod (po), service (svc), replicationcontroller (rc),
node (no), event (ev), componentstatuse (cs),
limitrange (limits), persistentvolume (pv), persistentvolumeclaim (pvc),
horizontalpodautoscaler (hpa), resourcequota (quota), secret
`
annotate_long = `Update the annotations on one or more resources. annotate_long = `Update the annotations on one or more resources.
An annotation is a key/value pair that can hold larger (compared to a label), and possibly not human-readable, data. An annotation is a key/value pair that can hold larger (compared to a label), and possibly not human-readable, data.
@ -65,10 +73,8 @@ It is intended to store non-identifying auxiliary data, especially data manipula
If --overwrite is true, then existing annotations can be overwritten, otherwise attempting to overwrite an annotation will result in an error. If --overwrite is true, then existing annotations can be overwritten, otherwise attempting to overwrite an annotation will result in an error.
If --resource-version is specified, then updates will use this resource version, otherwise the existing resource-version will be used. If --resource-version is specified, then updates will use this resource version, otherwise the existing resource-version will be used.
Possible resources include (case insensitive): pods (po), services (svc), Possible resources include (case insensitive):` + annotate_resources
replicationcontrollers (rc), nodes (no), events (ev), componentstatuses (cs),
limitranges (limits), persistentvolumes (pv), persistentvolumeclaims (pvc),
horizontalpodautoscalers (hpa), resourcequotas (quota) or secrets.`
annotate_example = `# Update pod 'foo' with the annotation 'description' and the value 'my frontend'. annotate_example = `# Update pod 'foo' with the annotation 'description' and the value 'my frontend'.
# If the same annotation is set multiple times, only the last value will be applied # If the same annotation is set multiple times, only the last value will be applied
kubectl annotate pods foo description='my frontend' kubectl annotate pods foo description='my frontend'
@ -93,6 +99,13 @@ kubectl annotate pods foo description-`
func NewCmdAnnotate(f *cmdutil.Factory, out io.Writer) *cobra.Command { func NewCmdAnnotate(f *cmdutil.Factory, out io.Writer) *cobra.Command {
options := &AnnotateOptions{} options := &AnnotateOptions{}
validArgs, argAliases := []string{}, []string{}
resources := regexp.MustCompile(`\s*,`).Split(annotate_resources, -1)
for _, r := range resources {
validArgs = append(validArgs, strings.Fields(r)[0])
argAliases = kubectl.ResourceAliases(validArgs)
}
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "annotate [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]", Use: "annotate [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]",
Short: "Update the annotations on a resource", Short: "Update the annotations on a resource",
@ -109,6 +122,8 @@ func NewCmdAnnotate(f *cmdutil.Factory, out io.Writer) *cobra.Command {
cmdutil.CheckErr(err) cmdutil.CheckErr(err)
} }
}, },
ValidArgs: validArgs,
ArgAliases: argAliases,
} }
cmdutil.AddPrinterFlags(cmd) cmdutil.AddPrinterFlags(cmd)
cmdutil.AddInclude3rdPartyFlags(cmd) cmdutil.AddInclude3rdPartyFlags(cmd)

View File

@ -124,7 +124,8 @@ __kubectl_require_pod_and_container()
__custom_func() { __custom_func() {
case ${last_command} in case ${last_command} in
kubectl_get | kubectl_describe | kubectl_delete | kubectl_label | kubectl_stop) kubectl_get | kubectl_describe | kubectl_delete | kubectl_label | kubectl_stop | kubectl_edit | kubectl_patch |\
kubectl_annotate | kubectl_expose)
__kubectl_get_resource __kubectl_get_resource
return return
;; ;;

View File

@ -86,6 +86,15 @@ var errExit = fmt.Errorf("exit directly")
func NewCmdEdit(f *cmdutil.Factory, out, errOut io.Writer) *cobra.Command { func NewCmdEdit(f *cmdutil.Factory, out, errOut io.Writer) *cobra.Command {
options := &EditOptions{} options := &EditOptions{}
// retrieve a list of handled resources from printer as valid args
validArgs, argAliases := []string{}, []string{}
p, err := f.Printer(nil, false, false, false, false, false, false, []string{})
cmdutil.CheckErr(err)
if p != nil {
validArgs = p.HandledResources()
argAliases = kubectl.ResourceAliases(validArgs)
}
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "edit (RESOURCE/NAME | -f FILENAME)", Use: "edit (RESOURCE/NAME | -f FILENAME)",
Short: "Edit a resource on the server", Short: "Edit a resource on the server",
@ -98,6 +107,8 @@ func NewCmdEdit(f *cmdutil.Factory, out, errOut io.Writer) *cobra.Command {
} }
cmdutil.CheckErr(err) cmdutil.CheckErr(err)
}, },
ValidArgs: validArgs,
ArgAliases: argAliases,
} }
usage := "Filename, directory, or URL to file to use to edit the resource" usage := "Filename, directory, or URL to file to use to edit the resource"
kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage) kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage)

View File

@ -19,6 +19,7 @@ package cmd
import ( import (
"fmt" "fmt"
"io" "io"
"regexp"
"strings" "strings"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -38,14 +39,21 @@ type ExposeOptions struct {
} }
const ( const (
expose_long = `Take a deployment, service, replica set, replication controller, or pod and expose it as a new Kubernetes service. expose_resources = `
pod (po), service (svc), replicationcontroller (rc),
deployment, replicaset (rs)
`
expose_long = `Expose a resource as a new Kubernetes service.
Looks up a deployment, service, replica set, replication controller or pod by name and uses the selector Looks up a deployment, service, replica set, replication controller or pod by name and uses the selector
for that resource as the selector for a new service on the specified port. A deployment or replica set for that resource as the selector for a new service on the specified port. A deployment or replica set
will be exposed as a service only if its selector is convertible to a selector that service supports, will be exposed as a service only if its selector is convertible to a selector that service supports,
i.e. when the selector contains only the matchLabels component. Note that if no port is specified via i.e. when the selector contains only the matchLabels component. Note that if no port is specified via
--port and the exposed resource has multiple ports, all will be re-used by the new service. Also if no --port and the exposed resource has multiple ports, all will be re-used by the new service. Also if no
labels are specified, the new service will re-use the labels from the resource it exposes.` labels are specified, the new service will re-use the labels from the resource it exposes.
Possible resources include (case insensitive):` + expose_resources
expose_example = `# Create a service for a replicated nginx, which serves on port 80 and connects to the containers on port 8000. expose_example = `# Create a service for a replicated nginx, which serves on port 80 and connects to the containers on port 8000.
kubectl expose rc nginx --port=80 --target-port=8000 kubectl expose rc nginx --port=80 --target-port=8000
@ -72,6 +80,13 @@ kubectl expose deployment nginx --port=80 --target-port=8000`
func NewCmdExposeService(f *cmdutil.Factory, out io.Writer) *cobra.Command { func NewCmdExposeService(f *cmdutil.Factory, out io.Writer) *cobra.Command {
options := &ExposeOptions{} options := &ExposeOptions{}
validArgs, argAliases := []string{}, []string{}
resources := regexp.MustCompile(`\s*,`).Split(expose_resources, -1)
for _, r := range resources {
validArgs = append(validArgs, strings.Fields(r)[0])
argAliases = kubectl.ResourceAliases(validArgs)
}
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]", Use: "expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]",
Short: "Take a replication controller, service, deployment or pod and expose it as a new Kubernetes Service", Short: "Take a replication controller, service, deployment or pod and expose it as a new Kubernetes Service",
@ -81,6 +96,8 @@ func NewCmdExposeService(f *cmdutil.Factory, out io.Writer) *cobra.Command {
err := RunExpose(f, out, cmd, args, options) err := RunExpose(f, out, cmd, args, options)
cmdutil.CheckErr(err) cmdutil.CheckErr(err)
}, },
ValidArgs: validArgs,
ArgAliases: argAliases,
} }
cmdutil.AddPrinterFlags(cmd) cmdutil.AddPrinterFlags(cmd)
cmd.Flags().String("generator", "service/v2", "The name of the API generator to use. There are 2 generators: 'service/v1' and 'service/v2'. The only difference between them is that service port in v1 is named 'default', while it is left unnamed in v2. Default is 'service/v2'.") cmd.Flags().String("generator", "service/v2", "The name of the API generator to use. There are 2 generators: 'service/v1' and 'service/v2'. The only difference between them is that service port in v1 is named 'default', while it is left unnamed in v2. Default is 'service/v2'.")

View File

@ -63,6 +63,15 @@ kubectl patch pod valid-pod -type='json' -p='[{"op": "replace", "path": "/spec/c
func NewCmdPatch(f *cmdutil.Factory, out io.Writer) *cobra.Command { func NewCmdPatch(f *cmdutil.Factory, out io.Writer) *cobra.Command {
options := &PatchOptions{} options := &PatchOptions{}
// retrieve a list of handled resources from printer as valid args
validArgs, argAliases := []string{}, []string{}
p, err := f.Printer(nil, false, false, false, false, false, false, []string{})
cmdutil.CheckErr(err)
if p != nil {
validArgs = p.HandledResources()
argAliases = kubectl.ResourceAliases(validArgs)
}
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "patch (-f FILENAME | TYPE NAME) -p PATCH", Use: "patch (-f FILENAME | TYPE NAME) -p PATCH",
Short: "Update field(s) of a resource using strategic merge patch.", Short: "Update field(s) of a resource using strategic merge patch.",
@ -74,6 +83,8 @@ func NewCmdPatch(f *cmdutil.Factory, out io.Writer) *cobra.Command {
err := RunPatch(f, out, cmd, args, shortOutput, options) err := RunPatch(f, out, cmd, args, shortOutput, options)
cmdutil.CheckErr(err) cmdutil.CheckErr(err)
}, },
ValidArgs: validArgs,
ArgAliases: argAliases,
} }
cmd.Flags().StringP("patch", "p", "", "The patch to be applied to the resource JSON file.") cmd.Flags().StringP("patch", "p", "", "The patch to be applied to the resource JSON file.")
cmd.MarkFlagRequired("patch") cmd.MarkFlagRequired("patch")