diff --git a/pkg/target/transformersarrays_test.go b/pkg/target/transformersarrays_test.go new file mode 100644 index 000000000..432f0813b --- /dev/null +++ b/pkg/target/transformersarrays_test.go @@ -0,0 +1,182 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package target_test + +import ( + "testing" + + kusttest_test "sigs.k8s.io/kustomize/pkg/kusttest" +) + +func makeStatefulSetKustomization(th *kusttest_test.KustTestHarness) { + th.WriteK("/app", ` +commonLabels: + notIn: arrays +resources: +- statefulset.yaml +- statefulset-with-template.yaml +`) + th.WriteF("/app/statefulset.yaml", ` +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: test + labels: + notIn: arrays +spec: + serviceName: test + replicas: 1 + selector: + matchLabels: + app: test + template: + metadata: + labels: + app: test + spec: + containers: + - name: nginx + image: k8s.gcr.io/nginx-slim:0.8 + ports: + - containerPort: 80 + name: web +`) + th.WriteF("/app/statefulset-with-template.yaml", ` +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: persisted-test + labels: + notIn: arrays +spec: + serviceName: test + replicas: 1 + selector: + matchLabels: + app: test + template: + metadata: + labels: + app: test + spec: + containers: + - name: nginx + image: k8s.gcr.io/nginx-slim:0.8 + ports: + - containerPort: 80 + name: web + volumeMounts: + - name: www + mountPath: /usr/share/nginx/html + - name: data + mountPath: /usr/share/nginx/data + volumeClaimTemplates: + - metadata: + name: www + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: my-storage-class + resources: + requests: + storage: 1Gi + - metadata: + name: data + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: my-storage-class + resources: + requests: + storage: 100Gi +`) +} + +func TestTransformersNoCreateArrays(t *testing.T) { + th := kusttest_test.NewKustTestHarness(t, "/app") + makeStatefulSetKustomization(th) + m, err := th.MakeKustTarget().MakeCustomizedResMap() + if err != nil { + t.Fatalf("Err: %v", err) + } + th.AssertActualEqualsExpected(m, ` +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + notIn: arrays + name: persisted-test +spec: + replicas: 1 + selector: + matchLabels: + app: test + notIn: arrays + serviceName: test + template: + metadata: + labels: + app: test + notIn: arrays + spec: + containers: + - image: k8s.gcr.io/nginx-slim:0.8 + name: nginx + ports: + - containerPort: 80 + name: web + volumeMounts: + - mountPath: /usr/share/nginx/html + name: www + - mountPath: /usr/share/nginx/data + name: data + volumeClaimTemplates: + - metadata: + labels: + notIn: arrays + name: www + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: my-storage-class + - metadata: + labels: + notIn: arrays + name: data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Gi + storageClassName: my-storage-class +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + notIn: arrays + name: test +spec: + replicas: 1 + selector: + matchLabels: + app: test + notIn: arrays + serviceName: test + template: + metadata: + labels: + app: test + notIn: arrays + spec: + containers: + - image: k8s.gcr.io/nginx-slim:0.8 + name: nginx + ports: + - containerPort: 80 + name: web +`) +} diff --git a/pkg/transformers/config/defaultconfig/commonlabels.go b/pkg/transformers/config/defaultconfig/commonlabels.go index a61e7ca01..9ad18739a 100644 --- a/pkg/transformers/config/defaultconfig/commonlabels.go +++ b/pkg/transformers/config/defaultconfig/commonlabels.go @@ -110,8 +110,8 @@ commonLabels: group: apps kind: StatefulSet -- path: spec/volumeClaimTemplates/metadata/labels - create: false +- path: spec/volumeClaimTemplates[]/metadata/labels + create: true group: apps kind: StatefulSet diff --git a/pkg/transformers/mutatefield.go b/pkg/transformers/mutatefield.go index 87c659c97..57caef8e0 100644 --- a/pkg/transformers/mutatefield.go +++ b/pkg/transformers/mutatefield.go @@ -33,18 +33,20 @@ func MutateField( return nil } - _, found := m[pathToField[0]] + firstPathSegment, isArray := getFirstPathSegment(pathToField) + + _, found := m[firstPathSegment] if !found { - if !createIfNotPresent { + if !createIfNotPresent || isArray { return nil } - m[pathToField[0]] = map[string]interface{}{} + m[firstPathSegment] = map[string]interface{}{} } if len(pathToField) == 1 { var err error for _, fn := range fns { - m[pathToField[0]], err = fn(m[pathToField[0]]) + m[firstPathSegment], err = fn(m[firstPathSegment]) if err != nil { return err } @@ -52,7 +54,7 @@ func MutateField( return nil } - v := m[pathToField[0]] + v := m[firstPathSegment] newPathToField := pathToField[1:] switch typedV := v.(type) { case nil: @@ -79,3 +81,10 @@ func MutateField( return fmt.Errorf("%#v is not expected to be a primitive type", typedV) } } + +func getFirstPathSegment(pathToField []string) (string, bool) { + if strings.HasSuffix(pathToField[0], "[]") { + return pathToField[0][:len(pathToField[0])-2], true + } + return pathToField[0], false +}