From 7cbd2fc97d1ab7abcb24235cfd2d297073ff536f Mon Sep 17 00:00:00 2001 From: yuzhiquan Date: Thu, 1 Jul 2021 17:46:48 +0800 Subject: [PATCH] add KObjs function to handle slice of KMetada --- klog.go | 17 ++++++++++++ klog_test.go | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/klog.go b/klog.go index 1e187f76..d24087de 100644 --- a/klog.go +++ b/klog.go @@ -1603,3 +1603,20 @@ func KRef(namespace, name string) ObjectRef { Namespace: namespace, } } + +// KObjs returns slice of ObjectRef from an slice of ObjectMeta +func KObjs(arg interface{}) []ObjectRef { + s := reflect.ValueOf(arg) + if s.Kind() != reflect.Slice { + return nil + } + objectRefs := make([]ObjectRef, 0, s.Len()) + for i := 0; i < s.Len(); i++ { + if v, ok := s.Index(i).Interface().(KMetadata); ok { + objectRefs = append(objectRefs, KObj(v)) + } else { + return nil + } + } + return objectRefs +} diff --git a/klog_test.go b/klog_test.go index cd67e4c0..7f6a6471 100644 --- a/klog_test.go +++ b/klog_test.go @@ -1754,3 +1754,81 @@ func TestKlogFlagPrefix(t *testing.T) { } }) } + +func TestKObjs(t *testing.T) { + tests := []struct { + name string + obj interface{} + want []ObjectRef + }{ + { + name: "test for KObjs function with KMetadata slice", + obj: []kMetadataMock{ + { + name: "kube-dns", + ns: "kube-system", + }, + { + name: "mi-conf", + }, + {}, + }, + want: []ObjectRef{ + { + Name: "kube-dns", + Namespace: "kube-system", + }, + { + Name: "mi-conf", + }, + {}, + }, + }, + { + name: "test for KObjs function with KMetadata pointer slice", + obj: []*kMetadataMock{ + { + name: "kube-dns", + ns: "kube-system", + }, + { + name: "mi-conf", + }, + nil, + }, + want: []ObjectRef{ + { + Name: "kube-dns", + Namespace: "kube-system", + }, + { + Name: "mi-conf", + }, + {}, + }, + }, + { + name: "test for KObjs function with slice does not implement KMetadata", + obj: []int{1, 2, 3, 4, 6}, + want: nil, + }, + { + name: "test for KObjs function with interface", + obj: "test case", + want: nil, + }, + { + name: "test for KObjs function with nil", + obj: nil, + want: nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if !reflect.DeepEqual(KObjs(tt.obj), tt.want) { + t.Errorf("\nwant:\t %v\n got:\t %v", tt.want, KObjs(tt.obj)) + } + }) + } +}