repo_description: Customization of kubernetes YAML configurations
repo_topics: hacktoberfest k8s-sig-cli
code: // 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 Deployment.v1.apps/banana.[noNs]; failed to find unique target for patch Deployment.v1.apps/banana.[noNs]") {
  		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
  	// `)
  }
  