mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Refactor test objects to a separate package
This commit is contained in:
		@@ -38,6 +38,7 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/pkg/api/meta"
 | 
						"k8s.io/kubernetes/pkg/api/meta"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/rest"
 | 
						"k8s.io/kubernetes/pkg/api/rest"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/unversioned"
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
 | 
						apiservertesting "k8s.io/kubernetes/pkg/apiserver/testing"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/fields"
 | 
						"k8s.io/kubernetes/pkg/fields"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/labels"
 | 
						"k8s.io/kubernetes/pkg/labels"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/runtime"
 | 
						"k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
@@ -102,7 +103,9 @@ func addTestTypes() {
 | 
				
			|||||||
		Watch                bool   `json:"watch,omitempty"`
 | 
							Watch                bool   `json:"watch,omitempty"`
 | 
				
			||||||
		ResourceVersion      string `json:"resourceVersion,omitempty"`
 | 
							ResourceVersion      string `json:"resourceVersion,omitempty"`
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	api.Scheme.AddKnownTypes(testVersion, &Simple{}, &SimpleList{}, &unversioned.Status{}, &ListOptions{}, &api.DeleteOptions{}, &SimpleGetOptions{}, &SimpleRoot{})
 | 
						api.Scheme.AddKnownTypes(
 | 
				
			||||||
 | 
							testVersion, &apiservertesting.Simple{}, &apiservertesting.SimpleList{}, &unversioned.Status{},
 | 
				
			||||||
 | 
							&ListOptions{}, &api.DeleteOptions{}, &apiservertesting.SimpleGetOptions{}, &apiservertesting.SimpleRoot{})
 | 
				
			||||||
	api.Scheme.AddKnownTypes(testVersion, &api.Pod{})
 | 
						api.Scheme.AddKnownTypes(testVersion, &api.Pod{})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -115,7 +118,9 @@ func addNewTestTypes() {
 | 
				
			|||||||
		Watch                bool   `json:"watch,omitempty"`
 | 
							Watch                bool   `json:"watch,omitempty"`
 | 
				
			||||||
		ResourceVersion      string `json:"resourceVersion,omitempty"`
 | 
							ResourceVersion      string `json:"resourceVersion,omitempty"`
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	api.Scheme.AddKnownTypes(newVersion, &Simple{}, &SimpleList{}, &unversioned.Status{}, &ListOptions{}, &api.DeleteOptions{}, &SimpleGetOptions{}, &SimpleRoot{})
 | 
						api.Scheme.AddKnownTypes(
 | 
				
			||||||
 | 
							newVersion, &apiservertesting.Simple{}, &apiservertesting.SimpleList{}, &unversioned.Status{},
 | 
				
			||||||
 | 
							&ListOptions{}, &api.DeleteOptions{}, &apiservertesting.SimpleGetOptions{}, &apiservertesting.SimpleRoot{})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
@@ -123,7 +128,9 @@ func init() {
 | 
				
			|||||||
	// api.Status is returned in errors
 | 
						// api.Status is returned in errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// "internal" version
 | 
						// "internal" version
 | 
				
			||||||
	api.Scheme.AddKnownTypes("", &Simple{}, &SimpleList{}, &unversioned.Status{}, &api.ListOptions{}, &SimpleGetOptions{}, &SimpleRoot{})
 | 
						api.Scheme.AddKnownTypes(
 | 
				
			||||||
 | 
							"", &apiservertesting.Simple{}, &apiservertesting.SimpleList{}, &unversioned.Status{},
 | 
				
			||||||
 | 
							&api.ListOptions{}, &apiservertesting.SimpleGetOptions{}, &apiservertesting.SimpleRoot{})
 | 
				
			||||||
	addTestTypes()
 | 
						addTestTypes()
 | 
				
			||||||
	addNewTestTypes()
 | 
						addNewTestTypes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -234,50 +241,8 @@ func handleInternal(legacy bool, storage map[string]rest.Storage, admissionContr
 | 
				
			|||||||
	return &defaultAPIServer{mux, group, container}
 | 
						return &defaultAPIServer{mux, group, container}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Simple struct {
 | 
					 | 
				
			||||||
	unversioned.TypeMeta `json:",inline"`
 | 
					 | 
				
			||||||
	api.ObjectMeta       `json:"metadata"`
 | 
					 | 
				
			||||||
	Other                string            `json:"other,omitempty"`
 | 
					 | 
				
			||||||
	Labels               map[string]string `json:"labels,omitempty"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*Simple) IsAnAPIObject() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type SimpleRoot struct {
 | 
					 | 
				
			||||||
	unversioned.TypeMeta `json:",inline"`
 | 
					 | 
				
			||||||
	api.ObjectMeta       `json:"metadata"`
 | 
					 | 
				
			||||||
	Other                string            `json:"other,omitempty"`
 | 
					 | 
				
			||||||
	Labels               map[string]string `json:"labels,omitempty"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*SimpleRoot) IsAnAPIObject() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type SimpleGetOptions struct {
 | 
					 | 
				
			||||||
	unversioned.TypeMeta `json:",inline"`
 | 
					 | 
				
			||||||
	Param1               string `json:"param1"`
 | 
					 | 
				
			||||||
	Param2               string `json:"param2"`
 | 
					 | 
				
			||||||
	Path                 string `json:"atAPath"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (SimpleGetOptions) SwaggerDoc() map[string]string {
 | 
					 | 
				
			||||||
	return map[string]string{
 | 
					 | 
				
			||||||
		"param1": "description for param1",
 | 
					 | 
				
			||||||
		"param2": "description for param2",
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*SimpleGetOptions) IsAnAPIObject() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type SimpleList struct {
 | 
					 | 
				
			||||||
	unversioned.TypeMeta `json:",inline"`
 | 
					 | 
				
			||||||
	unversioned.ListMeta `json:"metadata,inline"`
 | 
					 | 
				
			||||||
	Items                []Simple `json:"items,omitempty"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*SimpleList) IsAnAPIObject() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestSimpleSetupRight(t *testing.T) {
 | 
					func TestSimpleSetupRight(t *testing.T) {
 | 
				
			||||||
	s := &Simple{ObjectMeta: api.ObjectMeta{Name: "aName"}}
 | 
						s := &apiservertesting.Simple{ObjectMeta: api.ObjectMeta{Name: "aName"}}
 | 
				
			||||||
	wire, err := codec.Encode(s)
 | 
						wire, err := codec.Encode(s)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
@@ -292,7 +257,7 @@ func TestSimpleSetupRight(t *testing.T) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestSimpleOptionsSetupRight(t *testing.T) {
 | 
					func TestSimpleOptionsSetupRight(t *testing.T) {
 | 
				
			||||||
	s := &SimpleGetOptions{}
 | 
						s := &apiservertesting.SimpleGetOptions{}
 | 
				
			||||||
	wire, err := codec.Encode(s)
 | 
						wire, err := codec.Encode(s)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
@@ -308,11 +273,11 @@ func TestSimpleOptionsSetupRight(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type SimpleRESTStorage struct {
 | 
					type SimpleRESTStorage struct {
 | 
				
			||||||
	errors map[string]error
 | 
						errors map[string]error
 | 
				
			||||||
	list   []Simple
 | 
						list   []apiservertesting.Simple
 | 
				
			||||||
	item   Simple
 | 
						item   apiservertesting.Simple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	updated *Simple
 | 
						updated *apiservertesting.Simple
 | 
				
			||||||
	created *Simple
 | 
						created *apiservertesting.Simple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stream *SimpleStream
 | 
						stream *SimpleStream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -342,7 +307,7 @@ type SimpleRESTStorage struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (storage *SimpleRESTStorage) List(ctx api.Context, label labels.Selector, field fields.Selector) (runtime.Object, error) {
 | 
					func (storage *SimpleRESTStorage) List(ctx api.Context, label labels.Selector, field fields.Selector) (runtime.Object, error) {
 | 
				
			||||||
	storage.checkContext(ctx)
 | 
						storage.checkContext(ctx)
 | 
				
			||||||
	result := &SimpleList{
 | 
						result := &apiservertesting.SimpleList{
 | 
				
			||||||
		Items: storage.list,
 | 
							Items: storage.list,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	storage.requestedLabelSelector = label
 | 
						storage.requestedLabelSelector = label
 | 
				
			||||||
@@ -408,22 +373,22 @@ func (storage *SimpleRESTStorage) Delete(ctx api.Context, id string, options *ap
 | 
				
			|||||||
	var obj runtime.Object = &unversioned.Status{Status: unversioned.StatusSuccess}
 | 
						var obj runtime.Object = &unversioned.Status{Status: unversioned.StatusSuccess}
 | 
				
			||||||
	var err error
 | 
						var err error
 | 
				
			||||||
	if storage.injectedFunction != nil {
 | 
						if storage.injectedFunction != nil {
 | 
				
			||||||
		obj, err = storage.injectedFunction(&Simple{ObjectMeta: api.ObjectMeta{Name: id}})
 | 
							obj, err = storage.injectedFunction(&apiservertesting.Simple{ObjectMeta: api.ObjectMeta{Name: id}})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return obj, err
 | 
						return obj, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (storage *SimpleRESTStorage) New() runtime.Object {
 | 
					func (storage *SimpleRESTStorage) New() runtime.Object {
 | 
				
			||||||
	return &Simple{}
 | 
						return &apiservertesting.Simple{}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (storage *SimpleRESTStorage) NewList() runtime.Object {
 | 
					func (storage *SimpleRESTStorage) NewList() runtime.Object {
 | 
				
			||||||
	return &SimpleList{}
 | 
						return &apiservertesting.SimpleList{}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (storage *SimpleRESTStorage) Create(ctx api.Context, obj runtime.Object) (runtime.Object, error) {
 | 
					func (storage *SimpleRESTStorage) Create(ctx api.Context, obj runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
	storage.checkContext(ctx)
 | 
						storage.checkContext(ctx)
 | 
				
			||||||
	storage.created = obj.(*Simple)
 | 
						storage.created = obj.(*apiservertesting.Simple)
 | 
				
			||||||
	if err := storage.errors["create"]; err != nil {
 | 
						if err := storage.errors["create"]; err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -436,7 +401,7 @@ func (storage *SimpleRESTStorage) Create(ctx api.Context, obj runtime.Object) (r
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (storage *SimpleRESTStorage) Update(ctx api.Context, obj runtime.Object) (runtime.Object, bool, error) {
 | 
					func (storage *SimpleRESTStorage) Update(ctx api.Context, obj runtime.Object) (runtime.Object, bool, error) {
 | 
				
			||||||
	storage.checkContext(ctx)
 | 
						storage.checkContext(ctx)
 | 
				
			||||||
	storage.updated = obj.(*Simple)
 | 
						storage.updated = obj.(*apiservertesting.Simple)
 | 
				
			||||||
	if err := storage.errors["update"]; err != nil {
 | 
						if err := storage.errors["update"]; err != nil {
 | 
				
			||||||
		return nil, false, err
 | 
							return nil, false, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -494,7 +459,7 @@ type ConnecterRESTStorage struct {
 | 
				
			|||||||
var _ = rest.Connecter(&ConnecterRESTStorage{})
 | 
					var _ = rest.Connecter(&ConnecterRESTStorage{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *ConnecterRESTStorage) New() runtime.Object {
 | 
					func (s *ConnecterRESTStorage) New() runtime.Object {
 | 
				
			||||||
	return &Simple{}
 | 
						return &apiservertesting.Simple{}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *ConnecterRESTStorage) Connect(ctx api.Context, id string, options runtime.Object) (rest.ConnectHandler, error) {
 | 
					func (s *ConnecterRESTStorage) Connect(ctx api.Context, id string, options runtime.Object) (rest.ConnectHandler, error) {
 | 
				
			||||||
@@ -540,7 +505,7 @@ type GetWithOptionsRESTStorage struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (r *GetWithOptionsRESTStorage) Get(ctx api.Context, name string, options runtime.Object) (runtime.Object, error) {
 | 
					func (r *GetWithOptionsRESTStorage) Get(ctx api.Context, name string, options runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
	if _, ok := options.(*SimpleGetOptions); !ok {
 | 
						if _, ok := options.(*apiservertesting.SimpleGetOptions); !ok {
 | 
				
			||||||
		return nil, fmt.Errorf("Unexpected options object: %#v", options)
 | 
							return nil, fmt.Errorf("Unexpected options object: %#v", options)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	r.optionsReceived = options
 | 
						r.optionsReceived = options
 | 
				
			||||||
@@ -549,9 +514,9 @@ func (r *GetWithOptionsRESTStorage) Get(ctx api.Context, name string, options ru
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (r *GetWithOptionsRESTStorage) NewGetOptions() (runtime.Object, bool, string) {
 | 
					func (r *GetWithOptionsRESTStorage) NewGetOptions() (runtime.Object, bool, string) {
 | 
				
			||||||
	if len(r.takesPath) > 0 {
 | 
						if len(r.takesPath) > 0 {
 | 
				
			||||||
		return &SimpleGetOptions{}, true, r.takesPath
 | 
							return &apiservertesting.SimpleGetOptions{}, true, r.takesPath
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &SimpleGetOptions{}, false, ""
 | 
						return &apiservertesting.SimpleGetOptions{}, false, ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ rest.GetterWithOptions = &GetWithOptionsRESTStorage{}
 | 
					var _ rest.GetterWithOptions = &GetWithOptionsRESTStorage{}
 | 
				
			||||||
@@ -563,7 +528,7 @@ type NamedCreaterRESTStorage struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (storage *NamedCreaterRESTStorage) Create(ctx api.Context, name string, obj runtime.Object) (runtime.Object, error) {
 | 
					func (storage *NamedCreaterRESTStorage) Create(ctx api.Context, name string, obj runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
	storage.checkContext(ctx)
 | 
						storage.checkContext(ctx)
 | 
				
			||||||
	storage.created = obj.(*Simple)
 | 
						storage.created = obj.(*apiservertesting.Simple)
 | 
				
			||||||
	storage.createdName = name
 | 
						storage.createdName = name
 | 
				
			||||||
	if err := storage.errors["create"]; err != nil {
 | 
						if err := storage.errors["create"]; err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -673,7 +638,7 @@ func TestNotFound(t *testing.T) {
 | 
				
			|||||||
type UnimplementedRESTStorage struct{}
 | 
					type UnimplementedRESTStorage struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (UnimplementedRESTStorage) New() runtime.Object {
 | 
					func (UnimplementedRESTStorage) New() runtime.Object {
 | 
				
			||||||
	return &Simple{}
 | 
						return &apiservertesting.Simple{}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TestUnimplementedRESTStorage ensures that if a rest.Storage does not implement a given
 | 
					// TestUnimplementedRESTStorage ensures that if a rest.Storage does not implement a given
 | 
				
			||||||
@@ -910,7 +875,7 @@ func TestErrorList(t *testing.T) {
 | 
				
			|||||||
func TestNonEmptyList(t *testing.T) {
 | 
					func TestNonEmptyList(t *testing.T) {
 | 
				
			||||||
	storage := map[string]rest.Storage{}
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
	simpleStorage := SimpleRESTStorage{
 | 
						simpleStorage := SimpleRESTStorage{
 | 
				
			||||||
		list: []Simple{
 | 
							list: []apiservertesting.Simple{
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				ObjectMeta: api.ObjectMeta{Name: "something", Namespace: "other"},
 | 
									ObjectMeta: api.ObjectMeta{Name: "something", Namespace: "other"},
 | 
				
			||||||
				Other:      "foo",
 | 
									Other:      "foo",
 | 
				
			||||||
@@ -936,7 +901,7 @@ func TestNonEmptyList(t *testing.T) {
 | 
				
			|||||||
		t.Logf("Data: %s", string(body))
 | 
							t.Logf("Data: %s", string(body))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var listOut SimpleList
 | 
						var listOut apiservertesting.SimpleList
 | 
				
			||||||
	body, err := extractBody(resp, &listOut)
 | 
						body, err := extractBody(resp, &listOut)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatalf("unexpected error: %v", err)
 | 
							t.Fatalf("unexpected error: %v", err)
 | 
				
			||||||
@@ -961,7 +926,7 @@ func TestNonEmptyList(t *testing.T) {
 | 
				
			|||||||
func TestSelfLinkSkipsEmptyName(t *testing.T) {
 | 
					func TestSelfLinkSkipsEmptyName(t *testing.T) {
 | 
				
			||||||
	storage := map[string]rest.Storage{}
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
	simpleStorage := SimpleRESTStorage{
 | 
						simpleStorage := SimpleRESTStorage{
 | 
				
			||||||
		list: []Simple{
 | 
							list: []apiservertesting.Simple{
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				ObjectMeta: api.ObjectMeta{Namespace: "other"},
 | 
									ObjectMeta: api.ObjectMeta{Namespace: "other"},
 | 
				
			||||||
				Other:      "foo",
 | 
									Other:      "foo",
 | 
				
			||||||
@@ -986,7 +951,7 @@ func TestSelfLinkSkipsEmptyName(t *testing.T) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		t.Logf("Data: %s", string(body))
 | 
							t.Logf("Data: %s", string(body))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var listOut SimpleList
 | 
						var listOut apiservertesting.SimpleList
 | 
				
			||||||
	body, err := extractBody(resp, &listOut)
 | 
						body, err := extractBody(resp, &listOut)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatalf("unexpected error: %v", err)
 | 
							t.Fatalf("unexpected error: %v", err)
 | 
				
			||||||
@@ -1031,7 +996,7 @@ func TestMetadata(t *testing.T) {
 | 
				
			|||||||
func TestGet(t *testing.T) {
 | 
					func TestGet(t *testing.T) {
 | 
				
			||||||
	storage := map[string]rest.Storage{}
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
	simpleStorage := SimpleRESTStorage{
 | 
						simpleStorage := SimpleRESTStorage{
 | 
				
			||||||
		item: Simple{
 | 
							item: apiservertesting.Simple{
 | 
				
			||||||
			Other: "foo",
 | 
								Other: "foo",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1053,7 +1018,7 @@ func TestGet(t *testing.T) {
 | 
				
			|||||||
	if resp.StatusCode != http.StatusOK {
 | 
						if resp.StatusCode != http.StatusOK {
 | 
				
			||||||
		t.Fatalf("unexpected response: %#v", resp)
 | 
							t.Fatalf("unexpected response: %#v", resp)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var itemOut Simple
 | 
						var itemOut apiservertesting.Simple
 | 
				
			||||||
	body, err := extractBody(resp, &itemOut)
 | 
						body, err := extractBody(resp, &itemOut)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("unexpected error: %v", err)
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
@@ -1145,7 +1110,7 @@ func TestGetWithOptions(t *testing.T) {
 | 
				
			|||||||
	storage := map[string]rest.Storage{}
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
	simpleStorage := GetWithOptionsRESTStorage{
 | 
						simpleStorage := GetWithOptionsRESTStorage{
 | 
				
			||||||
		SimpleRESTStorage: &SimpleRESTStorage{
 | 
							SimpleRESTStorage: &SimpleRESTStorage{
 | 
				
			||||||
			item: Simple{
 | 
								item: apiservertesting.Simple{
 | 
				
			||||||
				Other: "foo",
 | 
									Other: "foo",
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -1162,7 +1127,7 @@ func TestGetWithOptions(t *testing.T) {
 | 
				
			|||||||
	if resp.StatusCode != http.StatusOK {
 | 
						if resp.StatusCode != http.StatusOK {
 | 
				
			||||||
		t.Fatalf("unexpected response: %#v", resp)
 | 
							t.Fatalf("unexpected response: %#v", resp)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var itemOut Simple
 | 
						var itemOut apiservertesting.Simple
 | 
				
			||||||
	body, err := extractBody(resp, &itemOut)
 | 
						body, err := extractBody(resp, &itemOut)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("unexpected error: %v", err)
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
@@ -1172,7 +1137,7 @@ func TestGetWithOptions(t *testing.T) {
 | 
				
			|||||||
		t.Errorf("Unexpected data: %#v, expected %#v (%s)", itemOut, simpleStorage.item, string(body))
 | 
							t.Errorf("Unexpected data: %#v, expected %#v (%s)", itemOut, simpleStorage.item, string(body))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	opts, ok := simpleStorage.optionsReceived.(*SimpleGetOptions)
 | 
						opts, ok := simpleStorage.optionsReceived.(*apiservertesting.SimpleGetOptions)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		t.Errorf("Unexpected options object received: %#v", simpleStorage.optionsReceived)
 | 
							t.Errorf("Unexpected options object received: %#v", simpleStorage.optionsReceived)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -1186,7 +1151,7 @@ func TestGetWithOptionsAndPath(t *testing.T) {
 | 
				
			|||||||
	storage := map[string]rest.Storage{}
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
	simpleStorage := GetWithOptionsRESTStorage{
 | 
						simpleStorage := GetWithOptionsRESTStorage{
 | 
				
			||||||
		SimpleRESTStorage: &SimpleRESTStorage{
 | 
							SimpleRESTStorage: &SimpleRESTStorage{
 | 
				
			||||||
			item: Simple{
 | 
								item: apiservertesting.Simple{
 | 
				
			||||||
				Other: "foo",
 | 
									Other: "foo",
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -1204,7 +1169,7 @@ func TestGetWithOptionsAndPath(t *testing.T) {
 | 
				
			|||||||
	if resp.StatusCode != http.StatusOK {
 | 
						if resp.StatusCode != http.StatusOK {
 | 
				
			||||||
		t.Fatalf("unexpected response: %#v", resp)
 | 
							t.Fatalf("unexpected response: %#v", resp)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var itemOut Simple
 | 
						var itemOut apiservertesting.Simple
 | 
				
			||||||
	body, err := extractBody(resp, &itemOut)
 | 
						body, err := extractBody(resp, &itemOut)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("unexpected error: %v", err)
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
@@ -1214,7 +1179,7 @@ func TestGetWithOptionsAndPath(t *testing.T) {
 | 
				
			|||||||
		t.Errorf("Unexpected data: %#v, expected %#v (%s)", itemOut, simpleStorage.item, string(body))
 | 
							t.Errorf("Unexpected data: %#v, expected %#v (%s)", itemOut, simpleStorage.item, string(body))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	opts, ok := simpleStorage.optionsReceived.(*SimpleGetOptions)
 | 
						opts, ok := simpleStorage.optionsReceived.(*apiservertesting.SimpleGetOptions)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		t.Errorf("Unexpected options object received: %#v", simpleStorage.optionsReceived)
 | 
							t.Errorf("Unexpected options object received: %#v", simpleStorage.optionsReceived)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -1226,7 +1191,7 @@ func TestGetWithOptionsAndPath(t *testing.T) {
 | 
				
			|||||||
func TestGetAlternateSelfLink(t *testing.T) {
 | 
					func TestGetAlternateSelfLink(t *testing.T) {
 | 
				
			||||||
	storage := map[string]rest.Storage{}
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
	simpleStorage := SimpleRESTStorage{
 | 
						simpleStorage := SimpleRESTStorage{
 | 
				
			||||||
		item: Simple{
 | 
							item: apiservertesting.Simple{
 | 
				
			||||||
			Other: "foo",
 | 
								Other: "foo",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1248,7 +1213,7 @@ func TestGetAlternateSelfLink(t *testing.T) {
 | 
				
			|||||||
	if resp.StatusCode != http.StatusOK {
 | 
						if resp.StatusCode != http.StatusOK {
 | 
				
			||||||
		t.Fatalf("unexpected response: %#v", resp)
 | 
							t.Fatalf("unexpected response: %#v", resp)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var itemOut Simple
 | 
						var itemOut apiservertesting.Simple
 | 
				
			||||||
	body, err := extractBody(resp, &itemOut)
 | 
						body, err := extractBody(resp, &itemOut)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatalf("unexpected error: %v", err)
 | 
							t.Fatalf("unexpected error: %v", err)
 | 
				
			||||||
@@ -1264,7 +1229,7 @@ func TestGetAlternateSelfLink(t *testing.T) {
 | 
				
			|||||||
func TestGetNamespaceSelfLink(t *testing.T) {
 | 
					func TestGetNamespaceSelfLink(t *testing.T) {
 | 
				
			||||||
	storage := map[string]rest.Storage{}
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
	simpleStorage := SimpleRESTStorage{
 | 
						simpleStorage := SimpleRESTStorage{
 | 
				
			||||||
		item: Simple{
 | 
							item: apiservertesting.Simple{
 | 
				
			||||||
			Other: "foo",
 | 
								Other: "foo",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1286,7 +1251,7 @@ func TestGetNamespaceSelfLink(t *testing.T) {
 | 
				
			|||||||
	if resp.StatusCode != http.StatusOK {
 | 
						if resp.StatusCode != http.StatusOK {
 | 
				
			||||||
		t.Fatalf("unexpected response: %#v", resp)
 | 
							t.Fatalf("unexpected response: %#v", resp)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var itemOut Simple
 | 
						var itemOut apiservertesting.Simple
 | 
				
			||||||
	body, err := extractBody(resp, &itemOut)
 | 
						body, err := extractBody(resp, &itemOut)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatalf("unexpected error: %v", err)
 | 
							t.Fatalf("unexpected error: %v", err)
 | 
				
			||||||
@@ -1358,7 +1323,7 @@ func TestConnect(t *testing.T) {
 | 
				
			|||||||
func TestConnectWithOptionsRouteParams(t *testing.T) {
 | 
					func TestConnectWithOptionsRouteParams(t *testing.T) {
 | 
				
			||||||
	connectStorage := &ConnecterRESTStorage{
 | 
						connectStorage := &ConnecterRESTStorage{
 | 
				
			||||||
		connectHandler:      &SimpleConnectHandler{},
 | 
							connectHandler:      &SimpleConnectHandler{},
 | 
				
			||||||
		emptyConnectOptions: &SimpleGetOptions{},
 | 
							emptyConnectOptions: &apiservertesting.SimpleGetOptions{},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	storage := map[string]rest.Storage{
 | 
						storage := map[string]rest.Storage{
 | 
				
			||||||
		"simple":         &SimpleRESTStorage{},
 | 
							"simple":         &SimpleRESTStorage{},
 | 
				
			||||||
@@ -1389,7 +1354,7 @@ func TestConnectWithOptions(t *testing.T) {
 | 
				
			|||||||
		connectHandler: &SimpleConnectHandler{
 | 
							connectHandler: &SimpleConnectHandler{
 | 
				
			||||||
			response: responseText,
 | 
								response: responseText,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		emptyConnectOptions: &SimpleGetOptions{},
 | 
							emptyConnectOptions: &apiservertesting.SimpleGetOptions{},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	storage := map[string]rest.Storage{
 | 
						storage := map[string]rest.Storage{
 | 
				
			||||||
		"simple":         &SimpleRESTStorage{},
 | 
							"simple":         &SimpleRESTStorage{},
 | 
				
			||||||
@@ -1418,7 +1383,7 @@ func TestConnectWithOptions(t *testing.T) {
 | 
				
			|||||||
	if string(body) != responseText {
 | 
						if string(body) != responseText {
 | 
				
			||||||
		t.Errorf("Unexpected response. Expected: %s. Actual: %s.", responseText, string(body))
 | 
							t.Errorf("Unexpected response. Expected: %s. Actual: %s.", responseText, string(body))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	opts, ok := connectStorage.receivedConnectOptions.(*SimpleGetOptions)
 | 
						opts, ok := connectStorage.receivedConnectOptions.(*apiservertesting.SimpleGetOptions)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		t.Errorf("Unexpected options type: %#v", connectStorage.receivedConnectOptions)
 | 
							t.Errorf("Unexpected options type: %#v", connectStorage.receivedConnectOptions)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1435,7 +1400,7 @@ func TestConnectWithOptionsAndPath(t *testing.T) {
 | 
				
			|||||||
		connectHandler: &SimpleConnectHandler{
 | 
							connectHandler: &SimpleConnectHandler{
 | 
				
			||||||
			response: responseText,
 | 
								response: responseText,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		emptyConnectOptions: &SimpleGetOptions{},
 | 
							emptyConnectOptions: &apiservertesting.SimpleGetOptions{},
 | 
				
			||||||
		takesPath:           "atAPath",
 | 
							takesPath:           "atAPath",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	storage := map[string]rest.Storage{
 | 
						storage := map[string]rest.Storage{
 | 
				
			||||||
@@ -1465,7 +1430,7 @@ func TestConnectWithOptionsAndPath(t *testing.T) {
 | 
				
			|||||||
	if string(body) != responseText {
 | 
						if string(body) != responseText {
 | 
				
			||||||
		t.Errorf("Unexpected response. Expected: %s. Actual: %s.", responseText, string(body))
 | 
							t.Errorf("Unexpected response. Expected: %s. Actual: %s.", responseText, string(body))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	opts, ok := connectStorage.receivedConnectOptions.(*SimpleGetOptions)
 | 
						opts, ok := connectStorage.receivedConnectOptions.(*apiservertesting.SimpleGetOptions)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		t.Errorf("Unexpected options type: %#v", connectStorage.receivedConnectOptions)
 | 
							t.Errorf("Unexpected options type: %#v", connectStorage.receivedConnectOptions)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1645,7 +1610,7 @@ func TestDeleteMissing(t *testing.T) {
 | 
				
			|||||||
func TestPatch(t *testing.T) {
 | 
					func TestPatch(t *testing.T) {
 | 
				
			||||||
	storage := map[string]rest.Storage{}
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
	ID := "id"
 | 
						ID := "id"
 | 
				
			||||||
	item := &Simple{
 | 
						item := &apiservertesting.Simple{
 | 
				
			||||||
		ObjectMeta: api.ObjectMeta{
 | 
							ObjectMeta: api.ObjectMeta{
 | 
				
			||||||
			Name:      ID,
 | 
								Name:      ID,
 | 
				
			||||||
			Namespace: "", // update should allow the client to send an empty namespace
 | 
								Namespace: "", // update should allow the client to send an empty namespace
 | 
				
			||||||
@@ -1683,7 +1648,7 @@ func TestPatch(t *testing.T) {
 | 
				
			|||||||
func TestPatchRequiresMatchingName(t *testing.T) {
 | 
					func TestPatchRequiresMatchingName(t *testing.T) {
 | 
				
			||||||
	storage := map[string]rest.Storage{}
 | 
						storage := map[string]rest.Storage{}
 | 
				
			||||||
	ID := "id"
 | 
						ID := "id"
 | 
				
			||||||
	item := &Simple{
 | 
						item := &apiservertesting.Simple{
 | 
				
			||||||
		ObjectMeta: api.ObjectMeta{
 | 
							ObjectMeta: api.ObjectMeta{
 | 
				
			||||||
			Name:      ID,
 | 
								Name:      ID,
 | 
				
			||||||
			Namespace: "", // update should allow the client to send an empty namespace
 | 
								Namespace: "", // update should allow the client to send an empty namespace
 | 
				
			||||||
@@ -1723,7 +1688,7 @@ func TestUpdate(t *testing.T) {
 | 
				
			|||||||
	server := httptest.NewServer(handler)
 | 
						server := httptest.NewServer(handler)
 | 
				
			||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	item := &Simple{
 | 
						item := &apiservertesting.Simple{
 | 
				
			||||||
		ObjectMeta: api.ObjectMeta{
 | 
							ObjectMeta: api.ObjectMeta{
 | 
				
			||||||
			Name:      ID,
 | 
								Name:      ID,
 | 
				
			||||||
			Namespace: "", // update should allow the client to send an empty namespace
 | 
								Namespace: "", // update should allow the client to send an empty namespace
 | 
				
			||||||
@@ -1760,7 +1725,7 @@ func TestUpdateInvokesAdmissionControl(t *testing.T) {
 | 
				
			|||||||
	server := httptest.NewServer(handler)
 | 
						server := httptest.NewServer(handler)
 | 
				
			||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	item := &Simple{
 | 
						item := &apiservertesting.Simple{
 | 
				
			||||||
		ObjectMeta: api.ObjectMeta{
 | 
							ObjectMeta: api.ObjectMeta{
 | 
				
			||||||
			Name:      ID,
 | 
								Name:      ID,
 | 
				
			||||||
			Namespace: api.NamespaceDefault,
 | 
								Namespace: api.NamespaceDefault,
 | 
				
			||||||
@@ -1793,7 +1758,7 @@ func TestUpdateRequiresMatchingName(t *testing.T) {
 | 
				
			|||||||
	server := httptest.NewServer(handler)
 | 
						server := httptest.NewServer(handler)
 | 
				
			||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	item := &Simple{
 | 
						item := &apiservertesting.Simple{
 | 
				
			||||||
		Other: "bar",
 | 
							Other: "bar",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	body, err := codec.Encode(item)
 | 
						body, err := codec.Encode(item)
 | 
				
			||||||
@@ -1822,7 +1787,7 @@ func TestUpdateAllowsMissingNamespace(t *testing.T) {
 | 
				
			|||||||
	server := httptest.NewServer(handler)
 | 
						server := httptest.NewServer(handler)
 | 
				
			||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	item := &Simple{
 | 
						item := &apiservertesting.Simple{
 | 
				
			||||||
		ObjectMeta: api.ObjectMeta{
 | 
							ObjectMeta: api.ObjectMeta{
 | 
				
			||||||
			Name: ID,
 | 
								Name: ID,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -1859,7 +1824,7 @@ func TestUpdateAllowsMismatchedNamespaceOnError(t *testing.T) {
 | 
				
			|||||||
	server := httptest.NewServer(handler)
 | 
						server := httptest.NewServer(handler)
 | 
				
			||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	item := &Simple{
 | 
						item := &apiservertesting.Simple{
 | 
				
			||||||
		ObjectMeta: api.ObjectMeta{
 | 
							ObjectMeta: api.ObjectMeta{
 | 
				
			||||||
			Name:      ID,
 | 
								Name:      ID,
 | 
				
			||||||
			Namespace: "other", // does not match request
 | 
								Namespace: "other", // does not match request
 | 
				
			||||||
@@ -1896,7 +1861,7 @@ func TestUpdatePreventsMismatchedNamespace(t *testing.T) {
 | 
				
			|||||||
	server := httptest.NewServer(handler)
 | 
						server := httptest.NewServer(handler)
 | 
				
			||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	item := &Simple{
 | 
						item := &apiservertesting.Simple{
 | 
				
			||||||
		ObjectMeta: api.ObjectMeta{
 | 
							ObjectMeta: api.ObjectMeta{
 | 
				
			||||||
			Name:      ID,
 | 
								Name:      ID,
 | 
				
			||||||
			Namespace: "other",
 | 
								Namespace: "other",
 | 
				
			||||||
@@ -1931,7 +1896,7 @@ func TestUpdateMissing(t *testing.T) {
 | 
				
			|||||||
	server := httptest.NewServer(handler)
 | 
						server := httptest.NewServer(handler)
 | 
				
			||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	item := &Simple{
 | 
						item := &apiservertesting.Simple{
 | 
				
			||||||
		ObjectMeta: api.ObjectMeta{
 | 
							ObjectMeta: api.ObjectMeta{
 | 
				
			||||||
			Name:      ID,
 | 
								Name:      ID,
 | 
				
			||||||
			Namespace: api.NamespaceDefault,
 | 
								Namespace: api.NamespaceDefault,
 | 
				
			||||||
@@ -1966,7 +1931,7 @@ func TestCreateNotFound(t *testing.T) {
 | 
				
			|||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
	client := http.Client{}
 | 
						client := http.Client{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	simple := &Simple{Other: "foo"}
 | 
						simple := &apiservertesting.Simple{Other: "foo"}
 | 
				
			||||||
	data, err := codec.Encode(simple)
 | 
						data, err := codec.Encode(simple)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("unexpected error: %v", err)
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
@@ -2097,8 +2062,8 @@ func TestUpdateREST(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func TestParentResourceIsRequired(t *testing.T) {
 | 
					func TestParentResourceIsRequired(t *testing.T) {
 | 
				
			||||||
	storage := &SimpleTypedStorage{
 | 
						storage := &SimpleTypedStorage{
 | 
				
			||||||
		baseType: &SimpleRoot{}, // a root scoped type
 | 
							baseType: &apiservertesting.SimpleRoot{}, // a root scoped type
 | 
				
			||||||
		item:     &SimpleRoot{},
 | 
							item:     &apiservertesting.SimpleRoot{},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	group := &APIGroupVersion{
 | 
						group := &APIGroupVersion{
 | 
				
			||||||
		Storage: map[string]rest.Storage{
 | 
							Storage: map[string]rest.Storage{
 | 
				
			||||||
@@ -2125,8 +2090,8 @@ func TestParentResourceIsRequired(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	storage = &SimpleTypedStorage{
 | 
						storage = &SimpleTypedStorage{
 | 
				
			||||||
		baseType: &SimpleRoot{}, // a root scoped type
 | 
							baseType: &apiservertesting.SimpleRoot{}, // a root scoped type
 | 
				
			||||||
		item:     &SimpleRoot{},
 | 
							item:     &apiservertesting.SimpleRoot{},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	group = &APIGroupVersion{
 | 
						group = &APIGroupVersion{
 | 
				
			||||||
		Storage: map[string]rest.Storage{
 | 
							Storage: map[string]rest.Storage{
 | 
				
			||||||
@@ -2182,7 +2147,7 @@ func TestCreateWithName(t *testing.T) {
 | 
				
			|||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
	client := http.Client{}
 | 
						client := http.Client{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	simple := &Simple{Other: "foo"}
 | 
						simple := &apiservertesting.Simple{Other: "foo"}
 | 
				
			||||||
	data, err := codec.Encode(simple)
 | 
						data, err := codec.Encode(simple)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("unexpected error: %v", err)
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
@@ -2283,7 +2248,7 @@ func TestCreate(t *testing.T) {
 | 
				
			|||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
	client := http.Client{}
 | 
						client := http.Client{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	simple := &Simple{
 | 
						simple := &apiservertesting.Simple{
 | 
				
			||||||
		Other: "bar",
 | 
							Other: "bar",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	data, err := codec.Encode(simple)
 | 
						data, err := codec.Encode(simple)
 | 
				
			||||||
@@ -2307,7 +2272,7 @@ func TestCreate(t *testing.T) {
 | 
				
			|||||||
		t.Errorf("unexpected error: %v", err)
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var itemOut Simple
 | 
						var itemOut apiservertesting.Simple
 | 
				
			||||||
	body, err := extractBody(response, &itemOut)
 | 
						body, err := extractBody(response, &itemOut)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("unexpected error: %v", err)
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
@@ -2342,7 +2307,7 @@ func TestCreateInNamespace(t *testing.T) {
 | 
				
			|||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
	client := http.Client{}
 | 
						client := http.Client{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	simple := &Simple{
 | 
						simple := &apiservertesting.Simple{
 | 
				
			||||||
		Other: "bar",
 | 
							Other: "bar",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	data, err := codec.Encode(simple)
 | 
						data, err := codec.Encode(simple)
 | 
				
			||||||
@@ -2366,7 +2331,7 @@ func TestCreateInNamespace(t *testing.T) {
 | 
				
			|||||||
		t.Errorf("unexpected error: %v", err)
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var itemOut Simple
 | 
						var itemOut apiservertesting.Simple
 | 
				
			||||||
	body, err := extractBody(response, &itemOut)
 | 
						body, err := extractBody(response, &itemOut)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("unexpected error: %v", err)
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
@@ -2401,7 +2366,7 @@ func TestCreateInvokesAdmissionControl(t *testing.T) {
 | 
				
			|||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
	client := http.Client{}
 | 
						client := http.Client{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	simple := &Simple{
 | 
						simple := &apiservertesting.Simple{
 | 
				
			||||||
		Other: "bar",
 | 
							Other: "bar",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	data, err := codec.Encode(simple)
 | 
						data, err := codec.Encode(simple)
 | 
				
			||||||
@@ -2531,7 +2496,7 @@ func TestCreateTimeout(t *testing.T) {
 | 
				
			|||||||
	server := httptest.NewServer(handler)
 | 
						server := httptest.NewServer(handler)
 | 
				
			||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	simple := &Simple{Other: "foo"}
 | 
						simple := &apiservertesting.Simple{Other: "foo"}
 | 
				
			||||||
	data, err := codec.Encode(simple)
 | 
						data, err := codec.Encode(simple)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("unexpected error: %v", err)
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
@@ -2622,7 +2587,7 @@ func TestCreateChecksAPIVersion(t *testing.T) {
 | 
				
			|||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
	client := http.Client{}
 | 
						client := http.Client{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	simple := &Simple{}
 | 
						simple := &apiservertesting.Simple{}
 | 
				
			||||||
	//using newCodec and send the request to testVersion URL shall cause a discrepancy in apiVersion
 | 
						//using newCodec and send the request to testVersion URL shall cause a discrepancy in apiVersion
 | 
				
			||||||
	data, err := newCodec.Encode(simple)
 | 
						data, err := newCodec.Encode(simple)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -2653,7 +2618,7 @@ func TestCreateDefaultsAPIVersion(t *testing.T) {
 | 
				
			|||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
	client := http.Client{}
 | 
						client := http.Client{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	simple := &Simple{}
 | 
						simple := &apiservertesting.Simple{}
 | 
				
			||||||
	data, err := codec.Encode(simple)
 | 
						data, err := codec.Encode(simple)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("unexpected error: %v", err)
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
@@ -2688,7 +2653,7 @@ func TestUpdateChecksAPIVersion(t *testing.T) {
 | 
				
			|||||||
	defer server.Close()
 | 
						defer server.Close()
 | 
				
			||||||
	client := http.Client{}
 | 
						client := http.Client{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	simple := &Simple{ObjectMeta: api.ObjectMeta{Name: "bar"}}
 | 
						simple := &apiservertesting.Simple{ObjectMeta: api.ObjectMeta{Name: "bar"}}
 | 
				
			||||||
	data, err := newCodec.Encode(simple)
 | 
						data, err := newCodec.Encode(simple)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("unexpected error: %v", err)
 | 
							t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										64
									
								
								pkg/apiserver/testing/types.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								pkg/apiserver/testing/types.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2015 The Kubernetes Authors All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package testing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Simple struct {
 | 
				
			||||||
 | 
						unversioned.TypeMeta `json:",inline"`
 | 
				
			||||||
 | 
						api.ObjectMeta       `json:"metadata"`
 | 
				
			||||||
 | 
						Other                string            `json:"other,omitempty"`
 | 
				
			||||||
 | 
						Labels               map[string]string `json:"labels,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (*Simple) IsAnAPIObject() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SimpleRoot struct {
 | 
				
			||||||
 | 
						unversioned.TypeMeta `json:",inline"`
 | 
				
			||||||
 | 
						api.ObjectMeta       `json:"metadata"`
 | 
				
			||||||
 | 
						Other                string            `json:"other,omitempty"`
 | 
				
			||||||
 | 
						Labels               map[string]string `json:"labels,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (*SimpleRoot) IsAnAPIObject() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SimpleGetOptions struct {
 | 
				
			||||||
 | 
						unversioned.TypeMeta `json:",inline"`
 | 
				
			||||||
 | 
						Param1               string `json:"param1"`
 | 
				
			||||||
 | 
						Param2               string `json:"param2"`
 | 
				
			||||||
 | 
						Path                 string `json:"atAPath"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (SimpleGetOptions) SwaggerDoc() map[string]string {
 | 
				
			||||||
 | 
						return map[string]string{
 | 
				
			||||||
 | 
							"param1": "description for param1",
 | 
				
			||||||
 | 
							"param2": "description for param2",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (*SimpleGetOptions) IsAnAPIObject() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SimpleList struct {
 | 
				
			||||||
 | 
						unversioned.TypeMeta `json:",inline"`
 | 
				
			||||||
 | 
						unversioned.ListMeta `json:"metadata,inline"`
 | 
				
			||||||
 | 
						Items                []Simple `json:"items,omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (*SimpleList) IsAnAPIObject() {}
 | 
				
			||||||
@@ -30,6 +30,7 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/pkg/api"
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/rest"
 | 
						"k8s.io/kubernetes/pkg/api/rest"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/unversioned"
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
 | 
						apiservertesting "k8s.io/kubernetes/pkg/apiserver/testing"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/fields"
 | 
						"k8s.io/kubernetes/pkg/fields"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/labels"
 | 
						"k8s.io/kubernetes/pkg/labels"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/runtime"
 | 
						"k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
@@ -47,9 +48,9 @@ var watchTestTable = []struct {
 | 
				
			|||||||
	t   watch.EventType
 | 
						t   watch.EventType
 | 
				
			||||||
	obj runtime.Object
 | 
						obj runtime.Object
 | 
				
			||||||
}{
 | 
					}{
 | 
				
			||||||
	{watch.Added, &Simple{ObjectMeta: api.ObjectMeta{Name: "foo"}}},
 | 
						{watch.Added, &apiservertesting.Simple{ObjectMeta: api.ObjectMeta{Name: "foo"}}},
 | 
				
			||||||
	{watch.Modified, &Simple{ObjectMeta: api.ObjectMeta{Name: "bar"}}},
 | 
						{watch.Modified, &apiservertesting.Simple{ObjectMeta: api.ObjectMeta{Name: "bar"}}},
 | 
				
			||||||
	{watch.Deleted, &Simple{ObjectMeta: api.ObjectMeta{Name: "bar"}}},
 | 
						{watch.Deleted, &apiservertesting.Simple{ObjectMeta: api.ObjectMeta{Name: "bar"}}},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestWatchWebsocket(t *testing.T) {
 | 
					func TestWatchWebsocket(t *testing.T) {
 | 
				
			||||||
@@ -363,7 +364,7 @@ func TestWatchHTTPTimeout(t *testing.T) {
 | 
				
			|||||||
	req, _ := http.NewRequest("GET", dest.String(), nil)
 | 
						req, _ := http.NewRequest("GET", dest.String(), nil)
 | 
				
			||||||
	client := http.Client{}
 | 
						client := http.Client{}
 | 
				
			||||||
	resp, err := client.Do(req)
 | 
						resp, err := client.Do(req)
 | 
				
			||||||
	watcher.Add(&Simple{TypeMeta: unversioned.TypeMeta{APIVersion: newVersion}})
 | 
						watcher.Add(&apiservertesting.Simple{TypeMeta: unversioned.TypeMeta{APIVersion: newVersion}})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Make sure we can actually watch an endpoint
 | 
						// Make sure we can actually watch an endpoint
 | 
				
			||||||
	decoder := json.NewDecoder(resp.Body)
 | 
						decoder := json.NewDecoder(resp.Body)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,6 +31,7 @@ import (
 | 
				
			|||||||
	"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/apis/extensions"
 | 
						"k8s.io/kubernetes/pkg/apis/extensions"
 | 
				
			||||||
 | 
						kubectltesting "k8s.io/kubernetes/pkg/kubectl/testing"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/runtime"
 | 
						"k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/util"
 | 
						"k8s.io/kubernetes/pkg/util"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/util/sets"
 | 
						"k8s.io/kubernetes/pkg/util/sets"
 | 
				
			||||||
@@ -38,23 +39,12 @@ import (
 | 
				
			|||||||
	"github.com/ghodss/yaml"
 | 
						"github.com/ghodss/yaml"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type testStruct struct {
 | 
					 | 
				
			||||||
	unversioned.TypeMeta `json:",inline"`
 | 
					 | 
				
			||||||
	api.ObjectMeta       `json:"metadata,omitempty"`
 | 
					 | 
				
			||||||
	Key                  string         `json:"Key"`
 | 
					 | 
				
			||||||
	Map                  map[string]int `json:"Map"`
 | 
					 | 
				
			||||||
	StringList           []string       `json:"StringList"`
 | 
					 | 
				
			||||||
	IntList              []int          `json:"IntList"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ts *testStruct) IsAnAPIObject() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	api.Scheme.AddKnownTypes("", &testStruct{})
 | 
						api.Scheme.AddKnownTypes("", &kubectltesting.TestStruct{})
 | 
				
			||||||
	api.Scheme.AddKnownTypes(testapi.Default.Version(), &testStruct{})
 | 
						api.Scheme.AddKnownTypes(testapi.Default.Version(), &kubectltesting.TestStruct{})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var testData = testStruct{
 | 
					var testData = kubectltesting.TestStruct{
 | 
				
			||||||
	Key:        "testValue",
 | 
						Key:        "testValue",
 | 
				
			||||||
	Map:        map[string]int{"TestSubkey": 1},
 | 
						Map:        map[string]int{"TestSubkey": 1},
 | 
				
			||||||
	StringList: []string{"a", "b", "c"},
 | 
						StringList: []string{"a", "b", "c"},
 | 
				
			||||||
@@ -62,13 +52,13 @@ var testData = testStruct{
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestVersionedPrinter(t *testing.T) {
 | 
					func TestVersionedPrinter(t *testing.T) {
 | 
				
			||||||
	original := &testStruct{Key: "value"}
 | 
						original := &kubectltesting.TestStruct{Key: "value"}
 | 
				
			||||||
	p := NewVersionedPrinter(
 | 
						p := NewVersionedPrinter(
 | 
				
			||||||
		ResourcePrinterFunc(func(obj runtime.Object, w io.Writer) error {
 | 
							ResourcePrinterFunc(func(obj runtime.Object, w io.Writer) error {
 | 
				
			||||||
			if obj == original {
 | 
								if obj == original {
 | 
				
			||||||
				t.Fatalf("object should not be identical: %#v", obj)
 | 
									t.Fatalf("object should not be identical: %#v", obj)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if obj.(*testStruct).Key != "value" {
 | 
								if obj.(*kubectltesting.TestStruct).Key != "value" {
 | 
				
			||||||
				t.Fatalf("object was not converted: %#v", obj)
 | 
									t.Fatalf("object was not converted: %#v", obj)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return nil
 | 
								return nil
 | 
				
			||||||
@@ -177,14 +167,14 @@ func testPrinter(t *testing.T, printer ResourcePrinter, unmarshalFunc func(data
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var poutput testStruct
 | 
						var poutput kubectltesting.TestStruct
 | 
				
			||||||
	// Verify that given function runs without error.
 | 
						// Verify that given function runs without error.
 | 
				
			||||||
	err = unmarshalFunc(buf.Bytes(), &poutput)
 | 
						err = unmarshalFunc(buf.Bytes(), &poutput)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Use real decode function to undo the versioning process.
 | 
						// Use real decode function to undo the versioning process.
 | 
				
			||||||
	poutput = testStruct{}
 | 
						poutput = kubectltesting.TestStruct{}
 | 
				
			||||||
	err = runtime.YAMLDecoder(testapi.Default.Codec()).DecodeInto(buf.Bytes(), &poutput)
 | 
						err = runtime.YAMLDecoder(testapi.Default.Codec()).DecodeInto(buf.Bytes(), &poutput)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										33
									
								
								pkg/kubectl/testing/types.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								pkg/kubectl/testing/types.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2015 The Kubernetes Authors All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package testing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TestStruct struct {
 | 
				
			||||||
 | 
						unversioned.TypeMeta `json:",inline"`
 | 
				
			||||||
 | 
						api.ObjectMeta       `json:"metadata,omitempty"`
 | 
				
			||||||
 | 
						Key                  string         `json:"Key"`
 | 
				
			||||||
 | 
						Map                  map[string]int `json:"Map"`
 | 
				
			||||||
 | 
						StringList           []string       `json:"StringList"`
 | 
				
			||||||
 | 
						IntList              []int          `json:"IntList"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ts *TestStruct) IsAnAPIObject() {}
 | 
				
			||||||
@@ -22,17 +22,18 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api"
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/unversioned"
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
 | 
						storagetesting "k8s.io/kubernetes/pkg/storage/testing"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestObjectVersioner(t *testing.T) {
 | 
					func TestObjectVersioner(t *testing.T) {
 | 
				
			||||||
	v := APIObjectVersioner{}
 | 
						v := APIObjectVersioner{}
 | 
				
			||||||
	if ver, err := v.ObjectResourceVersion(&TestResource{ObjectMeta: api.ObjectMeta{ResourceVersion: "5"}}); err != nil || ver != 5 {
 | 
						if ver, err := v.ObjectResourceVersion(&storagetesting.TestResource{ObjectMeta: api.ObjectMeta{ResourceVersion: "5"}}); err != nil || ver != 5 {
 | 
				
			||||||
		t.Errorf("unexpected version: %d %v", ver, err)
 | 
							t.Errorf("unexpected version: %d %v", ver, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if ver, err := v.ObjectResourceVersion(&TestResource{ObjectMeta: api.ObjectMeta{ResourceVersion: "a"}}); err == nil || ver != 0 {
 | 
						if ver, err := v.ObjectResourceVersion(&storagetesting.TestResource{ObjectMeta: api.ObjectMeta{ResourceVersion: "a"}}); err == nil || ver != 0 {
 | 
				
			||||||
		t.Errorf("unexpected version: %d %v", ver, err)
 | 
							t.Errorf("unexpected version: %d %v", ver, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	obj := &TestResource{ObjectMeta: api.ObjectMeta{ResourceVersion: "a"}}
 | 
						obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{ResourceVersion: "a"}}
 | 
				
			||||||
	if err := v.UpdateObject(obj, nil, 5); err != nil {
 | 
						if err := v.UpdateObject(obj, nil, 5); err != nil {
 | 
				
			||||||
		t.Fatalf("unexpected error: %v", err)
 | 
							t.Fatalf("unexpected error: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -40,7 +41,7 @@ func TestObjectVersioner(t *testing.T) {
 | 
				
			|||||||
		t.Errorf("unexpected resource version: %#v", obj)
 | 
							t.Errorf("unexpected resource version: %#v", obj)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	now := unversioned.Time{Time: time.Now()}
 | 
						now := unversioned.Time{Time: time.Now()}
 | 
				
			||||||
	obj = &TestResource{ObjectMeta: api.ObjectMeta{ResourceVersion: "a"}}
 | 
						obj = &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{ResourceVersion: "a"}}
 | 
				
			||||||
	if err := v.UpdateObject(obj, &now.Time, 5); err != nil {
 | 
						if err := v.UpdateObject(obj, &now.Time, 5); err != nil {
 | 
				
			||||||
		t.Fatalf("unexpected error: %v", err)
 | 
							t.Fatalf("unexpected error: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,30 +40,23 @@ import (
 | 
				
			|||||||
	"k8s.io/kubernetes/pkg/conversion"
 | 
						"k8s.io/kubernetes/pkg/conversion"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/runtime"
 | 
						"k8s.io/kubernetes/pkg/runtime"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/storage"
 | 
						"k8s.io/kubernetes/pkg/storage"
 | 
				
			||||||
 | 
						storagetesting "k8s.io/kubernetes/pkg/storage/testing"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/tools"
 | 
						"k8s.io/kubernetes/pkg/tools"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/tools/etcdtest"
 | 
						"k8s.io/kubernetes/pkg/tools/etcdtest"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const validEtcdVersion = "etcd 2.0.9"
 | 
					const validEtcdVersion = "etcd 2.0.9"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type TestResource struct {
 | 
					 | 
				
			||||||
	unversioned.TypeMeta `json:",inline"`
 | 
					 | 
				
			||||||
	api.ObjectMeta       `json:"metadata"`
 | 
					 | 
				
			||||||
	Value                int `json:"value"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (*TestResource) IsAnAPIObject() {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var scheme *runtime.Scheme
 | 
					var scheme *runtime.Scheme
 | 
				
			||||||
var codec runtime.Codec
 | 
					var codec runtime.Codec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	scheme = runtime.NewScheme()
 | 
						scheme = runtime.NewScheme()
 | 
				
			||||||
	scheme.AddKnownTypes("", &TestResource{})
 | 
						scheme.AddKnownTypes("", &storagetesting.TestResource{})
 | 
				
			||||||
	scheme.AddKnownTypes(testapi.Default.Version(), &TestResource{})
 | 
						scheme.AddKnownTypes(testapi.Default.Version(), &storagetesting.TestResource{})
 | 
				
			||||||
	codec = runtime.CodecFor(scheme, testapi.Default.Version())
 | 
						codec = runtime.CodecFor(scheme, testapi.Default.Version())
 | 
				
			||||||
	scheme.AddConversionFuncs(
 | 
						scheme.AddConversionFuncs(
 | 
				
			||||||
		func(in *TestResource, out *TestResource, s conversion.Scope) error {
 | 
							func(in *storagetesting.TestResource, out *storagetesting.TestResource, s conversion.Scope) error {
 | 
				
			||||||
			*out = *in
 | 
								*out = *in
 | 
				
			||||||
			return nil
 | 
								return nil
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -568,8 +561,8 @@ func TestGuaranteedUpdate(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Create a new node.
 | 
						// Create a new node.
 | 
				
			||||||
	fakeClient.ExpectNotFoundGet(key)
 | 
						fakeClient.ExpectNotFoundGet(key)
 | 
				
			||||||
	obj := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
						obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
				
			||||||
	err := helper.GuaranteedUpdate(context.TODO(), "/some/key", &TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
						err := helper.GuaranteedUpdate(context.TODO(), "/some/key", &storagetesting.TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
		return obj, nil
 | 
							return obj, nil
 | 
				
			||||||
	}))
 | 
						}))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -587,11 +580,11 @@ func TestGuaranteedUpdate(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Update an existing node.
 | 
						// Update an existing node.
 | 
				
			||||||
	callbackCalled := false
 | 
						callbackCalled := false
 | 
				
			||||||
	objUpdate := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 2}
 | 
						objUpdate := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 2}
 | 
				
			||||||
	err = helper.GuaranteedUpdate(context.TODO(), "/some/key", &TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
						err = helper.GuaranteedUpdate(context.TODO(), "/some/key", &storagetesting.TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
		callbackCalled = true
 | 
							callbackCalled = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if in.(*TestResource).Value != 1 {
 | 
							if in.(*storagetesting.TestResource).Value != 1 {
 | 
				
			||||||
			t.Errorf("Callback input was not current set value")
 | 
								t.Errorf("Callback input was not current set value")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -623,8 +616,8 @@ func TestGuaranteedUpdateTTL(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Create a new node.
 | 
						// Create a new node.
 | 
				
			||||||
	fakeClient.ExpectNotFoundGet(key)
 | 
						fakeClient.ExpectNotFoundGet(key)
 | 
				
			||||||
	obj := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
						obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
				
			||||||
	err := helper.GuaranteedUpdate(context.TODO(), "/some/key", &TestResource{}, true, func(in runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
 | 
						err := helper.GuaranteedUpdate(context.TODO(), "/some/key", &storagetesting.TestResource{}, true, func(in runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
 | 
				
			||||||
		if res.TTL != 0 {
 | 
							if res.TTL != 0 {
 | 
				
			||||||
			t.Fatalf("unexpected response meta: %#v", res)
 | 
								t.Fatalf("unexpected response meta: %#v", res)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -649,14 +642,14 @@ func TestGuaranteedUpdateTTL(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Update an existing node.
 | 
						// Update an existing node.
 | 
				
			||||||
	callbackCalled := false
 | 
						callbackCalled := false
 | 
				
			||||||
	objUpdate := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 2}
 | 
						objUpdate := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 2}
 | 
				
			||||||
	err = helper.GuaranteedUpdate(context.TODO(), "/some/key", &TestResource{}, true, func(in runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
 | 
						err = helper.GuaranteedUpdate(context.TODO(), "/some/key", &storagetesting.TestResource{}, true, func(in runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
 | 
				
			||||||
		if res.TTL != 10 {
 | 
							if res.TTL != 10 {
 | 
				
			||||||
			t.Fatalf("unexpected response meta: %#v", res)
 | 
								t.Fatalf("unexpected response meta: %#v", res)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		callbackCalled = true
 | 
							callbackCalled = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if in.(*TestResource).Value != 1 {
 | 
							if in.(*storagetesting.TestResource).Value != 1 {
 | 
				
			||||||
			t.Errorf("Callback input was not current set value")
 | 
								t.Errorf("Callback input was not current set value")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -681,14 +674,14 @@ func TestGuaranteedUpdateTTL(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Update an existing node and change ttl
 | 
						// Update an existing node and change ttl
 | 
				
			||||||
	callbackCalled = false
 | 
						callbackCalled = false
 | 
				
			||||||
	objUpdate = &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 3}
 | 
						objUpdate = &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 3}
 | 
				
			||||||
	err = helper.GuaranteedUpdate(context.TODO(), "/some/key", &TestResource{}, true, func(in runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
 | 
						err = helper.GuaranteedUpdate(context.TODO(), "/some/key", &storagetesting.TestResource{}, true, func(in runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
 | 
				
			||||||
		if res.TTL != 10 {
 | 
							if res.TTL != 10 {
 | 
				
			||||||
			t.Fatalf("unexpected response meta: %#v", res)
 | 
								t.Fatalf("unexpected response meta: %#v", res)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		callbackCalled = true
 | 
							callbackCalled = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if in.(*TestResource).Value != 2 {
 | 
							if in.(*storagetesting.TestResource).Value != 2 {
 | 
				
			||||||
			t.Errorf("Callback input was not current set value")
 | 
								t.Errorf("Callback input was not current set value")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -724,8 +717,8 @@ func TestGuaranteedUpdateNoChange(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Create a new node.
 | 
						// Create a new node.
 | 
				
			||||||
	fakeClient.ExpectNotFoundGet(key)
 | 
						fakeClient.ExpectNotFoundGet(key)
 | 
				
			||||||
	obj := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
						obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
				
			||||||
	err := helper.GuaranteedUpdate(context.TODO(), "/some/key", &TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
						err := helper.GuaranteedUpdate(context.TODO(), "/some/key", &storagetesting.TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
		return obj, nil
 | 
							return obj, nil
 | 
				
			||||||
	}))
 | 
						}))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -734,8 +727,8 @@ func TestGuaranteedUpdateNoChange(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Update an existing node with the same data
 | 
						// Update an existing node with the same data
 | 
				
			||||||
	callbackCalled := false
 | 
						callbackCalled := false
 | 
				
			||||||
	objUpdate := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
						objUpdate := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
				
			||||||
	err = helper.GuaranteedUpdate(context.TODO(), "/some/key", &TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
						err = helper.GuaranteedUpdate(context.TODO(), "/some/key", &storagetesting.TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
		fakeClient.Err = errors.New("should not be called")
 | 
							fakeClient.Err = errors.New("should not be called")
 | 
				
			||||||
		callbackCalled = true
 | 
							callbackCalled = true
 | 
				
			||||||
		return objUpdate, nil
 | 
							return objUpdate, nil
 | 
				
			||||||
@@ -756,20 +749,20 @@ func TestGuaranteedUpdateKeyNotFound(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Create a new node.
 | 
						// Create a new node.
 | 
				
			||||||
	fakeClient.ExpectNotFoundGet(key)
 | 
						fakeClient.ExpectNotFoundGet(key)
 | 
				
			||||||
	obj := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
						obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: 1}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f := storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
						f := storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
		return obj, nil
 | 
							return obj, nil
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ignoreNotFound := false
 | 
						ignoreNotFound := false
 | 
				
			||||||
	err := helper.GuaranteedUpdate(context.TODO(), "/some/key", &TestResource{}, ignoreNotFound, f)
 | 
						err := helper.GuaranteedUpdate(context.TODO(), "/some/key", &storagetesting.TestResource{}, ignoreNotFound, f)
 | 
				
			||||||
	if err == nil {
 | 
						if err == nil {
 | 
				
			||||||
		t.Errorf("Expected error for key not found.")
 | 
							t.Errorf("Expected error for key not found.")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ignoreNotFound = true
 | 
						ignoreNotFound = true
 | 
				
			||||||
	err = helper.GuaranteedUpdate(context.TODO(), "/some/key", &TestResource{}, ignoreNotFound, f)
 | 
						err = helper.GuaranteedUpdate(context.TODO(), "/some/key", &storagetesting.TestResource{}, ignoreNotFound, f)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Errorf("Unexpected error %v.", err)
 | 
							t.Errorf("Unexpected error %v.", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -790,12 +783,12 @@ func TestGuaranteedUpdate_CreateCollision(t *testing.T) {
 | 
				
			|||||||
	wgForceCollision.Add(concurrency)
 | 
						wgForceCollision.Add(concurrency)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for i := 0; i < concurrency; i++ {
 | 
						for i := 0; i < concurrency; i++ {
 | 
				
			||||||
		// Increment TestResource.Value by 1
 | 
							// Increment storagetesting.TestResource.Value by 1
 | 
				
			||||||
		go func() {
 | 
							go func() {
 | 
				
			||||||
			defer wgDone.Done()
 | 
								defer wgDone.Done()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			firstCall := true
 | 
								firstCall := true
 | 
				
			||||||
			err := helper.GuaranteedUpdate(context.TODO(), "/some/key", &TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
								err := helper.GuaranteedUpdate(context.TODO(), "/some/key", &storagetesting.TestResource{}, true, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) {
 | 
				
			||||||
				defer func() { firstCall = false }()
 | 
									defer func() { firstCall = false }()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if firstCall {
 | 
									if firstCall {
 | 
				
			||||||
@@ -804,8 +797,8 @@ func TestGuaranteedUpdate_CreateCollision(t *testing.T) {
 | 
				
			|||||||
					wgForceCollision.Wait()
 | 
										wgForceCollision.Wait()
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				currValue := in.(*TestResource).Value
 | 
									currValue := in.(*storagetesting.TestResource).Value
 | 
				
			||||||
				obj := &TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: currValue + 1}
 | 
									obj := &storagetesting.TestResource{ObjectMeta: api.ObjectMeta{Name: "foo"}, Value: currValue + 1}
 | 
				
			||||||
				return obj, nil
 | 
									return obj, nil
 | 
				
			||||||
			}))
 | 
								}))
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
@@ -815,9 +808,9 @@ func TestGuaranteedUpdate_CreateCollision(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	wgDone.Wait()
 | 
						wgDone.Wait()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check that stored TestResource has received all updates.
 | 
						// Check that stored storagetesting.TestResource has received all updates.
 | 
				
			||||||
	body := fakeClient.Data[key].R.Node.Value
 | 
						body := fakeClient.Data[key].R.Node.Value
 | 
				
			||||||
	stored := &TestResource{}
 | 
						stored := &storagetesting.TestResource{}
 | 
				
			||||||
	if err := codec.DecodeInto([]byte(body), stored); err != nil {
 | 
						if err := codec.DecodeInto([]byte(body), stored); err != nil {
 | 
				
			||||||
		t.Errorf("Error decoding stored value: %v", body)
 | 
							t.Errorf("Error decoding stored value: %v", body)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										30
									
								
								pkg/storage/testing/types.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								pkg/storage/testing/types.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2015 The Kubernetes Authors All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package testing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TestResource struct {
 | 
				
			||||||
 | 
						unversioned.TypeMeta `json:",inline"`
 | 
				
			||||||
 | 
						api.ObjectMeta       `json:"metadata"`
 | 
				
			||||||
 | 
						Value                int `json:"value"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (*TestResource) IsAnAPIObject() {}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user