Rename methods in api/meta to be cleaner

This commit is contained in:
Clayton Coleman 2014-10-22 22:54:34 -04:00
parent 64d98cba73
commit 1ccb86c760
12 changed files with 77 additions and 77 deletions

View File

@ -373,7 +373,7 @@ func executeAPIRequest(ctx api.Context, method string, c *client.Client) bool {
if err != nil { if err != nil {
glog.Fatalf("error obtaining resource version for update: %v", err) glog.Fatalf("error obtaining resource version for update: %v", err)
} }
jsonBase, err := meta.FindTypeMeta(obj) jsonBase, err := meta.FindAccessor(obj)
if err != nil { if err != nil {
glog.Fatalf("error finding json base for update: %v", err) glog.Fatalf("error finding json base for update: %v", err)
} }
@ -409,7 +409,7 @@ func executeAPIRequest(ctx api.Context, method string, c *client.Client) bool {
if err != nil { if err != nil {
glog.Fatalf("error setting resource version: %v", err) glog.Fatalf("error setting resource version: %v", err)
} }
jsonBase, err := meta.FindTypeMeta(obj) jsonBase, err := meta.FindAccessor(obj)
if err != nil { if err != nil {
glog.Fatalf("error setting resource version: %v", err) glog.Fatalf("error setting resource version: %v", err)
} }

View File

@ -48,13 +48,13 @@ var Codec = v1beta1.Codec
// ResourceVersioner describes a default versioner that can handle all types // ResourceVersioner describes a default versioner that can handle all types
// of versioning. // of versioning.
// TODO: when versioning changes, make this part of each API definition. // TODO: when versioning changes, make this part of each API definition.
var ResourceVersioner = meta.NewTypeMetaResourceVersioner() var ResourceVersioner = meta.NewResourceVersioner()
// SelfLinker can set or get the SelfLink field of all API types. // SelfLinker can set or get the SelfLink field of all API types.
// TODO: when versioning changes, make this part of each API definition. // TODO: when versioning changes, make this part of each API definition.
// TODO(lavalamp): Combine SelfLinker & ResourceVersioner interfaces, force all uses // TODO(lavalamp): Combine SelfLinker & ResourceVersioner interfaces, force all uses
// to go through the InterfacesFor method below. // to go through the InterfacesFor method below.
var SelfLinker = meta.NewTypeMetaSelfLinker() var SelfLinker = meta.NewSelfLinker()
// VersionInterfaces contains the interfaces one should use for dealing with types of a particular version. // VersionInterfaces contains the interfaces one should use for dealing with types of a particular version.
type VersionInterfaces struct { type VersionInterfaces struct {

View File

@ -24,9 +24,9 @@ import (
"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
) )
// FindTypeMeta takes an arbitary api type, returns pointer to its TypeMeta field. // FindAccessor takes an arbitary api type, returns pointer to its TypeMeta field.
// obj must be a pointer to an api type. // obj must be a pointer to an api type.
func FindTypeMeta(obj runtime.Object) (TypeMetaInterface, error) { func FindAccessor(obj runtime.Object) (Accessor, error) {
v, err := conversion.EnforcePtr(obj) v, err := conversion.EnforcePtr(obj)
if err != nil { if err != nil {
return nil, err return nil, err
@ -38,7 +38,7 @@ func FindTypeMeta(obj runtime.Object) (TypeMetaInterface, error) {
} }
typeMeta := v.FieldByName("TypeMeta") typeMeta := v.FieldByName("TypeMeta")
if !typeMeta.IsValid() { if !typeMeta.IsValid() {
return nil, fmt.Errorf("struct %v lacks embedded JSON type", name) return nil, fmt.Errorf("struct %v lacks embedded TypeMeta type", name)
} }
g, err := newGenericTypeMeta(typeMeta) g, err := newGenericTypeMeta(typeMeta)
if err != nil { if err != nil {
@ -47,67 +47,67 @@ func FindTypeMeta(obj runtime.Object) (TypeMetaInterface, error) {
return g, nil return g, nil
} }
// NewTypeMetaResourceVersioner returns a ResourceVersioner that can set or // NewResourceVersioner returns a ResourceVersioner that can set or
// retrieve ResourceVersion on objects derived from TypeMeta. // retrieve ResourceVersion on objects derived from TypeMeta.
func NewTypeMetaResourceVersioner() runtime.ResourceVersioner { func NewResourceVersioner() runtime.ResourceVersioner {
return jsonBaseModifier{} return typeMetaModifier{}
} }
// jsonBaseModifier implements ResourceVersioner and SelfLinker. // typeMetaModifier implements ResourceVersioner and SelfLinker.
type jsonBaseModifier struct{} type typeMetaModifier struct{}
func (v jsonBaseModifier) ResourceVersion(obj runtime.Object) (string, error) { func (v typeMetaModifier) ResourceVersion(obj runtime.Object) (string, error) {
json, err := FindTypeMeta(obj) accessor, err := FindAccessor(obj)
if err != nil { if err != nil {
return "", err return "", err
} }
return json.ResourceVersion(), nil return accessor.ResourceVersion(), nil
} }
func (v jsonBaseModifier) SetResourceVersion(obj runtime.Object, version string) error { func (v typeMetaModifier) SetResourceVersion(obj runtime.Object, version string) error {
json, err := FindTypeMeta(obj) accessor, err := FindAccessor(obj)
if err != nil { if err != nil {
return err return err
} }
json.SetResourceVersion(version) accessor.SetResourceVersion(version)
return nil return nil
} }
func (v jsonBaseModifier) ID(obj runtime.Object) (string, error) { func (v typeMetaModifier) Name(obj runtime.Object) (string, error) {
json, err := FindTypeMeta(obj) accessor, err := FindAccessor(obj)
if err != nil { if err != nil {
return "", err return "", err
} }
return json.ID(), nil return accessor.Name(), nil
} }
func (v jsonBaseModifier) SelfLink(obj runtime.Object) (string, error) { func (v typeMetaModifier) SelfLink(obj runtime.Object) (string, error) {
json, err := FindTypeMeta(obj) accessor, err := FindAccessor(obj)
if err != nil { if err != nil {
return "", err return "", err
} }
return json.SelfLink(), nil return accessor.SelfLink(), nil
} }
func (v jsonBaseModifier) SetSelfLink(obj runtime.Object, selfLink string) error { func (v typeMetaModifier) SetSelfLink(obj runtime.Object, selfLink string) error {
json, err := FindTypeMeta(obj) accessor, err := FindAccessor(obj)
if err != nil { if err != nil {
return err return err
} }
json.SetSelfLink(selfLink) accessor.SetSelfLink(selfLink)
return nil return nil
} }
// NewTypeMetaSelfLinker returns a SelfLinker that works on all TypeMeta SelfLink fields. // NewSelfLinker returns a SelfLinker that works on all TypeMeta SelfLink fields.
func NewTypeMetaSelfLinker() runtime.SelfLinker { func NewSelfLinker() runtime.SelfLinker {
return jsonBaseModifier{} return typeMetaModifier{}
} }
// TypeMetaInterface lets you work with a TypeMeta from any of the versioned or // Accessor lets you work with object metadata from any of the versioned or
// internal APIruntime.Objects. // internal APIruntime.Objects.
type TypeMetaInterface interface { type Accessor interface {
ID() string Name() string
SetID(ID string) SetName(name string)
APIVersion() string APIVersion() string
SetAPIVersion(version string) SetAPIVersion(version string)
Kind() string Kind() string
@ -119,19 +119,19 @@ type TypeMetaInterface interface {
} }
type genericTypeMeta struct { type genericTypeMeta struct {
id *string name *string
apiVersion *string apiVersion *string
kind *string kind *string
resourceVersion *string resourceVersion *string
selfLink *string selfLink *string
} }
func (g genericTypeMeta) ID() string { func (g genericTypeMeta) Name() string {
return *g.id return *g.name
} }
func (g genericTypeMeta) SetID(id string) { func (g genericTypeMeta) SetName(name string) {
*g.id = id *g.name = name
} }
func (g genericTypeMeta) APIVersion() string { func (g genericTypeMeta) APIVersion() string {
@ -196,7 +196,7 @@ func fieldPtr(v reflect.Value, fieldName string, dest interface{}) error {
// Returns an error if this isn't the case. // Returns an error if this isn't the case.
func newGenericTypeMeta(v reflect.Value) (genericTypeMeta, error) { func newGenericTypeMeta(v reflect.Value) (genericTypeMeta, error) {
g := genericTypeMeta{} g := genericTypeMeta{}
if err := fieldPtr(v, "Name", &g.id); err != nil { if err := fieldPtr(v, "Name", &g.name); err != nil {
return g, err return g, err
} }
if err := fieldPtr(v, "APIVersion", &g.apiVersion); err != nil { if err := fieldPtr(v, "APIVersion", &g.apiVersion); err != nil {

View File

@ -44,9 +44,9 @@ func TestGenericTypeMeta(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("new err: %v", err) t.Fatalf("new err: %v", err)
} }
// Prove g supports TypeMetaInterface. // Prove g supports Accessor.
jbi := TypeMetaInterface(g) jbi := Accessor(g)
if e, a := "foo", jbi.ID(); e != a { if e, a := "foo", jbi.Name(); e != a {
t.Errorf("expected %v, got %v", e, a) t.Errorf("expected %v, got %v", e, a)
} }
if e, a := "a", jbi.APIVersion(); e != a { if e, a := "a", jbi.APIVersion(); e != a {
@ -62,7 +62,7 @@ func TestGenericTypeMeta(t *testing.T) {
t.Errorf("expected %v, got %v", e, a) t.Errorf("expected %v, got %v", e, a)
} }
jbi.SetID("bar") jbi.SetName("bar")
jbi.SetAPIVersion("c") jbi.SetAPIVersion("c")
jbi.SetKind("d") jbi.SetKind("d")
jbi.SetResourceVersion("2") jbi.SetResourceVersion("2")
@ -107,7 +107,7 @@ func TestResourceVersionerOfAPI(t *testing.T) {
"api object with version": {&MyAPIObject{TypeMeta: runtime.TypeMeta{ResourceVersion: "1"}}, "1"}, "api object with version": {&MyAPIObject{TypeMeta: runtime.TypeMeta{ResourceVersion: "1"}}, "1"},
"pointer to api object with version": {&MyAPIObject{TypeMeta: runtime.TypeMeta{ResourceVersion: "1"}}, "1"}, "pointer to api object with version": {&MyAPIObject{TypeMeta: runtime.TypeMeta{ResourceVersion: "1"}}, "1"},
} }
versioning := NewTypeMetaResourceVersioner() versioning := NewResourceVersioner()
for key, testCase := range testCases { for key, testCase := range testCases {
actual, err := versioning.ResourceVersion(testCase.Object) actual, err := versioning.ResourceVersion(testCase.Object)
if err != nil { if err != nil {
@ -170,7 +170,7 @@ func TestTypeMetaSelfLinker(t *testing.T) {
}, },
} }
linker := NewTypeMetaSelfLinker() linker := NewSelfLinker()
for name, item := range table { for name, item := range table {
got, err := linker.SelfLink(item.obj) got, err := linker.SelfLink(item.obj)
if e, a := item.succeed, err == nil; e != a { if e, a := item.succeed, err == nil; e != a {

View File

@ -36,7 +36,7 @@ func GetReference(obj runtime.Object) (*ObjectReference, error) {
if obj == nil { if obj == nil {
return nil, ErrNilObject return nil, ErrNilObject
} }
jsonBase, err := meta.FindTypeMeta(obj) accessor, err := meta.FindAccessor(obj)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -44,16 +44,16 @@ func GetReference(obj runtime.Object) (*ObjectReference, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
version := versionFromSelfLink.FindStringSubmatch(jsonBase.SelfLink()) version := versionFromSelfLink.FindStringSubmatch(accessor.SelfLink())
if len(version) < 2 { if len(version) < 2 {
return nil, fmt.Errorf("unexpected self link format: %v", jsonBase.SelfLink()) return nil, fmt.Errorf("unexpected self link format: %v", accessor.SelfLink())
} }
return &ObjectReference{ return &ObjectReference{
Kind: kind, Kind: kind,
APIVersion: version[1], APIVersion: version[1],
// TODO: correct Name and UID when TypeMeta makes a distinction // TODO: correct Name and UID when TypeMeta makes a distinction
Name: jsonBase.ID(), Name: accessor.Name(),
UID: jsonBase.ID(), UID: accessor.Name(),
ResourceVersion: jsonBase.ResourceVersion(), ResourceVersion: accessor.ResourceVersion(),
}, nil }, nil
} }

View File

@ -101,7 +101,7 @@ var apiObjectFuzzer = fuzz.New().NilChance(.5).NumElements(1, 1).Funcs(
func runTest(t *testing.T, codec runtime.Codec, source runtime.Object) { func runTest(t *testing.T, codec runtime.Codec, source runtime.Object) {
name := reflect.TypeOf(source).Elem().Name() name := reflect.TypeOf(source).Elem().Name()
apiObjectFuzzer.Fuzz(source) apiObjectFuzzer.Fuzz(source)
j, err := meta.FindTypeMeta(source) j, err := meta.FindAccessor(source)
if err != nil { if err != nil {
t.Fatalf("Unexpected error %v for %#v", err, source) t.Fatalf("Unexpected error %v for %#v", err, source)
} }
@ -160,7 +160,7 @@ func TestTypes(t *testing.T) {
t.Errorf("Couldn't make a %v? %v", kind, err) t.Errorf("Couldn't make a %v? %v", kind, err)
continue continue
} }
if _, err := meta.FindTypeMeta(item); err != nil { if _, err := meta.FindAccessor(item); err != nil {
t.Logf("%s is not a TypeMeta and cannot be round tripped: %v", kind, err) t.Logf("%s is not a TypeMeta and cannot be round tripped: %v", kind, err)
continue continue
} }

View File

@ -564,11 +564,11 @@ func TestParseTimeout(t *testing.T) {
type setTestSelfLinker struct { type setTestSelfLinker struct {
t *testing.T t *testing.T
expectedSet string expectedSet string
id string name string
called bool called bool
} }
func (s *setTestSelfLinker) ID(runtime.Object) (string, error) { return s.id, nil } func (s *setTestSelfLinker) Name(runtime.Object) (string, error) { return s.name, nil }
func (*setTestSelfLinker) SelfLink(runtime.Object) (string, error) { return "", nil } func (*setTestSelfLinker) SelfLink(runtime.Object) (string, error) { return "", nil }
func (s *setTestSelfLinker) SetSelfLink(obj runtime.Object, selfLink string) error { func (s *setTestSelfLinker) SetSelfLink(obj runtime.Object, selfLink string) error {
if e, a := s.expectedSet, selfLink; e != a { if e, a := s.expectedSet, selfLink; e != a {
@ -587,7 +587,7 @@ func TestSyncCreate(t *testing.T) {
} }
selfLinker := &setTestSelfLinker{ selfLinker := &setTestSelfLinker{
t: t, t: t,
id: "bar", name: "bar",
expectedSet: "/prefix/version/foo/bar", expectedSet: "/prefix/version/foo/bar",
} }
handler := Handle(map[string]RESTStorage{ handler := Handle(map[string]RESTStorage{
@ -684,7 +684,7 @@ func TestAsyncCreateError(t *testing.T) {
} }
selfLinker := &setTestSelfLinker{ selfLinker := &setTestSelfLinker{
t: t, t: t,
id: "bar", name: "bar",
expectedSet: "/prefix/version/foo/bar", expectedSet: "/prefix/version/foo/bar",
} }
handler := Handle(map[string]RESTStorage{"foo": &storage}, codec, "/prefix/version", selfLinker) handler := Handle(map[string]RESTStorage{"foo": &storage}, codec, "/prefix/version", selfLinker)

View File

@ -64,14 +64,14 @@ func (h *RESTHandler) setSelfLink(obj runtime.Object, req *http.Request) error {
return h.selfLinker.SetSelfLink(obj, newURL.String()) return h.selfLinker.SetSelfLink(obj, newURL.String())
} }
// Like setSelfLink, but appends the object's id. // Like setSelfLink, but appends the object's name.
func (h *RESTHandler) setSelfLinkAddID(obj runtime.Object, req *http.Request) error { func (h *RESTHandler) setSelfLinkAddName(obj runtime.Object, req *http.Request) error {
id, err := h.selfLinker.ID(obj) name, err := h.selfLinker.Name(obj)
if err != nil { if err != nil {
return err return err
} }
newURL := *req.URL newURL := *req.URL
newURL.Path = path.Join(h.canonicalPrefix, req.URL.Path, id) newURL.Path = path.Join(h.canonicalPrefix, req.URL.Path, name)
newURL.RawQuery = "" newURL.RawQuery = ""
newURL.Fragment = "" newURL.Fragment = ""
return h.selfLinker.SetSelfLink(obj, newURL.String()) return h.selfLinker.SetSelfLink(obj, newURL.String())
@ -171,7 +171,7 @@ func (h *RESTHandler) handleRESTStorage(parts []string, req *http.Request, w htt
errorJSON(err, h.codec, w) errorJSON(err, h.codec, w)
return return
} }
op := h.createOperation(out, sync, timeout, curry(h.setSelfLinkAddID, req)) op := h.createOperation(out, sync, timeout, curry(h.setSelfLinkAddName, req))
h.finishReq(op, req, w) h.finishReq(op, req, w)
case "DELETE": case "DELETE":

View File

@ -79,7 +79,7 @@ func (r *Reflector) listAndWatch() {
glog.Errorf("Failed to list %v: %v", r.expectedType, err) glog.Errorf("Failed to list %v: %v", r.expectedType, err)
return return
} }
jsonBase, err := meta.FindTypeMeta(list) jsonBase, err := meta.FindAccessor(list)
if err != nil { if err != nil {
glog.Errorf("Unable to understand list result %#v", list) glog.Errorf("Unable to understand list result %#v", list)
return return
@ -113,11 +113,11 @@ func (r *Reflector) listAndWatch() {
func (r *Reflector) syncWith(items []runtime.Object) error { func (r *Reflector) syncWith(items []runtime.Object) error {
found := map[string]interface{}{} found := map[string]interface{}{}
for _, item := range items { for _, item := range items {
jsonBase, err := meta.FindTypeMeta(item) jsonBase, err := meta.FindAccessor(item)
if err != nil { if err != nil {
return fmt.Errorf("unexpected item in list: %v", err) return fmt.Errorf("unexpected item in list: %v", err)
} }
found[jsonBase.ID()] = item found[jsonBase.Name()] = item
} }
r.store.Replace(found) r.store.Replace(found)
@ -140,21 +140,21 @@ func (r *Reflector) watchHandler(w watch.Interface, resourceVersion *string) err
glog.Errorf("expected type %v, but watch event object had type %v", e, a) glog.Errorf("expected type %v, but watch event object had type %v", e, a)
continue continue
} }
jsonBase, err := meta.FindTypeMeta(event.Object) jsonBase, err := meta.FindAccessor(event.Object)
if err != nil { if err != nil {
glog.Errorf("unable to understand watch event %#v", event) glog.Errorf("unable to understand watch event %#v", event)
continue continue
} }
switch event.Type { switch event.Type {
case watch.Added: case watch.Added:
r.store.Add(jsonBase.ID(), event.Object) r.store.Add(jsonBase.Name(), event.Object)
case watch.Modified: case watch.Modified:
r.store.Update(jsonBase.ID(), event.Object) r.store.Update(jsonBase.Name(), event.Object)
case watch.Deleted: case watch.Deleted:
// TODO: Will any consumers need access to the "last known // TODO: Will any consumers need access to the "last known
// state", which is passed in event.Object? If so, may need // state", which is passed in event.Object? If so, may need
// to change this. // to change this.
r.store.Delete(jsonBase.ID()) r.store.Delete(jsonBase.Name())
default: default:
glog.Errorf("unable to understand watch event %#v", event) glog.Errorf("unable to understand watch event %#v", event)
} }

View File

@ -110,7 +110,7 @@ func doUpdate(c *client.RESTClient, resource string, obj runtime.Object) (string
// Update the object we are trying to send to the server with the // Update the object we are trying to send to the server with the
// correct resource version. // correct resource version.
typeMeta, err := meta.FindTypeMeta(obj) typeMeta, err := meta.FindAccessor(obj)
if err != nil { if err != nil {
return "", err return "", err
} }
@ -150,15 +150,15 @@ func doDelete(c *client.RESTClient, resource string, obj runtime.Object) (string
} }
func getIDFromObj(obj runtime.Object) (string, error) { func getIDFromObj(obj runtime.Object) (string, error) {
typeMeta, err := meta.FindTypeMeta(obj) typeMeta, err := meta.FindAccessor(obj)
if err != nil { if err != nil {
return "", err return "", err
} }
return typeMeta.ID(), nil return typeMeta.Name(), nil
} }
func getResourceVersionFromObj(obj runtime.Object) (string, error) { func getResourceVersionFromObj(obj runtime.Object) (string, error) {
typeMeta, err := meta.FindTypeMeta(obj) typeMeta, err := meta.FindAccessor(obj)
if err != nil { if err != nil {
return "", err return "", err
} }

View File

@ -45,8 +45,8 @@ type SelfLinker interface {
SetSelfLink(obj Object, selfLink string) error SetSelfLink(obj Object, selfLink string) error
SelfLink(obj Object) (string, error) SelfLink(obj Object) (string, error)
// Knowing ID is sometimes necessary to use a SelfLinker. // Knowing Name is sometimes necessary to use a SelfLinker.
ID(obj Object) (string, error) Name(obj Object) (string, error)
} }
// All api types must support the Object interface. It's deliberately tiny so that this is not an onerous // All api types must support the Object interface. It's deliberately tiny so that this is not an onerous

View File

@ -45,7 +45,7 @@ func (*TestResource) IsAnAPIObject() {}
var scheme *runtime.Scheme var scheme *runtime.Scheme
var codec runtime.Codec var codec runtime.Codec
var versioner = RuntimeVersionAdapter{meta.NewTypeMetaResourceVersioner()} var versioner = RuntimeVersionAdapter{meta.NewResourceVersioner()}
func init() { func init() {
scheme = runtime.NewScheme() scheme = runtime.NewScheme()