diff --git a/pkg/controller/volume/persistentvolume/scheduler_binder_test.go b/pkg/controller/volume/persistentvolume/scheduler_binder_test.go index b481b7ee13..999fdd3e95 100644 --- a/pkg/controller/volume/persistentvolume/scheduler_binder_test.go +++ b/pkg/controller/volume/persistentvolume/scheduler_binder_test.go @@ -51,7 +51,6 @@ var ( boundPVC = makeTestPVC("bound-pvc", "1G", "", pvcBound, "pv-bound", "1", &waitClass) boundPVC2 = makeTestPVC("bound-pvc2", "1G", "", pvcBound, "pv-bound2", "1", &waitClass) boundPVCNode1a = makeTestPVC("unbound-pvc", "1G", "", pvcBound, "pv-node1a", "1", &waitClass) - badPVC = makeBadPVC() immediateUnboundPVC = makeTestPVC("immediate-unbound-pvc", "1G", "", pvcUnbound, "", "1", &immediateClass) immediateBoundPVC = makeTestPVC("immediate-bound-pvc", "1G", "", pvcBound, "pv-bound-immediate", "1", &immediateClass) @@ -554,28 +553,6 @@ func makeTestPVC(name, size, node string, pvcBoundState int, pvName, resourceVer return pvc } -func makeBadPVC() *v1.PersistentVolumeClaim { - fs := v1.PersistentVolumeFilesystem - return &v1.PersistentVolumeClaim{ - ObjectMeta: metav1.ObjectMeta{ - Name: "bad-pvc", - Namespace: "testns", - UID: types.UID("pvc-uid"), - ResourceVersion: "1", - // Don't include SefLink, so that GetReference will fail - }, - Spec: v1.PersistentVolumeClaimSpec{ - Resources: v1.ResourceRequirements{ - Requests: v1.ResourceList{ - v1.ResourceName(v1.ResourceStorage): resource.MustParse("1G"), - }, - }, - StorageClassName: &waitClass, - VolumeMode: &fs, - }, - } -} - func makeTestPV(name, node, capacity, version string, boundToPVC *v1.PersistentVolumeClaim, className string) *v1.PersistentVolume { fs := v1.PersistentVolumeFilesystem pv := &v1.PersistentVolume{ @@ -1044,12 +1021,6 @@ func TestAssumePodVolumes(t *testing.T) { expectedBindings: []*bindingInfo{makeBinding(unboundPVC, pvNode1aBound)}, expectedProvisionings: []*v1.PersistentVolumeClaim{}, }, - "claimref-failed": { - podPVCs: []*v1.PersistentVolumeClaim{unboundPVC}, - bindings: []*bindingInfo{makeBinding(unboundPVC, pvNode1a), makeBinding(badPVC, pvNode1b)}, - pvs: []*v1.PersistentVolume{pvNode1a, pvNode1b}, - shouldFail: true, - }, "tmpupdate-failed": { podPVCs: []*v1.PersistentVolumeClaim{unboundPVC}, bindings: []*bindingInfo{makeBinding(unboundPVC, pvNode1a), makeBinding(unboundPVC2, pvNode1b)}, diff --git a/pkg/kubelet/container/ref_test.go b/pkg/kubelet/container/ref_test.go index 716b259ef6..6ae93f5401 100644 --- a/pkg/kubelet/container/ref_test.go +++ b/pkg/kubelet/container/ref_test.go @@ -132,13 +132,6 @@ func TestGenerateContainerRef(t *testing.T) { }, success: true, }, - { - name: "no-selflink", - pod: &noSelfLinkPod, - container: &v1.Container{}, - expected: nil, - success: false, - }, { name: "defaulted-selflink", pod: &defaultedSelfLinkPod, diff --git a/staging/src/k8s.io/client-go/tools/record/event_test.go b/staging/src/k8s.io/client-go/tools/record/event_test.go index 4fcebc3537..67150d9909 100644 --- a/staging/src/k8s.io/client-go/tools/record/event_test.go +++ b/staging/src/k8s.io/client-go/tools/record/event_test.go @@ -153,7 +153,7 @@ func TestEventf(t *testing.T) { Name: "foo", Namespace: "baz", UID: "bar", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[2]", }, Reason: "Started", @@ -162,7 +162,7 @@ func TestEventf(t *testing.T) { Count: 1, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, expectUpdate: false, }, { @@ -181,7 +181,7 @@ func TestEventf(t *testing.T) { Name: "foo", Namespace: "baz", UID: "bar", - APIVersion: "version", + APIVersion: "v1", }, Reason: "Killed", Message: "some other verbose message: 1", @@ -189,7 +189,7 @@ func TestEventf(t *testing.T) { Count: 1, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'Killed' some other verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'Killed' some other verbose message: 1`, expectUpdate: false, }, { @@ -208,7 +208,7 @@ func TestEventf(t *testing.T) { Name: "foo", Namespace: "baz", UID: "bar", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[2]", }, Reason: "Started", @@ -217,7 +217,7 @@ func TestEventf(t *testing.T) { Count: 2, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, expectUpdate: true, }, { @@ -236,7 +236,7 @@ func TestEventf(t *testing.T) { Name: "foo", Namespace: "baz", UID: "differentUid", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[3]", }, Reason: "Started", @@ -245,7 +245,7 @@ func TestEventf(t *testing.T) { Count: 1, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, expectUpdate: false, }, { @@ -264,7 +264,7 @@ func TestEventf(t *testing.T) { Name: "foo", Namespace: "baz", UID: "bar", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[2]", }, Reason: "Started", @@ -273,7 +273,7 @@ func TestEventf(t *testing.T) { Count: 3, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, expectUpdate: true, }, { @@ -292,7 +292,7 @@ func TestEventf(t *testing.T) { Name: "foo", Namespace: "baz", UID: "differentUid", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[3]", }, Reason: "Stopped", @@ -301,7 +301,7 @@ func TestEventf(t *testing.T) { Count: 1, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, expectUpdate: false, }, { @@ -320,7 +320,7 @@ func TestEventf(t *testing.T) { Name: "foo", Namespace: "baz", UID: "differentUid", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[3]", }, Reason: "Stopped", @@ -329,7 +329,7 @@ func TestEventf(t *testing.T) { Count: 2, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, expectUpdate: true, }, } @@ -509,7 +509,7 @@ func TestLotsOfEvents(t *testing.T) { Name: fmt.Sprintf("foo-%v", i), Namespace: "baz", UID: "bar", - APIVersion: "version", + APIVersion: "v1", } // we need to vary the reason to prevent aggregation go recorder.Eventf(ref, v1.EventTypeNormal, "Reason-"+string(i), strconv.Itoa(i)) @@ -567,7 +567,7 @@ func TestEventfNoNamespace(t *testing.T) { Name: "foo", Namespace: "", UID: "bar", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[2]", }, Reason: "Started", @@ -576,7 +576,7 @@ func TestEventfNoNamespace(t *testing.T) { Count: 1, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, expectUpdate: false, }, } @@ -677,7 +677,7 @@ func TestMultiSinkCache(t *testing.T) { Name: "foo", Namespace: "baz", UID: "bar", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[2]", }, Reason: "Started", @@ -686,7 +686,7 @@ func TestMultiSinkCache(t *testing.T) { Count: 1, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, expectUpdate: false, }, { @@ -705,7 +705,7 @@ func TestMultiSinkCache(t *testing.T) { Name: "foo", Namespace: "baz", UID: "bar", - APIVersion: "version", + APIVersion: "v1", }, Reason: "Killed", Message: "some other verbose message: 1", @@ -713,7 +713,7 @@ func TestMultiSinkCache(t *testing.T) { Count: 1, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'Killed' some other verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'Killed' some other verbose message: 1`, expectUpdate: false, }, { @@ -732,7 +732,7 @@ func TestMultiSinkCache(t *testing.T) { Name: "foo", Namespace: "baz", UID: "bar", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[2]", }, Reason: "Started", @@ -741,7 +741,7 @@ func TestMultiSinkCache(t *testing.T) { Count: 2, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, expectUpdate: true, }, { @@ -760,7 +760,7 @@ func TestMultiSinkCache(t *testing.T) { Name: "foo", Namespace: "baz", UID: "differentUid", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[3]", }, Reason: "Started", @@ -769,7 +769,7 @@ func TestMultiSinkCache(t *testing.T) { Count: 1, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, expectUpdate: false, }, { @@ -788,7 +788,7 @@ func TestMultiSinkCache(t *testing.T) { Name: "foo", Namespace: "baz", UID: "bar", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[2]", }, Reason: "Started", @@ -797,7 +797,7 @@ func TestMultiSinkCache(t *testing.T) { Count: 3, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, expectUpdate: true, }, { @@ -816,7 +816,7 @@ func TestMultiSinkCache(t *testing.T) { Name: "foo", Namespace: "baz", UID: "differentUid", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[3]", }, Reason: "Stopped", @@ -825,7 +825,7 @@ func TestMultiSinkCache(t *testing.T) { Count: 1, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, expectUpdate: false, }, { @@ -844,7 +844,7 @@ func TestMultiSinkCache(t *testing.T) { Name: "foo", Namespace: "baz", UID: "differentUid", - APIVersion: "version", + APIVersion: "v1", FieldPath: "spec.containers[3]", }, Reason: "Stopped", @@ -853,7 +853,7 @@ func TestMultiSinkCache(t *testing.T) { Count: 2, Type: v1.EventTypeNormal, }, - expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, expectUpdate: true, }, } diff --git a/staging/src/k8s.io/client-go/tools/reference/ref.go b/staging/src/k8s.io/client-go/tools/reference/ref.go index 573d948a98..442a991cc4 100644 --- a/staging/src/k8s.io/client-go/tools/reference/ref.go +++ b/staging/src/k8s.io/client-go/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/staging/src/k8s.io/client-go/tools/reference/ref_test.go b/staging/src/k8s.io/client-go/tools/reference/ref_test.go index b0cf06a97c..7a478374e2 100644 --- a/staging/src/k8s.io/client-go/tools/reference/ref_test.go +++ b/staging/src/k8s.io/client-go/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)