diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index c76762dc24..7c747fede4 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -4343,113 +4343,113 @@ }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/commands/build", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/constants", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/expansion", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/factory", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/fs", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/git", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/gvk", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/ifc", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/ifc/transformer", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/image", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/internal/error", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/loader", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/patch", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/patch/transformer", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/resid", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/resmap", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/resource", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/target", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/transformers", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/transformers/config", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/types", - "Comment": "v2.0.1", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Comment": "v2.0.3", + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/structured-merge-diff/fieldpath", diff --git a/staging/src/k8s.io/cli-runtime/Godeps/Godeps.json b/staging/src/k8s.io/cli-runtime/Godeps/Godeps.json index 59b09ba887..1c07d1e7a0 100644 --- a/staging/src/k8s.io/cli-runtime/Godeps/Godeps.json +++ b/staging/src/k8s.io/cli-runtime/Godeps/Godeps.json @@ -716,91 +716,91 @@ }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/commands/build", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/constants", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/expansion", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/factory", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/fs", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/git", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/gvk", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/ifc", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/ifc/transformer", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/image", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/internal/error", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/loader", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/patch", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/patch/transformer", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/resid", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/resmap", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/resource", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/target", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/transformers", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/transformers/config", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/types", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/yaml", diff --git a/staging/src/k8s.io/cli-runtime/pkg/genericclioptions/resource/builder_test.go b/staging/src/k8s.io/cli-runtime/pkg/genericclioptions/resource/builder_test.go index d2e0d6ffec..e9408f7311 100644 --- a/staging/src/k8s.io/cli-runtime/pkg/genericclioptions/resource/builder_test.go +++ b/staging/src/k8s.io/cli-runtime/pkg/genericclioptions/resource/builder_test.go @@ -666,7 +666,7 @@ func TestKustomizeDirectoryBuilder(t *testing.T) { { directory: "../../../artifacts/guestbook", expectErr: true, - errMsg: "No kustomization file found", + errMsg: "unable to find one of 'kustomization.yaml', 'kustomization.yml' or 'Kustomization'", }, { directory: dir, diff --git a/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/configmapfactory.go b/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/configmapfactory.go index 4525537364..07d5919d5d 100644 --- a/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/configmapfactory.go +++ b/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/configmapfactory.go @@ -81,8 +81,8 @@ func (f *ConfigMapFactory) MakeConfigMap( } all = append(all, pairs...) - for _, kv := range all { - err = addKvToConfigMap(cm, kv.Key, kv.Value) + for _, p := range all { + err = addKvToConfigMap(cm, p.Key, p.Value) if err != nil { return nil, err } diff --git a/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/secretfactory.go b/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/secretfactory.go index 6e431a7e3e..97469f6337 100644 --- a/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/secretfactory.go +++ b/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/configmapandsecret/secretfactory.go @@ -80,8 +80,8 @@ func (f *SecretFactory) MakeSecret(args *types.SecretArgs, options *types.Genera } all = append(all, pairs...) - for _, kv := range all { - err = addKvToSecret(s, kv.Key, kv.Value) + for _, p := range all { + err = addKvToSecret(s, p.Key, p.Value) if err != nil { return nil, err } diff --git a/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/factory.go b/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/factory.go index 4e001aaa05..a1dec31691 100644 --- a/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/factory.go +++ b/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/factory.go @@ -108,7 +108,7 @@ func (kf *KunstructuredFactoryImpl) validate(u unstructured.Unstructured) error kind := u.GetKind() if kind == "" { return fmt.Errorf("missing kind in object %v", u) - } else if kind == "List" { + } else if strings.HasSuffix(kind, "List") { return nil } if u.GetName() == "" { diff --git a/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/factory_test.go b/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/factory_test.go index 51e2be793c..4fe7109344 100644 --- a/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/factory_test.go +++ b/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kunstruct/factory_test.go @@ -42,6 +42,15 @@ func TestSliceFromBytes(t *testing.T) { testConfigMap.Map(), }, }) + testConfigMapList := factory.FromMap( + map[string]interface{}{ + "apiVersion": "v1", + "kind": "ConfigMapList", + "items": []interface{}{ + testConfigMap.Map(), + testConfigMap.Map(), + }, + }) tests := []struct { name string @@ -151,6 +160,24 @@ items: expectedOut: []ifc.Kunstructured{testList}, expectedErr: false, }, + { + name: "ConfigMapList", + input: []byte(` +apiVersion: v1 +kind: ConfigMapList +items: +- apiVersion: v1 + kind: ConfigMap + metadata: + name: winnie +- apiVersion: v1 + kind: ConfigMap + metadata: + name: winnie +`), + expectedOut: []ifc.Kunstructured{testConfigMapList}, + expectedErr: false, + }, } for _, test := range tests { diff --git a/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/patch.go b/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/patch.go index 4a2764bfbd..357f3dabae 100644 --- a/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/patch.go +++ b/staging/src/k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch/patch.go @@ -60,7 +60,7 @@ func (pt *patchTransformer) Transform(baseResourceMap resmap.ResMap) error { for _, patch := range patches { // Merge patches with base resource. id := patch.Id() - matchedIds := baseResourceMap.FindByGVKN(id) + matchedIds := baseResourceMap.GetMatchingIds(id.GvknEquals) if len(matchedIds) == 0 { return fmt.Errorf("failed to find an object with %s to apply the patch", id.GvknString()) } diff --git a/staging/src/k8s.io/sample-cli-plugin/Godeps/Godeps.json b/staging/src/k8s.io/sample-cli-plugin/Godeps/Godeps.json index d01f443f67..a2db1890f9 100644 --- a/staging/src/k8s.io/sample-cli-plugin/Godeps/Godeps.json +++ b/staging/src/k8s.io/sample-cli-plugin/Godeps/Godeps.json @@ -740,91 +740,91 @@ }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/commands/build", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/constants", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/expansion", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/factory", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/fs", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/git", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/gvk", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/ifc", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/ifc/transformer", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/image", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/internal/error", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/loader", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/patch", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/patch/transformer", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/resid", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/resmap", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/resource", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/target", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/transformers", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/transformers/config", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/kustomize/pkg/types", - "Rev": "ce7e5ee2c30cc5856fea01fe423cf167f2a2d0c3" + "Rev": "a6f65144121d1955266b0cd836ce954c04122dc8" }, { "ImportPath": "sigs.k8s.io/yaml", diff --git a/vendor/sigs.k8s.io/kustomize/pkg/commands/build/build.go b/vendor/sigs.k8s.io/kustomize/pkg/commands/build/build.go index 43c1a982f0..e62747e329 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/commands/build/build.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/commands/build/build.go @@ -108,7 +108,7 @@ func (o *Options) RunBuild( return err } defer ldr.Cleanup() - kt, err := target.NewKustTarget(ldr, fSys, rf, ptf) + kt, err := target.NewKustTarget(ldr, rf, ptf) if err != nil { return err } diff --git a/vendor/sigs.k8s.io/kustomize/pkg/expansion/expand.go b/vendor/sigs.k8s.io/kustomize/pkg/expansion/expand.go index c2a81ed6f2..de55e46148 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/expansion/expand.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/expansion/expand.go @@ -36,15 +36,17 @@ func syntaxWrap(input string) string { // implements the expansion semantics defined in the expansion spec; it // returns the input string wrapped in the expansion syntax if no mapping // for the input is found. -func MappingFuncFor(context ...map[string]string) func(string) string { +func MappingFuncFor( + counts map[string]int, + context ...map[string]string) func(string) string { return func(input string) string { for _, vars := range context { val, ok := vars[input] if ok { + counts[input]++ return val } } - return syntaxWrap(input) } } diff --git a/vendor/sigs.k8s.io/kustomize/pkg/fs/confirmeddir.go b/vendor/sigs.k8s.io/kustomize/pkg/fs/confirmeddir.go index 6d2f5c30d2..5d12bf0779 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/fs/confirmeddir.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/fs/confirmeddir.go @@ -26,7 +26,7 @@ import ( // that was confirmed to point to an existing directory. type ConfirmedDir string -// Return a temporary dir, else error. +// NewTmpConfirmedDir returns a temporary dir, else error. // The directory is cleaned, no symlinks, etc. so its // returned as a ConfirmedDir. func NewTmpConfirmedDir() (ConfirmedDir, error) { @@ -34,7 +34,15 @@ func NewTmpConfirmedDir() (ConfirmedDir, error) { if err != nil { return "", err } - return ConfirmedDir(n), nil + + // In MacOs `ioutil.TempDir` creates a directory + // with root in the `/var` folder, which is in turn a symlinked path + // to `/private/var`. + // Function `filepath.EvalSymlinks`is used to + // resolve the real absolute path. + deLinked, err := filepath.EvalSymlinks(n) + return ConfirmedDir(deLinked), err + } // HasPrefix returns true if the directory argument diff --git a/vendor/sigs.k8s.io/kustomize/pkg/git/repospec.go b/vendor/sigs.k8s.io/kustomize/pkg/git/repospec.go index db8b1b908a..b3251f6535 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/git/repospec.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/git/repospec.go @@ -24,6 +24,13 @@ import ( "sigs.k8s.io/kustomize/pkg/fs" ) +// Used as a temporary non-empty occupant of the cloneDir +// field, as something distinguishable from the empty string +// in various outputs (especially tests). Not using an +// actual directory name here, as that's a temporary directory +// with a unique name that isn't created until clone time. +const notCloned = fs.ConfirmedDir("/notCloned") + // RepoSpec specifies a git repository and a branch and path therein. type RepoSpec struct { // Raw, original spec, used to look for cycles. @@ -88,7 +95,7 @@ func NewRepoSpecFromUrl(n string) (*RepoSpec, error) { } return &RepoSpec{ raw: n, host: host, orgRepo: orgRepo, - path: path, ref: gitRef}, nil + cloneDir: notCloned, path: path, ref: gitRef}, nil } const ( diff --git a/vendor/sigs.k8s.io/kustomize/pkg/gvk/gvk.go b/vendor/sigs.k8s.io/kustomize/pkg/gvk/gvk.go index 00e44f7eaa..890c8e8b53 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/gvk/gvk.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/gvk/gvk.go @@ -73,6 +73,8 @@ var order = []string{ "Namespace", "StorageClass", "CustomResourceDefinition", + "MutatingWebhookConfiguration", + "ValidatingWebhookConfiguration", "ServiceAccount", "Role", "ClusterRole", diff --git a/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/BUILD b/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/BUILD index 757567bfa2..19416d6701 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/BUILD +++ b/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/BUILD @@ -5,7 +5,6 @@ go_library( srcs = [ "factory.go", "patchjson6902json.go", - "util.go", ], importmap = "k8s.io/kubernetes/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer", importpath = "sigs.k8s.io/kustomize/pkg/patch/transformer", @@ -13,6 +12,7 @@ go_library( deps = [ "//vendor/github.com/evanphx/json-patch:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", + "//vendor/github.com/pkg/errors:go_default_library", "//vendor/sigs.k8s.io/kustomize/pkg/gvk:go_default_library", "//vendor/sigs.k8s.io/kustomize/pkg/ifc:go_default_library", "//vendor/sigs.k8s.io/kustomize/pkg/patch:go_default_library", diff --git a/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/factory.go b/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/factory.go index b7eb258391..b373dfb721 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/factory.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/factory.go @@ -21,8 +21,6 @@ import ( "sigs.k8s.io/kustomize/pkg/ifc" "sigs.k8s.io/kustomize/pkg/resid" - "github.com/evanphx/json-patch" - "github.com/ghodss/yaml" "sigs.k8s.io/kustomize/pkg/gvk" "sigs.k8s.io/kustomize/pkg/patch" "sigs.k8s.io/kustomize/pkg/transformers" @@ -77,19 +75,7 @@ func (f PatchJson6902Factory) makeOnePatchJson6902Transformer(p patch.Json6902) return nil, err } - if !isJsonFormat(rawOp) { - // if it isn't JSON, try to parse it as YAML - rawOp, err = yaml.YAMLToJSON(rawOp) - if err != nil { - return nil, err - } - } - - decodedPatch, err := jsonpatch.DecodePatch(rawOp) - if err != nil { - return nil, err - } - return newPatchJson6902JSONTransformer(targetId, decodedPatch) + return newPatchJson6902JSONTransformer(targetId, rawOp) } func isJsonFormat(data []byte) bool { diff --git a/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/patchjson6902json.go b/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/patchjson6902json.go index 6737b959c7..1f09939d1d 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/patchjson6902json.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/patchjson6902json.go @@ -17,9 +17,14 @@ limitations under the License. package transformer import ( + "fmt" + "github.com/evanphx/json-patch" + "github.com/ghodss/yaml" + "github.com/pkg/errors" "sigs.k8s.io/kustomize/pkg/resid" "sigs.k8s.io/kustomize/pkg/resmap" + "sigs.k8s.io/kustomize/pkg/resource" "sigs.k8s.io/kustomize/pkg/transformers" ) @@ -27,22 +32,37 @@ import ( type patchJson6902JSONTransformer struct { target resid.ResId patch jsonpatch.Patch + rawOp []byte } var _ transformers.Transformer = &patchJson6902JSONTransformer{} // newPatchJson6902JSONTransformer constructs a PatchJson6902 transformer. -func newPatchJson6902JSONTransformer(t resid.ResId, p jsonpatch.Patch) (transformers.Transformer, error) { - if len(p) == 0 { +func newPatchJson6902JSONTransformer( + id resid.ResId, rawOp []byte) (transformers.Transformer, error) { + op := rawOp + var err error + if !isJsonFormat(op) { + // if it isn't JSON, try to parse it as YAML + op, err = yaml.YAMLToJSON(rawOp) + if err != nil { + return nil, err + } + } + decodedPatch, err := jsonpatch.DecodePatch(op) + if err != nil { + return nil, err + } + if len(decodedPatch) == 0 { return transformers.NewNoOpTransformer(), nil } - return &patchJson6902JSONTransformer{target: t, patch: p}, nil + return &patchJson6902JSONTransformer{target: id, patch: decodedPatch, rawOp: rawOp}, nil } // Transform apply the json patches on top of the base resources. -func (t *patchJson6902JSONTransformer) Transform(baseResourceMap resmap.ResMap) error { - obj, err := findTargetObj(baseResourceMap, t.target) - if obj == nil { +func (t *patchJson6902JSONTransformer) Transform(m resmap.ResMap) error { + obj, err := t.findTargetObj(m) + if err != nil { return err } rawObj, err := obj.MarshalJSON() @@ -51,7 +71,7 @@ func (t *patchJson6902JSONTransformer) Transform(baseResourceMap resmap.ResMap) } modifiedObj, err := t.patch.Apply(rawObj) if err != nil { - return err + return errors.Wrapf(err, "failed to apply json patch '%s'", string(t.rawOp)) } err = obj.UnmarshalJSON(modifiedObj) if err != nil { @@ -59,3 +79,30 @@ func (t *patchJson6902JSONTransformer) Transform(baseResourceMap resmap.ResMap) } return nil } + +func (t *patchJson6902JSONTransformer) findTargetObj( + m resmap.ResMap) (*resource.Resource, error) { + var matched []resid.ResId + // TODO(monopole): namespace bug in json patch? + // Since introduction in PR #300 + // (see pkg/patch/transformer/util.go), + // this code has treated an empty namespace like a wildcard + // rather than like an additional restriction to match + // only the empty namespace. No test coverage to confirm. + // Not sure if desired, keeping it for now. + if t.target.Namespace() != "" { + matched = m.GetMatchingIds(t.target.NsGvknEquals) + } else { + matched = m.GetMatchingIds(t.target.GvknEquals) + } + if len(matched) == 0 { + return nil, fmt.Errorf( + "couldn't find target %v for json patch", t.target) + } + if len(matched) > 1 { + return nil, fmt.Errorf( + "found multiple targets %v matching %v for json patch", + matched, t.target) + } + return m[matched[0]], nil +} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/util.go b/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/util.go deleted file mode 100644 index aaed1e1cc6..0000000000 --- a/vendor/sigs.k8s.io/kustomize/pkg/patch/transformer/util.go +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package transformer - -import ( - "fmt" - - "sigs.k8s.io/kustomize/pkg/resid" - "sigs.k8s.io/kustomize/pkg/resmap" - "sigs.k8s.io/kustomize/pkg/resource" -) - -func findTargetObj(m resmap.ResMap, targetId resid.ResId) (*resource.Resource, error) { - matchedIds := m.FindByGVKN(targetId) - if targetId.Namespace() != "" { - var ids []resid.ResId - for _, id := range matchedIds { - if id.Namespace() == targetId.Namespace() { - ids = append(ids, id) - } - } - matchedIds = ids - } - - if len(matchedIds) == 0 { - return nil, fmt.Errorf("couldn't find any object to apply the json patch %v", targetId) - } - if len(matchedIds) > 1 { - return nil, fmt.Errorf("found multiple objects that the patch can apply %v", matchedIds) - } - return m[matchedIds[0]], nil -} diff --git a/vendor/sigs.k8s.io/kustomize/pkg/resid/resid.go b/vendor/sigs.k8s.io/kustomize/pkg/resid/resid.go index 2af7c02a5a..dbf9a3e929 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/resid/resid.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/resid/resid.go @@ -22,23 +22,30 @@ import ( "sigs.k8s.io/kustomize/pkg/gvk" ) -// ResId conflates GroupVersionKind with a textual name to uniquely identify a kubernetes resource (object). +// ResId is an immutable identifier of a k8s resource object. type ResId struct { // Gvk of the resource. gvKind gvk.Gvk - // original name of the resource before transformation. + + // name of the resource before transformation. name string - // namePrefix of the resource - // an untransformed resource has no prefix, fully transformed resource has an arbitrary number of prefixes - // concatenated together. + + // namePrefix of the resource. + // An untransformed resource has no prefix. + // A fully transformed resource has an arbitrary + // number of prefixes concatenated together. prefix string - // nameSuffix of the resource - // an untransformed resource has no suffix, fully transformed resource has an arbitrary number of suffixes - // concatenated together. + + // nameSuffix of the resource. + // An untransformed resource has no suffix. + // A fully transformed resource has an arbitrary + // number of suffixes concatenated together. suffix string - // namespace the resource belongs to - // an untransformed resource has no namespace, fully transformed resource has the namespace from - // the top most overlay + + // Namespace the resource belongs to. + // An untransformed resource has no namespace. + // A fully transformed resource has the namespace + // from the top most overlay. namespace string } @@ -108,10 +115,16 @@ func (n ResId) GvknString() string { return n.gvKind.String() + separator + n.name } -// GvknEquals return if two ResId have the same Group/Version/Kind and name -// The comparison excludes prefix and suffix +// GvknEquals returns true if the other id matches +// Group/Version/Kind/name. func (n ResId) GvknEquals(id ResId) bool { - return n.gvKind.Equals(id.gvKind) && n.name == id.name + return n.name == id.name && n.gvKind.Equals(id.gvKind) +} + +// NsGvknEquals returns true if the other id matches +// namespace/Group/Version/Kind/name. +func (n ResId) NsGvknEquals(id ResId) bool { + return n.namespace == id.namespace && n.GvknEquals(id) } // Gvk returns Group/Version/Kind of the resource. diff --git a/vendor/sigs.k8s.io/kustomize/pkg/resmap/factory.go b/vendor/sigs.k8s.io/kustomize/pkg/resmap/factory.go index 9e64dbee42..923cde2325 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/resmap/factory.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/resmap/factory.go @@ -50,7 +50,7 @@ func (rmF *Factory) FromFiles( if err != nil { return nil, errors.Wrap(err, "Load from path "+path+" failed") } - res, err := rmF.newResMapFromBytes(content) + res, err := rmF.NewResMapFromBytes(content) if err != nil { return nil, internal.Handler(err, path) } @@ -60,7 +60,7 @@ func (rmF *Factory) FromFiles( } // newResMapFromBytes decodes a list of objects in byte array format. -func (rmF *Factory) newResMapFromBytes(b []byte) (ResMap, error) { +func (rmF *Factory) NewResMapFromBytes(b []byte) (ResMap, error) { resources, err := rmF.resF.SliceFromBytes(b) if err != nil { return nil, err diff --git a/vendor/sigs.k8s.io/kustomize/pkg/resmap/resmap.go b/vendor/sigs.k8s.io/kustomize/pkg/resmap/resmap.go index d6936f6d56..ca1e723980 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/resmap/resmap.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/resmap/resmap.go @@ -32,26 +32,20 @@ import ( // ResMap is a map from ResId to Resource. type ResMap map[resid.ResId]*resource.Resource -// FindByGVKN find the matched ResIds by Group/Version/Kind and Name -func (m ResMap) FindByGVKN(inputId resid.ResId) []resid.ResId { +type IdMatcher func(resid.ResId) bool + +// GetMatchingIds returns a slice of ResId keys from the map +// that all satisfy the given matcher function. +func (m ResMap) GetMatchingIds(matches IdMatcher) []resid.ResId { var result []resid.ResId for id := range m { - if id.GvknEquals(inputId) { + if matches(id) { result = append(result, id) } } return result } -// DemandOneMatchForId find the matched resource by Group/Version/Kind and Name -func (m ResMap) DemandOneMatchForId(inputId resid.ResId) (*resource.Resource, bool) { - result := m.FindByGVKN(inputId) - if len(result) == 1 { - return m[result[0]], true - } - return nil, false -} - // EncodeAsYaml encodes a ResMap to YAML; encoded objects separated by `---`. func (m ResMap) EncodeAsYaml() ([]byte, error) { var ids []resid.ResId @@ -177,7 +171,7 @@ func MergeWithOverride(maps ...ResMap) (ResMap, error) { continue } for id, r := range m { - matchedId := result.FindByGVKN(id) + matchedId := result.GetMatchingIds(id.GvknEquals) if len(matchedId) == 1 { id = matchedId[0] switch r.Behavior() { diff --git a/vendor/sigs.k8s.io/kustomize/pkg/resource/factory.go b/vendor/sigs.k8s.io/kustomize/pkg/resource/factory.go index b016678a51..148323dd6b 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/resource/factory.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/resource/factory.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" "log" + "strings" "sigs.k8s.io/kustomize/pkg/ifc" internal "sigs.k8s.io/kustomize/pkg/internal/error" @@ -94,10 +95,14 @@ func (rf *Factory) SliceFromBytes(in []byte) ([]*Resource, error) { for len(kunStructs) > 0 { u := kunStructs[0] kunStructs = kunStructs[1:] - if u.GetKind() == "List" { + if strings.HasSuffix(u.GetKind(), "List") { items := u.Map()["items"] itemsSlice, ok := items.([]interface{}) if !ok { + if items == nil { + // an empty list + continue + } return nil, fmt.Errorf("items in List is type %T, expected array", items) } for _, item := range itemsSlice { diff --git a/vendor/sigs.k8s.io/kustomize/pkg/resource/resource.go b/vendor/sigs.k8s.io/kustomize/pkg/resource/resource.go index 7cc87a745a..1e0e3764b8 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/resource/resource.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/resource/resource.go @@ -38,7 +38,7 @@ func (r *Resource) String() string { if err != nil { return "<" + err.Error() + ">" } - return strings.TrimSpace(string(bs)) + return strings.TrimSpace(string(bs)) + r.options.String() } // DeepCopy returns a new copy of resource diff --git a/vendor/sigs.k8s.io/kustomize/pkg/target/BUILD b/vendor/sigs.k8s.io/kustomize/pkg/target/BUILD index d127e51104..4a524516d6 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/target/BUILD +++ b/vendor/sigs.k8s.io/kustomize/pkg/target/BUILD @@ -13,7 +13,6 @@ go_library( "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", "//vendor/sigs.k8s.io/kustomize/pkg/constants:go_default_library", - "//vendor/sigs.k8s.io/kustomize/pkg/fs:go_default_library", "//vendor/sigs.k8s.io/kustomize/pkg/ifc:go_default_library", "//vendor/sigs.k8s.io/kustomize/pkg/ifc/transformer:go_default_library", "//vendor/sigs.k8s.io/kustomize/pkg/internal/error:go_default_library", diff --git a/vendor/sigs.k8s.io/kustomize/pkg/target/kusttarget.go b/vendor/sigs.k8s.io/kustomize/pkg/target/kusttarget.go index 94a8b3f00d..f136b2683b 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/target/kusttarget.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/target/kusttarget.go @@ -26,7 +26,6 @@ import ( "github.com/ghodss/yaml" "github.com/pkg/errors" "sigs.k8s.io/kustomize/pkg/constants" - "sigs.k8s.io/kustomize/pkg/fs" "sigs.k8s.io/kustomize/pkg/ifc" "sigs.k8s.io/kustomize/pkg/ifc/transformer" interror "sigs.k8s.io/kustomize/pkg/internal/error" @@ -42,7 +41,6 @@ import ( type KustTarget struct { kustomization *types.Kustomization ldr ifc.Loader - fSys fs.FileSystem rFactory *resmap.Factory tFactory transformer.Factory } @@ -50,7 +48,6 @@ type KustTarget struct { // NewKustTarget returns a new instance of KustTarget primed with a Loader. func NewKustTarget( ldr ifc.Loader, - fSys fs.FileSystem, rFactory *resmap.Factory, tFactory transformer.Factory) (*KustTarget, error) { content, err := loadKustFile(ldr) @@ -70,12 +67,23 @@ func NewKustTarget( return &KustTarget{ kustomization: &k, ldr: ldr, - fSys: fSys, rFactory: rFactory, tFactory: tFactory, }, nil } +func quoted(l []string) []string { + r := make([]string, len(l)) + for i, v := range l { + r[i] = "'" + v + "'" + } + return r +} + +func commaOr(q []string) string { + return strings.Join(q[:len(q)-1], ", ") + " or " + q[len(q)-1] +} + func loadKustFile(ldr ifc.Loader) ([]byte, error) { var content []byte match := 0 @@ -88,8 +96,9 @@ func loadKustFile(ldr ifc.Loader) ([]byte, error) { } switch match { case 0: - return nil, fmt.Errorf("No kustomization file found in %s. Kustomize supports the following kustomization files: %s", - ldr.Root(), strings.Join(constants.KustomizationFileNames, ", ")) + return nil, fmt.Errorf( + "unable to find one of %v in directory '%s'", + commaOr(quoted(constants.KustomizationFileNames)), ldr.Root()) case 1: return content, nil default: @@ -110,7 +119,7 @@ func unmarshal(y []byte, o interface{}) error { // MakeCustomizedResMap creates a ResMap per kustomization instructions. // The Resources in the returned ResMap are fully customized. func (kt *KustTarget) MakeCustomizedResMap() (resmap.ResMap, error) { - ra, err := kt.accumulateTarget() + ra, err := kt.AccumulateTarget() if err != nil { return nil, err } @@ -134,11 +143,11 @@ func (kt *KustTarget) shouldAddHashSuffixesToGeneratedResources() bool { !kt.kustomization.GeneratorOptions.DisableNameSuffixHash } -// accumulateTarget returns a new ResAccumulator, +// AccumulateTarget returns a new ResAccumulator, // holding customized resources and the data/rules used // to do so. The name back references and vars are // not yet fixed. -func (kt *KustTarget) accumulateTarget() ( +func (kt *KustTarget) AccumulateTarget() ( ra *ResAccumulator, err error) { // TODO(monopole): Get rid of the KustomizationErrors accumulator. // It's not consistently used, and complicates tests. @@ -236,15 +245,15 @@ func (kt *KustTarget) accumulateBases() ( continue } subKt, err := NewKustTarget( - ldr, kt.fSys, kt.rFactory, kt.tFactory) + ldr, kt.rFactory, kt.tFactory) if err != nil { errs.Append(errors.Wrap(err, "couldn't make target for "+path)) ldr.Cleanup() continue } - subRa, err := subKt.accumulateTarget() + subRa, err := subKt.AccumulateTarget() if err != nil { - errs.Append(errors.Wrap(err, "accumulateTarget")) + errs.Append(errors.Wrap(err, "AccumulateTarget")) ldr.Cleanup() continue } diff --git a/vendor/sigs.k8s.io/kustomize/pkg/target/resaccumulator.go b/vendor/sigs.k8s.io/kustomize/pkg/target/resaccumulator.go index 41e448b8d6..b8c45015a5 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/target/resaccumulator.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/target/resaccumulator.go @@ -19,6 +19,8 @@ package target import ( "fmt" "log" + "strings" + "sigs.k8s.io/kustomize/pkg/resid" "sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/transformers" @@ -55,6 +57,11 @@ func (ra *ResAccumulator) ResMap() resmap.ResMap { return result } +// Vars returns a copy of underlying vars. +func (ra *ResAccumulator) Vars() []types.Var { + return ra.varSet.Set() +} + func (ra *ResAccumulator) MergeResourcesWithErrorOnIdCollision( resources resmap.ResMap) (err error) { ra.resMap, err = resmap.MergeWithErrorOnIdCollision( @@ -96,17 +103,27 @@ func (ra *ResAccumulator) MergeAccumulator(other *ResAccumulator) (err error) { // for substitution wherever the $(var.Name) occurs. func (ra *ResAccumulator) makeVarReplacementMap() (map[string]string, error) { result := map[string]string{} - for _, v := range ra.varSet.Set() { - id := resid.NewResId(v.ObjRef.GVK(), v.ObjRef.Name) - if r, found := ra.resMap.DemandOneMatchForId(id); found { - s, err := r.GetFieldValue(v.FieldRef.FieldPath) + for _, v := range ra.Vars() { + matched := ra.resMap.GetMatchingIds( + resid.NewResId(v.ObjRef.GVK(), v.ObjRef.Name).GvknEquals) + if len(matched) > 1 { + return nil, fmt.Errorf( + "found %d resId matches for var %s "+ + "(unable to disambiguate)", + len(matched), v) + } + if len(matched) == 1 { + s, err := ra.resMap[matched[0]].GetFieldValue(v.FieldRef.FieldPath) if err != nil { - return nil, fmt.Errorf("field path err for var: %+v", v) + return nil, fmt.Errorf( + "field specified in var '%v' "+ + "not found in corresponding resource", v) } result[v.Name] = s } else { - // Should this be an error? - log.Printf("var %v defined but not used", v) + return nil, fmt.Errorf( + "var '%v' cannot be mapped to a field "+ + "in the set of known resources", v) } } return result, nil @@ -121,8 +138,18 @@ func (ra *ResAccumulator) ResolveVars() error { if err != nil { return err } - return ra.Transform(transformers.NewRefVarTransformer( - replacementMap, ra.tConfig.VarReference)) + if len(replacementMap) == 0 { + return nil + } + t := transformers.NewRefVarTransformer( + replacementMap, ra.tConfig.VarReference) + err = ra.Transform(t) + if len(t.UnusedVars()) > 0 { + log.Printf( + "well-defined vars that were never replaced: %s\n", + strings.Join(t.UnusedVars(), ",")) + } + return err } func (ra *ResAccumulator) FixBackReferences() (err error) { diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/BUILD b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/BUILD index 6cfe780526..64fe15a31d 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/BUILD +++ b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/BUILD @@ -15,6 +15,7 @@ go_library( deps = [ "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library", + "//vendor/github.com/pkg/errors:go_default_library", "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", "//vendor/sigs.k8s.io/kustomize/pkg/gvk:go_default_library", "//vendor/sigs.k8s.io/kustomize/pkg/ifc:go_default_library", diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/varreference.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/varreference.go index 35a92d78e7..71953f5768 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/varreference.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/defaultconfig/varreference.go @@ -100,10 +100,63 @@ varReference: - path: spec/containers/env/value kind: Pod +- path: spec/initContainers/command + kind: Pod + +- path: spec/initContainers/args + kind: Pod + +- path: spec/initContainers/env/value + kind: Pod + - path: spec/rules/host kind: Ingress - path: spec/tls/hosts kind: Ingress + +- path: spec/template/spec/containers/volumeMounts/mountPath + kind: StatefulSet + +- path: spec/template/spec/initContainers/volumeMounts/mountPath + kind: StatefulSet + +- path: spec/containers/volumeMounts/mountPath + kind: Pod + +- path: spec/initContainers/volumeMounts/mountPath + kind: Pod + +- path: spec/template/spec/containers/volumeMounts/mountPath + kind: ReplicaSet + +- path: spec/template/spec/initContainers/volumeMounts/mountPath + kind: ReplicaSet + +- path: spec/template/spec/containers/volumeMounts/mountPath + kind: Job + +- path: spec/template/spec/initContainers/volumeMounts/mountPath + kind: Job + +- path: spec/template/spec/containers/volumeMounts/mountPath + kind: CronJob + +- path: spec/template/spec/initContainers/volumeMounts/mountPath + kind: CronJob + +- path: spec/template/spec/containers/volumeMounts/mountPath + kind: DaemonSet + +- path: spec/template/spec/initContainers/volumeMounts/mountPath + kind: DaemonSet + +- path: spec/template/spec/containers/volumeMounts/mountPath + kind: Deployment + +- path: spec/template/spec/initContainers/volumeMounts/mountPath + kind: Deployment + +- path: metadata/labels ` ) diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/factorycrd.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/factorycrd.go index 8aaa8ee645..66a24dc868 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/factorycrd.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/transformers/config/factorycrd.go @@ -22,6 +22,7 @@ import ( "github.com/ghodss/yaml" "github.com/go-openapi/spec" + "github.com/pkg/errors" "k8s.io/kube-openapi/pkg/common" "sigs.k8s.io/kustomize/pkg/gvk" "sigs.k8s.io/kustomize/pkg/ifc" @@ -41,7 +42,7 @@ func LoadConfigFromCRDs( } m, err := makeNameToApiMap(content) if err != nil { - return nil, err + return nil, errors.Wrapf(err, "unable to parse open API definition from '%s'", path) } otherTc, err := makeConfigFromApiMap(m) if err != nil { diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/image.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/image.go index f6f999d1ef..2e07976943 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/image.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/transformers/image.go @@ -17,6 +17,7 @@ limitations under the License. package transformers import ( + "fmt" "regexp" "strings" @@ -75,7 +76,10 @@ func (pt *imageTransformer) findAndReplaceImage(obj map[string]interface{}) erro } func (pt *imageTransformer) updateContainers(obj map[string]interface{}, path string) error { - containers := obj[path].([]interface{}) + containers, ok := obj[path].([]interface{}) + if !ok { + return fmt.Errorf("containers path is not of type []interface{} but %T", obj[path]) + } for i := range containers { container := containers[i].(map[string]interface{}) containerImage, found := container["image"] @@ -85,20 +89,21 @@ func (pt *imageTransformer) updateContainers(obj map[string]interface{}, path st imageName := containerImage.(string) for _, img := range pt.images { - if isImageMatched(imageName, img.Name) { - name, tag := split(imageName) - if img.NewName != "" { - name = img.NewName - } - if img.NewTag != "" { - tag = ":" + img.NewTag - } - if img.Digest != "" { - tag = "@" + img.Digest - } - container["image"] = name + tag - break + if !isImageMatched(imageName, img.Name) { + continue } + name, tag := split(imageName) + if img.NewName != "" { + name = img.NewName + } + if img.NewTag != "" { + tag = ":" + img.NewTag + } + if img.Digest != "" { + tag = "@" + img.Digest + } + container["image"] = name + tag + break } } return nil @@ -138,7 +143,18 @@ func isImageMatched(s, t string) bool { // from the image string using either colon `:` or at `@` separators. // Note that the returned tag keeps its separator. func split(imageName string) (name string, tag string) { - ic := strings.LastIndex(imageName, ":") + // check if image name contains a domain + // if domain is present, ignore domain and check for `:` + ic := -1 + if slashIndex := strings.Index(imageName, "/"); slashIndex < 0 { + ic = strings.LastIndex(imageName, ":") + } else { + lastIc := strings.LastIndex(imageName[slashIndex:], ":") + // set ic only if `:` is present + if lastIc > 0 { + ic = slashIndex + lastIc + } + } ia := strings.LastIndex(imageName, "@") if ic < 0 && ia < 0 { return imageName, "" diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/namereference.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/namereference.go index 899813776a..a4e8a7f8ed 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/namereference.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/transformers/namereference.go @@ -89,7 +89,7 @@ func (o *nameReferenceTransformer) updateNameReference( s, _ := in.(string) for id, res := range m { if id.Gvk().IsSelected(&backRef) && id.Name() == s { - matchedIds := m.FindByGVKN(id) + matchedIds := m.GetMatchingIds(id.GvknEquals) // If there's more than one match, there's no way // to know which one to pick, so emit error. if len(matchedIds) > 1 { @@ -115,7 +115,7 @@ func (o *nameReferenceTransformer) updateNameReference( for id, res := range m { indexes := indexOf(id.Name(), names) if id.Gvk().IsSelected(&backRef) && len(indexes) > 0 { - matchedIds := m.FindByGVKN(id) + matchedIds := m.GetMatchingIds(id.GvknEquals) if len(matchedIds) > 1 { return nil, fmt.Errorf( "Multiple matches for name %s:\n %v", id, matchedIds) diff --git a/vendor/sigs.k8s.io/kustomize/pkg/transformers/refvars.go b/vendor/sigs.k8s.io/kustomize/pkg/transformers/refvars.go index 1d35c9602a..b31ec6e7a2 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/transformers/refvars.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/transformers/refvars.go @@ -2,28 +2,26 @@ package transformers import ( "fmt" - "sigs.k8s.io/kustomize/pkg/expansion" "sigs.k8s.io/kustomize/pkg/resmap" "sigs.k8s.io/kustomize/pkg/transformers/config" ) -type refvarTransformer struct { - fieldSpecs []config.FieldSpec - mappingFunc func(string) string +type RefVarTransformer struct { + varMap map[string]string + replacementCounts map[string]int + fieldSpecs []config.FieldSpec + mappingFunc func(string) string } -// NewRefVarTransformer returns a Transformer that replaces $(VAR) style -// variables with values. +// NewRefVarTransformer returns a new RefVarTransformer +// that replaces $(VAR) style variables with values. // The fieldSpecs are the places to look for occurrences of $(VAR). func NewRefVarTransformer( - varMap map[string]string, fs []config.FieldSpec) Transformer { - if len(varMap) == 0 { - return NewNoOpTransformer() - } - return &refvarTransformer{ - fieldSpecs: fs, - mappingFunc: expansion.MappingFuncFor(varMap), + varMap map[string]string, fs []config.FieldSpec) *RefVarTransformer { + return &RefVarTransformer{ + varMap: varMap, + fieldSpecs: fs, } } @@ -31,7 +29,7 @@ func NewRefVarTransformer( // embedded instances of $VAR style variables, e.g. a container command string. // The function returns the string with the variables expanded to their final // values. -func (rv *refvarTransformer) replaceVars(in interface{}) (interface{}, error) { +func (rv *RefVarTransformer) replaceVars(in interface{}) (interface{}, error) { switch vt := in.(type) { case []interface{}: var xs []string @@ -39,6 +37,17 @@ func (rv *refvarTransformer) replaceVars(in interface{}) (interface{}, error) { xs = append(xs, expansion.Expand(a.(string), rv.mappingFunc)) } return xs, nil + case map[string]interface{}: + inMap := in.(map[string]interface{}) + xs := make(map[string]interface{}, len(inMap)) + for k, v := range inMap { + s, ok := v.(string) + if !ok { + return nil, fmt.Errorf("%#v is expected to be %T", v, s) + } + xs[k] = expansion.Expand(s, rv.mappingFunc) + } + return xs, nil case interface{}: s, ok := in.(string) if !ok { @@ -52,8 +61,24 @@ func (rv *refvarTransformer) replaceVars(in interface{}) (interface{}, error) { } } +// UnusedVars returns slice of Var names that were unused +// after a Transform run. +func (rv *RefVarTransformer) UnusedVars() []string { + var unused []string + for k := range rv.varMap { + _, ok := rv.replacementCounts[k] + if !ok { + unused = append(unused, k) + } + } + return unused +} + // Transform replaces $(VAR) style variables with values. -func (rv *refvarTransformer) Transform(m resmap.ResMap) error { +func (rv *RefVarTransformer) Transform(m resmap.ResMap) error { + rv.replacementCounts = make(map[string]int) + rv.mappingFunc = expansion.MappingFuncFor( + rv.replacementCounts, rv.varMap) for id, res := range m { for _, fieldSpec := range rv.fieldSpecs { if id.Gvk().IsSelected(&fieldSpec.Gvk) { diff --git a/vendor/sigs.k8s.io/kustomize/pkg/types/genargs.go b/vendor/sigs.k8s.io/kustomize/pkg/types/genargs.go index a74a48d222..bef093d350 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/types/genargs.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/types/genargs.go @@ -16,6 +16,11 @@ limitations under the License. package types +import ( + "strconv" + "strings" +) + // GenArgs contains both generator args and options type GenArgs struct { args *GeneratorArgs @@ -30,6 +35,18 @@ func NewGenArgs(args *GeneratorArgs, opts *GeneratorOptions) *GenArgs { } } +func (g *GenArgs) String() string { + if g == nil { + return "{nilGenArgs}" + } + return "{" + + strings.Join([]string{ + "nsfx:" + strconv.FormatBool(g.NeedsHashSuffix()), + "beh:" + g.Behavior().String()}, + ",") + + "}" +} + // NeedHashSuffix returns true if the hash suffix is needed. // It is needed when the two conditions are both met // 1) GenArgs is not nil diff --git a/vendor/sigs.k8s.io/kustomize/pkg/types/var.go b/vendor/sigs.k8s.io/kustomize/pkg/types/var.go index 4be30078b9..6a48032a08 100644 --- a/vendor/sigs.k8s.io/kustomize/pkg/types/var.go +++ b/vendor/sigs.k8s.io/kustomize/pkg/types/var.go @@ -75,9 +75,11 @@ type VarSet struct { set []Var } -// Set returns the var set. +// Set returns a copy of the var set. func (vs *VarSet) Set() []Var { - return vs.set + s := make([]Var, len(vs.set)) + copy(s, vs.set) + return s } // MergeSet absorbs other vars with error on name collision.