Skip to content

Commit 23de8ff

Browse files
mmltpemmelot
andauthored
Fixes issue 1392, kpt can't handle kind: List. (#3654)
Co-authored-by: Pieter Emmelot <[email protected]>
1 parent c67b11f commit 23de8ff

File tree

3 files changed

+126
-0
lines changed

3 files changed

+126
-0
lines changed

commands/live/apply/cmdapply.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,12 @@ func (r *Runner) runE(c *cobra.Command, args []string) error {
175175
return err
176176
}
177177

178+
// objs may contain kind List
179+
objs, err = live.Flatten(objs)
180+
if err != nil {
181+
return err
182+
}
183+
178184
invInfo, err := live.ToInventoryInfo(inv)
179185
if err != nil {
180186
return err

pkg/live/flatten.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright 2022 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package live
16+
17+
import (
18+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
19+
"k8s.io/apimachinery/pkg/runtime"
20+
)
21+
22+
// Flatten returns a list containing 'in' objects with objects of kind List
23+
// replaced by their members.
24+
func Flatten(in []*unstructured.Unstructured) ([]*unstructured.Unstructured, error) {
25+
var out []*unstructured.Unstructured
26+
27+
for _, o := range in {
28+
if o.IsList() {
29+
err := o.EachListItem(func(item runtime.Object) error {
30+
item2 := item.(*unstructured.Unstructured)
31+
out = append(out, item2)
32+
return nil
33+
})
34+
if err != nil {
35+
return nil, err
36+
}
37+
} else {
38+
out = append(out, o)
39+
}
40+
}
41+
return out, nil
42+
}

pkg/live/flatten_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// Copyright 2022 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package live
16+
17+
import (
18+
"testing"
19+
20+
"github.com/stretchr/testify/assert"
21+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
22+
)
23+
24+
func Test_Flatten(t *testing.T) {
25+
tests := []struct {
26+
name string
27+
in []*unstructured.Unstructured
28+
want []*unstructured.Unstructured
29+
}{
30+
{
31+
name: "simple list",
32+
in: simpleList,
33+
want: simpleList,
34+
},
35+
{
36+
name: "list with list",
37+
in: []*unstructured.Unstructured{
38+
{
39+
Object: map[string]interface{}{
40+
"kind": "List",
41+
"items": anySlice(simpleList),
42+
},
43+
},
44+
},
45+
want: simpleList,
46+
},
47+
}
48+
for _, tt := range tests {
49+
t.Run(tt.name, func(t *testing.T) {
50+
got, err := Flatten(tt.in)
51+
if assert.NoError(t, err) {
52+
assert.Equal(t, tt.want, got)
53+
}
54+
})
55+
}
56+
}
57+
58+
func anySlice(in []*unstructured.Unstructured) (out []interface{}) {
59+
for _, o := range in {
60+
out = append(out, o.Object)
61+
}
62+
return
63+
}
64+
65+
var simpleList = []*unstructured.Unstructured{
66+
{
67+
Object: map[string]interface{}{
68+
"kind": "ConfigMap",
69+
"version": "v1",
70+
},
71+
},
72+
{
73+
Object: map[string]interface{}{
74+
"kind": "Pod",
75+
"version": "v1",
76+
},
77+
},
78+
}

0 commit comments

Comments
 (0)