Update client library to react to changes in Decoding

This commit is contained in:
Clayton Coleman 2015-12-21 00:32:52 -05:00
parent 24a7919002
commit efe88e0818
20 changed files with 65 additions and 88 deletions

View File

@ -48,13 +48,14 @@ func (g *genGroup) Namers(c *generator.Context) namer.NameSystems {
} }
func (g *genGroup) Imports(c *generator.Context) (imports []string) { func (g *genGroup) Imports(c *generator.Context) (imports []string) {
return append(g.imports.ImportLines(), "fmt") return g.imports.ImportLines()
} }
func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
sw := generator.NewSnippetWriter(w, c, "$", "$") sw := generator.NewSnippetWriter(w, c, "$", "$")
const pkgUnversioned = "k8s.io/kubernetes/pkg/client/unversioned" const pkgUnversioned = "k8s.io/kubernetes/pkg/client/unversioned"
const pkgRegistered = "k8s.io/kubernetes/pkg/apimachinery/registered" const pkgRegistered = "k8s.io/kubernetes/pkg/apimachinery/registered"
const pkgAPI = "k8s.io/kubernetes/pkg/api"
apiPath := func(group string) string { apiPath := func(group string) string {
if group == "legacy" { if group == "legacy" {
return `"/api"` return `"/api"`
@ -81,6 +82,7 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer
"latestGroup": c.Universe.Variable(types.Name{Package: pkgRegistered, Name: "Group"}), "latestGroup": c.Universe.Variable(types.Name{Package: pkgRegistered, Name: "Group"}),
"GroupOrDie": c.Universe.Variable(types.Name{Package: pkgRegistered, Name: "GroupOrDie"}), "GroupOrDie": c.Universe.Variable(types.Name{Package: pkgRegistered, Name: "GroupOrDie"}),
"apiPath": apiPath(g.group), "apiPath": apiPath(g.group),
"latestCodecs": c.Universe.Variable(types.Name{Package: pkgAPI, Name: "Codecs"}),
} }
sw.Do(groupInterfaceTemplate, m) sw.Do(groupInterfaceTemplate, m)
sw.Do(groupClientTemplate, m) sw.Do(groupClientTemplate, m)
@ -181,12 +183,7 @@ func setConfigDefaults(config *$.Config|raw$) error {
config.GroupVersion = &copyGroupVersion config.GroupVersion = &copyGroupVersion
//} //}
versionInterfaces, err := g.InterfacesFor(*config.GroupVersion) config.Codec = $.latestCodecs|raw$.LegacyCodec(*config.GroupVersion)
if err != nil {
return fmt.Errorf("$.Group$ API version '%s' is not recognized (valid values: %s)",
config.GroupVersion, g.GroupVersions)
}
config.Codec = versionInterfaces.Codec
if config.QPS == 0 { if config.QPS == 0 {
config.QPS = 5 config.QPS = 5
} }

View File

@ -17,7 +17,7 @@ limitations under the License.
package unversioned package unversioned
import ( import (
"fmt" api "k8s.io/kubernetes/pkg/api"
registered "k8s.io/kubernetes/pkg/apimachinery/registered" registered "k8s.io/kubernetes/pkg/apimachinery/registered"
unversioned "k8s.io/kubernetes/pkg/client/unversioned" unversioned "k8s.io/kubernetes/pkg/client/unversioned"
) )
@ -79,12 +79,7 @@ func setConfigDefaults(config *unversioned.Config) error {
config.GroupVersion = &copyGroupVersion config.GroupVersion = &copyGroupVersion
//} //}
versionInterfaces, err := g.InterfacesFor(*config.GroupVersion) config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
if err != nil {
return fmt.Errorf("Testgroup API version '%s' is not recognized (valid values: %s)",
config.GroupVersion, g.GroupVersions)
}
config.Codec = versionInterfaces.Codec
if config.QPS == 0 { if config.QPS == 0 {
config.QPS = 5 config.QPS = 5
} }

View File

@ -40,7 +40,7 @@ func init() {
return return
} }
testapi.Groups[testgroup.SchemeGroupVersion.Group] = testapi.NewTestGroup( testapi.Groups[testgroup.SchemeGroupVersion.Group] = testapi.NewTestGroup(
unversioned.GroupVersion{Group: testgroup.SchemeGroupVersion.Group, Version: registered.GroupOrDie(testgroup.SchemeGroupVersion.Group).GroupVersion.Version}, registered.GroupOrDie(testgroup.SchemeGroupVersion.Group).GroupVersion,
testgroup.SchemeGroupVersion) testgroup.SchemeGroupVersion)
testHelper = testapi.Groups[testgroup.SchemeGroupVersion.Group] testHelper = testapi.Groups[testgroup.SchemeGroupVersion.Group]
} }

View File

@ -128,7 +128,7 @@ type objects struct {
types map[string][]runtime.Object types map[string][]runtime.Object
last map[string]int last map[string]int
scheme ObjectScheme scheme ObjectScheme
decoder runtime.ObjectDecoder decoder runtime.Decoder
} }
var _ ObjectRetriever = &objects{} var _ ObjectRetriever = &objects{}
@ -143,7 +143,7 @@ var _ ObjectRetriever = &objects{}
// as a runtime.Object if Status == Success). If multiple PodLists are provided, they // as a runtime.Object if Status == Success). If multiple PodLists are provided, they
// will be returned in order by the Kind call, and the last PodList will be reused for // will be returned in order by the Kind call, and the last PodList will be reused for
// subsequent calls. // subsequent calls.
func NewObjects(scheme ObjectScheme, decoder runtime.ObjectDecoder) ObjectRetriever { func NewObjects(scheme ObjectScheme, decoder runtime.Decoder) ObjectRetriever {
return objects{ return objects{
types: make(map[string][]runtime.Object), types: make(map[string][]runtime.Object),
last: make(map[string]int), last: make(map[string]int),

View File

@ -30,7 +30,7 @@ import (
// Clientset returns a clientset that will respond with the provided objects // Clientset returns a clientset that will respond with the provided objects
func NewSimpleClientset(objects ...runtime.Object) *Clientset { func NewSimpleClientset(objects ...runtime.Object) *Clientset {
o := core.NewObjects(api.Scheme, api.Scheme) o := core.NewObjects(api.Scheme, api.Codecs.UniversalDecoder())
for _, obj := range objects { for _, obj := range objects {
if err := o.Add(obj); err != nil { if err := o.Add(obj); err != nil {
panic(err) panic(err)

View File

@ -18,6 +18,7 @@ package unversioned
import ( import (
"fmt" "fmt"
registered "k8s.io/kubernetes/pkg/apimachinery/registered" registered "k8s.io/kubernetes/pkg/apimachinery/registered"
unversioned "k8s.io/kubernetes/pkg/client/unversioned" unversioned "k8s.io/kubernetes/pkg/client/unversioned"
) )
@ -109,12 +110,7 @@ func setConfigDefaults(config *unversioned.Config) error {
config.GroupVersion = &copyGroupVersion config.GroupVersion = &copyGroupVersion
//} //}
versionInterfaces, err := g.InterfacesFor(*config.GroupVersion) config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
if err != nil {
return fmt.Errorf("Extensions API version '%s' is not recognized (valid values: %s)",
config.GroupVersion, g.GroupVersions)
}
config.Codec = versionInterfaces.Codec
if config.QPS == 0 { if config.QPS == 0 {
config.QPS = 5 config.QPS = 5
} }

View File

@ -18,6 +18,7 @@ package unversioned
import ( import (
"fmt" "fmt"
registered "k8s.io/kubernetes/pkg/apimachinery/registered" registered "k8s.io/kubernetes/pkg/apimachinery/registered"
unversioned "k8s.io/kubernetes/pkg/client/unversioned" unversioned "k8s.io/kubernetes/pkg/client/unversioned"
) )
@ -149,12 +150,7 @@ func setConfigDefaults(config *unversioned.Config) error {
config.GroupVersion = &copyGroupVersion config.GroupVersion = &copyGroupVersion
//} //}
versionInterfaces, err := g.InterfacesFor(*config.GroupVersion) config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
if err != nil {
return fmt.Errorf("Legacy API version '%s' is not recognized (valid values: %s)",
config.GroupVersion, g.GroupVersions)
}
config.Codec = versionInterfaces.Codec
if config.QPS == 0 { if config.QPS == 0 {
config.QPS = 5 config.QPS = 5
} }

View File

@ -30,6 +30,8 @@ import (
"k8s.io/kubernetes/pkg/version" "k8s.io/kubernetes/pkg/version"
) )
const nameRequiredError = "resource name may not be empty"
func TestGetServerVersion(t *testing.T) { func TestGetServerVersion(t *testing.T) {
expect := version.Info{ expect := version.Info{
Major: "foo", Major: "foo",
@ -75,7 +77,7 @@ func TestGetServerGroupsWithV1Server(t *testing.T) {
} }
output, err := json.Marshal(obj) output, err := json.Marshal(obj)
if err != nil { if err != nil {
t.Errorf("unexpected encoding error: %v", err) t.Fatalf("unexpected encoding error: %v", err)
return return
} }
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
@ -88,7 +90,7 @@ func TestGetServerGroupsWithV1Server(t *testing.T) {
// ServerGroups should not return an error even if server returns error at /api and /apis // ServerGroups should not return an error even if server returns error at /api and /apis
apiGroupList, err := client.Discovery().ServerGroups() apiGroupList, err := client.Discovery().ServerGroups()
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
groupVersions := ExtractGroupVersions(apiGroupList) groupVersions := ExtractGroupVersions(apiGroupList)
if !reflect.DeepEqual(groupVersions, []string{"v1"}) { if !reflect.DeepEqual(groupVersions, []string{"v1"}) {

View File

@ -27,6 +27,7 @@ import (
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/version" "k8s.io/kubernetes/pkg/version"
) )
@ -209,8 +210,7 @@ func (d *DiscoveryClient) SwaggerSchema(version unversioned.GroupVersion) (*swag
func setDiscoveryDefaults(config *Config) error { func setDiscoveryDefaults(config *Config) error {
config.APIPath = "" config.APIPath = ""
config.GroupVersion = nil config.GroupVersion = nil
// Discovery client deals with unversioned objects, so we use api.Codec. config.Codec = runtime.NoopEncoder{api.Codecs.UniversalDecoder()}
config.Codec = api.Codec
return nil return nil
} }

View File

@ -17,8 +17,7 @@ limitations under the License.
package unversioned package unversioned
import ( import (
"fmt" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apimachinery/registered"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
) )
@ -121,12 +120,7 @@ func setExtensionsDefaults(config *Config) error {
config.GroupVersion = &copyGroupVersion config.GroupVersion = &copyGroupVersion
//} //}
versionInterfaces, err := g.InterfacesFor(*config.GroupVersion) config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
if err != nil {
return fmt.Errorf("Extensions API group/version '%v' is not recognized (valid values: %v)",
config.GroupVersion, registered.GroupOrDie(extensions.GroupName).GroupVersions)
}
config.Codec = versionInterfaces.Codec
if config.QPS == 0 { if config.QPS == 0 {
config.QPS = 5 config.QPS = 5
} }

View File

@ -378,12 +378,8 @@ func SetKubernetesDefaults(config *Config) error {
// TODO: Unconditionally set the config.Version, until we fix the config. // TODO: Unconditionally set the config.Version, until we fix the config.
copyGroupVersion := g.GroupVersion copyGroupVersion := g.GroupVersion
config.GroupVersion = &copyGroupVersion config.GroupVersion = &copyGroupVersion
versionInterfaces, err := g.InterfacesFor(*config.GroupVersion)
if err != nil {
return fmt.Errorf("API version '%v' is not recognized (valid values: %v)", *config.GroupVersion, registered.GroupOrDie(api.GroupName).GroupVersions)
}
if config.Codec == nil { if config.Codec == nil {
config.Codec = versionInterfaces.Codec config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
} }
if config.QPS == 0.0 { if config.QPS == 0.0 {
config.QPS = 5.0 config.QPS = 5.0

View File

@ -56,7 +56,7 @@ func TestNegotiateVersion(t *testing.T) {
name: "server supports client default", name: "server supports client default",
version: &uapi.GroupVersion{Version: "version1"}, version: &uapi.GroupVersion{Version: "version1"},
config: &unversioned.Config{}, config: &unversioned.Config{},
serverVersions: []string{"/version1", testapi.Default.GroupVersion().String()}, serverVersions: []string{"version1", testapi.Default.GroupVersion().String()},
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()}, clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
expectedVersion: &uapi.GroupVersion{Version: "version1"}, expectedVersion: &uapi.GroupVersion{Version: "version1"},
}, },
@ -64,28 +64,28 @@ func TestNegotiateVersion(t *testing.T) {
name: "server falls back to client supported", name: "server falls back to client supported",
version: testapi.Default.GroupVersion(), version: testapi.Default.GroupVersion(),
config: &unversioned.Config{}, config: &unversioned.Config{},
serverVersions: []string{"/version1"}, serverVersions: []string{"version1"},
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()}, clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
expectedVersion: &uapi.GroupVersion{Version: "version1"}, expectedVersion: &uapi.GroupVersion{Version: "version1"},
}, },
{ {
name: "explicit version supported", name: "explicit version supported",
config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()}, config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()},
serverVersions: []string{"/version1", testapi.Default.GroupVersion().String()}, serverVersions: []string{"/ersion1", testapi.Default.GroupVersion().String()},
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()}, clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
expectedVersion: testapi.Default.GroupVersion(), expectedVersion: testapi.Default.GroupVersion(),
}, },
{ {
name: "explicit version not supported", name: "explicit version not supported",
config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()}, config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()},
serverVersions: []string{"/version1"}, serverVersions: []string{"version1"},
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()}, clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
expectErr: func(err error) bool { return strings.Contains(err.Error(), `server does not support API version "v1"`) }, expectErr: func(err error) bool { return strings.Contains(err.Error(), `server does not support API version "v1"`) },
}, },
{ {
name: "connection refused error", name: "connection refused error",
config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()}, config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()},
serverVersions: []string{"/version1"}, serverVersions: []string{"version1"},
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()}, clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
sendErr: errors.New("connection refused"), sendErr: errors.New("connection refused"),
expectErr: func(err error) bool { return strings.Contains(err.Error(), "connection refused") }, expectErr: func(err error) bool { return strings.Contains(err.Error(), "connection refused") },

View File

@ -222,7 +222,7 @@ func TestSetsCodec(t *testing.T) {
if e, a := expected.Prefix, client.RESTClient.versionedAPIPath; e != a { if e, a := expected.Prefix, client.RESTClient.versionedAPIPath; e != a {
t.Errorf("expected %#v, got %#v", e, a) t.Errorf("expected %#v, got %#v", e, a)
} }
if e, a := expected.Codec, client.RESTClient.Codec; e != a { if e, a := expected.Codec, client.RESTClient.Codec; !reflect.DeepEqual(e, a) {
t.Errorf("expected %#v, got %#v", e, a) t.Errorf("expected %#v, got %#v", e, a)
} }
} }

View File

@ -452,7 +452,7 @@ func (r *Request) VersionedParams(obj runtime.Object, convertor runtime.ObjectCo
continue continue
} }
if k == unversioned.FieldSelectorQueryParam(r.groupVersion.String()) { if k == unversioned.FieldSelectorQueryParam(r.groupVersion.String()) {
if value == "" { if len(value) == 0 {
// Don't set an empty selector for backward compatibility. // Don't set an empty selector for backward compatibility.
// Since there is no way to get the difference between empty // Since there is no way to get the difference between empty
// and unspecified string, we don't set it to avoid having // and unspecified string, we don't set it to avoid having
@ -717,7 +717,7 @@ func (r *Request) Stream() (io.ReadCloser, error) {
return nil, fmt.Errorf("%v while accessing %v", resp.Status, url) return nil, fmt.Errorf("%v while accessing %v", resp.Status, url)
} }
if runtimeObject, err := r.codec.Decode(bodyBytes); err == nil { if runtimeObject, err := runtime.Decode(r.codec, bodyBytes); err == nil {
statusError := errors.FromObject(runtimeObject) statusError := errors.FromObject(runtimeObject)
if _, ok := statusError.(errors.APIStatus); ok { if _, ok := statusError.(errors.APIStatus); ok {
@ -846,8 +846,10 @@ func (r *Request) transformResponse(resp *http.Response, req *http.Request) Resu
// Did the server give us a status response? // Did the server give us a status response?
isStatusResponse := false isStatusResponse := false
var status unversioned.Status var status *unversioned.Status
if err := r.codec.DecodeInto(body, &status); err == nil && status.Status != "" { result, err := runtime.Decode(r.codec, body)
if out, ok := result.(*unversioned.Status); err == nil && ok && len(out.Status) > 0 {
status = out
isStatusResponse = true isStatusResponse = true
} }
@ -858,14 +860,14 @@ func (r *Request) transformResponse(resp *http.Response, req *http.Request) Resu
if !isStatusResponse { if !isStatusResponse {
return Result{err: r.transformUnstructuredResponseError(resp, req, body)} return Result{err: r.transformUnstructuredResponseError(resp, req, body)}
} }
return Result{err: errors.FromObject(&status)} return Result{err: errors.FromObject(status)}
} }
// If the server gave us a status back, look at what it was. // If the server gave us a status back, look at what it was.
success := resp.StatusCode >= http.StatusOK && resp.StatusCode <= http.StatusPartialContent success := resp.StatusCode >= http.StatusOK && resp.StatusCode <= http.StatusPartialContent
if isStatusResponse && (status.Status != unversioned.StatusSuccess && !success) { if isStatusResponse && (status.Status != unversioned.StatusSuccess && !success) {
// "Failed" requests are clearly just an error and it makes sense to return them as such. // "Failed" requests are clearly just an error and it makes sense to return them as such.
return Result{err: errors.FromObject(&status)} return Result{err: errors.FromObject(status)}
} }
return Result{ return Result{
@ -965,7 +967,8 @@ func (r Result) Get() (runtime.Object, error) {
if r.err != nil { if r.err != nil {
return nil, r.err return nil, r.err
} }
return r.codec.Decode(r.body) obj, err := runtime.Decode(r.codec, r.body)
return obj, err
} }
// StatusCode returns the HTTP status code of the request. (Only valid if no // StatusCode returns the HTTP status code of the request. (Only valid if no
@ -975,12 +978,12 @@ func (r Result) StatusCode(statusCode *int) Result {
return r return r
} }
// Into stores the result into obj, if possible. // Into stores the result into obj, if possible. If obj is nil it is ignored.
func (r Result) Into(obj runtime.Object) error { func (r Result) Into(obj runtime.Object) error {
if r.err != nil { if r.err != nil {
return r.err return r.err
} }
return r.codec.DecodeInto(r.body, obj) return runtime.DecodeInto(r.codec, r.body, obj)
} }
// WasCreated updates the provided bool pointer to whether the server returned // WasCreated updates the provided bool pointer to whether the server returned

View File

@ -698,7 +698,7 @@ func TestDoRequestNewWay(t *testing.T) {
Port: 12345, Port: 12345,
TargetPort: intstr.FromInt(12345), TargetPort: intstr.FromInt(12345),
}}}} }}}}
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj) expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
fakeHandler := utiltesting.FakeHandler{ fakeHandler := utiltesting.FakeHandler{
StatusCode: 200, StatusCode: 200,
ResponseBody: string(expectedBody), ResponseBody: string(expectedBody),
@ -861,13 +861,13 @@ func BenchmarkCheckRetryClosesBody(b *testing.B) {
func TestDoRequestNewWayReader(t *testing.T) { func TestDoRequestNewWayReader(t *testing.T) {
reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
reqBodyExpected, _ := testapi.Default.Codec().Encode(reqObj) reqBodyExpected, _ := runtime.Encode(testapi.Default.Codec(), reqObj)
expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{ expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{
Protocol: "TCP", Protocol: "TCP",
Port: 12345, Port: 12345,
TargetPort: intstr.FromInt(12345), TargetPort: intstr.FromInt(12345),
}}}} }}}}
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj) expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
fakeHandler := utiltesting.FakeHandler{ fakeHandler := utiltesting.FakeHandler{
StatusCode: 200, StatusCode: 200,
ResponseBody: string(expectedBody), ResponseBody: string(expectedBody),
@ -902,13 +902,13 @@ func TestDoRequestNewWayReader(t *testing.T) {
func TestDoRequestNewWayObj(t *testing.T) { func TestDoRequestNewWayObj(t *testing.T) {
reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
reqBodyExpected, _ := testapi.Default.Codec().Encode(reqObj) reqBodyExpected, _ := runtime.Encode(testapi.Default.Codec(), reqObj)
expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{ expectedObj := &api.Service{Spec: api.ServiceSpec{Ports: []api.ServicePort{{
Protocol: "TCP", Protocol: "TCP",
Port: 12345, Port: 12345,
TargetPort: intstr.FromInt(12345), TargetPort: intstr.FromInt(12345),
}}}} }}}}
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj) expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
fakeHandler := utiltesting.FakeHandler{ fakeHandler := utiltesting.FakeHandler{
StatusCode: 200, StatusCode: 200,
ResponseBody: string(expectedBody), ResponseBody: string(expectedBody),
@ -943,7 +943,7 @@ func TestDoRequestNewWayObj(t *testing.T) {
func TestDoRequestNewWayFile(t *testing.T) { func TestDoRequestNewWayFile(t *testing.T) {
reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
reqBodyExpected, err := testapi.Default.Codec().Encode(reqObj) reqBodyExpected, err := runtime.Encode(testapi.Default.Codec(), reqObj)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
@ -964,7 +964,7 @@ func TestDoRequestNewWayFile(t *testing.T) {
Port: 12345, Port: 12345,
TargetPort: intstr.FromInt(12345), TargetPort: intstr.FromInt(12345),
}}}} }}}}
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj) expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
fakeHandler := utiltesting.FakeHandler{ fakeHandler := utiltesting.FakeHandler{
StatusCode: 200, StatusCode: 200,
ResponseBody: string(expectedBody), ResponseBody: string(expectedBody),
@ -1000,7 +1000,7 @@ func TestDoRequestNewWayFile(t *testing.T) {
func TestWasCreated(t *testing.T) { func TestWasCreated(t *testing.T) {
reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} reqObj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
reqBodyExpected, err := testapi.Default.Codec().Encode(reqObj) reqBodyExpected, err := runtime.Encode(testapi.Default.Codec(), reqObj)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
@ -1010,7 +1010,7 @@ func TestWasCreated(t *testing.T) {
Port: 12345, Port: 12345,
TargetPort: intstr.FromInt(12345), TargetPort: intstr.FromInt(12345),
}}}} }}}}
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj) expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
fakeHandler := utiltesting.FakeHandler{ fakeHandler := utiltesting.FakeHandler{
StatusCode: 201, StatusCode: 201,
ResponseBody: string(expectedBody), ResponseBody: string(expectedBody),
@ -1138,7 +1138,7 @@ func TestBody(t *testing.T) {
const data = "test payload" const data = "test payload"
obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}} obj := &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo"}}
bodyExpected, _ := testapi.Default.Codec().Encode(obj) bodyExpected, _ := runtime.Encode(testapi.Default.Codec(), obj)
f, err := ioutil.TempFile("", "test_body") f, err := ioutil.TempFile("", "test_body")
if err != nil { if err != nil {

View File

@ -28,13 +28,14 @@ import (
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
utiltesting "k8s.io/kubernetes/pkg/util/testing" utiltesting "k8s.io/kubernetes/pkg/util/testing"
) )
func TestDoRequestSuccess(t *testing.T) { func TestDoRequestSuccess(t *testing.T) {
status := &unversioned.Status{Status: unversioned.StatusSuccess} status := &unversioned.Status{Status: unversioned.StatusSuccess}
expectedBody, _ := testapi.Default.Codec().Encode(status) expectedBody, _ := runtime.Encode(testapi.Default.Codec(), status)
fakeHandler := utiltesting.FakeHandler{ fakeHandler := utiltesting.FakeHandler{
StatusCode: 200, StatusCode: 200,
ResponseBody: string(expectedBody), ResponseBody: string(expectedBody),
@ -60,7 +61,7 @@ func TestDoRequestSuccess(t *testing.T) {
if fakeHandler.RequestReceived.Header["Authorization"] == nil { if fakeHandler.RequestReceived.Header["Authorization"] == nil {
t.Errorf("Request is missing authorization header: %#v", fakeHandler.RequestReceived) t.Errorf("Request is missing authorization header: %#v", fakeHandler.RequestReceived)
} }
statusOut, err := testapi.Default.Codec().Decode(body) statusOut, err := runtime.Decode(testapi.Default.Codec(), body)
if err != nil { if err != nil {
t.Errorf("Unexpected error %#v", err) t.Errorf("Unexpected error %#v", err)
} }
@ -78,7 +79,7 @@ func TestDoRequestFailed(t *testing.T) {
Message: " \"\" not found", Message: " \"\" not found",
Details: &unversioned.StatusDetails{}, Details: &unversioned.StatusDetails{},
} }
expectedBody, _ := testapi.Default.Codec().Encode(status) expectedBody, _ := runtime.Encode(testapi.Default.Codec(), status)
fakeHandler := utiltesting.FakeHandler{ fakeHandler := utiltesting.FakeHandler{
StatusCode: 404, StatusCode: 404,
ResponseBody: string(expectedBody), ResponseBody: string(expectedBody),
@ -111,7 +112,7 @@ func TestDoRequestFailed(t *testing.T) {
func TestDoRequestCreated(t *testing.T) { func TestDoRequestCreated(t *testing.T) {
status := &unversioned.Status{Status: unversioned.StatusSuccess} status := &unversioned.Status{Status: unversioned.StatusSuccess}
expectedBody, _ := testapi.Default.Codec().Encode(status) expectedBody, _ := runtime.Encode(testapi.Default.Codec(), status)
fakeHandler := utiltesting.FakeHandler{ fakeHandler := utiltesting.FakeHandler{
StatusCode: 201, StatusCode: 201,
ResponseBody: string(expectedBody), ResponseBody: string(expectedBody),
@ -138,7 +139,7 @@ func TestDoRequestCreated(t *testing.T) {
if !created { if !created {
t.Errorf("Expected object to be created") t.Errorf("Expected object to be created")
} }
statusOut, err := testapi.Default.Codec().Decode(body) statusOut, err := runtime.Decode(testapi.Default.Codec(), body)
if err != nil { if err != nil {
t.Errorf("Unexpected error %#v", err) t.Errorf("Unexpected error %#v", err)
} }

View File

@ -128,7 +128,7 @@ type objects struct {
types map[string][]runtime.Object types map[string][]runtime.Object
last map[string]int last map[string]int
scheme ObjectScheme scheme ObjectScheme
decoder runtime.ObjectDecoder decoder runtime.Decoder
} }
var _ ObjectRetriever = &objects{} var _ ObjectRetriever = &objects{}
@ -143,7 +143,7 @@ var _ ObjectRetriever = &objects{}
// as a runtime.Object if Status == Success). If multiple PodLists are provided, they // as a runtime.Object if Status == Success). If multiple PodLists are provided, they
// will be returned in order by the Kind call, and the last PodList will be reused for // will be returned in order by the Kind call, and the last PodList will be reused for
// subsequent calls. // subsequent calls.
func NewObjects(scheme ObjectScheme, decoder runtime.ObjectDecoder) ObjectRetriever { func NewObjects(scheme ObjectScheme, decoder runtime.Decoder) ObjectRetriever {
return objects{ return objects{
types: make(map[string][]runtime.Object), types: make(map[string][]runtime.Object),
last: make(map[string]int), last: make(map[string]int),
@ -153,10 +153,7 @@ func NewObjects(scheme ObjectScheme, decoder runtime.ObjectDecoder) ObjectRetrie
} }
func (o objects) Kind(kind unversioned.GroupVersionKind, name string) (runtime.Object, error) { func (o objects) Kind(kind unversioned.GroupVersionKind, name string) (runtime.Object, error) {
// TODO our test clients deal in internal versions. We need to plumb that knowledge down here kind.Version = runtime.APIVersionInternal
// we might do this via an extra function to the scheme to allow getting internal group versions
// I'm punting for now
kind.Version = ""
empty, _ := o.scheme.New(kind) empty, _ := o.scheme.New(kind)
nilValue := reflect.Zero(reflect.TypeOf(empty)).Interface().(runtime.Object) nilValue := reflect.Zero(reflect.TypeOf(empty)).Interface().(runtime.Object)

View File

@ -213,7 +213,7 @@ func body(t *testing.T, obj runtime.Object, raw *string) *string {
if !found { if !found {
t.Errorf("Group %s is not registered in testapi", fqKind.GroupVersion().Group) t.Errorf("Group %s is not registered in testapi", fqKind.GroupVersion().Group)
} }
bs, err = g.Codec().Encode(obj) bs, err = runtime.Encode(g.Codec(), obj)
if err != nil { if err != nil {
t.Errorf("unexpected encoding error: %v", err) t.Errorf("unexpected encoding error: %v", err)
} }

View File

@ -33,7 +33,7 @@ import (
// NewSimpleFake returns a client that will respond with the provided objects // NewSimpleFake returns a client that will respond with the provided objects
func NewSimpleFake(objects ...runtime.Object) *Fake { func NewSimpleFake(objects ...runtime.Object) *Fake {
o := NewObjects(api.Scheme, api.Scheme) o := NewObjects(api.Scheme, api.Codecs.UniversalDecoder())
for _, obj := range objects { for _, obj := range objects {
if err := o.Add(obj); err != nil { if err := o.Add(obj); err != nil {
panic(err) panic(err)

View File

@ -26,8 +26,8 @@ import (
) )
func TestNewClient(t *testing.T) { func TestNewClient(t *testing.T) {
o := NewObjects(api.Scheme, api.Scheme) o := NewObjects(api.Scheme, api.Codecs.UniversalDecoder())
if err := AddObjectsFromPath("../../../../examples/guestbook/frontend-service.yaml", o, api.Scheme); err != nil { if err := AddObjectsFromPath("../../../../examples/guestbook/frontend-service.yaml", o, api.Codecs.UniversalDecoder()); err != nil {
t.Fatal(err) t.Fatal(err)
} }
client := &Fake{} client := &Fake{}
@ -52,7 +52,7 @@ func TestNewClient(t *testing.T) {
} }
func TestErrors(t *testing.T) { func TestErrors(t *testing.T) {
o := NewObjects(api.Scheme, api.Scheme) o := NewObjects(api.Scheme, api.Codecs.UniversalDecoder())
o.Add(&api.List{ o.Add(&api.List{
Items: []runtime.Object{ Items: []runtime.Object{
// This first call to List will return this error // This first call to List will return this error