From 56cb4c93918efdc6e05f1c8f011166734fbe8a2f Mon Sep 17 00:00:00 2001 From: Vihang Mehta Date: Wed, 21 Jun 2023 13:17:41 -0700 Subject: [PATCH] [bug] Update DefaultObjectDescriber to handle interface params (#118190) * Update DefaultObjectDescriber to handle interface params Signed-off-by: Vihang Mehta * Minor test cleanup for more descriptive errors Signed-off-by: Vihang Mehta --------- Signed-off-by: Vihang Mehta --- .../k8s.io/kubectl/pkg/describe/describe.go | 8 +++++-- .../kubectl/pkg/describe/describe_test.go | 21 ++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/staging/src/k8s.io/kubectl/pkg/describe/describe.go b/staging/src/k8s.io/kubectl/pkg/describe/describe.go index 8cc58be09d4..33576e194ec 100644 --- a/staging/src/k8s.io/kubectl/pkg/describe/describe.go +++ b/staging/src/k8s.io/kubectl/pkg/describe/describe.go @@ -5030,8 +5030,12 @@ func (fn typeFunc) Matches(types []reflect.Type) bool { // Describe invokes the nested function with the exact number of arguments. func (fn typeFunc) Describe(exact interface{}, extra ...interface{}) (string, error) { values := []reflect.Value{reflect.ValueOf(exact)} - for _, obj := range extra { - values = append(values, reflect.ValueOf(obj)) + for i, obj := range extra { + if obj != nil { + values = append(values, reflect.ValueOf(obj)) + } else { + values = append(values, reflect.New(fn.Extra[i]).Elem()) + } } out := fn.Fn.Call(values) s := out[0].Interface().(string) diff --git a/staging/src/k8s.io/kubectl/pkg/describe/describe_test.go b/staging/src/k8s.io/kubectl/pkg/describe/describe_test.go index fc87d44790d..8838ee0ee93 100644 --- a/staging/src/k8s.io/kubectl/pkg/describe/describe_test.go +++ b/staging/src/k8s.io/kubectl/pkg/describe/describe_test.go @@ -1254,7 +1254,7 @@ func TestDefaultDescribers(t *testing.T) { t.Fatalf("unexpected error: %v", err) } if !strings.Contains(out, "foo") { - t.Errorf("unexpected output: %s", out) + t.Errorf("missing Pod `foo` in output: %s", out) } out, err = DefaultObjectDescriber.DescribeObject(&corev1.Service{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}) @@ -1262,18 +1262,18 @@ func TestDefaultDescribers(t *testing.T) { t.Fatalf("unexpected error: %v", err) } if !strings.Contains(out, "foo") { - t.Errorf("unexpected output: %s", out) + t.Errorf("missing Service `foo` in output: %s", out) } out, err = DefaultObjectDescriber.DescribeObject(&corev1.ReplicationController{ ObjectMeta: metav1.ObjectMeta{Name: "foo"}, - Spec: corev1.ReplicationControllerSpec{Replicas: utilpointer.Int32Ptr(1)}, + Spec: corev1.ReplicationControllerSpec{Replicas: utilpointer.Int32(1)}, }) if err != nil { t.Fatalf("unexpected error: %v", err) } if !strings.Contains(out, "foo") { - t.Errorf("unexpected output: %s", out) + t.Errorf("missing Replication Controller `foo` in output: %s", out) } out, err = DefaultObjectDescriber.DescribeObject(&corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}) @@ -1281,7 +1281,18 @@ func TestDefaultDescribers(t *testing.T) { t.Fatalf("unexpected error: %v", err) } if !strings.Contains(out, "foo") { - t.Errorf("unexpected output: %s", out) + t.Errorf("missing Node `foo` output: %s", out) + } + + out, err = DefaultObjectDescriber.DescribeObject(&appsv1.StatefulSet{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: appsv1.StatefulSetSpec{Replicas: utilpointer.Int32(1)}, + }) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !strings.Contains(out, "foo") { + t.Errorf("missing StatefulSet `foo` in output: %s", out) } }