From 82896feebbdf1c0809c0fec29988eff15cb02837 Mon Sep 17 00:00:00 2001 From: Ondra Kupka Date: Mon, 4 Aug 2025 22:48:57 +0200 Subject: [PATCH] cli-runtime: Return defined error from Builder There is a custom error message returned from resource.Builder when SingleResourceType is set and multiple resources types are specified, which makes it impossible to check for the condition in code easily. This patch adds resource.ErrMultipleResourceTypes that is returned precisely in this case so that it can be checked. This patch also removes an extra custom error message in kubectl get, which is actually never reached, because the builder fails before. --- staging/src/k8s.io/cli-runtime/pkg/resource/builder.go | 8 ++++++-- .../src/k8s.io/cli-runtime/pkg/resource/builder_test.go | 4 ++-- staging/src/k8s.io/kubectl/pkg/cmd/get/get.go | 3 --- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/staging/src/k8s.io/cli-runtime/pkg/resource/builder.go b/staging/src/k8s.io/cli-runtime/pkg/resource/builder.go index 00bd3701a0e..37e830852c9 100644 --- a/staging/src/k8s.io/cli-runtime/pkg/resource/builder.go +++ b/staging/src/k8s.io/cli-runtime/pkg/resource/builder.go @@ -129,6 +129,10 @@ Example resource specifications include: var StdinMultiUseError = errors.New("standard input cannot be used for multiple arguments") +// ErrMultipleResourceTypes is returned when Builder.SingleResourceType() was called, +// but multiple resource types were specified. +var ErrMultipleResourceTypes = errors.New("you may only specify a single resource type") + // TODO: expand this to include other errors. func IsUsageError(err error) bool { if err == nil { @@ -813,7 +817,7 @@ func (b *Builder) mappingFor(resourceOrKindArg string) (*meta.RESTMapping, error func (b *Builder) resourceMappings() ([]*meta.RESTMapping, error) { if len(b.resources) > 1 && b.singleResourceType { - return nil, fmt.Errorf("you may only specify a single resource type") + return nil, ErrMultipleResourceTypes } mappings := []*meta.RESTMapping{} seen := map[schema.GroupVersionKind]bool{} @@ -849,7 +853,7 @@ func (b *Builder) resourceTupleMappings() (map[string]*meta.RESTMapping, error) canonical[mapping.Resource] = struct{}{} } if len(canonical) > 1 && b.singleResourceType { - return nil, fmt.Errorf("you may only specify a single resource type") + return nil, ErrMultipleResourceTypes } return mappings, nil } diff --git a/staging/src/k8s.io/cli-runtime/pkg/resource/builder_test.go b/staging/src/k8s.io/cli-runtime/pkg/resource/builder_test.go index 41149b43feb..e556e462da5 100644 --- a/staging/src/k8s.io/cli-runtime/pkg/resource/builder_test.go +++ b/staging/src/k8s.io/cli-runtime/pkg/resource/builder_test.go @@ -1367,8 +1367,8 @@ func TestSingleResourceType(t *testing.T) { SingleResourceType(). ResourceTypeOrNameArgs(true, "pods,services") - if b.Do().Err() == nil { - t.Errorf("unexpected non-error") + if err := b.Do().Err(); !errors.Is(err, ErrMultipleResourceTypes) { + t.Errorf("unexpected error: %s", err) } } diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/get/get.go b/staging/src/k8s.io/kubectl/pkg/cmd/get/get.go index 5509158a774..00b991e6edf 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/get/get.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/get/get.go @@ -629,9 +629,6 @@ func (o *GetOptions) watch(f cmdutil.Factory, args []string) error { } return err } - if multipleGVKsRequested(infos) { - return i18n.Errorf("watch is only supported on individual resources and resource collections - more than 1 resource was found") - } info := infos[0] mapping := info.ResourceMapping()