diff --git a/pkg/kubectl/cmd/annotate.go b/pkg/kubectl/cmd/annotate.go index f014134bbcd..92ec1a12527 100644 --- a/pkg/kubectl/cmd/annotate.go +++ b/pkg/kubectl/cmd/annotate.go @@ -205,7 +205,7 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro return err } - b = b.SelectorParam(o.selector). + b = b.LabelSelectorParam(o.selector). Unstructured(f.UnstructuredClientForMapping, mapper, typer). ResourceTypeOrNameArgs(o.all, o.resources...). Latest() diff --git a/pkg/kubectl/cmd/apply.go b/pkg/kubectl/cmd/apply.go index ec969eab7ee..8f4a0792612 100644 --- a/pkg/kubectl/cmd/apply.go +++ b/pkg/kubectl/cmd/apply.go @@ -219,7 +219,7 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &options.FilenameOptions). - SelectorParam(options.Selector). + LabelSelectorParam(options.Selector). IncludeUninitialized(includeUninitialized). Flatten(). Do() diff --git a/pkg/kubectl/cmd/apply_view_last_applied.go b/pkg/kubectl/cmd/apply_view_last_applied.go index 4c7cec8214d..8692cffde1f 100644 --- a/pkg/kubectl/cmd/apply_view_last_applied.go +++ b/pkg/kubectl/cmd/apply_view_last_applied.go @@ -98,7 +98,7 @@ func (o *ViewLastAppliedOptions) Complete(f cmdutil.Factory, args []string) erro FilenameParam(enforceNamespace, &o.FilenameOptions). ResourceTypeOrNameArgs(enforceNamespace, args...). SelectAllParam(o.All). - SelectorParam(o.Selector). + LabelSelectorParam(o.Selector). Latest(). Flatten(). Do() diff --git a/pkg/kubectl/cmd/clusterinfo.go b/pkg/kubectl/cmd/clusterinfo.go index 142b7bab0ab..2c63d49a82e 100644 --- a/pkg/kubectl/cmd/clusterinfo.go +++ b/pkg/kubectl/cmd/clusterinfo.go @@ -74,7 +74,7 @@ func RunClusterInfo(f cmdutil.Factory, out io.Writer, cmd *cobra.Command) error // TODO use generalized labels once they are implemented (#341) b := f.NewBuilder(). NamespaceParam(cmdNamespace).DefaultNamespace(). - SelectorParam("kubernetes.io/cluster-service=true"). + LabelSelectorParam("kubernetes.io/cluster-service=true"). ResourceTypeOrNameArgs(false, []string{"services"}...). Latest() err = b.Do().Visit(func(r *resource.Info, err error) error { diff --git a/pkg/kubectl/cmd/create.go b/pkg/kubectl/cmd/create.go index 8caa921870d..6ec61c93acd 100644 --- a/pkg/kubectl/cmd/create.go +++ b/pkg/kubectl/cmd/create.go @@ -194,7 +194,7 @@ func RunCreate(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opt ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &options.FilenameOptions). - SelectorParam(options.Selector). + LabelSelectorParam(options.Selector). Flatten(). Do() err = r.Err() diff --git a/pkg/kubectl/cmd/delete.go b/pkg/kubectl/cmd/delete.go index 50f32f4ca0e..bf37e301367 100644 --- a/pkg/kubectl/cmd/delete.go +++ b/pkg/kubectl/cmd/delete.go @@ -182,7 +182,7 @@ func (o *DeleteOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &o.FilenameOptions). - SelectorParam(o.Selector). + LabelSelectorParam(o.Selector). IncludeUninitialized(includeUninitialized). SelectAllParam(o.DeleteAll). ResourceTypeOrNameArgs(false, args...).RequireObject(false). diff --git a/pkg/kubectl/cmd/describe.go b/pkg/kubectl/cmd/describe.go index 91d8306378f..0f69c73164a 100644 --- a/pkg/kubectl/cmd/describe.go +++ b/pkg/kubectl/cmd/describe.go @@ -129,7 +129,7 @@ func RunDescribe(f cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, a ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces). FilenameParam(enforceNamespace, options). - SelectorParam(selector). + LabelSelectorParam(selector). IncludeUninitialized(includeUninitialized). ResourceTypeOrNameArgs(true, args...). Flatten(). diff --git a/pkg/kubectl/cmd/drain.go b/pkg/kubectl/cmd/drain.go index 19d49c3e6e5..396f5e2eac6 100644 --- a/pkg/kubectl/cmd/drain.go +++ b/pkg/kubectl/cmd/drain.go @@ -243,7 +243,7 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error { Flatten() if len(o.Selector) > 0 { - builder = builder.SelectorParam(o.Selector). + builder = builder.LabelSelectorParam(o.Selector). ResourceTypes("nodes") } diff --git a/pkg/kubectl/cmd/label.go b/pkg/kubectl/cmd/label.go index 01166db620d..e53e4b720d2 100644 --- a/pkg/kubectl/cmd/label.go +++ b/pkg/kubectl/cmd/label.go @@ -206,7 +206,7 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error { return err } - b = b.SelectorParam(o.selector). + b = b.LabelSelectorParam(o.selector). Unstructured(f.UnstructuredClientForMapping, mapper, typer). ResourceTypeOrNameArgs(o.all, o.resources...). Latest() diff --git a/pkg/kubectl/cmd/logs.go b/pkg/kubectl/cmd/logs.go index 8392c95babc..7cfc93d3df6 100644 --- a/pkg/kubectl/cmd/logs.go +++ b/pkg/kubectl/cmd/logs.go @@ -199,7 +199,7 @@ func (o *LogsOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Comm builder.ResourceNames("pods", o.ResourceArg) } if selector != "" { - builder.ResourceTypes("pods").SelectorParam(selector) + builder.ResourceTypes("pods").LabelSelectorParam(selector) } infos, err := builder.Do().Infos() if err != nil { diff --git a/pkg/kubectl/cmd/resource/get.go b/pkg/kubectl/cmd/resource/get.go index c632f259dff..91bd346ff50 100644 --- a/pkg/kubectl/cmd/resource/get.go +++ b/pkg/kubectl/cmd/resource/get.go @@ -233,7 +233,7 @@ func (options *GetOptions) Run(f cmdutil.Factory, cmd *cobra.Command, args []str Unstructured(f.UnstructuredClientForMapping, mapper, typer). NamespaceParam(options.Namespace).DefaultNamespace().AllNamespaces(options.AllNamespaces). FilenameParam(options.ExplicitNamespace, &options.FilenameOptions). - SelectorParam(options.LabelSelector). + LabelSelectorParam(options.LabelSelector). ExportParam(options.Export). RequestChunksOf(options.ChunkSize). IncludeUninitialized(cmdutil.ShouldIncludeUninitialized(cmd, false)). // TODO: this needs to be better factored @@ -450,7 +450,7 @@ func (options *GetOptions) watch(f cmdutil.Factory, cmd *cobra.Command, args []s Unstructured(f.UnstructuredClientForMapping, mapper, typer). NamespaceParam(options.Namespace).DefaultNamespace().AllNamespaces(options.AllNamespaces). FilenameParam(options.ExplicitNamespace, &options.FilenameOptions). - SelectorParam(options.LabelSelector). + LabelSelectorParam(options.LabelSelector). ExportParam(options.Export). RequestChunksOf(options.ChunkSize). IncludeUninitialized(includeUninitialized). diff --git a/pkg/kubectl/cmd/scale.go b/pkg/kubectl/cmd/scale.go index de3fef08ffd..f94e445af1f 100644 --- a/pkg/kubectl/cmd/scale.go +++ b/pkg/kubectl/cmd/scale.go @@ -110,7 +110,7 @@ func RunScale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin FilenameParam(enforceNamespace, options). ResourceTypeOrNameArgs(all, args...). Flatten(). - SelectorParam(selector). + LabelSelectorParam(selector). Do() err = r.Err() if resource.IsUsageError(err) { diff --git a/pkg/kubectl/cmd/set/set_env.go b/pkg/kubectl/cmd/set/set_env.go index 5bb1998cde9..e6a2679715f 100644 --- a/pkg/kubectl/cmd/set/set_env.go +++ b/pkg/kubectl/cmd/set/set_env.go @@ -240,7 +240,7 @@ func (o *EnvOptions) RunEnv(f cmdutil.Factory) error { if !o.Local { b = b. - SelectorParam(o.Selector). + LabelSelectorParam(o.Selector). ResourceTypeOrNameArgs(o.All, o.From). Latest() } else { @@ -304,7 +304,7 @@ func (o *EnvOptions) RunEnv(f cmdutil.Factory) error { if !o.Local { b = b. - SelectorParam(o.Selector). + LabelSelectorParam(o.Selector). ResourceTypeOrNameArgs(o.All, o.Resources...). Latest() } else { diff --git a/pkg/kubectl/cmd/set/set_image.go b/pkg/kubectl/cmd/set/set_image.go index f933100df8f..9cac8b68cae 100644 --- a/pkg/kubectl/cmd/set/set_image.go +++ b/pkg/kubectl/cmd/set/set_image.go @@ -149,7 +149,7 @@ func (o *ImageOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []st if !o.Local { builder = builder. - SelectorParam(o.Selector). + LabelSelectorParam(o.Selector). ResourceTypeOrNameArgs(o.All, o.Resources...). Latest() } else { diff --git a/pkg/kubectl/cmd/set/set_resources.go b/pkg/kubectl/cmd/set/set_resources.go index 02c3904f365..3278c6a1733 100644 --- a/pkg/kubectl/cmd/set/set_resources.go +++ b/pkg/kubectl/cmd/set/set_resources.go @@ -153,7 +153,7 @@ func (o *ResourcesOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args if !o.Local { builder = builder. - SelectorParam(o.Selector). + LabelSelectorParam(o.Selector). ResourceTypeOrNameArgs(o.All, args...). Latest() } else { diff --git a/pkg/kubectl/cmd/set/set_subject.go b/pkg/kubectl/cmd/set/set_subject.go index 0e7684b530a..9ab633310b2 100644 --- a/pkg/kubectl/cmd/set/set_subject.go +++ b/pkg/kubectl/cmd/set/set_subject.go @@ -135,7 +135,7 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [] if !o.Local { builder = builder. - SelectorParam(o.Selector). + LabelSelectorParam(o.Selector). ResourceTypeOrNameArgs(o.All, args...). Latest() } else { diff --git a/pkg/kubectl/cmd/taint.go b/pkg/kubectl/cmd/taint.go index 04578bbee95..3aae8aeb11d 100644 --- a/pkg/kubectl/cmd/taint.go +++ b/pkg/kubectl/cmd/taint.go @@ -152,7 +152,7 @@ func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Com ContinueOnError(). NamespaceParam(namespace).DefaultNamespace() if o.selector != "" { - o.builder = o.builder.SelectorParam(o.selector).ResourceTypes("node") + o.builder = o.builder.LabelSelectorParam(o.selector).ResourceTypes("node") } if o.all { o.builder = o.builder.SelectAllParam(o.all).ResourceTypes("node").Flatten().Latest() @@ -160,7 +160,7 @@ func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Com if !o.all && o.selector == "" && len(o.resources) >= 2 { o.builder = o.builder.ResourceNames("node", o.resources[1:]...) } - o.builder = o.builder.SelectorParam(o.selector). + o.builder = o.builder.LabelSelectorParam(o.selector). Flatten(). Latest() o.f = f diff --git a/pkg/kubectl/resource/builder.go b/pkg/kubectl/resource/builder.go index ab1757baab2..6dbcdef187f 100644 --- a/pkg/kubectl/resource/builder.go +++ b/pkg/kubectl/resource/builder.go @@ -53,7 +53,7 @@ type Builder struct { stream bool dir bool - selector *string + labelSelector *string selectAll bool includeUninitialized bool limitChunks int64 @@ -274,24 +274,25 @@ func (b *Builder) ResourceNames(resource string, names ...string) *Builder { return b } -// SelectorParam defines a selector that should be applied to the object types to load. +// LabelSelectorParam defines a selector that should be applied to the object types to load. // This will not affect files loaded from disk or URL. If the parameter is empty it is -// a no-op - to select all resources invoke `b.Selector(labels.Everything.String)`. -func (b *Builder) SelectorParam(s string) *Builder { +// a no-op - to select all resources invoke `b.LabelSelector(labels.Everything.String)`. +func (b *Builder) LabelSelectorParam(s string) *Builder { selector := strings.TrimSpace(s) if len(selector) == 0 { return b } if b.selectAll { - b.errs = append(b.errs, fmt.Errorf("found non empty selector %q with previously set 'all' parameter. ", s)) + b.errs = append(b.errs, fmt.Errorf("found non-empty label selector %q with previously set 'all' parameter. ", s)) return b } - return b.Selector(selector) + return b.LabelSelector(selector) } -// Selector accepts a selector directly, and if non nil will trigger a list action. -func (b *Builder) Selector(selector string) *Builder { - b.selector = &selector +// LabelSelector accepts a selector directly and will filter the resulting list by that object. +// Use LabelSelectorParam instead for user input. +func (b *Builder) LabelSelector(selector string) *Builder { + b.labelSelector = &selector return b } @@ -349,7 +350,7 @@ func (b *Builder) RequestChunksOf(chunkSize int64) *Builder { // SelectEverythingParam func (b *Builder) SelectAllParam(selectAll bool) *Builder { - if selectAll && b.selector != nil { + if selectAll && b.labelSelector != nil { b.errs = append(b.errs, fmt.Errorf("setting 'all' parameter but found a non empty selector. ")) return b } @@ -394,9 +395,9 @@ func (b *Builder) ResourceTypeOrNameArgs(allowEmptySelector bool, args ...string b.ResourceTypes(SplitResourceArgument(args[0])...) case len(args) == 1: b.ResourceTypes(SplitResourceArgument(args[0])...) - if b.selector == nil && allowEmptySelector { + if b.labelSelector == nil && allowEmptySelector { selector := labels.Everything().String() - b.selector = &selector + b.labelSelector = &selector } case len(args) == 0: default: @@ -585,7 +586,7 @@ func (b *Builder) visitorResult() *Result { if b.selectAll { selector := labels.Everything().String() - b.selector = &selector + b.labelSelector = &selector } // visit items specified by paths @@ -594,7 +595,7 @@ func (b *Builder) visitorResult() *Result { } // visit selectors - if b.selector != nil { + if b.labelSelector != nil { return b.visitBySelector() } @@ -645,7 +646,7 @@ func (b *Builder) visitBySelector() *Result { if mapping.Scope.Name() != meta.RESTScopeNameNamespace { selectorNamespace = "" } - visitors = append(visitors, NewSelector(client, mapping, selectorNamespace, *b.selector, b.export, b.includeUninitialized, b.limitChunks)) + visitors = append(visitors, NewSelector(client, mapping, selectorNamespace, *b.labelSelector, b.export, b.includeUninitialized, b.limitChunks)) } if b.continueOnError { result.visitor = EagerVisitorList(visitors) @@ -820,12 +821,12 @@ func (b *Builder) visitByPaths() *Result { } visitors = NewDecoratedVisitor(visitors, RetrieveLatest) } - if b.selector != nil { - selector, err := labels.Parse(*b.selector) + if b.labelSelector != nil { + selector, err := labels.Parse(*b.labelSelector) if err != nil { - return result.withError(fmt.Errorf("the provided selector %q is not valid: %v", b.selector, err)) + return result.withError(fmt.Errorf("the provided selector %q is not valid: %v", b.labelSelector, err)) } - visitors = NewFilteredVisitor(visitors, FilterBySelector(selector)) + visitors = NewFilteredVisitor(visitors, FilterByLabelSelector(selector)) } result.visitor = visitors result.sources = b.paths diff --git a/pkg/kubectl/resource/builder_test.go b/pkg/kubectl/resource/builder_test.go index 31664f29891..83fe86fae2f 100644 --- a/pkg/kubectl/resource/builder_test.go +++ b/pkg/kubectl/resource/builder_test.go @@ -46,6 +46,7 @@ import ( restclientwatch "k8s.io/client-go/rest/watch" utiltesting "k8s.io/client-go/util/testing" "k8s.io/kubernetes/pkg/kubectl/scheme" + "k8s.io/kubernetes/pkg/api/legacyscheme" ) var ( @@ -697,7 +698,7 @@ func TestResourceByNameAndEmptySelector(t *testing.T) { "/namespaces/test/pods/foo": runtime.EncodeOrDie(corev1Codec, &pods.Items[0]), }), corev1Codec). NamespaceParam("test"). - SelectorParam(""). + LabelSelectorParam(""). ResourceTypeOrNameArgs(true, "pods", "foo") singleItemImplied := false @@ -718,14 +719,14 @@ func TestResourceByNameAndEmptySelector(t *testing.T) { } } -func TestSelector(t *testing.T) { +func TestLabelSelector(t *testing.T) { pods, svc := testData() labelKey := metav1.LabelSelectorQueryParam(corev1GV.String()) b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{ "/namespaces/test/pods?" + labelKey + "=a%3Db": runtime.EncodeOrDie(corev1Codec, pods), "/namespaces/test/services?" + labelKey + "=a%3Db": runtime.EncodeOrDie(corev1Codec, svc), }), corev1Codec). - SelectorParam("a=b"). + LabelSelectorParam("a=b"). NamespaceParam("test"). Flatten() @@ -751,9 +752,9 @@ func TestSelector(t *testing.T) { } } -func TestSelectorRequiresKnownTypes(t *testing.T) { +func TestLabelSelectorRequiresKnownTypes(t *testing.T) { b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec). - SelectorParam("a=b"). + LabelSelectorParam("a=b"). NamespaceParam("test"). ResourceTypes("unknown") @@ -764,7 +765,7 @@ func TestSelectorRequiresKnownTypes(t *testing.T) { func TestSingleResourceType(t *testing.T) { b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec). - SelectorParam("a=b"). + LabelSelectorParam("a=b"). SingleResourceType(). ResourceTypeOrNameArgs(true, "pods,services") @@ -1019,7 +1020,7 @@ func TestListObject(t *testing.T) { b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{ "/namespaces/test/pods?" + labelKey + "=a%3Db": runtime.EncodeOrDie(corev1Codec, pods), }), corev1Codec). - SelectorParam("a=b"). + LabelSelectorParam("a=b"). NamespaceParam("test"). ResourceTypeOrNameArgs(true, "pods"). Flatten() @@ -1053,7 +1054,7 @@ func TestListObjectWithDifferentVersions(t *testing.T) { "/namespaces/test/pods?" + labelKey + "=a%3Db": runtime.EncodeOrDie(corev1Codec, pods), "/namespaces/test/services?" + labelKey + "=a%3Db": runtime.EncodeOrDie(corev1Codec, svc), }), corev1Codec). - SelectorParam("a=b"). + LabelSelectorParam("a=b"). NamespaceParam("test"). ResourceTypeOrNameArgs(true, "pods,services"). Flatten(). diff --git a/pkg/kubectl/resource/selector.go b/pkg/kubectl/resource/selector.go index 71a9d5886a1..2ae4791bd38 100644 --- a/pkg/kubectl/resource/selector.go +++ b/pkg/kubectl/resource/selector.go @@ -30,7 +30,7 @@ type Selector struct { Client RESTClient Mapping *meta.RESTMapping Namespace string - Selector string + LabelSelector string Export bool IncludeUninitialized bool LimitChunks int64 @@ -42,7 +42,7 @@ func NewSelector(client RESTClient, mapping *meta.RESTMapping, namespace string, Client: client, Mapping: mapping, Namespace: namespace, - Selector: selector, + LabelSelector: selector, Export: export, IncludeUninitialized: includeUninitialized, LimitChunks: limitChunks, @@ -58,7 +58,7 @@ func (r *Selector) Visit(fn VisitorFunc) error { r.ResourceMapping().GroupVersionKind.GroupVersion().String(), r.Export, &metav1.ListOptions{ - LabelSelector: r.Selector, + LabelSelector: r.LabelSelector, IncludeUninitialized: r.IncludeUninitialized, Limit: r.LimitChunks, Continue: continueToken, @@ -71,17 +71,17 @@ func (r *Selector) Visit(fn VisitorFunc) error { if errors.IsBadRequest(err) || errors.IsNotFound(err) { if se, ok := err.(*errors.StatusError); ok { // modify the message without hiding this is an API error - if len(r.Selector) == 0 { + if len(r.LabelSelector) == 0 { se.ErrStatus.Message = fmt.Sprintf("Unable to list %q: %v", r.Mapping.Resource, se.ErrStatus.Message) } else { - se.ErrStatus.Message = fmt.Sprintf("Unable to find %q that match the selector %q: %v", r.Mapping.Resource, r.Selector, se.ErrStatus.Message) + se.ErrStatus.Message = fmt.Sprintf("Unable to find %q that match the selector %q: %v", r.Mapping.Resource, r.LabelSelector, se.ErrStatus.Message) } return se } - if len(r.Selector) == 0 { + if len(r.LabelSelector) == 0 { return fmt.Errorf("Unable to list %q: %v", r.Mapping.Resource, err) } - return fmt.Errorf("Unable to find %q that match the selector %q: %v", r.Mapping.Resource, r.Selector, err) + return fmt.Errorf("Unable to find %q that match the selector %q: %v", r.Mapping.Resource, r.LabelSelector, err) } return err } @@ -107,7 +107,7 @@ func (r *Selector) Visit(fn VisitorFunc) error { } func (r *Selector) Watch(resourceVersion string) (watch.Interface, error) { - return NewHelper(r.Client, r.Mapping).Watch(r.Namespace, resourceVersion, r.ResourceMapping().GroupVersionKind.GroupVersion().String(), r.Selector) + return NewHelper(r.Client, r.Mapping).Watch(r.Namespace, resourceVersion, r.ResourceMapping().GroupVersionKind.GroupVersion().String(), r.LabelSelector) } // ResourceMapping returns the mapping for this resource and implements ResourceMapping diff --git a/pkg/kubectl/resource/visitor.go b/pkg/kubectl/resource/visitor.go index 5e5a73a3160..824f0132b2a 100644 --- a/pkg/kubectl/resource/visitor.go +++ b/pkg/kubectl/resource/visitor.go @@ -691,7 +691,7 @@ func (v FilteredVisitor) Visit(fn VisitorFunc) error { }) } -func FilterBySelector(s labels.Selector) FilterFunc { +func FilterByLabelSelector(s labels.Selector) FilterFunc { return func(info *Info, err error) (bool, error) { if err != nil { return false, err