Switch to v1.List instead of allowing the conversion fn to be provided.

This commit is contained in:
Phillip Wittrock 2017-10-18 09:27:52 -07:00
parent 72d672c3d5
commit fd169a6218
12 changed files with 39 additions and 118 deletions

View File

@ -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",

View File

@ -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",

View File

@ -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
}

View File

@ -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
}

View File

@ -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 {

View File

@ -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",

View File

@ -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
}

View File

@ -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"],
)

View File

@ -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,
}
}

View File

@ -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",

View File

@ -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)
}

View File

@ -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