From 72d672c3d52cbff6db9737ad42fde4982638b667 Mon Sep 17 00:00:00 2001 From: Phillip Wittrock Date: Tue, 17 Oct 2017 18:46:38 -0700 Subject: [PATCH 1/2] Remove dependency on internal types from pkg/kubectl/resource. Updates the Result.Object function to take an argument. --- pkg/kubectl/BUILD | 1 + pkg/kubectl/cmd/BUILD | 1 + pkg/kubectl/cmd/attach.go | 3 +- pkg/kubectl/cmd/get.go | 3 +- pkg/kubectl/cmd/rollingupdate.go | 3 +- pkg/kubectl/cmd/rollout/BUILD | 1 + pkg/kubectl/cmd/rollout/rollout_status.go | 3 +- pkg/kubectl/internaldeps/BUILD | 27 +++++++++++++++ pkg/kubectl/internaldeps/result.go | 35 +++++++++++++++++++ pkg/kubectl/resource/BUILD | 3 +- pkg/kubectl/resource/builder_test.go | 11 +++--- pkg/kubectl/resource/result.go | 41 ++++++++++++++++++----- 12 files changed, 113 insertions(+), 19 deletions(-) create mode 100644 pkg/kubectl/internaldeps/BUILD create mode 100644 pkg/kubectl/internaldeps/result.go diff --git a/pkg/kubectl/BUILD b/pkg/kubectl/BUILD index 775701b946a..6a85459156c 100644 --- a/pkg/kubectl/BUILD +++ b/pkg/kubectl/BUILD @@ -196,6 +196,7 @@ filegroup( "//pkg/kubectl/apps:all-srcs", "//pkg/kubectl/cmd:all-srcs", "//pkg/kubectl/explain:all-srcs", + "//pkg/kubectl/internaldeps:all-srcs", "//pkg/kubectl/metricsutil:all-srcs", "//pkg/kubectl/plugins:all-srcs", "//pkg/kubectl/proxy:all-srcs", diff --git a/pkg/kubectl/cmd/BUILD b/pkg/kubectl/cmd/BUILD index 07324d2934d..c3d9fe16d84 100644 --- a/pkg/kubectl/cmd/BUILD +++ b/pkg/kubectl/cmd/BUILD @@ -86,6 +86,7 @@ go_library( "//pkg/kubectl/cmd/util/editor:go_default_library", "//pkg/kubectl/cmd/util/openapi:go_default_library", "//pkg/kubectl/explain:go_default_library", + "//pkg/kubectl/internaldeps:go_default_library", "//pkg/kubectl/metricsutil:go_default_library", "//pkg/kubectl/plugins:go_default_library", "//pkg/kubectl/proxy:go_default_library", diff --git a/pkg/kubectl/cmd/attach.go b/pkg/kubectl/cmd/attach.go index 00861784910..ee82ea52b6b 100644 --- a/pkg/kubectl/cmd/attach.go +++ b/pkg/kubectl/cmd/attach.go @@ -34,6 +34,7 @@ import ( coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/internaldeps" "k8s.io/kubernetes/pkg/kubectl/util/i18n" ) @@ -152,7 +153,7 @@ func (p *AttachOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, argsIn [ builder.ResourceNames(argsIn[0], argsIn[1]) } - obj, err := builder.Do().Object() + obj, err := builder.Do().Object(internaldeps.ToInternalList) if err != nil { return err } diff --git a/pkg/kubectl/cmd/get.go b/pkg/kubectl/cmd/get.go index 79f03b6a231..5675bbd793d 100644 --- a/pkg/kubectl/cmd/get.go +++ b/pkg/kubectl/cmd/get.go @@ -38,6 +38,7 @@ import ( "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" + "k8s.io/kubernetes/pkg/kubectl/internaldeps" "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" @@ -248,7 +249,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ if err != nil { return err } - obj, err := r.Object() + obj, err := r.Object(internaldeps.ToInternalList) if err != nil { return err } diff --git a/pkg/kubectl/cmd/rollingupdate.go b/pkg/kubectl/cmd/rollingupdate.go index 3f6ac6d046b..25d3309cbe2 100644 --- a/pkg/kubectl/cmd/rollingupdate.go +++ b/pkg/kubectl/cmd/rollingupdate.go @@ -35,6 +35,7 @@ import ( "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/internaldeps" "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/util" "k8s.io/kubernetes/pkg/kubectl/util/i18n" @@ -204,7 +205,7 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &resource.FilenameOptions{Recursive: false, Filenames: []string{filename}}). Do() - obj, err := request.Object() + obj, err := request.Object(internaldeps.ToInternalList) if err != nil { return err } diff --git a/pkg/kubectl/cmd/rollout/BUILD b/pkg/kubectl/cmd/rollout/BUILD index dbcdca0146a..6c1cfa59dbb 100644 --- a/pkg/kubectl/cmd/rollout/BUILD +++ b/pkg/kubectl/cmd/rollout/BUILD @@ -22,6 +22,7 @@ go_library( "//pkg/kubectl/cmd/set:go_default_library", "//pkg/kubectl/cmd/templates:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", + "//pkg/kubectl/internaldeps:go_default_library", "//pkg/kubectl/resource:go_default_library", "//pkg/kubectl/util/i18n:go_default_library", "//pkg/util/interrupt:go_default_library", diff --git a/pkg/kubectl/cmd/rollout/rollout_status.go b/pkg/kubectl/cmd/rollout/rollout_status.go index d817a81a6d1..5e2d02dc056 100644 --- a/pkg/kubectl/cmd/rollout/rollout_status.go +++ b/pkg/kubectl/cmd/rollout/rollout_status.go @@ -24,6 +24,7 @@ import ( "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" + "k8s.io/kubernetes/pkg/kubectl/internaldeps" "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/util/interrupt" @@ -104,7 +105,7 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri info := infos[0] mapping := info.ResourceMapping() - obj, err := r.Object() + obj, err := r.Object(internaldeps.ToInternalList) if err != nil { return err } diff --git a/pkg/kubectl/internaldeps/BUILD b/pkg/kubectl/internaldeps/BUILD new file mode 100644 index 00000000000..8b604c03347 --- /dev/null +++ b/pkg/kubectl/internaldeps/BUILD @@ -0,0 +1,27 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["result.go"], + importpath = "k8s.io/kubernetes/pkg/kubectl/internaldeps", + visibility = ["//visibility:public"], + deps = [ + "//pkg/api:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/pkg/kubectl/internaldeps/result.go b/pkg/kubectl/internaldeps/result.go new file mode 100644 index 00000000000..1ea3ed3bddf --- /dev/null +++ b/pkg/kubectl/internaldeps/result.go @@ -0,0 +1,35 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package internaldeps + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" +) + +// ToInternalList implements resource.ToList and is used by callers of +// Result.Object to convert multiple returned Objects into an internal +// List containing the objects. +func ToInternalList(objects []runtime.Object, version string) runtime.Object { + return &api.List{ + ListMeta: metav1.ListMeta{ + ResourceVersion: version, + }, + Items: objects, + } +} diff --git a/pkg/kubectl/resource/BUILD b/pkg/kubectl/resource/BUILD index cfacc3dacfb..4afbdd24db0 100644 --- a/pkg/kubectl/resource/BUILD +++ b/pkg/kubectl/resource/BUILD @@ -22,10 +22,10 @@ go_library( "//build/visible_to:pkg_kubectl_resource_CONSUMERS", ], deps = [ - "//pkg/api:go_default_library", "//pkg/kubectl/validation:go_default_library", "//vendor/golang.org/x/text/encoding/unicode:go_default_library", "//vendor/golang.org/x/text/transform:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -62,6 +62,7 @@ go_test( "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", + "//pkg/kubectl/internaldeps:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", diff --git a/pkg/kubectl/resource/builder_test.go b/pkg/kubectl/resource/builder_test.go index d2614c3a485..d1a306c43d5 100644 --- a/pkg/kubectl/resource/builder_test.go +++ b/pkg/kubectl/resource/builder_test.go @@ -46,6 +46,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/testapi" apitesting "k8s.io/kubernetes/pkg/api/testing" + "k8s.io/kubernetes/pkg/kubectl/internaldeps" ) func stringBody(body string) io.ReadCloser { @@ -893,7 +894,7 @@ func TestMultipleObject(t *testing.T) { r, pods, svc := streamTestData() obj, err := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, api.Scheme, fakeClient(), testapi.Default.Codec()). NamespaceParam("test").Stream(r, "STDIN").Flatten(). - Do().Object() + Do().Object(internaldeps.ToInternalList) if err != nil { t.Fatalf("unexpected error: %v", err) @@ -946,7 +947,7 @@ func TestSingleItemImpliedObject(t *testing.T) { NamespaceParam("test").DefaultNamespace(). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/legacy/redis-master-controller.yaml"}}). Flatten(). - Do().Object() + Do().Object(internaldeps.ToInternalList) if err != nil { t.Fatalf("unexpected error: %v", err) @@ -966,7 +967,7 @@ func TestSingleItemImpliedObjectNoExtension(t *testing.T) { NamespaceParam("test").DefaultNamespace(). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/pod"}}). Flatten(). - Do().Object() + Do().Object(internaldeps.ToInternalList) if err != nil { t.Fatalf("unexpected error: %v", err) @@ -1017,7 +1018,7 @@ func TestListObject(t *testing.T) { ResourceTypeOrNameArgs(true, "pods"). Flatten() - obj, err := b.Do().Object() + obj, err := b.Do().Object(internaldeps.ToInternalList) if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -1050,7 +1051,7 @@ func TestListObjectWithDifferentVersions(t *testing.T) { NamespaceParam("test"). ResourceTypeOrNameArgs(true, "pods,services"). Flatten(). - Do().Object() + Do().Object(internaldeps.ToInternalList) if err != nil { t.Fatalf("unexpected error: %v", err) diff --git a/pkg/kubectl/resource/result.go b/pkg/kubectl/resource/result.go index 46578a5730b..5463dab4e85 100644 --- a/pkg/kubectl/resource/result.go +++ b/pkg/kubectl/resource/result.go @@ -20,13 +20,13 @@ import ( "fmt" "reflect" + "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/watch" - "k8s.io/kubernetes/pkg/api" ) // ErrMatchFunc can be used to filter errors that may not be true failures. @@ -125,13 +125,37 @@ func (r *Result) Infos() ([]*Info, error) { return infos, err } +// ToList is a function that converts a slice of Objects into a single +// List Object. It allows callers to control whether an internal +// or external List is returned. +type ToList func([]runtime.Object, string) runtime.Object + +// Compile time check to enforce that list implements the necessary interface +var _ metav1.ListInterface = &v1.List{} +var _ metav1.ListMetaAccessor = &v1.List{} + +// ToV1List takes a slice of Objects + their version, and returns +// a v1.List Object containing the objects as Items +func ToV1List(objects []runtime.Object, version string) runtime.Object { + raw := []runtime.RawExtension{} + for _, o := range objects { + raw = append(raw, runtime.RawExtension{Object: o}) + } + return &v1.List{ + ListMeta: metav1.ListMeta{ + ResourceVersion: version, + }, + Items: raw, + } +} + // Object returns a single object representing the output of a single visit to all // found resources. If the Builder was a singular context (expected to return a // single resource by user input) and only a single resource was found, the resource // will be returned as is. Otherwise, the returned resources will be part of an -// api.List. The ResourceVersion of the api.List will be set only if it is identical +// v1.List. The ResourceVersion of the v1.List will be set only if it is identical // across all infos returned. -func (r *Result) Object() (runtime.Object, error) { +func (r *Result) Object(toList ToList) (runtime.Object, error) { infos, err := r.Infos() if err != nil { return nil, err @@ -160,12 +184,11 @@ func (r *Result) Object() (runtime.Object, error) { if len(versions) == 1 { version = versions.List()[0] } - return &api.List{ - ListMeta: metav1.ListMeta{ - ResourceVersion: version, - }, - Items: objects, - }, err + if toList == nil { + toList = ToV1List + } + + return toList(objects, version), err } // ResourceMapping returns a single meta.RESTMapping representing the From fd169a621870551d3e14f357de83a7d0f1edd3a5 Mon Sep 17 00:00:00 2001 From: Phillip Wittrock Date: Wed, 18 Oct 2017 09:27:52 -0700 Subject: [PATCH 2/2] Switch to v1.List instead of allowing the conversion fn to be provided. --- pkg/kubectl/BUILD | 1 - pkg/kubectl/cmd/BUILD | 1 - pkg/kubectl/cmd/attach.go | 3 +- pkg/kubectl/cmd/get.go | 3 +- pkg/kubectl/cmd/rollingupdate.go | 7 ++-- pkg/kubectl/cmd/rollout/BUILD | 1 - pkg/kubectl/cmd/rollout/rollout_status.go | 3 +- pkg/kubectl/internaldeps/BUILD | 27 ------------ pkg/kubectl/internaldeps/result.go | 35 ---------------- pkg/kubectl/resource/BUILD | 1 - pkg/kubectl/resource/builder_test.go | 25 ++++++------ pkg/kubectl/resource/result.go | 50 ++++++++++------------- 12 files changed, 39 insertions(+), 118 deletions(-) delete mode 100644 pkg/kubectl/internaldeps/BUILD delete mode 100644 pkg/kubectl/internaldeps/result.go diff --git a/pkg/kubectl/BUILD b/pkg/kubectl/BUILD index 6a85459156c..775701b946a 100644 --- a/pkg/kubectl/BUILD +++ b/pkg/kubectl/BUILD @@ -196,7 +196,6 @@ filegroup( "//pkg/kubectl/apps:all-srcs", "//pkg/kubectl/cmd:all-srcs", "//pkg/kubectl/explain:all-srcs", - "//pkg/kubectl/internaldeps:all-srcs", "//pkg/kubectl/metricsutil:all-srcs", "//pkg/kubectl/plugins:all-srcs", "//pkg/kubectl/proxy:all-srcs", diff --git a/pkg/kubectl/cmd/BUILD b/pkg/kubectl/cmd/BUILD index c3d9fe16d84..07324d2934d 100644 --- a/pkg/kubectl/cmd/BUILD +++ b/pkg/kubectl/cmd/BUILD @@ -86,7 +86,6 @@ go_library( "//pkg/kubectl/cmd/util/editor:go_default_library", "//pkg/kubectl/cmd/util/openapi:go_default_library", "//pkg/kubectl/explain:go_default_library", - "//pkg/kubectl/internaldeps:go_default_library", "//pkg/kubectl/metricsutil:go_default_library", "//pkg/kubectl/plugins:go_default_library", "//pkg/kubectl/proxy:go_default_library", diff --git a/pkg/kubectl/cmd/attach.go b/pkg/kubectl/cmd/attach.go index ee82ea52b6b..00861784910 100644 --- a/pkg/kubectl/cmd/attach.go +++ b/pkg/kubectl/cmd/attach.go @@ -34,7 +34,6 @@ import ( coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/internaldeps" "k8s.io/kubernetes/pkg/kubectl/util/i18n" ) @@ -153,7 +152,7 @@ func (p *AttachOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, argsIn [ builder.ResourceNames(argsIn[0], argsIn[1]) } - obj, err := builder.Do().Object(internaldeps.ToInternalList) + obj, err := builder.Do().Object() if err != nil { return err } diff --git a/pkg/kubectl/cmd/get.go b/pkg/kubectl/cmd/get.go index 5675bbd793d..79f03b6a231 100644 --- a/pkg/kubectl/cmd/get.go +++ b/pkg/kubectl/cmd/get.go @@ -38,7 +38,6 @@ import ( "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" - "k8s.io/kubernetes/pkg/kubectl/internaldeps" "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/printers" @@ -249,7 +248,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ if err != nil { return err } - obj, err := r.Object(internaldeps.ToInternalList) + obj, err := r.Object() if err != nil { return err } diff --git a/pkg/kubectl/cmd/rollingupdate.go b/pkg/kubectl/cmd/rollingupdate.go index 25d3309cbe2..e190e5f5fff 100644 --- a/pkg/kubectl/cmd/rollingupdate.go +++ b/pkg/kubectl/cmd/rollingupdate.go @@ -35,7 +35,6 @@ import ( "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/internaldeps" "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/util" "k8s.io/kubernetes/pkg/kubectl/util/i18n" @@ -205,21 +204,21 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args NamespaceParam(cmdNamespace).DefaultNamespace(). FilenameParam(enforceNamespace, &resource.FilenameOptions{Recursive: false, Filenames: []string{filename}}). Do() - obj, err := request.Object(internaldeps.ToInternalList) + obj, err := request.Object() if err != nil { return err } var ok bool // Handle filename input from stdin. The resource builder always returns an api.List // when creating resource(s) from a stream. - if list, ok := obj.(*api.List); ok { + if list, ok := obj.(*v1.List); ok { if len(list.Items) > 1 { return cmdutil.UsageErrorf(cmd, "%s specifies multiple items", filename) } if len(list.Items) == 0 { return cmdutil.UsageErrorf(cmd, "please make sure %s exists and is not empty", filename) } - obj = list.Items[0] + obj = list.Items[0].Object } newRc, ok = obj.(*api.ReplicationController) if !ok { diff --git a/pkg/kubectl/cmd/rollout/BUILD b/pkg/kubectl/cmd/rollout/BUILD index 6c1cfa59dbb..dbcdca0146a 100644 --- a/pkg/kubectl/cmd/rollout/BUILD +++ b/pkg/kubectl/cmd/rollout/BUILD @@ -22,7 +22,6 @@ go_library( "//pkg/kubectl/cmd/set:go_default_library", "//pkg/kubectl/cmd/templates:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", - "//pkg/kubectl/internaldeps:go_default_library", "//pkg/kubectl/resource:go_default_library", "//pkg/kubectl/util/i18n:go_default_library", "//pkg/util/interrupt:go_default_library", diff --git a/pkg/kubectl/cmd/rollout/rollout_status.go b/pkg/kubectl/cmd/rollout/rollout_status.go index 5e2d02dc056..d817a81a6d1 100644 --- a/pkg/kubectl/cmd/rollout/rollout_status.go +++ b/pkg/kubectl/cmd/rollout/rollout_status.go @@ -24,7 +24,6 @@ import ( "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - "k8s.io/kubernetes/pkg/kubectl/internaldeps" "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/util/i18n" "k8s.io/kubernetes/pkg/util/interrupt" @@ -105,7 +104,7 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri info := infos[0] mapping := info.ResourceMapping() - obj, err := r.Object(internaldeps.ToInternalList) + obj, err := r.Object() if err != nil { return err } diff --git a/pkg/kubectl/internaldeps/BUILD b/pkg/kubectl/internaldeps/BUILD deleted file mode 100644 index 8b604c03347..00000000000 --- a/pkg/kubectl/internaldeps/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["result.go"], - importpath = "k8s.io/kubernetes/pkg/kubectl/internaldeps", - visibility = ["//visibility:public"], - deps = [ - "//pkg/api:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/pkg/kubectl/internaldeps/result.go b/pkg/kubectl/internaldeps/result.go deleted file mode 100644 index 1ea3ed3bddf..00000000000 --- a/pkg/kubectl/internaldeps/result.go +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package internaldeps - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/kubernetes/pkg/api" -) - -// ToInternalList implements resource.ToList and is used by callers of -// Result.Object to convert multiple returned Objects into an internal -// List containing the objects. -func ToInternalList(objects []runtime.Object, version string) runtime.Object { - return &api.List{ - ListMeta: metav1.ListMeta{ - ResourceVersion: version, - }, - Items: objects, - } -} diff --git a/pkg/kubectl/resource/BUILD b/pkg/kubectl/resource/BUILD index 4afbdd24db0..f49af7d829a 100644 --- a/pkg/kubectl/resource/BUILD +++ b/pkg/kubectl/resource/BUILD @@ -62,7 +62,6 @@ go_test( "//pkg/api:go_default_library", "//pkg/api/testapi:go_default_library", "//pkg/api/testing:go_default_library", - "//pkg/kubectl/internaldeps:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", diff --git a/pkg/kubectl/resource/builder_test.go b/pkg/kubectl/resource/builder_test.go index d1a306c43d5..e4356e8bc2e 100644 --- a/pkg/kubectl/resource/builder_test.go +++ b/pkg/kubectl/resource/builder_test.go @@ -46,7 +46,6 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/testapi" apitesting "k8s.io/kubernetes/pkg/api/testing" - "k8s.io/kubernetes/pkg/kubectl/internaldeps" ) func stringBody(body string) io.ReadCloser { @@ -894,17 +893,17 @@ func TestMultipleObject(t *testing.T) { r, pods, svc := streamTestData() obj, err := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, api.Scheme, fakeClient(), testapi.Default.Codec()). NamespaceParam("test").Stream(r, "STDIN").Flatten(). - Do().Object(internaldeps.ToInternalList) + Do().Object() if err != nil { t.Fatalf("unexpected error: %v", err) } - expected := &api.List{ - Items: []runtime.Object{ - &pods.Items[0], - &pods.Items[1], - &svc.Items[0], + expected := &v1.List{ + Items: []runtime.RawExtension{ + {Object: &pods.Items[0]}, + {Object: &pods.Items[1]}, + {Object: &svc.Items[0]}, }, } if !apiequality.Semantic.DeepDerivative(expected, obj) { @@ -947,7 +946,7 @@ func TestSingleItemImpliedObject(t *testing.T) { NamespaceParam("test").DefaultNamespace(). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/legacy/redis-master-controller.yaml"}}). Flatten(). - Do().Object(internaldeps.ToInternalList) + Do().Object() if err != nil { t.Fatalf("unexpected error: %v", err) @@ -967,7 +966,7 @@ func TestSingleItemImpliedObjectNoExtension(t *testing.T) { NamespaceParam("test").DefaultNamespace(). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/pod"}}). Flatten(). - Do().Object(internaldeps.ToInternalList) + Do().Object() if err != nil { t.Fatalf("unexpected error: %v", err) @@ -1018,12 +1017,12 @@ func TestListObject(t *testing.T) { ResourceTypeOrNameArgs(true, "pods"). Flatten() - obj, err := b.Do().Object(internaldeps.ToInternalList) + obj, err := b.Do().Object() if err != nil { t.Fatalf("unexpected error: %v", err) } - list, ok := obj.(*api.List) + list, ok := obj.(*v1.List) if !ok { t.Fatalf("unexpected object: %#v", obj) } @@ -1051,13 +1050,13 @@ func TestListObjectWithDifferentVersions(t *testing.T) { NamespaceParam("test"). ResourceTypeOrNameArgs(true, "pods,services"). Flatten(). - Do().Object(internaldeps.ToInternalList) + Do().Object() if err != nil { t.Fatalf("unexpected error: %v", err) } - list, ok := obj.(*api.List) + list, ok := obj.(*v1.List) if !ok { t.Fatalf("unexpected object: %#v", obj) } diff --git a/pkg/kubectl/resource/result.go b/pkg/kubectl/resource/result.go index 5463dab4e85..3c0471cae99 100644 --- a/pkg/kubectl/resource/result.go +++ b/pkg/kubectl/resource/result.go @@ -125,37 +125,13 @@ func (r *Result) Infos() ([]*Info, error) { return infos, err } -// ToList is a function that converts a slice of Objects into a single -// List Object. It allows callers to control whether an internal -// or external List is returned. -type ToList func([]runtime.Object, string) runtime.Object - -// Compile time check to enforce that list implements the necessary interface -var _ metav1.ListInterface = &v1.List{} -var _ metav1.ListMetaAccessor = &v1.List{} - -// ToV1List takes a slice of Objects + their version, and returns -// a v1.List Object containing the objects as Items -func ToV1List(objects []runtime.Object, version string) runtime.Object { - raw := []runtime.RawExtension{} - for _, o := range objects { - raw = append(raw, runtime.RawExtension{Object: o}) - } - return &v1.List{ - ListMeta: metav1.ListMeta{ - ResourceVersion: version, - }, - Items: raw, - } -} - // Object returns a single object representing the output of a single visit to all // found resources. If the Builder was a singular context (expected to return a // single resource by user input) and only a single resource was found, the resource // will be returned as is. Otherwise, the returned resources will be part of an // v1.List. The ResourceVersion of the v1.List will be set only if it is identical // across all infos returned. -func (r *Result) Object(toList ToList) (runtime.Object, error) { +func (r *Result) Object() (runtime.Object, error) { infos, err := r.Infos() if err != nil { return nil, err @@ -184,11 +160,27 @@ func (r *Result) Object(toList ToList) (runtime.Object, error) { if len(versions) == 1 { version = versions.List()[0] } - if toList == nil { - toList = ToV1List - } - return toList(objects, version), err + return toV1List(objects, version), err +} + +// Compile time check to enforce that list implements the necessary interface +var _ metav1.ListInterface = &v1.List{} +var _ metav1.ListMetaAccessor = &v1.List{} + +// toV1List takes a slice of Objects + their version, and returns +// a v1.List Object containing the objects in the Items field +func toV1List(objects []runtime.Object, version string) runtime.Object { + raw := []runtime.RawExtension{} + for _, o := range objects { + raw = append(raw, runtime.RawExtension{Object: o}) + } + return &v1.List{ + ListMeta: metav1.ListMeta{ + ResourceVersion: version, + }, + Items: raw, + } } // ResourceMapping returns a single meta.RESTMapping representing the