...

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

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

     1  // Copyright 2019 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package krusty_test
     5  
     6  import (
     7  	"os"
     8  	"path/filepath"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  	"sigs.k8s.io/kustomize/api/internal/utils"
    14  	"sigs.k8s.io/kustomize/api/krusty"
    15  	kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest"
    16  	"sigs.k8s.io/kustomize/kyaml/filesys"
    17  )
    18  
    19  func TestAnnoOriginLocalFiles(t *testing.T) {
    20  	th := kusttest_test.MakeHarness(t)
    21  	th.WriteF("service.yaml", `
    22  apiVersion: v1
    23  kind: Service
    24  metadata:
    25    name: myService
    26  spec:
    27    ports:
    28    - port: 7002
    29  `)
    30  	th.WriteK(".", `
    31  resources:
    32  - service.yaml
    33  buildMetadata: [originAnnotations]
    34  `)
    35  	options := th.MakeDefaultOptions()
    36  	m := th.Run(".", options)
    37  	th.AssertActualEqualsExpected(m, `
    38  apiVersion: v1
    39  kind: Service
    40  metadata:
    41    annotations:
    42      config.kubernetes.io/origin: |
    43        path: service.yaml
    44    name: myService
    45  spec:
    46    ports:
    47    - port: 7002
    48  `)
    49  }
    50  
    51  func TestAnnoOriginLocalFilesWithOverlay(t *testing.T) {
    52  	th := kusttest_test.MakeHarness(t)
    53  	th.WriteK("base", `
    54  namePrefix: b-
    55  resources:
    56  - namespace.yaml
    57  - role.yaml
    58  - service.yaml
    59  - deployment.yaml
    60  `)
    61  	th.WriteF("base/service.yaml", `
    62  apiVersion: v1
    63  kind: Service
    64  metadata:
    65    name: myService
    66  `)
    67  	th.WriteF("base/namespace.yaml", `
    68  apiVersion: v1
    69  kind: Namespace
    70  metadata:
    71    name: myNs
    72  `)
    73  	th.WriteF("base/role.yaml", `
    74  apiVersion: v1
    75  kind: Role
    76  metadata:
    77    name: myRole
    78  `)
    79  	th.WriteF("base/deployment.yaml", `
    80  apiVersion: v1
    81  kind: Deployment
    82  metadata:
    83    name: myDep
    84  `)
    85  	th.WriteK("prod", `
    86  namePrefix: p-
    87  resources:
    88  - ../base
    89  - service.yaml
    90  - namespace.yaml
    91  buildMetadata: [originAnnotations]
    92  `)
    93  	th.WriteF("prod/service.yaml", `
    94  apiVersion: v1
    95  kind: Service
    96  metadata:
    97    name: myService2
    98  `)
    99  	th.WriteF("prod/namespace.yaml", `
   100  apiVersion: v1
   101  kind: Namespace
   102  metadata:
   103    name: myNs2
   104  `)
   105  	m := th.Run("prod", th.MakeDefaultOptions())
   106  	th.AssertActualEqualsExpected(m, `
   107  apiVersion: v1
   108  kind: Namespace
   109  metadata:
   110    annotations:
   111      config.kubernetes.io/origin: |
   112        path: ../base/namespace.yaml
   113    name: myNs
   114  ---
   115  apiVersion: v1
   116  kind: Role
   117  metadata:
   118    annotations:
   119      config.kubernetes.io/origin: |
   120        path: ../base/role.yaml
   121    name: p-b-myRole
   122  ---
   123  apiVersion: v1
   124  kind: Service
   125  metadata:
   126    annotations:
   127      config.kubernetes.io/origin: |
   128        path: ../base/service.yaml
   129    name: p-b-myService
   130  ---
   131  apiVersion: v1
   132  kind: Deployment
   133  metadata:
   134    annotations:
   135      config.kubernetes.io/origin: |
   136        path: ../base/deployment.yaml
   137    name: p-b-myDep
   138  ---
   139  apiVersion: v1
   140  kind: Service
   141  metadata:
   142    annotations:
   143      config.kubernetes.io/origin: |
   144        path: service.yaml
   145    name: p-myService2
   146  ---
   147  apiVersion: v1
   148  kind: Namespace
   149  metadata:
   150    annotations:
   151      config.kubernetes.io/origin: |
   152        path: namespace.yaml
   153    name: myNs2
   154  `)
   155  }
   156  
   157  // This is a copy of TestGeneratorBasics in configmaps_test.go,
   158  // except that we've enabled the addAnnoOrigin option.
   159  func TestGeneratorWithAnnoOrigin(t *testing.T) {
   160  	th := kusttest_test.MakeHarness(t)
   161  	th.WriteK(".", `
   162  namePrefix: blah-
   163  configMapGenerator:
   164  - name: bob
   165    literals:
   166    - fruit=apple
   167    - vegetable=broccoli
   168    envs:
   169    - foo.env
   170    env: bar.env
   171    files:
   172    - passphrase=phrase.dat
   173    - forces.txt
   174  - name: json
   175    literals:
   176    - 'v2=[{"path": "var/druid/segment-cache"}]'
   177    - >-
   178      druid_segmentCache_locations=[{"path":
   179      "var/druid/segment-cache",
   180      "maxSize": 32000000000,
   181      "freeSpacePercent": 1.0}]
   182  secretGenerator:
   183  - name: bob
   184    literals:
   185    - fruit=apple
   186    - vegetable=broccoli
   187    envs:
   188    - foo.env
   189    files:
   190    - passphrase=phrase.dat
   191    - forces.txt
   192    env: bar.env
   193  buildMetadata: [originAnnotations]
   194  `)
   195  	th.WriteF("foo.env", `
   196  MOUNTAIN=everest
   197  OCEAN=pacific
   198  `)
   199  	th.WriteF("bar.env", `
   200  BIRD=falcon
   201  `)
   202  	th.WriteF("phrase.dat", `
   203  Life is short.
   204  But the years are long.
   205  Not while the evil days come not.
   206  `)
   207  	th.WriteF("forces.txt", `
   208  gravitational
   209  electromagnetic
   210  strong nuclear
   211  weak nuclear
   212  `)
   213  	opts := th.MakeDefaultOptions()
   214  	m := th.Run(".", opts)
   215  	th.AssertActualEqualsExpected(
   216  		m, `
   217  apiVersion: v1
   218  data:
   219    BIRD: falcon
   220    MOUNTAIN: everest
   221    OCEAN: pacific
   222    forces.txt: |2
   223  
   224      gravitational
   225      electromagnetic
   226      strong nuclear
   227      weak nuclear
   228    fruit: apple
   229    passphrase: |2
   230  
   231      Life is short.
   232      But the years are long.
   233      Not while the evil days come not.
   234    vegetable: broccoli
   235  kind: ConfigMap
   236  metadata:
   237    annotations:
   238      config.kubernetes.io/origin: |
   239        configuredIn: kustomization.yaml
   240        configuredBy:
   241          apiVersion: builtin
   242          kind: ConfigMapGenerator
   243    name: blah-bob-g9df72cd5b
   244  ---
   245  apiVersion: v1
   246  data:
   247    druid_segmentCache_locations: '[{"path": "var/druid/segment-cache", "maxSize": 32000000000,
   248      "freeSpacePercent": 1.0}]'
   249    v2: '[{"path": "var/druid/segment-cache"}]'
   250  kind: ConfigMap
   251  metadata:
   252    annotations:
   253      config.kubernetes.io/origin: |
   254        configuredIn: kustomization.yaml
   255        configuredBy:
   256          apiVersion: builtin
   257          kind: ConfigMapGenerator
   258    name: blah-json-m8529t979f
   259  ---
   260  apiVersion: v1
   261  data:
   262    BIRD: ZmFsY29u
   263    MOUNTAIN: ZXZlcmVzdA==
   264    OCEAN: cGFjaWZpYw==
   265    forces.txt: |
   266      CmdyYXZpdGF0aW9uYWwKZWxlY3Ryb21hZ25ldGljCnN0cm9uZyBudWNsZWFyCndlYWsgbn
   267      VjbGVhcgo=
   268    fruit: YXBwbGU=
   269    passphrase: |
   270      CkxpZmUgaXMgc2hvcnQuCkJ1dCB0aGUgeWVhcnMgYXJlIGxvbmcuCk5vdCB3aGlsZSB0aG
   271      UgZXZpbCBkYXlzIGNvbWUgbm90Lgo=
   272    vegetable: YnJvY2NvbGk=
   273  kind: Secret
   274  metadata:
   275    annotations:
   276      config.kubernetes.io/origin: |
   277        configuredIn: kustomization.yaml
   278        configuredBy:
   279          apiVersion: builtin
   280          kind: SecretGenerator
   281    name: blah-bob-58g62h555c
   282  type: Opaque
   283  `)
   284  }
   285  
   286  func TestAnnoOriginLocalBuiltinGenerator(t *testing.T) {
   287  	th := kusttest_test.MakeHarness(t)
   288  	th.WriteK(".", `
   289  resources:
   290  - service.yaml
   291  configMapGenerator:
   292  - name: bob
   293    literals:
   294    - fruit=Indian Gooseberry
   295    - year=2020
   296    - crisis=true
   297  buildMetadata: [originAnnotations]
   298  
   299  `)
   300  	th.WriteF("service.yaml", `
   301  apiVersion: v1
   302  kind: Service
   303  metadata:
   304    name: demo
   305  spec:
   306    clusterIP: None
   307  `)
   308  	m := th.Run(".", th.MakeDefaultOptions())
   309  	th.AssertActualEqualsExpected(
   310  		m, `
   311  apiVersion: v1
   312  kind: Service
   313  metadata:
   314    annotations:
   315      config.kubernetes.io/origin: |
   316        path: service.yaml
   317    name: demo
   318  spec:
   319    clusterIP: None
   320  ---
   321  apiVersion: v1
   322  data:
   323    crisis: "true"
   324    fruit: Indian Gooseberry
   325    year: "2020"
   326  kind: ConfigMap
   327  metadata:
   328    annotations:
   329      config.kubernetes.io/origin: |
   330        configuredIn: kustomization.yaml
   331        configuredBy:
   332          apiVersion: builtin
   333          kind: ConfigMapGenerator
   334    name: bob-79t79mt227
   335  `)
   336  }
   337  
   338  func TestAnnoOriginConfigMapGeneratorMerge(t *testing.T) {
   339  	th := kusttest_test.MakeHarness(t)
   340  	th.WriteK("base", `
   341  configMapGenerator:
   342  - name: bob
   343    literals:
   344    - fruit=Indian Gooseberry
   345    - year=2020
   346    - crisis=true
   347  `)
   348  	th.WriteK("overlay", `
   349  resources:
   350  - ../base
   351  configMapGenerator:
   352  - name: bob
   353    behavior: merge
   354    literals:
   355    - month=12
   356  buildMetadata: [originAnnotations]
   357  `)
   358  	m := th.Run("overlay", th.MakeDefaultOptions())
   359  	th.AssertActualEqualsExpected(m, `apiVersion: v1
   360  data:
   361    crisis: "true"
   362    fruit: Indian Gooseberry
   363    month: "12"
   364    year: "2020"
   365  kind: ConfigMap
   366  metadata:
   367    annotations:
   368      config.kubernetes.io/origin: |
   369        configuredIn: ../base/kustomization.yaml
   370        configuredBy:
   371          apiVersion: builtin
   372          kind: ConfigMapGenerator
   373    name: bob-bk46gm59c6
   374  `)
   375  }
   376  
   377  func TestAnnoOriginConfigMapGeneratorReplace(t *testing.T) {
   378  	th := kusttest_test.MakeHarness(t)
   379  	th.WriteK("base", `
   380  configMapGenerator:
   381  - name: bob
   382    literals:
   383    - fruit=Indian Gooseberry
   384    - year=2020
   385    - crisis=true
   386  `)
   387  	th.WriteK("overlay", `
   388  resources:
   389  - ../base
   390  configMapGenerator:
   391  - name: bob
   392    behavior: replace
   393    literals:
   394    - month=12
   395  buildMetadata: [originAnnotations]
   396  `)
   397  	m := th.Run("overlay", th.MakeDefaultOptions())
   398  	th.AssertActualEqualsExpected(m, `apiVersion: v1
   399  data:
   400    month: "12"
   401  kind: ConfigMap
   402  metadata:
   403    annotations:
   404      config.kubernetes.io/origin: |
   405        configuredIn: kustomization.yaml
   406        configuredBy:
   407          apiVersion: builtin
   408          kind: ConfigMapGenerator
   409    name: bob-f8t5fhtbhc
   410  `)
   411  }
   412  
   413  func TestAnnoOriginCustomExecGenerator(t *testing.T) {
   414  	fSys := filesys.MakeFsOnDisk()
   415  
   416  	th := kusttest_test.MakeHarnessWithFs(t, fSys)
   417  	o := th.MakeOptionsPluginsEnabled()
   418  	o.PluginConfig.FnpLoadingOptions.EnableExec = true
   419  
   420  	tmpDir, err := filesys.NewTmpConfirmedDir()
   421  	require.NoError(t, err)
   422  	th.WriteK(tmpDir.String(), `
   423  resources:
   424  - short_secret.yaml
   425  generators:
   426  - gener.yaml
   427  buildMetadata: [originAnnotations]
   428  `)
   429  
   430  	// Create some additional resource just to make sure everything is added
   431  	th.WriteF(filepath.Join(tmpDir.String(), "short_secret.yaml"),
   432  		`
   433  apiVersion: v1
   434  kind: Secret
   435  metadata:
   436    labels:
   437      airshipit.org/ephemeral-user-data: "true"
   438    name: node1-bmc-secret
   439  type: Opaque
   440  stringData:
   441    userData: |
   442      bootcmd:
   443      - mkdir /mnt/vda
   444  `)
   445  	th.WriteF(filepath.Join(tmpDir.String(), "generateDeployment.sh"), generateDeploymentDotSh)
   446  
   447  	require.NoError(t, os.Chmod(filepath.Join(tmpDir.String(), "generateDeployment.sh"), 0777))
   448  	th.WriteF(filepath.Join(tmpDir.String(), "gener.yaml"), `
   449  kind: executable
   450  metadata:
   451    name: demo
   452    annotations:
   453      config.kubernetes.io/function: |
   454        exec:
   455          path: ./generateDeployment.sh
   456  spec:
   457  `)
   458  
   459  	m := th.Run(tmpDir.String(), o)
   460  	require.NoError(t, err)
   461  	yml, err := m.AsYaml()
   462  	require.NoError(t, err)
   463  	assert.Equal(t, `apiVersion: v1
   464  kind: Secret
   465  metadata:
   466    annotations:
   467      config.kubernetes.io/origin: |
   468        path: short_secret.yaml
   469    labels:
   470      airshipit.org/ephemeral-user-data: "true"
   471    name: node1-bmc-secret
   472  stringData:
   473    userData: |
   474      bootcmd:
   475      - mkdir /mnt/vda
   476  type: Opaque
   477  ---
   478  apiVersion: apps/v1
   479  kind: Deployment
   480  metadata:
   481    annotations:
   482      config.kubernetes.io/origin: |
   483        configuredIn: gener.yaml
   484        configuredBy:
   485          kind: executable
   486          name: demo
   487      tshirt-size: small
   488    labels:
   489      app: nginx
   490    name: nginx
   491  spec:
   492    selector:
   493      matchLabels:
   494        app: nginx
   495    template:
   496      metadata:
   497        labels:
   498          app: nginx
   499      spec:
   500        containers:
   501        - image: nginx
   502          name: nginx
   503  `, string(yml))
   504  	require.NoError(t, fSys.RemoveAll(tmpDir.String()))
   505  }
   506  
   507  func TestAnnoOriginCustomInlineExecGenerator(t *testing.T) {
   508  	fSys := filesys.MakeFsOnDisk()
   509  
   510  	th := kusttest_test.MakeHarnessWithFs(t, fSys)
   511  	o := th.MakeOptionsPluginsEnabled()
   512  	o.PluginConfig.FnpLoadingOptions.EnableExec = true
   513  
   514  	tmpDir, err := filesys.NewTmpConfirmedDir()
   515  	require.NoError(t, err)
   516  	th.WriteK(tmpDir.String(), `
   517  resources:
   518  - short_secret.yaml
   519  generators:
   520  - |-
   521    kind: executable
   522    metadata:
   523      name: demo
   524      annotations:
   525        config.kubernetes.io/function: |
   526          exec:
   527            path: ./generateDeployment.sh
   528    spec:
   529  buildMetadata: [originAnnotations]
   530  `)
   531  
   532  	// Create some additional resource just to make sure everything is added
   533  	th.WriteF(filepath.Join(tmpDir.String(), "short_secret.yaml"),
   534  		`
   535  apiVersion: v1
   536  kind: Secret
   537  metadata:
   538    labels:
   539      airshipit.org/ephemeral-user-data: "true"
   540    name: node1-bmc-secret
   541  type: Opaque
   542  stringData:
   543    userData: |
   544      bootcmd:
   545      - mkdir /mnt/vda
   546  `)
   547  	th.WriteF(filepath.Join(tmpDir.String(), "generateDeployment.sh"), generateDeploymentDotSh)
   548  	require.NoError(t, os.Chmod(filepath.Join(tmpDir.String(), "generateDeployment.sh"), 0777))
   549  	m := th.Run(tmpDir.String(), o)
   550  	require.NoError(t, err)
   551  	yml, err := m.AsYaml()
   552  	require.NoError(t, err)
   553  	assert.Equal(t, `apiVersion: v1
   554  kind: Secret
   555  metadata:
   556    annotations:
   557      config.kubernetes.io/origin: |
   558        path: short_secret.yaml
   559    labels:
   560      airshipit.org/ephemeral-user-data: "true"
   561    name: node1-bmc-secret
   562  stringData:
   563    userData: |
   564      bootcmd:
   565      - mkdir /mnt/vda
   566  type: Opaque
   567  ---
   568  apiVersion: apps/v1
   569  kind: Deployment
   570  metadata:
   571    annotations:
   572      config.kubernetes.io/origin: |
   573        configuredIn: kustomization.yaml
   574        configuredBy:
   575          kind: executable
   576          name: demo
   577      tshirt-size: small
   578    labels:
   579      app: nginx
   580    name: nginx
   581  spec:
   582    selector:
   583      matchLabels:
   584        app: nginx
   585    template:
   586      metadata:
   587        labels:
   588          app: nginx
   589      spec:
   590        containers:
   591        - image: nginx
   592          name: nginx
   593  `, string(yml))
   594  	require.NoError(t, fSys.RemoveAll(tmpDir.String()))
   595  }
   596  
   597  func TestAnnoOriginCustomExecGeneratorWithOverlay(t *testing.T) {
   598  	fSys := filesys.MakeFsOnDisk()
   599  
   600  	th := kusttest_test.MakeHarnessWithFs(t, fSys)
   601  	o := th.MakeOptionsPluginsEnabled()
   602  	o.PluginConfig.FnpLoadingOptions.EnableExec = true
   603  
   604  	tmpDir, err := filesys.NewTmpConfirmedDir()
   605  	require.NoError(t, err)
   606  	base := filepath.Join(tmpDir.String(), "base")
   607  	prod := filepath.Join(tmpDir.String(), "prod")
   608  	require.NoError(t, fSys.Mkdir(base))
   609  	require.NoError(t, fSys.Mkdir(prod))
   610  	th.WriteK(base, `
   611  resources:
   612  - short_secret.yaml
   613  generators:
   614  - gener.yaml
   615  `)
   616  	th.WriteK(prod, `
   617  resources:
   618  - ../base
   619  buildMetadata: [originAnnotations]
   620  `)
   621  	th.WriteF(filepath.Join(base, "short_secret.yaml"),
   622  		`
   623  apiVersion: v1
   624  kind: Secret
   625  metadata:
   626    labels:
   627      airshipit.org/ephemeral-user-data: "true"
   628    name: node1-bmc-secret
   629  type: Opaque
   630  stringData:
   631    userData: |
   632      bootcmd:
   633      - mkdir /mnt/vda
   634  `)
   635  	th.WriteF(filepath.Join(base, "generateDeployment.sh"), generateDeploymentDotSh)
   636  
   637  	require.NoError(t, os.Chmod(filepath.Join(base, "generateDeployment.sh"), 0777))
   638  	th.WriteF(filepath.Join(base, "gener.yaml"), `
   639  kind: executable
   640  metadata:
   641    name: demo
   642    annotations:
   643      config.kubernetes.io/function: |
   644        exec:
   645          path: ./generateDeployment.sh
   646  spec:
   647  `)
   648  
   649  	m := th.Run(prod, o)
   650  	require.NoError(t, err)
   651  	yml, err := m.AsYaml()
   652  	require.NoError(t, err)
   653  	assert.Equal(t, `apiVersion: v1
   654  kind: Secret
   655  metadata:
   656    annotations:
   657      config.kubernetes.io/origin: |
   658        path: ../base/short_secret.yaml
   659    labels:
   660      airshipit.org/ephemeral-user-data: "true"
   661    name: node1-bmc-secret
   662  stringData:
   663    userData: |
   664      bootcmd:
   665      - mkdir /mnt/vda
   666  type: Opaque
   667  ---
   668  apiVersion: apps/v1
   669  kind: Deployment
   670  metadata:
   671    annotations:
   672      config.kubernetes.io/origin: |
   673        configuredIn: ../base/gener.yaml
   674        configuredBy:
   675          kind: executable
   676          name: demo
   677      tshirt-size: small
   678    labels:
   679      app: nginx
   680    name: nginx
   681  spec:
   682    selector:
   683      matchLabels:
   684        app: nginx
   685    template:
   686      metadata:
   687        labels:
   688          app: nginx
   689      spec:
   690        containers:
   691        - image: nginx
   692          name: nginx
   693  `, string(yml))
   694  	require.NoError(t, fSys.RemoveAll(tmpDir.String()))
   695  }
   696  
   697  func TestAnnoOriginCustomInlineExecGeneratorWithOverlay(t *testing.T) {
   698  	fSys := filesys.MakeFsOnDisk()
   699  
   700  	th := kusttest_test.MakeHarnessWithFs(t, fSys)
   701  	o := th.MakeOptionsPluginsEnabled()
   702  	o.PluginConfig.FnpLoadingOptions.EnableExec = true
   703  
   704  	tmpDir, err := filesys.NewTmpConfirmedDir()
   705  	require.NoError(t, err)
   706  	base := filepath.Join(tmpDir.String(), "base")
   707  	prod := filepath.Join(tmpDir.String(), "prod")
   708  	require.NoError(t, fSys.Mkdir(base))
   709  	require.NoError(t, fSys.Mkdir(prod))
   710  	th.WriteK(base, `
   711  resources:
   712  - short_secret.yaml
   713  generators:
   714  - |-
   715    kind: executable
   716    metadata:
   717      name: demo
   718      annotations:
   719        config.kubernetes.io/function: |
   720          exec:
   721            path: ./generateDeployment.sh
   722    spec:
   723  `)
   724  	th.WriteK(prod, `
   725  resources:
   726  - ../base
   727  buildMetadata: [originAnnotations]
   728  `)
   729  	th.WriteF(filepath.Join(base, "short_secret.yaml"),
   730  		`
   731  apiVersion: v1
   732  kind: Secret
   733  metadata:
   734    labels:
   735      airshipit.org/ephemeral-user-data: "true"
   736    name: node1-bmc-secret
   737  type: Opaque
   738  stringData:
   739    userData: |
   740      bootcmd:
   741      - mkdir /mnt/vda
   742  `)
   743  	th.WriteF(filepath.Join(base, "generateDeployment.sh"), generateDeploymentDotSh)
   744  	require.NoError(t, os.Chmod(filepath.Join(base, "generateDeployment.sh"), 0777))
   745  	m := th.Run(prod, o)
   746  	require.NoError(t, err)
   747  	yml, err := m.AsYaml()
   748  	require.NoError(t, err)
   749  	assert.Equal(t, `apiVersion: v1
   750  kind: Secret
   751  metadata:
   752    annotations:
   753      config.kubernetes.io/origin: |
   754        path: ../base/short_secret.yaml
   755    labels:
   756      airshipit.org/ephemeral-user-data: "true"
   757    name: node1-bmc-secret
   758  stringData:
   759    userData: |
   760      bootcmd:
   761      - mkdir /mnt/vda
   762  type: Opaque
   763  ---
   764  apiVersion: apps/v1
   765  kind: Deployment
   766  metadata:
   767    annotations:
   768      config.kubernetes.io/origin: |
   769        configuredIn: ../base/kustomization.yaml
   770        configuredBy:
   771          kind: executable
   772          name: demo
   773      tshirt-size: small
   774    labels:
   775      app: nginx
   776    name: nginx
   777  spec:
   778    selector:
   779      matchLabels:
   780        app: nginx
   781    template:
   782      metadata:
   783        labels:
   784          app: nginx
   785      spec:
   786        containers:
   787        - image: nginx
   788          name: nginx
   789  `, string(yml))
   790  	require.NoError(t, fSys.RemoveAll(tmpDir.String()))
   791  }
   792  
   793  func TestAnnoOriginRemoteBuiltinGenerator(t *testing.T) {
   794  	fSys := filesys.MakeFsOnDisk()
   795  	b := krusty.MakeKustomizer(krusty.MakeDefaultOptions())
   796  	tmpDir, err := filesys.NewTmpConfirmedDir()
   797  	require.NoError(t, err)
   798  	require.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "kustomization.yaml"), []byte(`
   799  resources:
   800  - github.com/kubernetes-sigs/kustomize/examples/ldap/base/?ref=v1.0.6
   801  buildMetadata: [originAnnotations]
   802  `)))
   803  	m, err := b.Run(
   804  		fSys,
   805  		tmpDir.String())
   806  	if utils.IsErrTimeout(err) {
   807  		// Don't fail on timeouts.
   808  		t.SkipNow()
   809  	}
   810  	if !assert.NoError(t, err) {
   811  		t.FailNow()
   812  	}
   813  	yml, err := m.AsYaml()
   814  	require.NoError(t, err)
   815  	assert.Contains(t, string(yml), `kind: ConfigMap
   816  metadata:
   817    annotations:
   818      config.kubernetes.io/origin: |
   819        repo: https://github.com/kubernetes-sigs/kustomize
   820        ref: v1.0.6
   821        configuredIn: examples/ldap/base/kustomization.yaml
   822        configuredBy:
   823          apiVersion: builtin
   824          kind: ConfigMapGenerator
   825    name: ldap-configmap-4d7m6k5b42`)
   826  	require.NoError(t, fSys.RemoveAll(tmpDir.String()))
   827  }
   828  
   829  func TestAnnoOriginInlineBuiltinGenerator(t *testing.T) {
   830  	th := kusttest_test.MakeHarness(t)
   831  	th.WriteK(".", `
   832  resources:
   833  - service.yaml
   834  generators:
   835  - |-
   836    apiVersion: builtin
   837    kind: ConfigMapGenerator
   838    metadata:
   839      name: notImportantHere
   840    name: bob
   841    literals:
   842    - fruit=Indian Gooseberry
   843    - year=2020
   844    - crisis=true
   845  buildMetadata: [originAnnotations]
   846  `)
   847  
   848  	th.WriteF("service.yaml", `
   849  apiVersion: v1
   850  kind: Service
   851  metadata:
   852    name: apple
   853  `)
   854  	m := th.Run(".", th.MakeDefaultOptions())
   855  	th.AssertActualEqualsExpected(m, `
   856  apiVersion: v1
   857  kind: Service
   858  metadata:
   859    annotations:
   860      config.kubernetes.io/origin: |
   861        path: service.yaml
   862    name: apple
   863  ---
   864  apiVersion: v1
   865  data:
   866    crisis: "true"
   867    fruit: Indian Gooseberry
   868    year: "2020"
   869  kind: ConfigMap
   870  metadata:
   871    annotations:
   872      config.kubernetes.io/origin: |
   873        configuredIn: kustomization.yaml
   874        configuredBy:
   875          apiVersion: builtin
   876          kind: ConfigMapGenerator
   877          name: notImportantHere
   878    name: bob-79t79mt227
   879  `)
   880  }
   881  
   882  func TestAnnoOriginGeneratorFromFile(t *testing.T) {
   883  	th := kusttest_test.MakeHarness(t)
   884  	th.WriteK(".", `
   885  resources:
   886  - service.yaml
   887  generators:
   888  - configmap.yaml
   889  buildMetadata: [originAnnotations]
   890  `)
   891  	th.WriteF("configmap.yaml", `
   892  apiVersion: builtin
   893  kind: ConfigMapGenerator
   894  metadata:
   895    name: notImportantHere
   896  name: bob
   897  literals:
   898  - fruit=Indian Gooseberry
   899  - year=2020
   900  - crisis=true
   901  `)
   902  	th.WriteF("service.yaml", `
   903  apiVersion: v1
   904  kind: Service
   905  metadata:
   906    name: apple
   907  `)
   908  	m := th.Run(".", th.MakeDefaultOptions())
   909  	th.AssertActualEqualsExpected(m, `
   910  apiVersion: v1
   911  kind: Service
   912  metadata:
   913    annotations:
   914      config.kubernetes.io/origin: |
   915        path: service.yaml
   916    name: apple
   917  ---
   918  apiVersion: v1
   919  data:
   920    crisis: "true"
   921    fruit: Indian Gooseberry
   922    year: "2020"
   923  kind: ConfigMap
   924  metadata:
   925    annotations:
   926      config.kubernetes.io/origin: |
   927        configuredIn: configmap.yaml
   928        configuredBy:
   929          apiVersion: builtin
   930          kind: ConfigMapGenerator
   931          name: notImportantHere
   932    name: bob-79t79mt227
   933  `)
   934  }
   935  
   936  func TestAnnoOriginBuiltinGeneratorFromFileWithOverlay(t *testing.T) {
   937  	th := kusttest_test.MakeHarness(t)
   938  	th.WriteK("base", `
   939  resources:
   940  - short_secret.yaml
   941  generators:
   942  - configmap.yaml
   943  `)
   944  	th.WriteF("base/configmap.yaml", `apiVersion: builtin
   945  kind: ConfigMapGenerator
   946  metadata:
   947    name: notImportantHere
   948  name: bob
   949  literals:
   950  - fruit=Indian Gooseberry
   951  - year=2020
   952  - crisis=true
   953  `)
   954  	th.WriteK("prod", `
   955  resources:
   956  - ../base
   957  buildMetadata: [originAnnotations]
   958  `)
   959  	th.WriteF("base/short_secret.yaml",
   960  		`
   961  apiVersion: v1
   962  kind: Secret
   963  metadata:
   964    labels:
   965      airshipit.org/ephemeral-user-data: "true"
   966    name: node1-bmc-secret
   967  type: Opaque
   968  stringData:
   969    userData: |
   970      bootcmd:
   971      - mkdir /mnt/vda
   972  `)
   973  	m := th.Run("prod", th.MakeDefaultOptions())
   974  	th.AssertActualEqualsExpected(m, `apiVersion: v1
   975  kind: Secret
   976  metadata:
   977    annotations:
   978      config.kubernetes.io/origin: |
   979        path: ../base/short_secret.yaml
   980    labels:
   981      airshipit.org/ephemeral-user-data: "true"
   982    name: node1-bmc-secret
   983  stringData:
   984    userData: |
   985      bootcmd:
   986      - mkdir /mnt/vda
   987  type: Opaque
   988  ---
   989  apiVersion: v1
   990  data:
   991    crisis: "true"
   992    fruit: Indian Gooseberry
   993    year: "2020"
   994  kind: ConfigMap
   995  metadata:
   996    annotations:
   997      config.kubernetes.io/origin: |
   998        configuredIn: ../base/configmap.yaml
   999        configuredBy:
  1000          apiVersion: builtin
  1001          kind: ConfigMapGenerator
  1002          name: notImportantHere
  1003    name: bob-79t79mt227
  1004  `)
  1005  }
  1006  
  1007  func TestAnnoOriginGeneratorInTransformersField(t *testing.T) {
  1008  	fSys := filesys.MakeFsOnDisk()
  1009  
  1010  	th := kusttest_test.MakeHarnessWithFs(t, fSys)
  1011  	o := th.MakeOptionsPluginsEnabled()
  1012  	o.PluginConfig.FnpLoadingOptions.EnableExec = true
  1013  
  1014  	tmpDir, err := filesys.NewTmpConfirmedDir()
  1015  	require.NoError(t, err)
  1016  	th.WriteK(tmpDir.String(), `
  1017  transformers:
  1018  - gener.yaml
  1019  buildMetadata: [originAnnotations]
  1020  `)
  1021  
  1022  	th.WriteF(filepath.Join(tmpDir.String(), "generateDeployment.sh"), generateDeploymentDotSh)
  1023  
  1024  	require.NoError(t, os.Chmod(filepath.Join(tmpDir.String(), "generateDeployment.sh"), 0777))
  1025  	th.WriteF(filepath.Join(tmpDir.String(), "gener.yaml"), `
  1026  kind: executable
  1027  metadata:
  1028    name: demo
  1029    annotations:
  1030      config.kubernetes.io/function: |
  1031        exec:
  1032          path: ./generateDeployment.sh
  1033  spec:
  1034  `)
  1035  
  1036  	m := th.Run(tmpDir.String(), o)
  1037  	require.NoError(t, err)
  1038  	yml, err := m.AsYaml()
  1039  	require.NoError(t, err)
  1040  	assert.Equal(t, `apiVersion: apps/v1
  1041  kind: Deployment
  1042  metadata:
  1043    annotations:
  1044      config.kubernetes.io/origin: |
  1045        configuredIn: gener.yaml
  1046        configuredBy:
  1047          kind: executable
  1048          name: demo
  1049      tshirt-size: small
  1050    labels:
  1051      app: nginx
  1052    name: nginx
  1053  spec:
  1054    selector:
  1055      matchLabels:
  1056        app: nginx
  1057    template:
  1058      metadata:
  1059        labels:
  1060          app: nginx
  1061      spec:
  1062        containers:
  1063        - image: nginx
  1064          name: nginx
  1065  `, string(yml))
  1066  	require.NoError(t, fSys.RemoveAll(tmpDir.String()))
  1067  }
  1068  
  1069  func TestAnnoOriginGeneratorInTransformersFieldWithOverlay(t *testing.T) {
  1070  	fSys := filesys.MakeFsOnDisk()
  1071  
  1072  	th := kusttest_test.MakeHarnessWithFs(t, fSys)
  1073  	o := th.MakeOptionsPluginsEnabled()
  1074  	o.PluginConfig.FnpLoadingOptions.EnableExec = true
  1075  
  1076  	tmpDir, err := filesys.NewTmpConfirmedDir()
  1077  	require.NoError(t, err)
  1078  	base := filepath.Join(tmpDir.String(), "base")
  1079  	prod := filepath.Join(tmpDir.String(), "prod")
  1080  	require.NoError(t, fSys.Mkdir(base))
  1081  	require.NoError(t, fSys.Mkdir(prod))
  1082  
  1083  	th.WriteK(base, `
  1084  transformers:
  1085  - gener.yaml
  1086  `)
  1087  
  1088  	th.WriteF(filepath.Join(base, "generateDeployment.sh"), generateDeploymentDotSh)
  1089  
  1090  	require.NoError(t, os.Chmod(filepath.Join(base, "generateDeployment.sh"), 0777))
  1091  	th.WriteF(filepath.Join(base, "gener.yaml"), `
  1092  kind: executable
  1093  metadata:
  1094    name: demo
  1095    annotations:
  1096      config.kubernetes.io/function: |
  1097        exec:
  1098          path: ./generateDeployment.sh
  1099  spec:
  1100  `)
  1101  	th.WriteK(prod, `
  1102  resources:
  1103  - ../base
  1104  nameSuffix: -foo
  1105  buildMetadata: [originAnnotations, transformerAnnotations]
  1106  `)
  1107  
  1108  	m := th.Run(prod, o)
  1109  	require.NoError(t, err)
  1110  	yml, err := m.AsYaml()
  1111  	require.NoError(t, err)
  1112  	assert.Equal(t, `apiVersion: apps/v1
  1113  kind: Deployment
  1114  metadata:
  1115    annotations:
  1116      alpha.config.kubernetes.io/transformations: |
  1117        - configuredIn: kustomization.yaml
  1118          configuredBy:
  1119            apiVersion: builtin
  1120            kind: SuffixTransformer
  1121      config.kubernetes.io/origin: |
  1122        configuredIn: ../base/gener.yaml
  1123        configuredBy:
  1124          kind: executable
  1125          name: demo
  1126      tshirt-size: small
  1127    labels:
  1128      app: nginx
  1129    name: nginx-foo
  1130  spec:
  1131    selector:
  1132      matchLabels:
  1133        app: nginx
  1134    template:
  1135      metadata:
  1136        labels:
  1137          app: nginx
  1138      spec:
  1139        containers:
  1140        - image: nginx
  1141          name: nginx
  1142  `, string(yml))
  1143  	require.NoError(t, fSys.RemoveAll(tmpDir.String()))
  1144  }
  1145  

View as plain text