diff --git a/k8sdeps/kunstruct/factory.go b/k8sdeps/kunstruct/factory.go index e140b4fd0..9d8a97288 100644 --- a/k8sdeps/kunstruct/factory.go +++ b/k8sdeps/kunstruct/factory.go @@ -7,6 +7,7 @@ import ( "bytes" "fmt" "io" + "strconv" "strings" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -108,5 +109,30 @@ func (kf *KunstructuredFactoryImpl) validate(u unstructured.Unstructured) error if u.GetName() == "" { return fmt.Errorf("missing metadata.name in object %v", u) } + + if result, path := checkItemNil(u.Object); result { + return fmt.Errorf("empty item at %v in object %v", path, u) + } return nil } + +func checkItemNil(in interface{}) (bool, string) { + if in == nil { + return true, "" + } + switch v := in.(type) { + case map[string]interface{}: + for key, s := range v { + if result, path := checkItemNil(s); result { + return result, key + "/" + path + } + } + case []interface{}: + for index, s := range v { + if result, path := checkItemNil(s); result { + return result, "[" + strconv.Itoa(index) + "]/" + path + } + } + } + return false, "" +} diff --git a/pkg/resource/factory_test.go b/pkg/resource/factory_test.go index 5658a394a..8604ad2f9 100644 --- a/pkg/resource/factory_test.go +++ b/pkg/resource/factory_test.go @@ -98,6 +98,21 @@ items: patch7 := ` apiVersion: v1 kind: List +` + patchList5 := types.PatchStrategicMerge("patch8.yaml") + patch8 := ` +apiVersion: builtin +kind: ConfigMapGenerator +metadata: + name: kube100-site + labels: + app: web + testList: + - testA + - +literals: +- FRUIT=apple +- VEGETABLE=carrot ` testDeploymentSpec := map[string]interface{}{ "template": map[string]interface{}{ @@ -139,6 +154,7 @@ kind: List l.AddFile("/"+string(patchList2), []byte(patch5)) l.AddFile("/"+string(patchList3), []byte(patch6)) l.AddFile("/"+string(patchList4), []byte(patch7)) + l.AddFile("/"+string(patchList5), []byte(patch8)) tests := []struct { name string @@ -188,6 +204,12 @@ kind: List expectedOut: []*Resource{}, expectedErr: false, }, + { + name: "listWithEmptyList", + input: []types.PatchStrategicMerge{patchList5}, + expectedOut: []*Resource{}, + expectedErr: true, + }, } for _, test := range tests { rs, err := factory.SliceFromPatches(l, test.input)