diff --git a/pkg/BUILD b/pkg/BUILD index 902581f1374..6e1a3760fb8 100644 --- a/pkg/BUILD +++ b/pkg/BUILD @@ -17,7 +17,6 @@ filegroup( "//pkg/api/persistentvolumeclaim:all-srcs", "//pkg/api/pod:all-srcs", "//pkg/api/podsecuritypolicy:all-srcs", - "//pkg/api/ref:all-srcs", "//pkg/api/resource:all-srcs", "//pkg/api/resourcequota:all-srcs", "//pkg/api/service:all-srcs", diff --git a/pkg/api/ref/BUILD b/pkg/api/ref/BUILD deleted file mode 100644 index f4244dbe12b..00000000000 --- a/pkg/api/ref/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["ref_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["ref.go"], - importpath = "k8s.io/kubernetes/pkg/api/ref", - deps = [ - "//pkg/apis/core:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/pkg/api/ref/ref.go b/pkg/api/ref/ref.go deleted file mode 100644 index d1a4c10de7b..00000000000 --- a/pkg/api/ref/ref.go +++ /dev/null @@ -1,122 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 ref - -import ( - "errors" - "fmt" - "net/url" - "strings" - - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - api "k8s.io/kubernetes/pkg/apis/core" -) - -// Errors that could be returned by GetReference. -var ( - ErrNilObject = errors.New("can't reference a nil object") - ErrNoSelfLink = errors.New("selfLink was empty, can't make reference") -) - -// 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 http://issue.k8s.io/7127 -func GetReference(scheme *runtime.Scheme, obj runtime.Object) (*api.ObjectReference, error) { - if obj == nil { - return nil, ErrNilObject - } - if ref, ok := obj.(*api.ObjectReference); ok { - // Don't make a reference to a reference. - 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) - if err != nil { - listMeta, err = meta.CommonAccessor(obj) - if err != nil { - return nil, err - } - } else { - 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) - 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] - } - - // only has list metadata - if objectMeta == nil { - return &api.ObjectReference{ - Kind: kind, - APIVersion: version, - ResourceVersion: listMeta.GetResourceVersion(), - }, nil - } - - return &api.ObjectReference{ - Kind: kind, - APIVersion: version, - Name: objectMeta.GetName(), - Namespace: objectMeta.GetNamespace(), - UID: objectMeta.GetUID(), - ResourceVersion: objectMeta.GetResourceVersion(), - }, nil -} - -// GetPartialReference is exactly like GetReference, but allows you to set the FieldPath. -func GetPartialReference(scheme *runtime.Scheme, obj runtime.Object, fieldPath string) (*api.ObjectReference, error) { - ref, err := GetReference(scheme, obj) - if err != nil { - return nil, err - } - ref.FieldPath = fieldPath - return ref, nil -} diff --git a/pkg/api/ref/ref_test.go b/pkg/api/ref/ref_test.go deleted file mode 100644 index 21c7406c7f2..00000000000 --- a/pkg/api/ref/ref_test.go +++ /dev/null @@ -1,150 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 ref - -import ( - "reflect" - "testing" - - "github.com/stretchr/testify/require" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/kubernetes/pkg/api/legacyscheme" - api "k8s.io/kubernetes/pkg/apis/core" -) - -type FakeAPIObject struct{} - -func (obj *FakeAPIObject) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind } -func (obj *FakeAPIObject) DeepCopyObject() runtime.Object { - if obj == nil { - return nil - } - clone := *obj - return &clone -} - -type ExtensionAPIObject struct { - metav1.TypeMeta - metav1.ObjectMeta -} - -func (obj *ExtensionAPIObject) DeepCopyObject() runtime.Object { - panic("ExtensionAPIObject does not support DeepCopy") -} - -func TestGetReference(t *testing.T) { - - // when vendoring kube, if you don't force the set of registered versions (like make test does) - // then you run into trouble because the types aren't registered in the scheme by anything. This does the - // register manually to allow unit test execution - if _, _, err := legacyscheme.Scheme.ObjectKinds(&api.Pod{}); err != nil { - require.NoError(t, api.AddToScheme(legacyscheme.Scheme)) - } - - table := map[string]struct { - obj runtime.Object - ref *api.ObjectReference - fieldPath string - shouldErr bool - }{ - "pod": { - obj: &api.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: "foo", - UID: "bar", - ResourceVersion: "42", - SelfLink: "/api/version1/pods/foo", - }, - }, - fieldPath: ".desiredState.containers[0]", - ref: &api.ObjectReference{ - Kind: "Pod", - APIVersion: "version1", - Name: "foo", - UID: "bar", - ResourceVersion: "42", - FieldPath: ".desiredState.containers[0]", - }, - }, - "serviceList": { - obj: &api.ServiceList{ - ListMeta: metav1.ListMeta{ - ResourceVersion: "42", - SelfLink: "/api/version2/services", - }, - }, - ref: &api.ObjectReference{ - Kind: "ServiceList", - APIVersion: "version2", - ResourceVersion: "42", - }, - }, - "extensionAPIObject": { - obj: &ExtensionAPIObject{ - TypeMeta: metav1.TypeMeta{ - Kind: "ExtensionAPIObject", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "foo", - UID: "bar", - ResourceVersion: "42", - SelfLink: "/custom_prefix/version1/extensions/foo", - }, - }, - ref: &api.ObjectReference{ - Kind: "ExtensionAPIObject", - APIVersion: "version1", - Name: "foo", - UID: "bar", - ResourceVersion: "42", - }, - }, - "badSelfLink": { - obj: &api.ServiceList{ - ListMeta: metav1.ListMeta{ - ResourceVersion: "42", - SelfLink: "version2/services", - }, - }, - shouldErr: true, - }, - "error": { - obj: &FakeAPIObject{}, - ref: nil, - shouldErr: true, - }, - "errorNil": { - obj: nil, - ref: nil, - shouldErr: true, - }, - } - - for name, item := range table { - ref, err := GetPartialReference(legacyscheme.Scheme, item.obj, item.fieldPath) - if e, a := item.shouldErr, (err != nil); e != a { - t.Errorf("%v: expected %v, got %v, err %v", name, e, a, err) - continue - } - if e, a := item.ref, ref; !reflect.DeepEqual(e, a) { - t.Errorf("%v: expected %#v, got %#v", name, e, a) - } - } -}