diff --git a/contrib/completions/bash/kubectl b/contrib/completions/bash/kubectl index c096937e22..d9caa16b81 100644 --- a/contrib/completions/bash/kubectl +++ b/contrib/completions/bash/kubectl @@ -256,10 +256,10 @@ _kubectl_get() flags+=("--all-namespaces") flags+=("--filename=") flags_with_completion+=("--filename") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") two_word_flags+=("-f") flags_with_completion+=("-f") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") flags+=("--help") flags+=("-h") flags+=("--label-columns=") @@ -312,10 +312,10 @@ _kubectl_describe() flags+=("--filename=") flags_with_completion+=("--filename") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") two_word_flags+=("-f") flags_with_completion+=("-f") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") flags+=("--help") flags+=("-h") flags+=("--selector=") @@ -349,10 +349,10 @@ _kubectl_create() flags+=("--filename=") flags_with_completion+=("--filename") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") two_word_flags+=("-f") flags_with_completion+=("-f") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") flags+=("--help") flags+=("-h") flags+=("--output=") @@ -378,10 +378,10 @@ _kubectl_replace() flags+=("--cascade") flags+=("--filename=") flags_with_completion+=("--filename") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") two_word_flags+=("-f") flags_with_completion+=("-f") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") flags+=("--force") flags+=("--grace-period=") flags+=("--help") @@ -409,10 +409,10 @@ _kubectl_patch() flags+=("--filename=") flags_with_completion+=("--filename") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") two_word_flags+=("-f") flags_with_completion+=("-f") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") flags+=("--help") flags+=("-h") flags+=("--output=") @@ -440,10 +440,10 @@ _kubectl_delete() flags+=("--cascade") flags+=("--filename=") flags_with_completion+=("--filename") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") two_word_flags+=("-f") flags_with_completion+=("-f") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") flags+=("--grace-period=") flags+=("--help") flags+=("-h") @@ -530,10 +530,10 @@ _kubectl_rolling-update() flags+=("--dry-run") flags+=("--filename=") flags_with_completion+=("--filename") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") two_word_flags+=("-f") flags_with_completion+=("-f") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") flags+=("--help") flags+=("-h") flags+=("--image=") @@ -572,10 +572,10 @@ _kubectl_scale() flags+=("--current-replicas=") flags+=("--filename=") flags_with_completion+=("--filename") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") two_word_flags+=("-f") flags_with_completion+=("-f") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") flags+=("--help") flags+=("-h") flags+=("--output=") @@ -743,10 +743,10 @@ _kubectl_stop() flags+=("--all") flags+=("--filename=") flags_with_completion+=("--filename") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") two_word_flags+=("-f") flags_with_completion+=("-f") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") flags+=("--grace-period=") flags+=("--help") flags+=("-h") @@ -777,10 +777,10 @@ _kubectl_expose() flags+=("--external-ip=") flags+=("--filename=") flags_with_completion+=("--filename") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") two_word_flags+=("-f") flags_with_completion+=("-f") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") flags+=("--generator=") flags+=("--help") flags+=("-h") @@ -822,10 +822,10 @@ _kubectl_label() flags+=("--all") flags+=("--filename=") flags_with_completion+=("--filename") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") two_word_flags+=("-f") flags_with_completion+=("-f") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") flags+=("--help") flags+=("-h") flags+=("--no-headers") @@ -876,10 +876,10 @@ _kubectl_annotate() flags+=("--all") flags+=("--filename=") flags_with_completion+=("--filename") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") two_word_flags+=("-f") flags_with_completion+=("-f") - flags_completion+=("__handle_filename_extension_flag json|yaml|yml") + flags_completion+=("__handle_filename_extension_flag json|stdin|yaml|yml") flags+=("--help") flags+=("-h") flags+=("--overwrite") diff --git a/pkg/kubectl/bash_comp_utils.go b/pkg/kubectl/bash_comp_utils.go index bf480bd05d..a89fef07a0 100644 --- a/pkg/kubectl/bash_comp_utils.go +++ b/pkg/kubectl/bash_comp_utils.go @@ -19,12 +19,18 @@ limitations under the License. package kubectl import ( + "strings" + "github.com/spf13/cobra" + + "k8s.io/kubernetes/pkg/kubectl/resource" ) func AddJsonFilenameFlag(cmd *cobra.Command, value *[]string, usage string) { cmd.Flags().StringSliceVarP(value, "filename", "f", *value, usage) - - annotations := []string{"json", "yaml", "yml"} + annotations := []string{} + for _, ext := range resource.FileExtensions { + annotations = append(annotations, strings.TrimLeft(ext, ".")) + } cmd.Flags().SetAnnotation("filename", cobra.BashCompFilenameExt, annotations) } diff --git a/pkg/kubectl/resource/builder.go b/pkg/kubectl/resource/builder.go index 835fd2225a..4386ed8d72 100644 --- a/pkg/kubectl/resource/builder.go +++ b/pkg/kubectl/resource/builder.go @@ -32,6 +32,8 @@ import ( "k8s.io/kubernetes/pkg/util/errors" ) +var FileExtensions = []string{".json", ".stdin", ".yaml", ".yml"} + // Builder provides convenience functions for taking arguments and parameters // from the command line and converting them to a list of resources to iterate // over using the Visitor interface. @@ -164,7 +166,7 @@ func (b *Builder) Path(paths ...string) *Builder { continue } - visitors, err := ExpandPathsToFileVisitors(b.mapper, p, false, []string{".json", ".stdin", ".yaml", ".yml"}, b.schema) + visitors, err := ExpandPathsToFileVisitors(b.mapper, p, false, FileExtensions, b.schema) if err != nil { b.errs = append(b.errs, fmt.Errorf("error reading %q: %v", p, err)) } @@ -646,7 +648,7 @@ func (b *Builder) visitorResult() *Result { return &Result{singular: singular, visitor: visitors, sources: b.paths} } - return &Result{err: fmt.Errorf("you must provide one or more resources by argument or filename")} + return &Result{err: fmt.Errorf("you must provide one or more resources by argument or filename (%s)", strings.Join(FileExtensions, "|"))} } // Do returns a Result object with a Visitor for the resources identified by the Builder.