From 3cef37bdb2c1479641f19ff76fec9622929df22c Mon Sep 17 00:00:00 2001 From: Jeffrey Regan Date: Thu, 27 Jun 2019 15:22:21 -0700 Subject: [PATCH] Add diamond base test. --- k8sdeps/transformer/patch/transformer.go | 11 +- k8sdeps/transformer/patch/transformer_test.go | 2 +- pkg/target/diamonds_test.go | 224 ++++++++++++++++++ 3 files changed, 231 insertions(+), 6 deletions(-) create mode 100644 pkg/target/diamonds_test.go diff --git a/k8sdeps/transformer/patch/transformer.go b/k8sdeps/transformer/patch/transformer.go index 2fbc2738a..ea0d5c6dd 100644 --- a/k8sdeps/transformer/patch/transformer.go +++ b/k8sdeps/transformer/patch/transformer.go @@ -98,16 +98,17 @@ func (tf *transformer) Transform(m resmap.ResMap) error { func (tf *transformer) findPatchTarget( m resmap.ResMap, id resid.ResId) (*resource.Resource, error) { - match, err := m.GetByOriginalId(id) - if err == nil { + match, err1 := m.GetByOriginalId(id) + if err1 == nil { return match, nil } - match, err = m.GetByCurrentId(id) - if err == nil { + match, err2 := m.GetByCurrentId(id) + if err2 == nil { return match, nil } return nil, fmt.Errorf( - "failed to find target for patch %s", id.GvknString()) + "%s; %s; failed to find unique target for patch %s", + err1.Error(), err2.Error(), id.GvknString()) } // mergePatches merge and index patches by OrgId. diff --git a/k8sdeps/transformer/patch/transformer_test.go b/k8sdeps/transformer/patch/transformer_test.go index f258efe1d..4a9cec645 100644 --- a/k8sdeps/transformer/patch/transformer_test.go +++ b/k8sdeps/transformer/patch/transformer_test.go @@ -380,7 +380,7 @@ func TestPatchesWithWrongNamespace(t *testing.T) { if err == nil { t.Fatalf("did not get expected error") } - if !strings.Contains(err.Error(), "failed to find target for patch") { + if !strings.Contains(err.Error(), "failed to find unique target for patch") { t.Fatalf("expected error to contain %q but get %v", "failed to find target for patch", err) } } diff --git a/pkg/target/diamonds_test.go b/pkg/target/diamonds_test.go new file mode 100644 index 000000000..be6755365 --- /dev/null +++ b/pkg/target/diamonds_test.go @@ -0,0 +1,224 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package target_test + +import ( + kusttest_test "sigs.k8s.io/kustomize/v3/pkg/kusttest" + "testing" +) + +// Here's a structure of two kustomizations, +// `dev` and `prod`, individually deployable, +// that depend on a diamond that combines +// multiple tenants (kirk, spock and bones), +// each sharing a common base. +// +// The objects used are contrived to avoid +// clouding the example with authentic +// but verbose Deployment boilerplate. +// +// Patches are applied at various levels, +// requiring more specificity as needed. +// +// dev prod +// \ / +// tenants +// / | \ +// kirk spock bones +// \ | / +// base +// +func writeDiamondBase(th *kusttest_test.KustTestHarness) { + th.WriteK("/app/base", ` +resources: +- deploy.yaml +`) + th.WriteF("/app/base/deploy.yaml", ` +apiVersion: v1 +kind: Deployment +metadata: + name: storefront +spec: + numReplicas: 1 +`) +} + +func writeKirk(th *kusttest_test.KustTestHarness) { + th.WriteK("/app/kirk", ` +namePrefix: kirk- +resources: +- ../base +- configmap.yaml +patchesStrategicMerge: +- dep-patch.yaml +`) + th.WriteF("/app/kirk/dep-patch.yaml", ` +apiVersion: v1 +kind: Deployment +metadata: + name: storefront +spec: + type: Confident +`) + th.WriteF("/app/kirk/configmap.yaml", ` +apiVersion: v1 +kind: ConfigMap +metadata: + name: settings +data: + phaser: caress +`) +} + +func writeSpock(th *kusttest_test.KustTestHarness) { + th.WriteK("/app/spock", ` +namePrefix: spock- +resources: +- ../base +patchesStrategicMerge: +- dep-patch.yaml +`) + th.WriteF("/app/spock/dep-patch.yaml", ` +apiVersion: v1 +kind: Deployment +metadata: + name: storefront +spec: + type: Logical +`) +} + +func writeBones(th *kusttest_test.KustTestHarness) { + th.WriteK("/app/bones", ` +namePrefix: bones- +resources: +- ../base +patchesStrategicMerge: +- dep-patch.yaml +`) + th.WriteF("/app/bones/dep-patch.yaml", ` +apiVersion: v1 +kind: Deployment +metadata: + name: storefront +spec: + type: Concerned +`) +} + +func writeTenants(th *kusttest_test.KustTestHarness) { + th.WriteK("/app/tenants", ` +namePrefix: t- +resources: +- ../kirk +- ../spock +- ../bones +- configMap.yaml +patchesStrategicMerge: +- bones-patch.yaml +`) + th.WriteF("/app/tenants/bones-patch.yaml", ` +apiVersion: v1 +kind: Deployment +metadata: + name: bones-storefront +spec: + mood: Cantankerous +`) + th.WriteF("/app/tenants/configMap.yaml", ` +apiVersion: v1 +kind: ConfigMap +metadata: + name: federation +data: + zone: neutral + guardian: forever +`) +} + +func TestBasicDiamond(t *testing.T) { + th := kusttest_test.NewKustTestHarness(t, "/app/prod") + writeDiamondBase(th) + writeKirk(th) + writeSpock(th) + writeBones(th) + writeTenants(th) + th.WriteK("/app/prod", ` +namePrefix: prod- +resources: +- ../tenants +patchesStrategicMerge: +- patches.yaml +`) + // The patch only has to be specific enough + // to match the item. + th.WriteF("/app/prod/patches.yaml", ` +apiVersion: v1 +kind: Deployment +metadata: + name: t-kirk-storefront +spec: + numReplicas: 10000 +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: federation +data: + guardian: ofTheGalaxy +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: t-federation +data: + zone: twilight +`) + + m, err := th.MakeKustTarget().MakeCustomizedResMap() + if err != nil { + t.Fatalf("Err: %v", err) + } + th.AssertActualEqualsExpected(m, ` +apiVersion: v1 +kind: Deployment +metadata: + name: prod-t-kirk-storefront +spec: + numReplicas: 10000 + type: Confident +--- +apiVersion: v1 +data: + phaser: caress +kind: ConfigMap +metadata: + name: prod-t-kirk-settings +--- +apiVersion: v1 +kind: Deployment +metadata: + name: prod-t-spock-storefront +spec: + numReplicas: 1 + type: Logical +--- +apiVersion: v1 +kind: Deployment +metadata: + name: prod-t-bones-storefront +spec: + mood: Cantankerous + numReplicas: 1 + type: Concerned +--- +apiVersion: v1 +data: + guardian: ofTheGalaxy + zone: twilight +kind: ConfigMap +metadata: + name: prod-t-federation +`) +}