From a31d2c44f47193ec8c3a7f820fa60743475d71b3 Mon Sep 17 00:00:00 2001 From: David Eads Date: Tue, 26 Jun 2018 11:47:46 -0400 Subject: [PATCH] flatten nested lists for flatten in visitor --- .../genericclioptions/resource/visitor.go | 24 +++++++++++++++---- .../resource/visitor_test.go | 17 +++++++++++++ .../pkg/kubectl/builder/deeply-nested.yaml | 21 ++++++++++++++++ 3 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/pkg/kubectl/builder/deeply-nested.yaml diff --git a/pkg/kubectl/genericclioptions/resource/visitor.go b/pkg/kubectl/genericclioptions/resource/visitor.go index e83d02aa422..237ba73c502 100644 --- a/pkg/kubectl/genericclioptions/resource/visitor.go +++ b/pkg/kubectl/genericclioptions/resource/visitor.go @@ -376,12 +376,28 @@ func (v FlattenListVisitor) Visit(fn VisitorFunc) error { if info.Object == nil { return fn(info, nil) } - items, err := meta.ExtractList(info.Object) - if err != nil { + if !meta.IsListType(info.Object) { return fn(info, nil) } - if errs := runtime.DecodeList(items, v.mapper.decoder); len(errs) > 0 { - return utilerrors.NewAggregate(errs) + + items := []runtime.Object{} + itemsToProcess := []runtime.Object{info.Object} + + for i := 0; i < len(itemsToProcess); i++ { + currObj := itemsToProcess[i] + if !meta.IsListType(currObj) { + items = append(items, currObj) + continue + } + + currItems, err := meta.ExtractList(currObj) + if err != nil { + return err + } + if errs := runtime.DecodeList(currItems, v.mapper.decoder); len(errs) > 0 { + return utilerrors.NewAggregate(errs) + } + itemsToProcess = append(itemsToProcess, currItems...) } // If we have a GroupVersionKind on the list, prioritize that when asking for info on the objects contained in the list diff --git a/pkg/kubectl/genericclioptions/resource/visitor_test.go b/pkg/kubectl/genericclioptions/resource/visitor_test.go index 62dce9b6538..ec033168c41 100644 --- a/pkg/kubectl/genericclioptions/resource/visitor_test.go +++ b/pkg/kubectl/genericclioptions/resource/visitor_test.go @@ -24,6 +24,7 @@ import ( "testing" "time" + "github.com/davecgh/go-spew/spew" "github.com/stretchr/testify/assert" ) @@ -163,3 +164,19 @@ func TestVisitorHttpGet(t *testing.T) { }) } } + +func TestFlattenListVisitor(t *testing.T) { + b := newDefaultBuilder(). + FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../../../test/fixtures/pkg/kubectl/builder/deeply-nested.yaml"}}). + Flatten() + + test := &testVisitor{} + + err := b.Do().Visit(test.Handle) + if err != nil { + t.Fatal(err) + } + if len(test.Infos) != 6 { + t.Fatal(spew.Sdump(test.Infos)) + } +} diff --git a/test/fixtures/pkg/kubectl/builder/deeply-nested.yaml b/test/fixtures/pkg/kubectl/builder/deeply-nested.yaml new file mode 100644 index 00000000000..09b2afc5f5e --- /dev/null +++ b/test/fixtures/pkg/kubectl/builder/deeply-nested.yaml @@ -0,0 +1,21 @@ +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: Pod +- apiVersion: v1 + kind: Pod +- apiVersion: v1 + kind: List + items: + - apiVersion: v1 + kind: Pod + - apiVersion: v1 + kind: Pod + - apiVersion: v1 + kind: List + items: + - apiVersion: v1 + kind: Pod + - apiVersion: v1 + kind: Pod \ No newline at end of file