diff --git a/pkg/kubectl/cmd/rollingupdate.go b/pkg/kubectl/cmd/rollingupdate.go index d114fe3b3b8..d9bf01b7368 100644 --- a/pkg/kubectl/cmd/rollingupdate.go +++ b/pkg/kubectl/cmd/rollingupdate.go @@ -212,14 +212,14 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args 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/resource/BUILD b/pkg/kubectl/resource/BUILD index eb088f4424c..87d7dd74ab7 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", diff --git a/pkg/kubectl/resource/builder_test.go b/pkg/kubectl/resource/builder_test.go index 00f7cfc9189..b5587cc8844 100644 --- a/pkg/kubectl/resource/builder_test.go +++ b/pkg/kubectl/resource/builder_test.go @@ -900,11 +900,11 @@ func TestMultipleObject(t *testing.T) { 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) { @@ -1023,7 +1023,7 @@ func TestListObject(t *testing.T) { t.Fatalf("unexpected error: %v", err) } - list, ok := obj.(*api.List) + list, ok := obj.(*v1.List) if !ok { t.Fatalf("unexpected object: %#v", obj) } @@ -1057,7 +1057,7 @@ func TestListObjectWithDifferentVersions(t *testing.T) { 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 46578a5730b..3c0471cae99 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. @@ -129,7 +129,7 @@ func (r *Result) Infos() ([]*Info, error) { // 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) { infos, err := r.Infos() @@ -160,12 +160,27 @@ func (r *Result) Object() (runtime.Object, error) { if len(versions) == 1 { version = versions.List()[0] } - return &api.List{ + + 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: objects, - }, err + Items: raw, + } } // ResourceMapping returns a single meta.RESTMapping representing the