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 5d4ec374345..7ba73924b94 100644 --- a/staging/src/k8s.io/client-go/tools/reference/ref.go +++ b/staging/src/k8s.io/client-go/tools/reference/ref.go @@ -20,7 +20,7 @@ import ( "errors" "fmt" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -63,6 +63,9 @@ func GetReference(scheme *runtime.Scheme, obj runtime.Object) (*v1.ObjectReferen // // TODO: This doesn't work for CRDs, which are not registered in scheme. if gvk.Empty() { + if scheme == nil { + return nil, errors.New("scheme is required to look up gvk") + } gvks, _, err := scheme.ObjectKinds(obj) if err != nil { return nil, err 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 c7042c62160..488d655d64f 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 @@ -72,3 +72,41 @@ func TestGetReferenceRefVersion(t *testing.T) { }) } } + +func TestGetReferenceNilScheme(t *testing.T) { + input := &TestRuntimeObj{ + ObjectMeta: metav1.ObjectMeta{}, + } + _, err := GetReference(nil, input) + if err == nil { + t.Fatal("expected an error") + } + if err.Error() != "scheme is required to look up gvk" { + t.Errorf("expected %q, got %q", "scheme is required to look up gvk", err.Error()) + } +} + +func TestGetReferenceNilSchemeWithPopulatedGVK(t *testing.T) { + input := &TestRuntimeObj{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "foo.group/v3", + Kind: "Bar", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "a-name", + }, + } + ref, err := GetReference(nil, input) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if ref.APIVersion != "foo.group/v3" { + t.Errorf("expected %q, got %q", "foo.group/v3", ref.APIVersion) + } + if ref.Kind != "Bar" { + t.Errorf("expected %q, got %q", "Bar", ref.Kind) + } + if ref.Name != "a-name" { + t.Errorf("expected %q, got %q", "a-name", ref.Name) + } +}