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) {
return append(g.imports.ImportLines(), "fmt")
return g.imports.ImportLines()
}
func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
sw := generator.NewSnippetWriter(w, c, "$", "$")
const pkgUnversioned = "k8s.io/kubernetes/pkg/client/unversioned"
const pkgRegistered = "k8s.io/kubernetes/pkg/apimachinery/registered"
const pkgAPI = "k8s.io/kubernetes/pkg/api"
apiPath := func(group string) string {
if group == "legacy" {
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"}),
"GroupOrDie": c.Universe.Variable(types.Name{Package: pkgRegistered, Name: "GroupOrDie"}),
"apiPath": apiPath(g.group),
"latestCodecs": c.Universe.Variable(types.Name{Package: pkgAPI, Name: "Codecs"}),
}
sw.Do(groupInterfaceTemplate, m)
sw.Do(groupClientTemplate, m)
@ -181,12 +183,7 @@ func setConfigDefaults(config *$.Config|raw$) error {
config.GroupVersion = &copyGroupVersion
//}
versionInterfaces, err := g.InterfacesFor(*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
config.Codec = $.latestCodecs|raw$.LegacyCodec(*config.GroupVersion)
if config.QPS == 0 {
config.QPS = 5
}

View File

@ -17,7 +17,7 @@ limitations under the License.
package unversioned
import (
"fmt"
api "k8s.io/kubernetes/pkg/api"
registered "k8s.io/kubernetes/pkg/apimachinery/registered"
unversioned "k8s.io/kubernetes/pkg/client/unversioned"
)
@ -79,12 +79,7 @@ func setConfigDefaults(config *unversioned.Config) error {
config.GroupVersion = &copyGroupVersion
//}
versionInterfaces, err := g.InterfacesFor(*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
config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
if config.QPS == 0 {
config.QPS = 5
}

View File

@ -40,7 +40,7 @@ func init() {
return
}
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)
testHelper = testapi.Groups[testgroup.SchemeGroupVersion.Group]
}

View File

@ -128,7 +128,7 @@ type objects struct {
types map[string][]runtime.Object
last map[string]int
scheme ObjectScheme
decoder runtime.ObjectDecoder
decoder runtime.Decoder
}
var _ ObjectRetriever = &objects{}
@ -143,7 +143,7 @@ var _ ObjectRetriever = &objects{}
// 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
// subsequent calls.
func NewObjects(scheme ObjectScheme, decoder runtime.ObjectDecoder) ObjectRetriever {
func NewObjects(scheme ObjectScheme, decoder runtime.Decoder) ObjectRetriever {
return objects{
types: make(map[string][]runtime.Object),
last: make(map[string]int),

View File

@ -30,7 +30,7 @@ import (
// Clientset returns a clientset that will respond with the provided objects
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 {
if err := o.Add(obj); err != nil {
panic(err)

View File

@ -18,6 +18,7 @@ package unversioned
import (
"fmt"
registered "k8s.io/kubernetes/pkg/apimachinery/registered"
unversioned "k8s.io/kubernetes/pkg/client/unversioned"
)
@ -109,12 +110,7 @@ func setConfigDefaults(config *unversioned.Config) error {
config.GroupVersion = &copyGroupVersion
//}
versionInterfaces, err := g.InterfacesFor(*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
config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
if config.QPS == 0 {
config.QPS = 5
}

View File

@ -18,6 +18,7 @@ package unversioned
import (
"fmt"
registered "k8s.io/kubernetes/pkg/apimachinery/registered"
unversioned "k8s.io/kubernetes/pkg/client/unversioned"
)
@ -149,12 +150,7 @@ func setConfigDefaults(config *unversioned.Config) error {
config.GroupVersion = &copyGroupVersion
//}
versionInterfaces, err := g.InterfacesFor(*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
config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
if config.QPS == 0 {
config.QPS = 5
}

View File

@ -30,6 +30,8 @@ import (
"k8s.io/kubernetes/pkg/version"
)
const nameRequiredError = "resource name may not be empty"
func TestGetServerVersion(t *testing.T) {
expect := version.Info{
Major: "foo",
@ -75,7 +77,7 @@ func TestGetServerGroupsWithV1Server(t *testing.T) {
}
output, err := json.Marshal(obj)
if err != nil {
t.Errorf("unexpected encoding error: %v", err)
t.Fatalf("unexpected encoding error: %v", err)
return
}
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
apiGroupList, err := client.Discovery().ServerGroups()
if err != nil {
t.Errorf("unexpected error: %v", err)
t.Fatalf("unexpected error: %v", err)
}
groupVersions := ExtractGroupVersions(apiGroupList)
if !reflect.DeepEqual(groupVersions, []string{"v1"}) {

View File

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

View File

@ -17,8 +17,7 @@ limitations under the License.
package unversioned
import (
"fmt"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apimachinery/registered"
"k8s.io/kubernetes/pkg/apis/extensions"
)
@ -121,12 +120,7 @@ func setExtensionsDefaults(config *Config) error {
config.GroupVersion = &copyGroupVersion
//}
versionInterfaces, err := g.InterfacesFor(*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
config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
if config.QPS == 0 {
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.
copyGroupVersion := g.GroupVersion
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 {
config.Codec = versionInterfaces.Codec
config.Codec = api.Codecs.LegacyCodec(*config.GroupVersion)
}
if config.QPS == 0.0 {
config.QPS = 5.0

View File

@ -56,7 +56,7 @@ func TestNegotiateVersion(t *testing.T) {
name: "server supports client default",
version: &uapi.GroupVersion{Version: "version1"},
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()},
expectedVersion: &uapi.GroupVersion{Version: "version1"},
},
@ -64,28 +64,28 @@ func TestNegotiateVersion(t *testing.T) {
name: "server falls back to client supported",
version: testapi.Default.GroupVersion(),
config: &unversioned.Config{},
serverVersions: []string{"/version1"},
serverVersions: []string{"version1"},
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
expectedVersion: &uapi.GroupVersion{Version: "version1"},
},
{
name: "explicit version supported",
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()},
expectedVersion: testapi.Default.GroupVersion(),
},
{
name: "explicit version not supported",
config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()},
serverVersions: []string{"/version1"},
serverVersions: []string{"version1"},
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"`) },
},
{
name: "connection refused error",
config: &unversioned.Config{GroupVersion: testapi.Default.GroupVersion()},
serverVersions: []string{"/version1"},
serverVersions: []string{"version1"},
clientVersions: []uapi.GroupVersion{{Version: "version1"}, *testapi.Default.GroupVersion()},
sendErr: errors.New("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 {
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)
}
}

View File

@ -452,7 +452,7 @@ func (r *Request) VersionedParams(obj runtime.Object, convertor runtime.ObjectCo
continue
}
if k == unversioned.FieldSelectorQueryParam(r.groupVersion.String()) {
if value == "" {
if len(value) == 0 {
// Don't set an empty selector for backward compatibility.
// Since there is no way to get the difference between empty
// 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)
}
if runtimeObject, err := r.codec.Decode(bodyBytes); err == nil {
if runtimeObject, err := runtime.Decode(r.codec, bodyBytes); err == nil {
statusError := errors.FromObject(runtimeObject)
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?
isStatusResponse := false
var status unversioned.Status
if err := r.codec.DecodeInto(body, &status); err == nil && status.Status != "" {
var status *unversioned.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
}
@ -858,14 +860,14 @@ func (r *Request) transformResponse(resp *http.Response, req *http.Request) Resu
if !isStatusResponse {
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.
success := resp.StatusCode >= http.StatusOK && resp.StatusCode <= http.StatusPartialContent
if isStatusResponse && (status.Status != unversioned.StatusSuccess && !success) {
// "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{
@ -965,7 +967,8 @@ func (r Result) Get() (runtime.Object, error) {
if r.err != nil {
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
@ -975,12 +978,12 @@ func (r Result) StatusCode(statusCode *int) Result {
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 {
if r.err != nil {
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

View File

@ -698,7 +698,7 @@ func TestDoRequestNewWay(t *testing.T) {
Port: 12345,
TargetPort: intstr.FromInt(12345),
}}}}
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj)
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
fakeHandler := utiltesting.FakeHandler{
StatusCode: 200,
ResponseBody: string(expectedBody),
@ -861,13 +861,13 @@ func BenchmarkCheckRetryClosesBody(b *testing.B) {
func TestDoRequestNewWayReader(t *testing.T) {
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{{
Protocol: "TCP",
Port: 12345,
TargetPort: intstr.FromInt(12345),
}}}}
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj)
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
fakeHandler := utiltesting.FakeHandler{
StatusCode: 200,
ResponseBody: string(expectedBody),
@ -902,13 +902,13 @@ func TestDoRequestNewWayReader(t *testing.T) {
func TestDoRequestNewWayObj(t *testing.T) {
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{{
Protocol: "TCP",
Port: 12345,
TargetPort: intstr.FromInt(12345),
}}}}
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj)
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
fakeHandler := utiltesting.FakeHandler{
StatusCode: 200,
ResponseBody: string(expectedBody),
@ -943,7 +943,7 @@ func TestDoRequestNewWayObj(t *testing.T) {
func TestDoRequestNewWayFile(t *testing.T) {
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 {
t.Errorf("unexpected error: %v", err)
}
@ -964,7 +964,7 @@ func TestDoRequestNewWayFile(t *testing.T) {
Port: 12345,
TargetPort: intstr.FromInt(12345),
}}}}
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj)
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
fakeHandler := utiltesting.FakeHandler{
StatusCode: 200,
ResponseBody: string(expectedBody),
@ -1000,7 +1000,7 @@ func TestDoRequestNewWayFile(t *testing.T) {
func TestWasCreated(t *testing.T) {
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 {
t.Errorf("unexpected error: %v", err)
}
@ -1010,7 +1010,7 @@ func TestWasCreated(t *testing.T) {
Port: 12345,
TargetPort: intstr.FromInt(12345),
}}}}
expectedBody, _ := testapi.Default.Codec().Encode(expectedObj)
expectedBody, _ := runtime.Encode(testapi.Default.Codec(), expectedObj)
fakeHandler := utiltesting.FakeHandler{
StatusCode: 201,
ResponseBody: string(expectedBody),
@ -1138,7 +1138,7 @@ func TestBody(t *testing.T) {
const data = "test payload"
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")
if err != nil {

View File

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

View File

@ -128,7 +128,7 @@ type objects struct {
types map[string][]runtime.Object
last map[string]int
scheme ObjectScheme
decoder runtime.ObjectDecoder
decoder runtime.Decoder
}
var _ ObjectRetriever = &objects{}
@ -143,7 +143,7 @@ var _ ObjectRetriever = &objects{}
// 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
// subsequent calls.
func NewObjects(scheme ObjectScheme, decoder runtime.ObjectDecoder) ObjectRetriever {
func NewObjects(scheme ObjectScheme, decoder runtime.Decoder) ObjectRetriever {
return objects{
types: make(map[string][]runtime.Object),
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) {
// TODO our test clients deal in internal versions. We need to plumb that knowledge down here
// we might do this via an extra function to the scheme to allow getting internal group versions
// I'm punting for now
kind.Version = ""
kind.Version = runtime.APIVersionInternal
empty, _ := o.scheme.New(kind)
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 {
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 {
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
func NewSimpleFake(objects ...runtime.Object) *Fake {
o := NewObjects(api.Scheme, api.Scheme)
o := NewObjects(api.Scheme, api.Codecs.UniversalDecoder())
for _, obj := range objects {
if err := o.Add(obj); err != nil {
panic(err)

View File

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