...

Source file src/sigs.k8s.io/kustomize/api/internal/target/vars_test.go

Documentation: sigs.k8s.io/kustomize/api/internal/target

     1  // Copyright 2019 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package target_test
     5  
     6  import (
     7  	"fmt"
     8  	"strings"
     9  	"testing"
    10  
    11  	kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest"
    12  	"sigs.k8s.io/kustomize/api/types"
    13  	"sigs.k8s.io/kustomize/kyaml/resid"
    14  )
    15  
    16  // To simplify tests, these vars specified in alphabetical order.
    17  var someVars = []types.Var{
    18  	{
    19  		Name: "AWARD",
    20  		ObjRef: types.Target{
    21  			APIVersion: "v7",
    22  			Gvk:        resid.Gvk{Kind: "Service"},
    23  			Name:       "nobelPrize"},
    24  		FieldRef: types.FieldSelector{FieldPath: "some.arbitrary.path"},
    25  	},
    26  	{
    27  		Name: "BIRD",
    28  		ObjRef: types.Target{
    29  			APIVersion: "v300",
    30  			Gvk:        resid.Gvk{Kind: "Service"},
    31  			Name:       "heron"},
    32  		FieldRef: types.FieldSelector{FieldPath: "metadata.name"},
    33  	},
    34  	{
    35  		Name: "FRUIT",
    36  		ObjRef: types.Target{
    37  			Gvk:  resid.Gvk{Kind: "Service"},
    38  			Name: "apple"},
    39  		FieldRef: types.FieldSelector{FieldPath: "metadata.name"},
    40  	},
    41  	{
    42  		Name: "VEGETABLE",
    43  		ObjRef: types.Target{
    44  			Gvk:  resid.Gvk{Kind: "Leafy"},
    45  			Name: "kale"},
    46  		FieldRef: types.FieldSelector{FieldPath: "metadata.name"},
    47  	},
    48  }
    49  
    50  func TestGetAllVarsSimple(t *testing.T) {
    51  	th := kusttest_test.MakeHarness(t)
    52  	th.WriteK("/app", `
    53  vars:
    54    - name: AWARD
    55      objref:
    56        kind: Service
    57        name: nobelPrize
    58        apiVersion: v7
    59      fieldref:
    60        fieldpath: some.arbitrary.path
    61    - name: BIRD
    62      objref:
    63        kind: Service
    64        name: heron
    65        apiVersion: v300
    66  `)
    67  	ra, err := makeAndLoadKustTarget(
    68  		t, th.GetFSys(), "/app").AccumulateTarget()
    69  	if err != nil {
    70  		t.Fatalf("Err: %v", err)
    71  	}
    72  	vars := ra.Vars()
    73  	if len(vars) != 2 {
    74  		t.Fatalf("unexpected size %d", len(vars))
    75  	}
    76  	for i := range vars[:2] {
    77  		// By using Var.DeepEqual, we are protecting the code
    78  		// from a potential invocation of vars[i].ObjRef.GVK()
    79  		// during accumulateTarget
    80  		if !vars[i].DeepEqual(someVars[i]) {
    81  			t.Fatalf("unexpected var[%d]:\n  %v\n  %v", i, vars[i], someVars[i])
    82  		}
    83  	}
    84  }
    85  
    86  func TestGetAllVarsNested(t *testing.T) {
    87  	th := kusttest_test.MakeHarness(t)
    88  	th.WriteK("/app/base", `
    89  vars:
    90    - name: AWARD
    91      objref:
    92        kind: Service
    93        name: nobelPrize
    94        apiVersion: v7
    95      fieldref:
    96        fieldpath: some.arbitrary.path
    97    - name: BIRD
    98      objref:
    99        kind: Service
   100        name: heron
   101        apiVersion: v300
   102  `)
   103  	th.WriteK("/app/overlays/o1", `
   104  vars:
   105    - name: FRUIT
   106      objref:
   107        kind: Service
   108        name: apple
   109  resources:
   110  - ../../base
   111  `)
   112  	th.WriteK("/app/overlays/o2", `
   113  vars:
   114    - name: VEGETABLE
   115      objref:
   116        kind: Leafy
   117        name: kale
   118  resources:
   119  - ../o1
   120  `)
   121  
   122  	ra, err := makeAndLoadKustTarget(
   123  		t, th.GetFSys(), "/app/overlays/o2").AccumulateTarget()
   124  	if err != nil {
   125  		t.Fatalf("Err: %v", err)
   126  	}
   127  	vars := ra.Vars()
   128  	if len(vars) != 4 {
   129  		for i, v := range vars {
   130  			fmt.Printf("%v: %v\n", i, v)
   131  		}
   132  		t.Fatalf("expected 4 vars, got %d", len(vars))
   133  	}
   134  	for i := range vars {
   135  		// By using Var.DeepEqual, we are protecting the code
   136  		// from a potential invocation of vars[i].ObjRef.GVK()
   137  		// during accumulateTarget
   138  		if !vars[i].DeepEqual(someVars[i]) {
   139  			t.Fatalf("unexpected var[%d]:\n  %v\n  %v", i, vars[i], someVars[i])
   140  		}
   141  	}
   142  }
   143  
   144  func TestVarCollisionsForbidden(t *testing.T) {
   145  	th := kusttest_test.MakeHarness(t)
   146  	th.WriteK("/app/base", `
   147  vars:
   148    - name: AWARD
   149      objref:
   150        kind: Service
   151        name: nobelPrize
   152        apiVersion: v7
   153      fieldref:
   154        fieldpath: some.arbitrary.path
   155    - name: BIRD
   156      objref:
   157        kind: Service
   158        name: heron
   159        apiVersion: v300
   160  `)
   161  	th.WriteK("/app/overlays/o1", `
   162  vars:
   163    - name: AWARD
   164      objref:
   165        kind: Service
   166        name: academy
   167  resources:
   168  - ../../base
   169  `)
   170  	th.WriteK("/app/overlays/o2", `
   171  vars:
   172    - name: VEGETABLE
   173      objref:
   174        kind: Leafy
   175        name: kale
   176  resources:
   177  - ../o1
   178  `)
   179  	_, err := makeAndLoadKustTarget(
   180  		t, th.GetFSys(), "/app/overlays/o2").AccumulateTarget()
   181  	if err == nil {
   182  		t.Fatalf("expected var collision")
   183  	}
   184  	if !strings.Contains(err.Error(),
   185  		"var 'AWARD' already encountered") {
   186  		t.Fatalf("unexpected error: %v", err)
   187  	}
   188  }
   189  

View as plain text