diff --git a/Godeps/_workspace/src/github.com/GoogleCloudPlatform/kubernetes/pkg/api/ref.go b/Godeps/_workspace/src/github.com/GoogleCloudPlatform/kubernetes/pkg/api/ref.go index 2af43ebb3d1b..67330f90057c 100644 --- a/Godeps/_workspace/src/github.com/GoogleCloudPlatform/kubernetes/pkg/api/ref.go +++ b/Godeps/_workspace/src/github.com/GoogleCloudPlatform/kubernetes/pkg/api/ref.go @@ -19,7 +19,8 @@ package api import ( "errors" "fmt" - "regexp" + "net/url" + "strings" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/meta" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" @@ -31,8 +32,6 @@ var ( ErrNoSelfLink = errors.New("selfLink was empty, can't make reference") ) -var versionFromSelfLink = regexp.MustCompile("/api/([^/]*)/") - // ForTesting_ReferencesAllowBlankSelfLinks can be set to true in tests to avoid // "ErrNoSelfLink" errors. var ForTesting_ReferencesAllowBlankSelfLinks = false @@ -40,6 +39,7 @@ var ForTesting_ReferencesAllowBlankSelfLinks = false // GetReference returns an ObjectReference which refers to the given // object, or an error if the object doesn't follow the conventions // that would allow this. +// TODO: should take a meta.Interface see https://github.com/GoogleCloudPlatform/kubernetes/issues/7127 func GetReference(obj runtime.Object) (*ObjectReference, error) { if obj == nil { return nil, ErrNilObject @@ -52,23 +52,41 @@ func GetReference(obj runtime.Object) (*ObjectReference, error) { if err != nil { return nil, err } - _, kind, err := Scheme.ObjectVersionAndKind(obj) - if err != nil { - return nil, err + + // 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 := meta.Kind() + if kind == "" { + _, kind, err = Scheme.ObjectVersionAndKind(obj) + if err != nil { + return nil, err + } } - version := "" - parsedSelfLink := versionFromSelfLink.FindStringSubmatch(meta.SelfLink()) - if len(parsedSelfLink) < 2 { - if ForTesting_ReferencesAllowBlankSelfLinks { - version = "testing" - } else if meta.SelfLink() == "" { - return nil, ErrNoSelfLink + + // if the object referenced is actually persisted, we can also get version from meta + version := meta.APIVersion() + if version == "" { + selfLink := meta.SelfLink() + if selfLink == "" { + if ForTesting_ReferencesAllowBlankSelfLinks { + version = "testing" + } else { + return nil, ErrNoSelfLink + } } else { - return nil, fmt.Errorf("unexpected self link format: '%v'; got version '%v'", meta.SelfLink(), version) + selfLinkUrl, err := url.Parse(selfLink) + if err != nil { + return nil, err + } + // example paths: ///* + parts := strings.Split(selfLinkUrl.Path, "/") + if len(parts) < 3 { + return nil, fmt.Errorf("unexpected self link format: '%v'; got version '%v'", selfLink, version) + } + version = parts[2] } - } else { - version = parsedSelfLink[1] } + return &ObjectReference{ Kind: kind, APIVersion: version,