From b972f722481b9138d9b77319d02a132bda2dfdf8 Mon Sep 17 00:00:00 2001 From: Daniel Smith Date: Thu, 25 Sep 2014 15:08:09 -0700 Subject: [PATCH] convert multiple return values into a struct, add SelfLinker --- pkg/api/latest/latest.go | 30 +++++++++++++++++++++++++----- pkg/api/latest/latest_test.go | 4 ++-- pkg/client/client.go | 4 ++-- pkg/master/master.go | 4 ++-- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/pkg/api/latest/latest.go b/pkg/api/latest/latest.go index cdd0704d6a9..99c558d6a79 100644 --- a/pkg/api/latest/latest.go +++ b/pkg/api/latest/latest.go @@ -49,16 +49,36 @@ var Codec = v1beta1.Codec // TODO: when versioning changes, make this part of each API definition. var ResourceVersioner = runtime.NewJSONBaseResourceVersioner() +// SelfLinker can set or get the SelfLink field of all API types. +// TODO: when versioning changes, make this part of each API definition. +// TODO(lavalamp): Combine SelfLinker & ResourceVersioner interfaces, force all uses +// to go through the InterfacesFor method below. +var SelfLinker = runtime.NewJSONBaseSelfLinker() + +// VersionInterfaces contains the interfaces one should use for dealing with types of a particular version. +type VersionInterfaces struct { + runtime.Codec + runtime.ResourceVersioner + runtime.SelfLinker +} + // InterfacesFor returns the default Codec and ResourceVersioner for a given version // string, or an error if the version is not known. -func InterfacesFor(version string) (codec runtime.Codec, versioner runtime.ResourceVersioner, err error) { +func InterfacesFor(version string) (*VersionInterfaces, error) { switch version { case "v1beta1": - codec, versioner = v1beta1.Codec, ResourceVersioner + return &VersionInterfaces{ + Codec: v1beta1.Codec, + ResourceVersioner: ResourceVersioner, + SelfLinker: SelfLinker, + }, nil case "v1beta2": - codec, versioner = v1beta2.Codec, ResourceVersioner + return &VersionInterfaces{ + Codec: v1beta2.Codec, + ResourceVersioner: ResourceVersioner, + SelfLinker: SelfLinker, + }, nil default: - err = fmt.Errorf("unsupported storage version: %s (valid: %s)", version, strings.Join(Versions, ", ")) + return nil, fmt.Errorf("unsupported storage version: %s (valid: %s)", version, strings.Join(Versions, ", ")) } - return } diff --git a/pkg/api/latest/latest_test.go b/pkg/api/latest/latest_test.go index 4c6c6f9d5c7..5fa83191a12 100644 --- a/pkg/api/latest/latest_test.go +++ b/pkg/api/latest/latest_test.go @@ -146,11 +146,11 @@ func TestCodec(t *testing.T) { } func TestInterfacesFor(t *testing.T) { - if _, _, err := InterfacesFor(""); err == nil { + if _, err := InterfacesFor(""); err == nil { t.Fatalf("unexpected non-error: %v", err) } for i, version := range append([]string{Version, OldestVersion}, Versions...) { - if codec, versioner, err := InterfacesFor(version); err != nil || codec == nil || versioner == nil { + if vi, err := InterfacesFor(version); err != nil || vi == nil { t.Fatalf("%d: unexpected result: %v", i, err) } } diff --git a/pkg/client/client.go b/pkg/client/client.go index 0ca6da7bad1..f6a3b46ed3c 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -108,12 +108,12 @@ func New(host, version string, auth *AuthInfo) (*Client, error) { // TODO: implement version negotation (highest version supported by server) version = latest.Version } - serverCodec, _, err := latest.InterfacesFor(version) + versionInterfaces, err := latest.InterfacesFor(version) if err != nil { return nil, fmt.Errorf("API version '%s' is not recognized (valid values: %s)", version, strings.Join(latest.Versions, ", ")) } prefix := fmt.Sprintf("/api/%s/", version) - restClient, err := NewRESTClient(host, auth, prefix, serverCodec) + restClient, err := NewRESTClient(host, auth, prefix, versionInterfaces.Codec) if err != nil { return nil, fmt.Errorf("API URL '%s' is not valid: %v", host, err) } diff --git a/pkg/master/master.go b/pkg/master/master.go index 886cadbb6c4..cab1167b6b1 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -73,11 +73,11 @@ func NewEtcdHelper(etcdServers []string, version string) (helper tools.EtcdHelpe if version == "" { version = latest.Version } - codec, versioner, err := latest.InterfacesFor(version) + versionInterfaces, err := latest.InterfacesFor(version) if err != nil { return helper, err } - return tools.EtcdHelper{client, codec, versioner}, nil + return tools.EtcdHelper{client, versionInterfaces.Codec, versionInterfaces.ResourceVersioner}, nil } // New returns a new instance of Master connected to the given etcd server.