...

Source file src/sigs.k8s.io/kustomize/api/krusty/replacementtransformer_test.go

Documentation: sigs.k8s.io/kustomize/api/krusty

     1  // Copyright 2022 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package krusty_test
     5  
     6  import (
     7  	"testing"
     8  
     9  	kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest"
    10  )
    11  
    12  // end to end tests to demonstrate functionality of ReplacementTransformer
    13  func TestReplacementsField(t *testing.T) {
    14  	th := kusttest_test.MakeEnhancedHarness(t)
    15  	defer th.Reset()
    16  
    17  	th.WriteK(".", `
    18  resources:
    19  - resource.yaml
    20  
    21  replacements:
    22  - source:
    23      kind: Deployment
    24      fieldPath: spec.template.spec.containers.0.image
    25    targets:
    26    - select:
    27        kind: Deployment
    28      fieldPaths:
    29      - spec.template.spec.containers.1.image
    30  `)
    31  	th.WriteF("resource.yaml", `
    32  apiVersion: apps/v1
    33  kind: Deployment
    34  metadata:
    35    name: deploy
    36  spec:
    37    template:
    38      spec:
    39        containers:
    40        - image: foobar:1
    41          name: replaced-with-digest
    42        - image: postgres:1.8.0
    43          name: postgresdb
    44  `)
    45  	expected := `
    46  apiVersion: apps/v1
    47  kind: Deployment
    48  metadata:
    49    name: deploy
    50  spec:
    51    template:
    52      spec:
    53        containers:
    54        - image: foobar:1
    55          name: replaced-with-digest
    56        - image: foobar:1
    57          name: postgresdb
    58  `
    59  	m := th.Run(".", th.MakeDefaultOptions())
    60  	th.AssertActualEqualsExpected(m, expected)
    61  }
    62  
    63  func TestReplacementsFieldWithPath(t *testing.T) {
    64  	th := kusttest_test.MakeEnhancedHarness(t)
    65  	defer th.Reset()
    66  
    67  	th.WriteK(".", `
    68  resources:
    69  - resource.yaml
    70  
    71  replacements:
    72  - path: replacement.yaml
    73  `)
    74  	th.WriteF("replacement.yaml", `
    75  source: 
    76    kind: Deployment
    77    fieldPath: spec.template.spec.containers.0.image
    78  targets:
    79  - select:
    80      kind: Deployment
    81    fieldPaths: 
    82    - spec.template.spec.containers.1.image
    83  `)
    84  	th.WriteF("resource.yaml", `
    85  apiVersion: apps/v1
    86  kind: Deployment
    87  metadata:
    88    name: deploy
    89  spec:
    90    template:
    91      spec:
    92        containers:
    93        - image: foobar:1
    94          name: replaced-with-digest
    95        - image: postgres:1.8.0
    96          name: postgresdb
    97  `)
    98  	expected := `
    99  apiVersion: apps/v1
   100  kind: Deployment
   101  metadata:
   102    name: deploy
   103  spec:
   104    template:
   105      spec:
   106        containers:
   107        - image: foobar:1
   108          name: replaced-with-digest
   109        - image: foobar:1
   110          name: postgresdb
   111  `
   112  	m := th.Run(".", th.MakeDefaultOptions())
   113  	th.AssertActualEqualsExpected(m, expected)
   114  }
   115  
   116  func TestReplacementsFieldWithPathMultiple(t *testing.T) {
   117  	th := kusttest_test.MakeEnhancedHarness(t)
   118  	defer th.Reset()
   119  
   120  	th.WriteK(".", `
   121  resources:
   122  - resource.yaml
   123  
   124  replacements:
   125  - path: replacement.yaml
   126  `)
   127  	th.WriteF("replacement.yaml", `
   128  - source: 
   129      kind: Deployment
   130      fieldPath: spec.template.spec.containers.0.image
   131    targets:
   132    - select:
   133        kind: Deployment
   134      fieldPaths: 
   135      - spec.template.spec.containers.1.image
   136  - source: 
   137      kind: Deployment
   138      fieldPath: spec.template.spec.containers.0.name
   139    targets:
   140    - select:
   141        kind: Deployment
   142      fieldPaths: 
   143      - spec.template.spec.containers.1.name
   144  `)
   145  	th.WriteF("resource.yaml", `
   146  apiVersion: apps/v1
   147  kind: Deployment
   148  metadata:
   149    name: deploy
   150  spec:
   151    template:
   152      spec:
   153        containers:
   154        - image: foobar:1
   155          name: replaced-with-digest
   156        - image: postgres:1.8.0
   157          name: postgresdb
   158  `)
   159  	expected := `
   160  apiVersion: apps/v1
   161  kind: Deployment
   162  metadata:
   163    name: deploy
   164  spec:
   165    template:
   166      spec:
   167        containers:
   168        - image: foobar:1
   169          name: replaced-with-digest
   170        - image: foobar:1
   171          name: replaced-with-digest
   172  `
   173  	m := th.Run(".", th.MakeDefaultOptions())
   174  	th.AssertActualEqualsExpected(m, expected)
   175  }
   176  
   177  func TestReplacementTransformerWithDiamondShape(t *testing.T) {
   178  	th := kusttest_test.MakeEnhancedHarness(t)
   179  	defer th.Reset()
   180  
   181  	th.WriteF("base/deployments.yaml", `
   182  apiVersion: apps/v1
   183  kind: Deployment
   184  metadata:
   185    name: deploy
   186  spec:
   187    template:
   188      spec:
   189        containers:
   190        - image: nginx:1.7.9
   191          name: nginx
   192  ---
   193  apiVersion: apps/v1
   194  kind: Deployment
   195  metadata:
   196    name: sourceA
   197  spec:
   198    template:
   199      spec:
   200        containers:
   201        - image: nginx:newtagA
   202          name: nginx
   203  ---
   204  apiVersion: apps/v1
   205  kind: Deployment
   206  metadata:
   207    name: sourceB
   208  spec:
   209    template:
   210      spec:
   211        containers:
   212        - image: nginx:newtagB
   213          name: nginx
   214  `)
   215  	th.WriteK("base", `
   216  resources:
   217  - deployments.yaml
   218  `)
   219  	th.WriteK("a", `
   220  namePrefix: a-
   221  resources:
   222  - ../base
   223  replacements:
   224  - path: replacement.yaml
   225  `)
   226  	th.WriteF("a/replacement.yaml", `
   227  source:
   228    name: a-sourceA
   229    fieldPath: spec.template.spec.containers.0.image
   230  targets:
   231  - select:
   232      name: a-deploy
   233    fieldPaths:
   234    - spec.template.spec.containers.[name=nginx].image
   235  `)
   236  	th.WriteK("b", `
   237  namePrefix: b-
   238  resources:
   239  - ../base
   240  replacements:
   241  - path: replacement.yaml
   242  `)
   243  	th.WriteF("b/replacement.yaml", `
   244  source:
   245    name: b-sourceB
   246    fieldPath: spec.template.spec.containers.0.image
   247  targets:
   248  - select:
   249      name: b-deploy
   250    fieldPaths:
   251    - spec.template.spec.containers.[name=nginx].image
   252  `)
   253  	th.WriteK(".", `
   254  resources:
   255  - a
   256  - b
   257  `)
   258  
   259  	m := th.Run(".", th.MakeDefaultOptions())
   260  	th.AssertActualEqualsExpected(m, `
   261  apiVersion: apps/v1
   262  kind: Deployment
   263  metadata:
   264    name: a-deploy
   265  spec:
   266    template:
   267      spec:
   268        containers:
   269        - image: nginx:newtagA
   270          name: nginx
   271  ---
   272  apiVersion: apps/v1
   273  kind: Deployment
   274  metadata:
   275    name: a-sourceA
   276  spec:
   277    template:
   278      spec:
   279        containers:
   280        - image: nginx:newtagA
   281          name: nginx
   282  ---
   283  apiVersion: apps/v1
   284  kind: Deployment
   285  metadata:
   286    name: a-sourceB
   287  spec:
   288    template:
   289      spec:
   290        containers:
   291        - image: nginx:newtagB
   292          name: nginx
   293  ---
   294  apiVersion: apps/v1
   295  kind: Deployment
   296  metadata:
   297    name: b-deploy
   298  spec:
   299    template:
   300      spec:
   301        containers:
   302        - image: nginx:newtagB
   303          name: nginx
   304  ---
   305  apiVersion: apps/v1
   306  kind: Deployment
   307  metadata:
   308    name: b-sourceA
   309  spec:
   310    template:
   311      spec:
   312        containers:
   313        - image: nginx:newtagA
   314          name: nginx
   315  ---
   316  apiVersion: apps/v1
   317  kind: Deployment
   318  metadata:
   319    name: b-sourceB
   320  spec:
   321    template:
   322      spec:
   323        containers:
   324        - image: nginx:newtagB
   325          name: nginx
   326  `)
   327  }
   328  
   329  func TestReplacementTransformerWithOriginalName(t *testing.T) {
   330  	th := kusttest_test.MakeEnhancedHarness(t)
   331  	defer th.Reset()
   332  
   333  	th.WriteF("base/deployments.yaml", `
   334  apiVersion: apps/v1
   335  kind: Deployment
   336  metadata:
   337    name: target
   338  spec:
   339    template:
   340      spec:
   341        containers:
   342        - image: nginx:oldtag
   343          name: nginx
   344  ---
   345  apiVersion: apps/v1
   346  kind: Deployment
   347  metadata:
   348    name: source
   349  spec:
   350    template:
   351      spec:
   352        containers:
   353        - image: nginx:newtag
   354          name: nginx
   355  `)
   356  	th.WriteK("base", `
   357  resources:
   358  - deployments.yaml
   359  `)
   360  	th.WriteK("overlay", `
   361  namePrefix: prefix1-
   362  resources:
   363  - ../base
   364  `)
   365  
   366  	th.WriteK(".", `
   367  namePrefix: prefix2-
   368  resources:
   369  - overlay
   370  replacements:
   371  - path: replacement.yaml
   372  `)
   373  	th.WriteF("replacement.yaml", `
   374  source:
   375    name: source
   376    fieldPath: spec.template.spec.containers.0.image
   377  targets:
   378  - select:
   379      name: prefix1-target
   380    fieldPaths:
   381    - spec.template.spec.containers.[name=nginx].image
   382  `)
   383  
   384  	m := th.Run(".", th.MakeDefaultOptions())
   385  	th.AssertActualEqualsExpected(m, `
   386  apiVersion: apps/v1
   387  kind: Deployment
   388  metadata:
   389    name: prefix2-prefix1-target
   390  spec:
   391    template:
   392      spec:
   393        containers:
   394        - image: nginx:newtag
   395          name: nginx
   396  ---
   397  apiVersion: apps/v1
   398  kind: Deployment
   399  metadata:
   400    name: prefix2-prefix1-source
   401  spec:
   402    template:
   403      spec:
   404        containers:
   405        - image: nginx:newtag
   406          name: nginx
   407  `)
   408  }
   409  
   410  // TODO: Address namePrefix in overlay not applying to replacement targets
   411  // The property `data.blue-name` should end up being `overlay-blue` instead of `blue`
   412  // https://github.com/kubernetes-sigs/kustomize/issues/4034
   413  func TestReplacementTransformerWithNamePrefixOverlay(t *testing.T) {
   414  	th := kusttest_test.MakeEnhancedHarness(t)
   415  	defer th.Reset()
   416  
   417  	th.WriteK("base", `
   418  generatorOptions:
   419   disableNameSuffixHash: true
   420  configMapGenerator:
   421  - name: blue
   422  - name: red
   423  replacements:
   424  - source:
   425      kind: ConfigMap
   426      name: blue
   427      fieldPath: metadata.name
   428    targets:
   429    - select:
   430        name: red
   431      fieldPaths:
   432      - data.blue-name
   433      options:
   434        create: true
   435  `)
   436  
   437  	th.WriteK(".", `
   438  namePrefix: overlay-
   439  resources:
   440  - base
   441  `)
   442  	m := th.Run(".", th.MakeDefaultOptions())
   443  	th.AssertActualEqualsExpected(m, `
   444  apiVersion: v1
   445  kind: ConfigMap
   446  metadata:
   447    name: overlay-blue
   448  ---
   449  apiVersion: v1
   450  data:
   451    blue-name: blue
   452  kind: ConfigMap
   453  metadata:
   454    name: overlay-red
   455  `)
   456  }
   457  
   458  // TODO: Address namespace in overlay not applying to replacement targets
   459  // The property `data.blue-namespace` should end up being `overlay-namespace` instead of `base-namespace`
   460  // https://github.com/kubernetes-sigs/kustomize/issues/4034
   461  func TestReplacementTransformerWithNamespaceOverlay(t *testing.T) {
   462  	th := kusttest_test.MakeEnhancedHarness(t)
   463  	defer th.Reset()
   464  
   465  	th.WriteK("base", `
   466  namespace: base-namespace
   467  generatorOptions:
   468   disableNameSuffixHash: true
   469  configMapGenerator:
   470  - name: blue
   471  - name: red
   472  replacements:
   473  - source:
   474      kind: ConfigMap
   475      name: blue
   476      fieldPath: metadata.namespace
   477    targets:
   478    - select:
   479        name: red
   480      fieldPaths:
   481      - data.blue-namespace
   482      options:
   483        create: true
   484  `)
   485  
   486  	th.WriteK(".", `
   487  namespace: overlay-namespace
   488  resources:
   489  - base
   490  `)
   491  	m := th.Run(".", th.MakeDefaultOptions())
   492  	th.AssertActualEqualsExpected(m, `
   493  apiVersion: v1
   494  kind: ConfigMap
   495  metadata:
   496    name: blue
   497    namespace: overlay-namespace
   498  ---
   499  apiVersion: v1
   500  data:
   501    blue-namespace: base-namespace
   502  kind: ConfigMap
   503  metadata:
   504    name: red
   505    namespace: overlay-namespace
   506  `)
   507  }
   508  
   509  // TODO: Address configMapGenerator suffix not applying to replacement targets
   510  // The property `data.blue-name` should end up being `blue-6ct58987ht` instead of `blue`
   511  // https://github.com/kubernetes-sigs/kustomize/issues/4034
   512  func TestReplacementTransformerWithConfigMapGenerator(t *testing.T) {
   513  	th := kusttest_test.MakeEnhancedHarness(t)
   514  	defer th.Reset()
   515  
   516  	th.WriteK(".", `
   517  configMapGenerator:
   518  - name: blue
   519  - name: red
   520  replacements:
   521  - source:
   522      kind: ConfigMap
   523      name: blue
   524      fieldPath: metadata.name
   525    targets:
   526    - select:
   527        name: red
   528      fieldPaths:
   529      - data.blue-name
   530      options:
   531        create: true
   532  `)
   533  
   534  	m := th.Run(".", th.MakeDefaultOptions())
   535  	th.AssertActualEqualsExpected(m, `
   536  apiVersion: v1
   537  kind: ConfigMap
   538  metadata:
   539    name: blue-6ct58987ht
   540  ---
   541  apiVersion: v1
   542  data:
   543    blue-name: blue
   544  kind: ConfigMap
   545  metadata:
   546    name: red-dc6gc5btkc
   547  `)
   548  }
   549  
   550  func TestReplacementTransformerWithSuffixTransformerAndReject(t *testing.T) {
   551  	th := kusttest_test.MakeEnhancedHarness(t)
   552  	defer th.Reset()
   553  
   554  	th.WriteF("base/app.yaml", `
   555  apiVersion: apps/v1
   556  kind: Deployment
   557  metadata:
   558    name: original-name
   559  spec:
   560    template:
   561      spec:
   562        containers:
   563          - image: app1:1.0
   564            name: app
   565  `)
   566  	th.WriteK("base", `
   567  resources:
   568    - app.yaml
   569  `)
   570  	th.WriteK("overlay", `
   571  apiVersion: kustomize.config.k8s.io/v1beta1
   572  kind: Kustomization
   573  
   574  nameSuffix: -dev
   575  resources:
   576    - ../base
   577  
   578  configMapGenerator:
   579    - name: app-config
   580      literals:
   581        - name=something-else
   582  
   583  replacements:
   584    - source:
   585        kind: ConfigMap
   586        name: app-config
   587        fieldPath: data.name
   588      targets:
   589        - fieldPaths:
   590            - spec.template.spec.containers.0.name
   591          select:
   592            kind: Deployment
   593          reject:
   594            - name: original-name
   595  `)
   596  	m := th.Run("overlay", th.MakeDefaultOptions())
   597  	th.AssertActualEqualsExpected(m, `
   598  apiVersion: apps/v1
   599  kind: Deployment
   600  metadata:
   601    name: original-name-dev
   602  spec:
   603    template:
   604      spec:
   605        containers:
   606        - image: app1:1.0
   607          name: app
   608  ---
   609  apiVersion: v1
   610  data:
   611    name: something-else
   612  kind: ConfigMap
   613  metadata:
   614    name: app-config-dev-97544dk6t8
   615  `)
   616  }
   617  

View as plain text