diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index b5ccac72..e00f03c5 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -264,7 +264,7 @@ }, { "ImportPath": "k8s.io/apimachinery", - "Rev": "162a2dabc72f" + "Rev": "4a63d48c5dc1" }, { "ImportPath": "k8s.io/gengo", diff --git a/go.mod b/go.mod index 53f7fdbd..e455739b 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( golang.org/x/time v0.0.0-20161028155119-f51c12702a4d google.golang.org/appengine v1.5.0 // indirect k8s.io/api v0.0.0-20190806064354-8b51d7113622 - k8s.io/apimachinery v0.0.0-20190806215851-162a2dabc72f + k8s.io/apimachinery v0.0.0-20190808140701-4a63d48c5dc1 k8s.io/klog v0.3.1 k8s.io/utils v0.0.0-20190801114015-581e00157fb1 sigs.k8s.io/yaml v1.1.0 @@ -41,5 +41,5 @@ replace ( golang.org/x/text => golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db golang.org/x/tools => golang.org/x/tools v0.0.0-20190313210603-aa82965741a9 k8s.io/api => k8s.io/api v0.0.0-20190806064354-8b51d7113622 - k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20190806215851-162a2dabc72f + k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20190808140701-4a63d48c5dc1 ) diff --git a/go.sum b/go.sum index 7d3329b1..62efdbe3 100644 --- a/go.sum +++ b/go.sum @@ -125,7 +125,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= k8s.io/api v0.0.0-20190806064354-8b51d7113622/go.mod h1:SgXHCRh94q+5GrRf9Dty2ZG8+wCVmqvQbZJXXcAswkw= -k8s.io/apimachinery v0.0.0-20190806215851-162a2dabc72f/go.mod h1:+ntn62igV2hyNj7/0brOvXSMONE2KxcePkSxK7/9FFQ= +k8s.io/apimachinery v0.0.0-20190808140701-4a63d48c5dc1/go.mod h1:+ntn62igV2hyNj7/0brOvXSMONE2KxcePkSxK7/9FFQ= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= diff --git a/tools/reference/ref.go b/tools/reference/ref.go index 573d948a..442a991c 100644 --- a/tools/reference/ref.go +++ b/tools/reference/ref.go @@ -19,8 +19,6 @@ package reference import ( "errors" "fmt" - "net/url" - "strings" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" @@ -30,8 +28,7 @@ import ( var ( // Errors that could be returned by GetReference. - ErrNilObject = errors.New("can't reference a nil object") - ErrNoSelfLink = errors.New("selfLink was empty, can't make reference") + ErrNilObject = errors.New("can't reference a nil object") ) // GetReference returns an ObjectReference which refers to the given @@ -47,20 +44,6 @@ func GetReference(scheme *runtime.Scheme, obj runtime.Object) (*v1.ObjectReferen return ref, nil } - gvk := obj.GetObjectKind().GroupVersionKind() - - // if the object referenced is actually persisted, we can just get kind from meta - // if we are building an object reference to something not yet persisted, we should fallback to scheme - kind := gvk.Kind - if len(kind) == 0 { - // TODO: this is wrong - gvks, _, err := scheme.ObjectKinds(obj) - if err != nil { - return nil, err - } - kind = gvks[0].Kind - } - // An object that implements only List has enough metadata to build a reference var listMeta metav1.Common objectMeta, err := meta.Accessor(obj) @@ -73,29 +56,29 @@ func GetReference(scheme *runtime.Scheme, obj runtime.Object) (*v1.ObjectReferen listMeta = objectMeta } - // if the object referenced is actually persisted, we can also get version from meta - version := gvk.GroupVersion().String() - if len(version) == 0 { - selfLink := listMeta.GetSelfLink() - if len(selfLink) == 0 { - return nil, ErrNoSelfLink - } - selfLinkUrl, err := url.Parse(selfLink) + gvk := obj.GetObjectKind().GroupVersionKind() + + // If object meta doesn't contain data about kind and/or version, + // we are falling back to scheme. + // + // TODO: This doesn't work for CRDs, which are not registered in scheme. + if gvk.Empty() { + gvks, _, err := scheme.ObjectKinds(obj) if err != nil { return nil, err } - // example paths: ///* - parts := strings.Split(selfLinkUrl.Path, "/") - if len(parts) < 4 { - return nil, fmt.Errorf("unexpected self link format: '%v'; got version '%v'", selfLink, version) - } - if parts[1] == "api" { - version = parts[2] - } else { - version = parts[2] + "/" + parts[3] + if len(gvks) == 0 || gvks[0].Empty() { + return nil, fmt.Errorf("unexpected gvks registered for object %T: %v", obj, gvks) } + // TODO: The same object can be registered for multiple group versions + // (although in practise this doesn't seem to be used). + // In such case, the version set may not be correct. + gvk = gvks[0] } + kind := gvk.Kind + version := gvk.GroupVersion().String() + // only has list metadata if objectMeta == nil { return &v1.ObjectReference{ diff --git a/tools/reference/ref_test.go b/tools/reference/ref_test.go index b0cf06a9..7a478374 100644 --- a/tools/reference/ref_test.go +++ b/tools/reference/ref_test.go @@ -37,29 +37,31 @@ func TestGetReferenceRefVersion(t *testing.T) { tests := []struct { name string input *TestRuntimeObj + groupVersion schema.GroupVersion expectedRefVersion string }{ { - name: "api from selflink", + name: "v1 GV from scheme", input: &TestRuntimeObj{ - ObjectMeta: metav1.ObjectMeta{SelfLink: "/api/v1/namespaces"}, + ObjectMeta: metav1.ObjectMeta{SelfLink: "/bad-selflink/unused"}, }, + groupVersion: schema.GroupVersion{Group: "", Version: "v1"}, expectedRefVersion: "v1", }, { - name: "foo.group/v3 from selflink", + name: "foo.group/v3 GV from scheme", input: &TestRuntimeObj{ - ObjectMeta: metav1.ObjectMeta{SelfLink: "/apis/foo.group/v3/namespaces"}, + ObjectMeta: metav1.ObjectMeta{SelfLink: "/bad-selflink/unused"}, }, + groupVersion: schema.GroupVersion{Group: "foo.group", Version: "v3"}, expectedRefVersion: "foo.group/v3", }, } - scheme := runtime.NewScheme() - scheme.AddKnownTypes(schema.GroupVersion{Group: "this", Version: "is ignored"}, &TestRuntimeObj{}) - for _, test := range tests { t.Run(test.name, func(t *testing.T) { + scheme := runtime.NewScheme() + scheme.AddKnownTypes(test.groupVersion, &TestRuntimeObj{}) ref, err := GetReference(scheme, test.input) if err != nil { t.Fatal(err)