diff --git a/api/krusty/repeatbase_test.go b/api/krusty/repeatbase_test.go new file mode 100644 index 000000000..c68a9dccd --- /dev/null +++ b/api/krusty/repeatbase_test.go @@ -0,0 +1,177 @@ +// Copyright 2021 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package krusty_test + +import ( + "strings" + "testing" + + kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest" +) + +// This is broken since kustomize v3.9.3. +// See https://github.com/kubernetes-sigs/kustomize/issues/3609 for details. + +// Here is a structure of a kustomization of one resource inheriting from +// two bases. One of those bases is shared between the canary base and the +// final resource. This is named canary as it is a simple pattern to +// duplicate a resource that can be used with canary deployments. +// +// base +// | deployment.yaml +// | kustomization.yaml +// canary +// | deployment-canary-patch.yaml +// | kustomization.yaml +// mango +// | deployment-mango-patch.yaml +// | deployment-mango-canary-patch.yaml +// | kustomization.yaml +func TestRepeatBase(t *testing.T) { + th := kusttest_test.MakeHarness(t) + th.WriteK("base", ` +resources: + - deployment.yaml +`) + th.WriteF("base/deployment.yaml", ` +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: banana +spec: + selector: + matchLabels: + component: banana + template: + metadata: + labels: + component: banana + spec: + containers: + - name: banana + image: image +`) + + th.WriteK("canary", ` +resources: + - ../base +patches: +- patch: | + - op: replace + path: /metadata/name + value: banana-canary + target: + kind: Deployment +- path: deployment-canary-patch.yaml +`) + th.WriteF("canary/deployment-canary-patch.yaml", ` +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: banana-canary + labels: + type: canary +spec: + selector: + matchLabels: + component: banana + type: canary + template: + metadata: + labels: + component: banana + type: canary + spec: + containers: + - name: banana + image: image-canary +`) + + th.WriteK("mango", ` +nameSuffix: -mango +resources: + - ../base + - ../canary +patches: +- path: deployment-mango-base-patch.yaml +- path: deployment-mango-canary-patch.yaml +`) + th.WriteF("mango/deployment-mango-base-patch.yaml", ` +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: banana +spec: + template: + spec: + containers: + - name: banana + image: image-mango +`) + th.WriteF("mango/deployment-mango-canary-patch.yaml", ` +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: banana-canary +spec: + template: + spec: + containers: + - name: banana + image: image-canary-mango +`) + + err := th.RunWithErr("mango", th.MakeDefaultOptions()) + if !strings.Contains( + err.Error(), "multiple matches for Id apps_v1_Deployment|~X|banana; failed to find unique target for patch") { + t.Fatalf("Unexpected err: %v", err) + } + + // Uncomenting the following makes it work with kustomize v3.9.2 and bellow. + + // m := th.Run("/app", th.MakeDefaultOptions()) + // th.AssertActualEqualsExpected(m, ` + //apiVersion: apps/v1 + //kind: Deployment + //metadata: + // name: deployment-a + //spec: + // selector: + // matchLabels: + // component: deployment + // template: + // metadata: + // labels: + // component: deployment + // spec: + // containers: + // - image: image-a + // name: container-a + //--- + //apiVersion: apps/v1 + //kind: Deployment + //metadata: + // labels: + // type: canary + // name: deployment-canary-a + //spec: + // selector: + // matchLabels: + // component: deployment + // type: canary + // template: + // metadata: + // labels: + // component: deployment + // spec: + // containers: + // - image: image-canary-a + // name: container-a + //`) + +}