Merge pull request #55016 from mengqiy/cleanup_resouce_test

Automatic merge from submit-queue (batch tested with PRs 55016, 50887). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.

Cleanup resouce test

- Make client-go testing support decoding to external version
- Cleanup bad dependency of `pkg/kubectl/resource` pkg

```release-note
NONE
```

/assign @monopole @caesarxuchao
This commit is contained in:
Kubernetes Submit Queue 2017-11-02 15:40:12 -07:00 committed by GitHub
commit fb67f84ed1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 189 additions and 174 deletions

View File

@ -59,10 +59,7 @@ go_test(
importpath = "k8s.io/kubernetes/pkg/kubectl/resource", importpath = "k8s.io/kubernetes/pkg/kubectl/resource",
library = ":go_default_library", library = ":go_default_library",
deps = [ deps = [
"//pkg/api:go_default_library", "//pkg/kubectl/scheme:go_default_library",
"//pkg/api/legacyscheme:go_default_library",
"//pkg/api/testapi:go_default_library",
"//pkg/api/testing:go_default_library",
"//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library",
"//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library",
"//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library",
@ -74,11 +71,13 @@ go_test(
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/version:go_default_library", "//vendor/k8s.io/apimachinery/pkg/version:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
"//vendor/k8s.io/client-go/discovery:go_default_library", "//vendor/k8s.io/client-go/discovery:go_default_library",
"//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library",
"//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library",
"//vendor/k8s.io/client-go/rest/fake:go_default_library", "//vendor/k8s.io/client-go/rest/fake:go_default_library",
"//vendor/k8s.io/client-go/rest/watch:go_default_library", "//vendor/k8s.io/client-go/rest/watch:go_default_library",

View File

@ -37,16 +37,22 @@ import (
"k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/apimachinery/pkg/runtime/serializer/streaming" "k8s.io/apimachinery/pkg/runtime/serializer/streaming"
utilerrors "k8s.io/apimachinery/pkg/util/errors" utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/rest/fake" "k8s.io/client-go/rest/fake"
restclientwatch "k8s.io/client-go/rest/watch" restclientwatch "k8s.io/client-go/rest/watch"
utiltesting "k8s.io/client-go/util/testing" utiltesting "k8s.io/client-go/util/testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/kubectl/scheme"
"k8s.io/kubernetes/pkg/api/legacyscheme" )
"k8s.io/kubernetes/pkg/api/testapi"
apitesting "k8s.io/kubernetes/pkg/api/testing" var (
corev1GV = schema.GroupVersion{Version: "v1"}
corev1Codec = scheme.Codecs.CodecForVersions(scheme.Codecs.LegacyCodec(corev1GV), scheme.Codecs.UniversalDecoder(corev1GV), corev1GV, corev1GV)
metaAccessor = meta.NewAccessor()
restmapper = scheme.Registry.RESTMapper()
) )
func stringBody(body string) io.ReadCloser { func stringBody(body string) io.ReadCloser {
@ -55,7 +61,7 @@ func stringBody(body string) io.ReadCloser {
func watchBody(events ...watch.Event) string { func watchBody(events ...watch.Event) string {
buf := &bytes.Buffer{} buf := &bytes.Buffer{}
codec := testapi.Default.Codec() codec := corev1Codec
enc := restclientwatch.NewEncoder(streaming.NewEncoder(buf, codec), codec) enc := restclientwatch.NewEncoder(streaming.NewEncoder(buf, codec), codec)
for _, e := range events { for _, e := range events {
enc.Encode(&e) enc.Encode(&e)
@ -72,8 +78,8 @@ func fakeClient() ClientMapper {
func fakeClientWith(testName string, t *testing.T, data map[string]string) ClientMapper { func fakeClientWith(testName string, t *testing.T, data map[string]string) ClientMapper {
return ClientMapperFunc(func(*meta.RESTMapping) (RESTClient, error) { return ClientMapperFunc(func(*meta.RESTMapping) (RESTClient, error) {
return &fake.RESTClient{ return &fake.RESTClient{
GroupVersion: legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion, GroupVersion: corev1GV,
NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs},
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
p := req.URL.Path p := req.URL.Path
q := req.URL.RawQuery q := req.URL.RawQuery
@ -96,30 +102,30 @@ func fakeClientWith(testName string, t *testing.T, data map[string]string) Clien
}) })
} }
func testData() (*api.PodList, *api.ServiceList) { func testData() (*v1.PodList, *v1.ServiceList) {
pods := &api.PodList{ pods := &v1.PodList{
ListMeta: metav1.ListMeta{ ListMeta: metav1.ListMeta{
ResourceVersion: "15", ResourceVersion: "15",
}, },
Items: []api.Pod{ Items: []v1.Pod{
{ {
ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "10"}, ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "10"},
Spec: apitesting.DeepEqualSafePodSpec(), Spec: V1DeepEqualSafePodSpec(),
}, },
{ {
ObjectMeta: metav1.ObjectMeta{Name: "bar", Namespace: "test", ResourceVersion: "11"}, ObjectMeta: metav1.ObjectMeta{Name: "bar", Namespace: "test", ResourceVersion: "11"},
Spec: apitesting.DeepEqualSafePodSpec(), Spec: V1DeepEqualSafePodSpec(),
}, },
}, },
} }
svc := &api.ServiceList{ svc := &v1.ServiceList{
ListMeta: metav1.ListMeta{ ListMeta: metav1.ListMeta{
ResourceVersion: "16", ResourceVersion: "16",
}, },
Items: []api.Service{ Items: []v1.Service{
{ {
ObjectMeta: metav1.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "12"}, ObjectMeta: metav1.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "12"},
Spec: api.ServiceSpec{ Spec: v1.ServiceSpec{
Type: "ClusterIP", Type: "ClusterIP",
SessionAffinity: "None", SessionAffinity: "None",
}, },
@ -129,13 +135,13 @@ func testData() (*api.PodList, *api.ServiceList) {
return pods, svc return pods, svc
} }
func streamTestData() (io.Reader, *api.PodList, *api.ServiceList) { func streamTestData() (io.Reader, *v1.PodList, *v1.ServiceList) {
pods, svc := testData() pods, svc := testData()
r, w := io.Pipe() r, w := io.Pipe()
go func() { go func() {
defer w.Close() defer w.Close()
w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), pods))) w.Write([]byte(runtime.EncodeOrDie(corev1Codec, pods)))
w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), svc))) w.Write([]byte(runtime.EncodeOrDie(corev1Codec, svc)))
}() }()
return r, pods, svc return r, pods, svc
} }
@ -148,14 +154,14 @@ func JSONToYAMLOrDie(in []byte) []byte {
return data return data
} }
func streamYAMLTestData() (io.Reader, *api.PodList, *api.ServiceList) { func streamYAMLTestData() (io.Reader, *v1.PodList, *v1.ServiceList) {
pods, svc := testData() pods, svc := testData()
r, w := io.Pipe() r, w := io.Pipe()
go func() { go func() {
defer w.Close() defer w.Close()
w.Write(JSONToYAMLOrDie([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), pods)))) w.Write(JSONToYAMLOrDie([]byte(runtime.EncodeOrDie(corev1Codec, pods))))
w.Write([]byte("\n---\n")) w.Write([]byte("\n---\n"))
w.Write(JSONToYAMLOrDie([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), svc)))) w.Write(JSONToYAMLOrDie([]byte(runtime.EncodeOrDie(corev1Codec, svc))))
}() }()
return r, pods, svc return r, pods, svc
} }
@ -164,7 +170,7 @@ func streamTestObject(obj runtime.Object) io.Reader {
r, w := io.Pipe() r, w := io.Pipe()
go func() { go func() {
defer w.Close() defer w.Close()
w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), obj))) w.Write([]byte(runtime.EncodeOrDie(corev1Codec, obj)))
}() }()
return r return r
} }
@ -193,7 +199,7 @@ func (v *testVisitor) Objects() []runtime.Object {
var aPod string = ` var aPod string = `
{ {
"kind": "Pod", "kind": "Pod",
"apiVersion": "` + legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion.String() + `", "apiVersion": "` + corev1GV.String() + `",
"metadata": { "metadata": {
"name": "busybox{id}", "name": "busybox{id}",
"labels": { "labels": {
@ -220,7 +226,7 @@ var aPod string = `
var aRC string = ` var aRC string = `
{ {
"kind": "ReplicationController", "kind": "ReplicationController",
"apiVersion": "` + legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion.String() + `", "apiVersion": "` + corev1GV.String() + `",
"metadata": { "metadata": {
"name": "busybox{id}", "name": "busybox{id}",
"labels": { "labels": {
@ -256,7 +262,7 @@ var aRC string = `
` `
func TestPathBuilderAndVersionedObjectNotDefaulted(t *testing.T) { func TestPathBuilderAndVersionedObjectNotDefaulted(t *testing.T) {
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../test/fixtures/pkg/kubectl/builder/kitten-rc.yaml"}}) FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../test/fixtures/pkg/kubectl/builder/kitten-rc.yaml"}})
test := &testVisitor{} test := &testVisitor{}
@ -279,23 +285,23 @@ func TestPathBuilderAndVersionedObjectNotDefaulted(t *testing.T) {
} }
func TestNodeBuilder(t *testing.T) { func TestNodeBuilder(t *testing.T) {
node := &api.Node{ node := &v1.Node{
ObjectMeta: metav1.ObjectMeta{Name: "node1", Namespace: "should-not-have", ResourceVersion: "10"}, ObjectMeta: metav1.ObjectMeta{Name: "node1", Namespace: "should-not-have", ResourceVersion: "10"},
Spec: api.NodeSpec{}, Spec: v1.NodeSpec{},
Status: api.NodeStatus{ Status: v1.NodeStatus{
Capacity: api.ResourceList{ Capacity: v1.ResourceList{
api.ResourceCPU: resource.MustParse("1000m"), v1.ResourceCPU: resource.MustParse("1000m"),
api.ResourceMemory: resource.MustParse("1Mi"), v1.ResourceMemory: resource.MustParse("1Mi"),
}, },
}, },
} }
r, w := io.Pipe() r, w := io.Pipe()
go func() { go func() {
defer w.Close() defer w.Close()
w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), node))) w.Write([]byte(runtime.EncodeOrDie(corev1Codec, node)))
}() }()
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
NamespaceParam("test").Stream(r, "STDIN") NamespaceParam("test").Stream(r, "STDIN")
test := &testVisitor{} test := &testVisitor{}
@ -350,16 +356,16 @@ func TestPathBuilderWithMultiple(t *testing.T) {
directory string directory string
expectedNames []string expectedNames []string
}{ }{
{"pod", &api.Pod{}, false, "../../../examples/pod", []string{"nginx"}}, {"pod", &v1.Pod{}, false, "../../../examples/pod", []string{"nginx"}},
{"recursive-pod", &api.Pod{}, true, fmt.Sprintf("%s/recursive/pod", tmpDir), []string{"busybox0", "busybox1"}}, {"recursive-pod", &v1.Pod{}, true, fmt.Sprintf("%s/recursive/pod", tmpDir), []string{"busybox0", "busybox1"}},
{"rc", &api.ReplicationController{}, false, "../../../examples/guestbook/legacy/redis-master-controller.yaml", []string{"redis-master"}}, {"rc", &v1.ReplicationController{}, false, "../../../examples/guestbook/legacy/redis-master-controller.yaml", []string{"redis-master"}},
{"recursive-rc", &api.ReplicationController{}, true, fmt.Sprintf("%s/recursive/rc", tmpDir), []string{"busybox0", "busybox1"}}, {"recursive-rc", &v1.ReplicationController{}, true, fmt.Sprintf("%s/recursive/rc", tmpDir), []string{"busybox0", "busybox1"}},
{"hardlink", &api.Pod{}, false, fmt.Sprintf("%s/inode/hardlink/busybox-link.json", tmpDir), []string{"busybox0"}}, {"hardlink", &v1.Pod{}, false, fmt.Sprintf("%s/inode/hardlink/busybox-link.json", tmpDir), []string{"busybox0"}},
{"hardlink", &api.Pod{}, true, fmt.Sprintf("%s/inode/hardlink/busybox-link.json", tmpDir), []string{"busybox0"}}, {"hardlink", &v1.Pod{}, true, fmt.Sprintf("%s/inode/hardlink/busybox-link.json", tmpDir), []string{"busybox0"}},
} }
for _, test := range tests { for _, test := range tests {
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
FilenameParam(false, &FilenameOptions{Recursive: test.recursive, Filenames: []string{test.directory}}). FilenameParam(false, &FilenameOptions{Recursive: test.recursive, Filenames: []string{test.directory}}).
NamespaceParam("test").DefaultNamespace() NamespaceParam("test").DefaultNamespace()
@ -375,12 +381,12 @@ func TestPathBuilderWithMultiple(t *testing.T) {
for i, v := range info { for i, v := range info {
switch test.object.(type) { switch test.object.(type) {
case *api.Pod: case *v1.Pod:
if _, ok := v.Object.(*api.Pod); !ok || v.Name != test.expectedNames[i] || v.Namespace != "test" { if _, ok := v.Object.(*v1.Pod); !ok || v.Name != test.expectedNames[i] || v.Namespace != "test" {
t.Errorf("unexpected info: %#v", v) t.Errorf("unexpected info: %#v", v)
} }
case *api.ReplicationController: case *v1.ReplicationController:
if _, ok := v.Object.(*api.ReplicationController); !ok || v.Name != test.expectedNames[i] || v.Namespace != "test" { if _, ok := v.Object.(*v1.ReplicationController); !ok || v.Name != test.expectedNames[i] || v.Namespace != "test" {
t.Errorf("unexpected info: %#v", v) t.Errorf("unexpected info: %#v", v)
} }
} }
@ -418,7 +424,7 @@ func TestPathBuilderWithMultipleInvalid(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
FilenameParam(false, &FilenameOptions{Recursive: test.recursive, Filenames: []string{test.directory}}). FilenameParam(false, &FilenameOptions{Recursive: test.recursive, Filenames: []string{test.directory}}).
NamespaceParam("test").DefaultNamespace() NamespaceParam("test").DefaultNamespace()
@ -433,7 +439,7 @@ func TestPathBuilderWithMultipleInvalid(t *testing.T) {
} }
func TestDirectoryBuilder(t *testing.T) { func TestDirectoryBuilder(t *testing.T) {
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/legacy"}}). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/legacy"}}).
NamespaceParam("test").DefaultNamespace() NamespaceParam("test").DefaultNamespace()
@ -460,11 +466,11 @@ func TestDirectoryBuilder(t *testing.T) {
func TestNamespaceOverride(t *testing.T) { func TestNamespaceOverride(t *testing.T) {
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "test"}}))) w.Write([]byte(runtime.EncodeOrDie(corev1Codec, &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "test"}})))
})) }))
defer s.Close() defer s.Close()
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{s.URL}}). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{s.URL}}).
NamespaceParam("test") NamespaceParam("test")
@ -475,7 +481,7 @@ func TestNamespaceOverride(t *testing.T) {
t.Fatalf("unexpected response: %v %#v", err, test.Infos) t.Fatalf("unexpected response: %v %#v", err, test.Infos)
} }
b = NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b = NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
FilenameParam(true, &FilenameOptions{Recursive: false, Filenames: []string{s.URL}}). FilenameParam(true, &FilenameOptions{Recursive: false, Filenames: []string{s.URL}}).
NamespaceParam("test") NamespaceParam("test")
@ -490,12 +496,12 @@ func TestNamespaceOverride(t *testing.T) {
func TestURLBuilder(t *testing.T) { func TestURLBuilder(t *testing.T) {
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "test"}}))) w.Write([]byte(runtime.EncodeOrDie(corev1Codec, &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "test"}})))
w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "test1"}}))) w.Write([]byte(runtime.EncodeOrDie(corev1Codec, &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "test1"}})))
})) }))
defer s.Close() defer s.Close()
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{s.URL}}). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{s.URL}}).
NamespaceParam("foo") NamespaceParam("foo")
@ -520,11 +526,11 @@ func TestURLBuilder(t *testing.T) {
func TestURLBuilderRequireNamespace(t *testing.T) { func TestURLBuilderRequireNamespace(t *testing.T) {
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &api.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "test"}}))) w.Write([]byte(runtime.EncodeOrDie(corev1Codec, &v1.Pod{ObjectMeta: metav1.ObjectMeta{Namespace: "foo", Name: "test"}})))
})) }))
defer s.Close() defer s.Close()
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{s.URL}}). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{s.URL}}).
NamespaceParam("test").RequireNamespace() NamespaceParam("test").RequireNamespace()
@ -539,9 +545,9 @@ func TestURLBuilderRequireNamespace(t *testing.T) {
func TestResourceByName(t *testing.T) { func TestResourceByName(t *testing.T) {
pods, _ := testData() pods, _ := testData()
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClientWith("", t, map[string]string{ b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{
"/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), "/namespaces/test/pods/foo": runtime.EncodeOrDie(corev1Codec, &pods.Items[0]),
}), testapi.Default.Codec()). }), corev1Codec).
NamespaceParam("test") NamespaceParam("test")
test := &testVisitor{} test := &testVisitor{}
@ -572,12 +578,12 @@ func TestResourceByName(t *testing.T) {
func TestMultipleResourceByTheSameName(t *testing.T) { func TestMultipleResourceByTheSameName(t *testing.T) {
pods, svcs := testData() pods, svcs := testData()
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClientWith("", t, map[string]string{ b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{
"/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), "/namespaces/test/pods/foo": runtime.EncodeOrDie(corev1Codec, &pods.Items[0]),
"/namespaces/test/pods/baz": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[1]), "/namespaces/test/pods/baz": runtime.EncodeOrDie(corev1Codec, &pods.Items[1]),
"/namespaces/test/services/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &svcs.Items[0]), "/namespaces/test/services/foo": runtime.EncodeOrDie(corev1Codec, &svcs.Items[0]),
"/namespaces/test/services/baz": runtime.EncodeOrDie(testapi.Default.Codec(), &svcs.Items[0]), "/namespaces/test/services/baz": runtime.EncodeOrDie(corev1Codec, &svcs.Items[0]),
}), testapi.Default.Codec()). }), corev1Codec).
NamespaceParam("test") NamespaceParam("test")
test := &testVisitor{} test := &testVisitor{}
@ -604,10 +610,10 @@ func TestMultipleResourceByTheSameName(t *testing.T) {
func TestResourceNames(t *testing.T) { func TestResourceNames(t *testing.T) {
pods, svc := testData() pods, svc := testData()
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClientWith("", t, map[string]string{ b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{
"/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), "/namespaces/test/pods/foo": runtime.EncodeOrDie(corev1Codec, &pods.Items[0]),
"/namespaces/test/services/baz": runtime.EncodeOrDie(testapi.Default.Codec(), &svc.Items[0]), "/namespaces/test/services/baz": runtime.EncodeOrDie(corev1Codec, &svc.Items[0]),
}), testapi.Default.Codec()). }), corev1Codec).
NamespaceParam("test") NamespaceParam("test")
test := &testVisitor{} test := &testVisitor{}
@ -632,10 +638,10 @@ func TestResourceNames(t *testing.T) {
func TestResourceNamesWithoutResource(t *testing.T) { func TestResourceNamesWithoutResource(t *testing.T) {
pods, svc := testData() pods, svc := testData()
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClientWith("", t, map[string]string{ b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{
"/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), "/namespaces/test/pods/foo": runtime.EncodeOrDie(corev1Codec, &pods.Items[0]),
"/namespaces/test/services/baz": runtime.EncodeOrDie(testapi.Default.Codec(), &svc.Items[0]), "/namespaces/test/services/baz": runtime.EncodeOrDie(corev1Codec, &svc.Items[0]),
}), testapi.Default.Codec()). }), corev1Codec).
NamespaceParam("test") NamespaceParam("test")
test := &testVisitor{} test := &testVisitor{}
@ -653,7 +659,7 @@ func TestResourceNamesWithoutResource(t *testing.T) {
} }
func TestResourceByNameWithoutRequireObject(t *testing.T) { func TestResourceByNameWithoutRequireObject(t *testing.T) {
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClientWith("", t, map[string]string{}), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{}), corev1Codec).
NamespaceParam("test") NamespaceParam("test")
test := &testVisitor{} test := &testVisitor{}
@ -687,9 +693,9 @@ func TestResourceByNameWithoutRequireObject(t *testing.T) {
func TestResourceByNameAndEmptySelector(t *testing.T) { func TestResourceByNameAndEmptySelector(t *testing.T) {
pods, _ := testData() pods, _ := testData()
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClientWith("", t, map[string]string{ b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{
"/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), "/namespaces/test/pods/foo": runtime.EncodeOrDie(corev1Codec, &pods.Items[0]),
}), testapi.Default.Codec()). }), corev1Codec).
NamespaceParam("test"). NamespaceParam("test").
SelectorParam(""). SelectorParam("").
ResourceTypeOrNameArgs(true, "pods", "foo") ResourceTypeOrNameArgs(true, "pods", "foo")
@ -714,11 +720,11 @@ func TestResourceByNameAndEmptySelector(t *testing.T) {
func TestSelector(t *testing.T) { func TestSelector(t *testing.T) {
pods, svc := testData() pods, svc := testData()
labelKey := metav1.LabelSelectorQueryParam(legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion.String()) labelKey := metav1.LabelSelectorQueryParam(corev1GV.String())
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClientWith("", t, map[string]string{ b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{
"/namespaces/test/pods?" + labelKey + "=a%3Db": runtime.EncodeOrDie(testapi.Default.Codec(), pods), "/namespaces/test/pods?" + labelKey + "=a%3Db": runtime.EncodeOrDie(corev1Codec, pods),
"/namespaces/test/services?" + labelKey + "=a%3Db": runtime.EncodeOrDie(testapi.Default.Codec(), svc), "/namespaces/test/services?" + labelKey + "=a%3Db": runtime.EncodeOrDie(corev1Codec, svc),
}), testapi.Default.Codec()). }), corev1Codec).
SelectorParam("a=b"). SelectorParam("a=b").
NamespaceParam("test"). NamespaceParam("test").
Flatten() Flatten()
@ -746,7 +752,7 @@ func TestSelector(t *testing.T) {
} }
func TestSelectorRequiresKnownTypes(t *testing.T) { func TestSelectorRequiresKnownTypes(t *testing.T) {
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
SelectorParam("a=b"). SelectorParam("a=b").
NamespaceParam("test"). NamespaceParam("test").
ResourceTypes("unknown") ResourceTypes("unknown")
@ -757,7 +763,7 @@ func TestSelectorRequiresKnownTypes(t *testing.T) {
} }
func TestSingleResourceType(t *testing.T) { func TestSingleResourceType(t *testing.T) {
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
SelectorParam("a=b"). SelectorParam("a=b").
SingleResourceType(). SingleResourceType().
ResourceTypeOrNameArgs(true, "pods,services") ResourceTypeOrNameArgs(true, "pods,services")
@ -821,13 +827,13 @@ func TestResourceTuple(t *testing.T) {
if requireObject { if requireObject {
pods, _ := testData() pods, _ := testData()
expectedRequests = map[string]string{ expectedRequests = map[string]string{
"/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), "/namespaces/test/pods/foo": runtime.EncodeOrDie(corev1Codec, &pods.Items[0]),
"/namespaces/test/pods/bar": runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]), "/namespaces/test/pods/bar": runtime.EncodeOrDie(corev1Codec, &pods.Items[0]),
"/nodes/foo": runtime.EncodeOrDie(testapi.Default.Codec(), &api.Node{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}), "/nodes/foo": runtime.EncodeOrDie(corev1Codec, &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}),
} }
} }
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClientWith(k, t, expectedRequests), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith(k, t, expectedRequests), corev1Codec).
NamespaceParam("test").DefaultNamespace(). NamespaceParam("test").DefaultNamespace().
ResourceTypeOrNameArgs(true, testCase.args...).RequireObject(requireObject) ResourceTypeOrNameArgs(true, testCase.args...).RequireObject(requireObject)
@ -858,7 +864,7 @@ func TestResourceTuple(t *testing.T) {
func TestStream(t *testing.T) { func TestStream(t *testing.T) {
r, pods, rc := streamTestData() r, pods, rc := streamTestData()
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
NamespaceParam("test").Stream(r, "STDIN").Flatten() NamespaceParam("test").Stream(r, "STDIN").Flatten()
test := &testVisitor{} test := &testVisitor{}
@ -875,7 +881,7 @@ func TestStream(t *testing.T) {
func TestYAMLStream(t *testing.T) { func TestYAMLStream(t *testing.T) {
r, pods, rc := streamYAMLTestData() r, pods, rc := streamYAMLTestData()
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
NamespaceParam("test").Stream(r, "STDIN").Flatten() NamespaceParam("test").Stream(r, "STDIN").Flatten()
test := &testVisitor{} test := &testVisitor{}
@ -892,7 +898,7 @@ func TestYAMLStream(t *testing.T) {
func TestMultipleObject(t *testing.T) { func TestMultipleObject(t *testing.T) {
r, pods, svc := streamTestData() r, pods, svc := streamTestData()
obj, err := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). obj, err := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
NamespaceParam("test").Stream(r, "STDIN").Flatten(). NamespaceParam("test").Stream(r, "STDIN").Flatten().
Do().Object() Do().Object()
@ -914,7 +920,7 @@ func TestMultipleObject(t *testing.T) {
func TestContinueOnErrorVisitor(t *testing.T) { func TestContinueOnErrorVisitor(t *testing.T) {
r, _, _ := streamTestData() r, _, _ := streamTestData()
req := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). req := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
ContinueOnError(). ContinueOnError().
NamespaceParam("test").Stream(r, "STDIN").Flatten(). NamespaceParam("test").Stream(r, "STDIN").Flatten().
Do() Do()
@ -943,7 +949,7 @@ func TestContinueOnErrorVisitor(t *testing.T) {
} }
func TestSingleItemImpliedObject(t *testing.T) { func TestSingleItemImpliedObject(t *testing.T) {
obj, err := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). obj, err := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
NamespaceParam("test").DefaultNamespace(). NamespaceParam("test").DefaultNamespace().
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/legacy/redis-master-controller.yaml"}}). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/legacy/redis-master-controller.yaml"}}).
Flatten(). Flatten().
@ -953,7 +959,7 @@ func TestSingleItemImpliedObject(t *testing.T) {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
rc, ok := obj.(*api.ReplicationController) rc, ok := obj.(*v1.ReplicationController)
if !ok { if !ok {
t.Fatalf("unexpected object: %#v", obj) t.Fatalf("unexpected object: %#v", obj)
} }
@ -963,7 +969,7 @@ func TestSingleItemImpliedObject(t *testing.T) {
} }
func TestSingleItemImpliedObjectNoExtension(t *testing.T) { func TestSingleItemImpliedObjectNoExtension(t *testing.T) {
obj, err := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). obj, err := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
NamespaceParam("test").DefaultNamespace(). NamespaceParam("test").DefaultNamespace().
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/pod"}}). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/pod"}}).
Flatten(). Flatten().
@ -973,7 +979,7 @@ func TestSingleItemImpliedObjectNoExtension(t *testing.T) {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
pod, ok := obj.(*api.Pod) pod, ok := obj.(*v1.Pod)
if !ok { if !ok {
t.Fatalf("unexpected object: %#v", obj) t.Fatalf("unexpected object: %#v", obj)
} }
@ -983,9 +989,9 @@ func TestSingleItemImpliedObjectNoExtension(t *testing.T) {
} }
func TestSingleItemImpliedRootScopedObject(t *testing.T) { func TestSingleItemImpliedRootScopedObject(t *testing.T) {
node := &api.Node{ObjectMeta: metav1.ObjectMeta{Name: "test"}, Spec: api.NodeSpec{ExternalID: "test"}} node := &v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "test"}, Spec: v1.NodeSpec{ExternalID: "test"}}
r := streamTestObject(node) r := streamTestObject(node)
infos, err := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). infos, err := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
NamespaceParam("test").DefaultNamespace(). NamespaceParam("test").DefaultNamespace().
Stream(r, "STDIN"). Stream(r, "STDIN").
Flatten(). Flatten().
@ -998,7 +1004,7 @@ func TestSingleItemImpliedRootScopedObject(t *testing.T) {
if infos[0].Namespace != "" { if infos[0].Namespace != "" {
t.Errorf("namespace should be empty: %#v", infos[0]) t.Errorf("namespace should be empty: %#v", infos[0])
} }
n, ok := infos[0].Object.(*api.Node) n, ok := infos[0].Object.(*v1.Node)
if !ok { if !ok {
t.Fatalf("unexpected object: %#v", infos[0].Object) t.Fatalf("unexpected object: %#v", infos[0].Object)
} }
@ -1009,10 +1015,10 @@ func TestSingleItemImpliedRootScopedObject(t *testing.T) {
func TestListObject(t *testing.T) { func TestListObject(t *testing.T) {
pods, _ := testData() pods, _ := testData()
labelKey := metav1.LabelSelectorQueryParam(legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion.String()) labelKey := metav1.LabelSelectorQueryParam(corev1GV.String())
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClientWith("", t, map[string]string{ b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{
"/namespaces/test/pods?" + labelKey + "=a%3Db": runtime.EncodeOrDie(testapi.Default.Codec(), pods), "/namespaces/test/pods?" + labelKey + "=a%3Db": runtime.EncodeOrDie(corev1Codec, pods),
}), testapi.Default.Codec()). }), corev1Codec).
SelectorParam("a=b"). SelectorParam("a=b").
NamespaceParam("test"). NamespaceParam("test").
ResourceTypeOrNameArgs(true, "pods"). ResourceTypeOrNameArgs(true, "pods").
@ -1042,11 +1048,11 @@ func TestListObject(t *testing.T) {
func TestListObjectWithDifferentVersions(t *testing.T) { func TestListObjectWithDifferentVersions(t *testing.T) {
pods, svc := testData() pods, svc := testData()
labelKey := metav1.LabelSelectorQueryParam(legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion.String()) labelKey := metav1.LabelSelectorQueryParam(corev1GV.String())
obj, err := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClientWith("", t, map[string]string{ obj, err := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{
"/namespaces/test/pods?" + labelKey + "=a%3Db": runtime.EncodeOrDie(testapi.Default.Codec(), pods), "/namespaces/test/pods?" + labelKey + "=a%3Db": runtime.EncodeOrDie(corev1Codec, pods),
"/namespaces/test/services?" + labelKey + "=a%3Db": runtime.EncodeOrDie(testapi.Default.Codec(), svc), "/namespaces/test/services?" + labelKey + "=a%3Db": runtime.EncodeOrDie(corev1Codec, svc),
}), testapi.Default.Codec()). }), corev1Codec).
SelectorParam("a=b"). SelectorParam("a=b").
NamespaceParam("test"). NamespaceParam("test").
ResourceTypeOrNameArgs(true, "pods,services"). ResourceTypeOrNameArgs(true, "pods,services").
@ -1069,12 +1075,12 @@ func TestListObjectWithDifferentVersions(t *testing.T) {
func TestWatch(t *testing.T) { func TestWatch(t *testing.T) {
_, svc := testData() _, svc := testData()
w, err := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClientWith("", t, map[string]string{ w, err := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{
"/namespaces/test/services?fieldSelector=metadata.name%3Dredis-master&resourceVersion=12&watch=true": watchBody(watch.Event{ "/namespaces/test/services?fieldSelector=metadata.name%3Dredis-master&resourceVersion=12&watch=true": watchBody(watch.Event{
Type: watch.Added, Type: watch.Added,
Object: &svc.Items[0], Object: &svc.Items[0],
}), }),
}), testapi.Default.Codec()). }), corev1Codec).
NamespaceParam("test").DefaultNamespace(). NamespaceParam("test").DefaultNamespace().
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/redis-master-service.yaml"}}).Flatten(). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/redis-master-service.yaml"}}).Flatten().
Do().Watch("12") Do().Watch("12")
@ -1090,7 +1096,7 @@ func TestWatch(t *testing.T) {
if obj.Type != watch.Added { if obj.Type != watch.Added {
t.Fatalf("unexpected watch event %#v", obj) t.Fatalf("unexpected watch event %#v", obj)
} }
service, ok := obj.Object.(*api.Service) service, ok := obj.Object.(*v1.Service)
if !ok { if !ok {
t.Fatalf("unexpected object: %#v", obj) t.Fatalf("unexpected object: %#v", obj)
} }
@ -1101,7 +1107,7 @@ func TestWatch(t *testing.T) {
} }
func TestWatchMultipleError(t *testing.T) { func TestWatchMultipleError(t *testing.T) {
_, err := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). _, err := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
NamespaceParam("test").DefaultNamespace(). NamespaceParam("test").DefaultNamespace().
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/legacy/redis-master-controller.yaml"}}).Flatten(). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/legacy/redis-master-controller.yaml"}}).Flatten().
FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/legacy/redis-master-controller.yaml"}}).Flatten(). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../examples/guestbook/legacy/redis-master-controller.yaml"}}).Flatten().
@ -1114,21 +1120,21 @@ func TestWatchMultipleError(t *testing.T) {
func TestLatest(t *testing.T) { func TestLatest(t *testing.T) {
r, _, _ := streamTestData() r, _, _ := streamTestData()
newPod := &api.Pod{ newPod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "13"}, ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "test", ResourceVersion: "13"},
} }
newPod2 := &api.Pod{ newPod2 := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: "bar", Namespace: "test", ResourceVersion: "14"}, ObjectMeta: metav1.ObjectMeta{Name: "bar", Namespace: "test", ResourceVersion: "14"},
} }
newSvc := &api.Service{ newSvc := &v1.Service{
ObjectMeta: metav1.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "15"}, ObjectMeta: metav1.ObjectMeta{Name: "baz", Namespace: "test", ResourceVersion: "15"},
} }
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClientWith("", t, map[string]string{ b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClientWith("", t, map[string]string{
"/namespaces/test/pods/foo": runtime.EncodeOrDie(testapi.Default.Codec(), newPod), "/namespaces/test/pods/foo": runtime.EncodeOrDie(corev1Codec, newPod),
"/namespaces/test/pods/bar": runtime.EncodeOrDie(testapi.Default.Codec(), newPod2), "/namespaces/test/pods/bar": runtime.EncodeOrDie(corev1Codec, newPod2),
"/namespaces/test/services/baz": runtime.EncodeOrDie(testapi.Default.Codec(), newSvc), "/namespaces/test/services/baz": runtime.EncodeOrDie(corev1Codec, newSvc),
}), testapi.Default.Codec()). }), corev1Codec).
NamespaceParam("other").Stream(r, "STDIN").Flatten().Latest() NamespaceParam("other").Stream(r, "STDIN").Flatten().Latest()
test := &testVisitor{} test := &testVisitor{}
@ -1150,17 +1156,17 @@ func TestReceiveMultipleErrors(t *testing.T) {
go func() { go func() {
defer w.Close() defer w.Close()
w.Write([]byte(`{}`)) w.Write([]byte(`{}`))
w.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &pods.Items[0]))) w.Write([]byte(runtime.EncodeOrDie(corev1Codec, &pods.Items[0])))
}() }()
r2, w2 := io.Pipe() r2, w2 := io.Pipe()
go func() { go func() {
defer w2.Close() defer w2.Close()
w2.Write([]byte(`{}`)) w2.Write([]byte(`{}`))
w2.Write([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), &svc.Items[0]))) w2.Write([]byte(runtime.EncodeOrDie(corev1Codec, &svc.Items[0])))
}() }()
b := NewBuilder(testapi.Default.RESTMapper(), LegacyCategoryExpander, legacyscheme.Scheme, fakeClient(), testapi.Default.Codec()). b := NewBuilder(restmapper, LegacyCategoryExpander, scheme.Scheme, fakeClient(), corev1Codec).
Stream(r, "1").Stream(r2, "2"). Stream(r, "1").Stream(r2, "2").
ContinueOnError() ContinueOnError()

View File

@ -26,18 +26,17 @@ import (
"strings" "strings"
"testing" "testing"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest/fake" "k8s.io/client-go/rest/fake"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/api/testapi"
apitesting "k8s.io/kubernetes/pkg/api/testing"
) )
func objBody(obj runtime.Object) io.ReadCloser { func objBody(obj runtime.Object) io.ReadCloser {
return ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(testapi.Default.Codec(), obj)))) return ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(corev1Codec, obj))))
} }
func header() http.Header { func header() http.Header {
@ -55,6 +54,17 @@ func splitPath(path string) []string {
return strings.Split(path, "/") return strings.Split(path, "/")
} }
// V1DeepEqualSafePodSpec returns a PodSpec which is ready to be used with apiequality.Semantic.DeepEqual
func V1DeepEqualSafePodSpec() corev1.PodSpec {
grace := int64(30)
return corev1.PodSpec{
RestartPolicy: corev1.RestartPolicyAlways,
DNSPolicy: corev1.DNSClusterFirst,
TerminationGracePeriodSeconds: &grace,
SecurityContext: &corev1.PodSecurityContext{},
}
}
func TestHelperDelete(t *testing.T) { func TestHelperDelete(t *testing.T) {
tests := []struct { tests := []struct {
Err bool Err bool
@ -104,8 +114,7 @@ func TestHelperDelete(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
client := &fake.RESTClient{ client := &fake.RESTClient{
GroupVersion: legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion, NegotiatedSerializer: scheme.Codecs,
NegotiatedSerializer: testapi.Default.NegotiatedSerializer(),
Resp: test.Resp, Resp: test.Resp,
Err: test.HttpErr, Err: test.HttpErr,
} }
@ -168,26 +177,26 @@ func TestHelperCreate(t *testing.T) {
Header: header(), Header: header(),
Body: objBody(&metav1.Status{Status: metav1.StatusSuccess}), Body: objBody(&metav1.Status{Status: metav1.StatusSuccess}),
}, },
Object: &api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}, Object: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}},
ExpectObject: &api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}, ExpectObject: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}},
Req: expectPost, Req: expectPost,
}, },
{ {
Modify: false, Modify: false,
Object: &api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}}, Object: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}},
ExpectObject: &api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}}, ExpectObject: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}},
Resp: &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&metav1.Status{Status: metav1.StatusSuccess})}, Resp: &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&metav1.Status{Status: metav1.StatusSuccess})},
Req: expectPost, Req: expectPost,
}, },
{ {
Modify: true, Modify: true,
Object: &api.Pod{ Object: &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}, ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"},
Spec: apitesting.DeepEqualSafePodSpec(), Spec: V1DeepEqualSafePodSpec(),
}, },
ExpectObject: &api.Pod{ ExpectObject: &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Spec: apitesting.DeepEqualSafePodSpec(), Spec: V1DeepEqualSafePodSpec(),
}, },
Resp: &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&metav1.Status{Status: metav1.StatusSuccess})}, Resp: &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&metav1.Status{Status: metav1.StatusSuccess})},
Req: expectPost, Req: expectPost,
@ -195,14 +204,14 @@ func TestHelperCreate(t *testing.T) {
} }
for i, test := range tests { for i, test := range tests {
client := &fake.RESTClient{ client := &fake.RESTClient{
GroupVersion: legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion, GroupVersion: corev1GV,
NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), NegotiatedSerializer: scheme.Codecs,
Resp: test.Resp, Resp: test.Resp,
Err: test.HttpErr, Err: test.HttpErr,
} }
modifier := &Helper{ modifier := &Helper{
RESTClient: client, RESTClient: client,
Versioner: testapi.Default.MetadataAccessor(), Versioner: metaAccessor,
NamespaceScoped: true, NamespaceScoped: true,
} }
_, err := modifier.Create("bar", test.Modify, test.Object) _, err := modifier.Create("bar", test.Modify, test.Object)
@ -222,7 +231,7 @@ func TestHelperCreate(t *testing.T) {
t.Logf("got body: %s", string(body)) t.Logf("got body: %s", string(body))
expect := []byte{} expect := []byte{}
if test.ExpectObject != nil { if test.ExpectObject != nil {
expect = []byte(runtime.EncodeOrDie(testapi.Default.Codec(), test.ExpectObject)) expect = []byte(runtime.EncodeOrDie(corev1Codec, test.ExpectObject))
} }
if !reflect.DeepEqual(expect, body) { if !reflect.DeepEqual(expect, body) {
t.Errorf("%d: unexpected body: %s (expected %s)", i, string(body), string(expect)) t.Errorf("%d: unexpected body: %s (expected %s)", i, string(body), string(expect))
@ -254,7 +263,7 @@ func TestHelperGet(t *testing.T) {
Resp: &http.Response{ Resp: &http.Response{
StatusCode: http.StatusOK, StatusCode: http.StatusOK,
Header: header(), Header: header(),
Body: objBody(&api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}), Body: objBody(&corev1.Pod{TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: "Pod"}, ObjectMeta: metav1.ObjectMeta{Name: "foo"}}),
}, },
Req: func(req *http.Request) bool { Req: func(req *http.Request) bool {
if req.Method != "GET" { if req.Method != "GET" {
@ -274,10 +283,10 @@ func TestHelperGet(t *testing.T) {
}, },
}, },
} }
for _, test := range tests { for i, test := range tests {
client := &fake.RESTClient{ client := &fake.RESTClient{
GroupVersion: legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion, GroupVersion: corev1GV,
NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs},
Resp: test.Resp, Resp: test.Resp,
Err: test.HttpErr, Err: test.HttpErr,
} }
@ -286,13 +295,14 @@ func TestHelperGet(t *testing.T) {
NamespaceScoped: true, NamespaceScoped: true,
} }
obj, err := modifier.Get("bar", "foo", false) obj, err := modifier.Get("bar", "foo", false)
if (err != nil) != test.Err { if (err != nil) != test.Err {
t.Errorf("unexpected error: %t %v", test.Err, err) t.Errorf("unexpected error: %d %t %v", i, test.Err, err)
} }
if err != nil { if err != nil {
continue continue
} }
if obj.(*api.Pod).Name != "foo" { if obj.(*corev1.Pod).Name != "foo" {
t.Errorf("unexpected object: %#v", obj) t.Errorf("unexpected object: %#v", obj)
} }
if test.Req != nil && !test.Req(client.Req) { if test.Req != nil && !test.Req(client.Req) {
@ -324,8 +334,8 @@ func TestHelperList(t *testing.T) {
Resp: &http.Response{ Resp: &http.Response{
StatusCode: http.StatusOK, StatusCode: http.StatusOK,
Header: header(), Header: header(),
Body: objBody(&api.PodList{ Body: objBody(&corev1.PodList{
Items: []api.Pod{{ Items: []corev1.Pod{{
ObjectMeta: metav1.ObjectMeta{Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Name: "foo"},
}, },
}, },
@ -340,7 +350,7 @@ func TestHelperList(t *testing.T) {
t.Errorf("url doesn't contain name: %#v", req.URL) t.Errorf("url doesn't contain name: %#v", req.URL)
return false return false
} }
if req.URL.Query().Get(metav1.LabelSelectorQueryParam(legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion.String())) != labels.SelectorFromSet(labels.Set{"foo": "baz"}).String() { if req.URL.Query().Get(metav1.LabelSelectorQueryParam(corev1GV.String())) != labels.SelectorFromSet(labels.Set{"foo": "baz"}).String() {
t.Errorf("url doesn't contain query parameters: %#v", req.URL) t.Errorf("url doesn't contain query parameters: %#v", req.URL)
return false return false
} }
@ -350,8 +360,8 @@ func TestHelperList(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
client := &fake.RESTClient{ client := &fake.RESTClient{
GroupVersion: legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion, GroupVersion: corev1GV,
NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs},
Resp: test.Resp, Resp: test.Resp,
Err: test.HttpErr, Err: test.HttpErr,
} }
@ -359,14 +369,14 @@ func TestHelperList(t *testing.T) {
RESTClient: client, RESTClient: client,
NamespaceScoped: true, NamespaceScoped: true,
} }
obj, err := modifier.List("bar", legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion.String(), false, &metav1.ListOptions{LabelSelector: "foo=baz"}) obj, err := modifier.List("bar", corev1GV.String(), false, &metav1.ListOptions{LabelSelector: "foo=baz"})
if (err != nil) != test.Err { if (err != nil) != test.Err {
t.Errorf("unexpected error: %t %v", test.Err, err) t.Errorf("unexpected error: %t %v", test.Err, err)
} }
if err != nil { if err != nil {
continue continue
} }
if obj.(*api.PodList).Items[0].Name != "foo" { if obj.(*corev1.PodList).Items[0].Name != "foo" {
t.Errorf("unexpected object: %#v", obj) t.Errorf("unexpected object: %#v", obj)
} }
if test.Req != nil && !test.Req(client.Req) { if test.Req != nil && !test.Req(client.Req) {
@ -411,7 +421,7 @@ func TestHelperReplace(t *testing.T) {
{ {
Namespace: "bar", Namespace: "bar",
NamespaceScoped: true, NamespaceScoped: true,
Object: &api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}, Object: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}},
Resp: &http.Response{ Resp: &http.Response{
StatusCode: http.StatusNotFound, StatusCode: http.StatusNotFound,
Header: header(), Header: header(),
@ -422,9 +432,9 @@ func TestHelperReplace(t *testing.T) {
{ {
Namespace: "bar", Namespace: "bar",
NamespaceScoped: true, NamespaceScoped: true,
Object: &api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}, Object: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}},
ExpectPath: "/namespaces/bar/foo", ExpectPath: "/namespaces/bar/foo",
ExpectObject: &api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}, ExpectObject: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}},
Resp: &http.Response{ Resp: &http.Response{
StatusCode: http.StatusOK, StatusCode: http.StatusOK,
Header: header(), Header: header(),
@ -436,30 +446,30 @@ func TestHelperReplace(t *testing.T) {
{ {
Namespace: "bar", Namespace: "bar",
NamespaceScoped: true, NamespaceScoped: true,
Object: &api.Pod{ Object: &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Name: "foo"},
Spec: apitesting.DeepEqualSafePodSpec(), Spec: V1DeepEqualSafePodSpec(),
}, },
ExpectPath: "/namespaces/bar/foo", ExpectPath: "/namespaces/bar/foo",
ExpectObject: &api.Pod{ ExpectObject: &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}, ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"},
Spec: apitesting.DeepEqualSafePodSpec(), Spec: V1DeepEqualSafePodSpec(),
}, },
Overwrite: true, Overwrite: true,
HTTPClient: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { HTTPClient: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
if req.Method == "PUT" { if req.Method == "PUT" {
return &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&metav1.Status{Status: metav1.StatusSuccess})}, nil return &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&metav1.Status{Status: metav1.StatusSuccess})}, nil
} }
return &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}})}, nil return &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}})}, nil
}), }),
Req: expectPut, Req: expectPut,
}, },
// cluster scoped resource // cluster scoped resource
{ {
Object: &api.Node{ Object: &corev1.Node{
ObjectMeta: metav1.ObjectMeta{Name: "foo"}, ObjectMeta: metav1.ObjectMeta{Name: "foo"},
}, },
ExpectObject: &api.Node{ ExpectObject: &corev1.Node{
ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}, ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"},
}, },
Overwrite: true, Overwrite: true,
@ -468,31 +478,31 @@ func TestHelperReplace(t *testing.T) {
if req.Method == "PUT" { if req.Method == "PUT" {
return &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&metav1.Status{Status: metav1.StatusSuccess})}, nil return &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&metav1.Status{Status: metav1.StatusSuccess})}, nil
} }
return &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&api.Node{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}})}, nil return &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}})}, nil
}), }),
Req: expectPut, Req: expectPut,
}, },
{ {
Namespace: "bar", Namespace: "bar",
NamespaceScoped: true, NamespaceScoped: true,
Object: &api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}}, Object: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}},
ExpectPath: "/namespaces/bar/foo", ExpectPath: "/namespaces/bar/foo",
ExpectObject: &api.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}}, ExpectObject: &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: "10"}},
Resp: &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&metav1.Status{Status: metav1.StatusSuccess})}, Resp: &http.Response{StatusCode: http.StatusOK, Header: header(), Body: objBody(&metav1.Status{Status: metav1.StatusSuccess})},
Req: expectPut, Req: expectPut,
}, },
} }
for i, test := range tests { for i, test := range tests {
client := &fake.RESTClient{ client := &fake.RESTClient{
GroupVersion: legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion, GroupVersion: corev1GV,
NegotiatedSerializer: testapi.Default.NegotiatedSerializer(), NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs},
Client: test.HTTPClient, Client: test.HTTPClient,
Resp: test.Resp, Resp: test.Resp,
Err: test.HttpErr, Err: test.HttpErr,
} }
modifier := &Helper{ modifier := &Helper{
RESTClient: client, RESTClient: client,
Versioner: testapi.Default.MetadataAccessor(), Versioner: metaAccessor,
NamespaceScoped: test.NamespaceScoped, NamespaceScoped: test.NamespaceScoped,
} }
_, err := modifier.Replace(test.Namespace, "foo", test.Overwrite, test.Object) _, err := modifier.Replace(test.Namespace, "foo", test.Overwrite, test.Object)
@ -511,7 +521,7 @@ func TestHelperReplace(t *testing.T) {
} }
expect := []byte{} expect := []byte{}
if test.ExpectObject != nil { if test.ExpectObject != nil {
expect = []byte(runtime.EncodeOrDie(testapi.Default.Codec(), test.ExpectObject)) expect = []byte(runtime.EncodeOrDie(corev1Codec, test.ExpectObject))
} }
if !reflect.DeepEqual(expect, body) { if !reflect.DeepEqual(expect, body) {
t.Errorf("%d: unexpected body: %s", i, string(body)) t.Errorf("%d: unexpected body: %s", i, string(body))