From 24c173a49bae15e877ffbc3397f07fdf4fe01773 Mon Sep 17 00:00:00 2001 From: Richard Marshall Date: Sun, 18 Aug 2019 07:33:44 -0700 Subject: [PATCH] Detect ID conflicts in namespace transformer --- plugin/builtin/NamespaceTransformer.go | 7 +++ .../NamespaceTransformer.go | 7 +++ .../NamespaceTransformer_test.go | 43 ++++++++++++++++++- 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/plugin/builtin/NamespaceTransformer.go b/plugin/builtin/NamespaceTransformer.go index 6c6674c0e..3acae5152 100644 --- a/plugin/builtin/NamespaceTransformer.go +++ b/plugin/builtin/NamespaceTransformer.go @@ -2,6 +2,8 @@ package builtin import ( + "fmt" + "sigs.k8s.io/kustomize/v3/pkg/ifc" "sigs.k8s.io/kustomize/v3/pkg/resid" "sigs.k8s.io/kustomize/v3/pkg/resmap" @@ -51,6 +53,11 @@ func (p *NamespaceTransformerPlugin) Transform(m resmap.ResMap) error { return err } } + + matches := m.GetMatchingResourcesByCurrentId(r.CurId().Equals) + if len(matches) != 1 { + return fmt.Errorf("namespace tranformation produces ID conflict: %#v", matches) + } } return nil } diff --git a/plugin/builtin/namespacetransformer/NamespaceTransformer.go b/plugin/builtin/namespacetransformer/NamespaceTransformer.go index 1687958f6..ef17fd156 100644 --- a/plugin/builtin/namespacetransformer/NamespaceTransformer.go +++ b/plugin/builtin/namespacetransformer/NamespaceTransformer.go @@ -5,6 +5,8 @@ package main import ( + "fmt" + "sigs.k8s.io/kustomize/v3/pkg/ifc" "sigs.k8s.io/kustomize/v3/pkg/resid" "sigs.k8s.io/kustomize/v3/pkg/resmap" @@ -52,6 +54,11 @@ func (p *plugin) Transform(m resmap.ResMap) error { return err } } + + matches := m.GetMatchingResourcesByCurrentId(r.CurId().Equals) + if len(matches) != 1 { + return fmt.Errorf("namespace tranformation produces ID conflict: %#v", matches) + } } return nil } diff --git a/plugin/builtin/namespacetransformer/NamespaceTransformer_test.go b/plugin/builtin/namespacetransformer/NamespaceTransformer_test.go index 0dd5005c7..1b1c6d9b8 100644 --- a/plugin/builtin/namespacetransformer/NamespaceTransformer_test.go +++ b/plugin/builtin/namespacetransformer/NamespaceTransformer_test.go @@ -4,9 +4,10 @@ package main_test import ( + "strings" "testing" - "sigs.k8s.io/kustomize/v3/pkg/kusttest" + kusttest_test "sigs.k8s.io/kustomize/v3/pkg/kusttest" plugins_test "sigs.k8s.io/kustomize/v3/pkg/plugins/test" ) @@ -238,3 +239,43 @@ fieldSpecs: th.AssertActualEqualsExpected(rm, noChangeExpected) } + +func TestNamespaceTransformerObjectConflict(t *testing.T) { + tc := plugins_test.NewEnvForTest(t).Set() + defer tc.Reset() + + tc.BuildGoPlugin( + "builtin", "", "NamespaceTransformer") + + th := kusttest_test.NewKustTestPluginHarness(t, "/app") + + err := th.ErrorFromLoadAndRunTransformer(` +apiVersion: builtin +kind: NamespaceTransformer +metadata: + name: notImportantHere + namespace: test +fieldSpecs: +- path: metadata/namespace + create: true +`, ` +apiVersion: v1 +kind: ConfigMap +metadata: + name: cm + namespace: foo +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: cm + namespace: bar +`) + + if err == nil { + t.Fatal("expected error") + } + if !strings.Contains(err.Error(), "ID conflict") { + t.Fatalf("unexpected error: %s", err.Error()) + } +}