...

Source file src/sigs.k8s.io/kustomize/kyaml/kio/tree_test.go

Documentation: sigs.k8s.io/kustomize/kyaml/kio

     1  // Copyright 2019 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package kio_test
     5  
     6  import (
     7  	"bytes"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  	. "sigs.k8s.io/kustomize/kyaml/kio"
    13  	"sigs.k8s.io/kustomize/kyaml/yaml"
    14  )
    15  
    16  func TestPrinter_Write_Package_Structure(t *testing.T) {
    17  	in := `kind: Deployment
    18  metadata:
    19    labels:
    20      app: nginx3
    21    name: foo
    22    namespace: default
    23    annotations:
    24      app: nginx3
    25      config.kubernetes.io/path: foo-package/3/f3.yaml
    26  spec:
    27    replicas: 1
    28  ---
    29  kind: Deployment
    30  metadata:
    31    labels:
    32      app: nginx2
    33    name: foo
    34    namespace: default
    35    annotations:
    36      app: nginx2
    37      config.kubernetes.io/path: foo-package/f1.yaml
    38  spec:
    39    replicas: 1
    40  ---
    41  kind: Deployment
    42  metadata:
    43    labels:
    44      app: nginx
    45    annotations:
    46      app: nginx
    47      config.kubernetes.io/path: bar-package/f2.yaml
    48    name: bar
    49  spec:
    50    replicas: 3
    51  ---
    52  kind: Service
    53  metadata:
    54    name: foo
    55    namespace: default
    56    annotations:
    57      app: nginx
    58      config.kubernetes.io/path: foo-package/f1.yaml
    59  spec:
    60    selector:
    61      app: nginx
    62  `
    63  	out := &bytes.Buffer{}
    64  	err := Pipeline{
    65  		Inputs:  []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
    66  		Outputs: []Writer{TreeWriter{Writer: out, Structure: TreeStructurePackage}},
    67  	}.Execute()
    68  	if !assert.NoError(t, err) {
    69  		t.FailNow()
    70  	}
    71  
    72  	if !assert.Equal(t, `
    73  ├── bar-package
    74  │   └── [f2.yaml]  Deployment bar
    75  └── foo-package
    76      ├── [f1.yaml]  Deployment default/foo
    77      ├── [f1.yaml]  Service default/foo
    78      └── 3
    79          └── [f3.yaml]  Deployment default/foo
    80  `, out.String()) {
    81  		t.FailNow()
    82  	}
    83  }
    84  
    85  func TestPrinter_Write_Package_Structure_base(t *testing.T) {
    86  	in := `kind: Deployment
    87  metadata:
    88    labels:
    89      app: nginx3
    90    name: foo
    91    namespace: default
    92    annotations:
    93      app: nginx3
    94      config.kubernetes.io/path: f3.yaml
    95  spec:
    96    replicas: 1
    97  ---
    98  kind: Deployment
    99  metadata:
   100    labels:
   101      app: nginx2
   102    name: foo
   103    namespace: default
   104    annotations:
   105      app: nginx2
   106      config.kubernetes.io/path: foo-package/f1.yaml
   107  spec:
   108    replicas: 1
   109  ---
   110  kind: Deployment
   111  metadata:
   112    labels:
   113      app: nginx
   114    annotations:
   115      app: nginx
   116      config.kubernetes.io/package: 
   117      config.kubernetes.io/path: bar-package/f2.yaml
   118    name: bar
   119  spec:
   120    replicas: 3
   121  ---
   122  kind: Service
   123  metadata:
   124    name: foo
   125    namespace: default
   126    annotations:
   127      app: nginx
   128      config.kubernetes.io/package: .
   129      config.kubernetes.io/path: f1.yaml
   130  spec:
   131    selector:
   132      app: nginx
   133  `
   134  	out := &bytes.Buffer{}
   135  	err := Pipeline{
   136  		Inputs:  []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
   137  		Outputs: []Writer{TreeWriter{Writer: out, Structure: TreeStructurePackage}},
   138  	}.Execute()
   139  	if !assert.NoError(t, err) {
   140  		t.FailNow()
   141  	}
   142  
   143  	if !assert.Equal(t, `
   144  ├── [f1.yaml]  Service default/foo
   145  ├── [f3.yaml]  Deployment default/foo
   146  ├── bar-package
   147  │   └── [f2.yaml]  Deployment bar
   148  └── foo-package
   149      └── [f1.yaml]  Deployment default/foo
   150  `, out.String()) {
   151  		t.FailNow()
   152  	}
   153  }
   154  
   155  func TestPrinter_Write_Package_Structure_sort(t *testing.T) {
   156  	in := `apiVersion: extensions/v1
   157  kind: Deployment
   158  metadata:
   159    labels:
   160      app: nginx2
   161    name: foo3
   162    namespace: default
   163    annotations:
   164      app: nginx2
   165      config.kubernetes.io/path: f1.yaml
   166  spec:
   167    replicas: 1
   168  ---
   169  apiVersion: extensions/v1
   170  kind: Deployment
   171  metadata:
   172    labels:
   173      app: nginx2
   174    name: foo3
   175    namespace: default
   176    annotations:
   177      app: nginx2
   178      config.kubernetes.io/path: f1.yaml
   179  spec:
   180    replicas: 1
   181  ---
   182  apiVersion: apps/v1
   183  kind: Deployment
   184  metadata:
   185    labels:
   186      app: nginx2
   187    name: foo3
   188    namespace: default
   189    annotations:
   190      app: nginx2
   191      config.kubernetes.io/path: f1.yaml
   192  spec:
   193    replicas: 1
   194  ---
   195  apiVersion: apps/v1
   196  kind: Deployment
   197  metadata:
   198    labels:
   199      app: nginx2
   200    name: foo2
   201    namespace: default2
   202    annotations:
   203      app: nginx2
   204      config.kubernetes.io/path: f1.yaml
   205  spec:
   206    replicas: 1
   207  ---
   208  apiVersion: apps/v1
   209  kind: Deployment
   210  metadata:
   211    labels:
   212      app: nginx3
   213    name: foo
   214    namespace: default
   215    annotations:
   216      app: nginx3
   217      config.kubernetes.io/path: f1.yaml
   218  spec:
   219    replicas: 1
   220  ---
   221  kind: Deployment
   222  metadata:
   223    labels:
   224      app: nginx
   225    annotations:
   226      app: nginx
   227      config.kubernetes.io/path: bar-package/f2.yaml
   228    name: bar
   229  spec:
   230    replicas: 3
   231  ---
   232  kind: Service
   233  metadata:
   234    name: foo
   235    namespace: default
   236    annotations:
   237      app: nginx
   238      config.kubernetes.io/path: f1.yaml
   239  spec:
   240    selector:
   241      app: nginx
   242  `
   243  	out := &bytes.Buffer{}
   244  	err := Pipeline{
   245  		Inputs:  []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
   246  		Outputs: []Writer{TreeWriter{Writer: out, Structure: TreeStructurePackage}},
   247  	}.Execute()
   248  	if !assert.NoError(t, err) {
   249  		t.FailNow()
   250  	}
   251  
   252  	if !assert.Equal(t, `
   253  ├── [f1.yaml]  Deployment default/foo
   254  ├── [f1.yaml]  Service default/foo
   255  ├── [f1.yaml]  Deployment default/foo3
   256  ├── [f1.yaml]  Deployment default/foo3
   257  ├── [f1.yaml]  Deployment default/foo3
   258  ├── [f1.yaml]  Deployment default2/foo2
   259  └── bar-package
   260      └── [f2.yaml]  Deployment bar
   261  `, out.String()) {
   262  		t.FailNow()
   263  	}
   264  }
   265  
   266  func TestPrinter_metaError(t *testing.T) {
   267  	out := &bytes.Buffer{}
   268  	err := TreeWriter{Writer: out}.Write([]*yaml.RNode{{}})
   269  	if !assert.NoError(t, err) {
   270  		t.FailNow()
   271  	}
   272  	if !assert.Equal(t, `
   273  `, out.String()) {
   274  		t.FailNow()
   275  	}
   276  }
   277  
   278  func TestPrinter_Write_Graph_Structure(t *testing.T) {
   279  	in := `
   280  apiVersion: v1
   281  kind: Pod
   282  metadata:
   283    name: cockroachdb-0
   284    namespace: myapp-staging
   285    ownerReferences:
   286    - apiVersion: apps/v1
   287      kind: StatefulSet
   288      name: cockroachdb
   289  spec:
   290    containers:
   291    - name: cockroachdb
   292      image: cockraochdb:1.1.1
   293  ---
   294  apiVersion: v1
   295  kind: Pod
   296  metadata:
   297    name: cockroachdb-1
   298    namespace: myapp-staging
   299    ownerReferences:
   300    - apiVersion: apps/v1
   301      kind: StatefulSet
   302      name: cockroachdb
   303  spec:
   304    containers:
   305    - name: cockroachdb
   306      image: cockraochdb:1.1.1
   307  ---
   308  apiVersion: v1
   309  kind: Pod
   310  metadata:
   311    name: cockroachdb-2
   312    namespace: myapp-staging
   313    ownerReferences:
   314    - apiVersion: apps/v1
   315      kind: StatefulSet
   316      name: cockroachdb
   317  spec:
   318    containers:
   319    - name: cockroachdb
   320      image: cockraochdb:1.1.0
   321  ---
   322  apiVersion: apps/v1
   323  kind: StatefulSet
   324  metadata:
   325    name: cockroachdb
   326    namespace: myapp-staging
   327    ownerReferences:
   328    - apiVersion: app.k8s.io/v1beta1
   329      kind: Application
   330      name: myapp
   331  spec:
   332    replicas: 3
   333    containers:
   334    - name: cockroachdb
   335      image: cockraochdb:1.1.1
   336  ---
   337  apiVersion: v1
   338  kind: Service
   339  metadata:
   340    name: cockroachdb
   341    namespace: myapp-staging
   342    ownerReferences:
   343    - apiVersion: app.k8s.io/v1beta1
   344      kind: Application
   345      name: myapp
   346  ---
   347  apiVersion: app.k8s.io/v1beta1
   348  kind: Application
   349  metadata:
   350    labels:
   351      app.kubernetes.io/name: myapp
   352    name: myapp
   353    namespace: myapp-staging
   354  `
   355  	out := &bytes.Buffer{}
   356  	err := Pipeline{
   357  		Inputs:  []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
   358  		Outputs: []Writer{TreeWriter{Writer: out, Structure: TreeStructureGraph}},
   359  	}.Execute()
   360  	if !assert.NoError(t, err) {
   361  		t.FailNow()
   362  	}
   363  
   364  	if !assert.Equal(t, `.
   365  └── [Resource]  Application myapp-staging/myapp
   366      ├── [Resource]  Service myapp-staging/cockroachdb
   367      └── [Resource]  StatefulSet myapp-staging/cockroachdb
   368          ├── [Resource]  Pod myapp-staging/cockroachdb-0
   369          ├── [Resource]  Pod myapp-staging/cockroachdb-1
   370          └── [Resource]  Pod myapp-staging/cockroachdb-2
   371  `, out.String()) {
   372  		t.FailNow()
   373  	}
   374  }
   375  
   376  func TestPrinter_Write_Structure_Defaulting_when_ownerRefs_present(t *testing.T) {
   377  	in := `
   378  apiVersion: v1
   379  kind: Pod
   380  metadata:
   381    name: cockroachdb-0
   382    namespace: myapp-staging
   383    ownerReferences:
   384    - apiVersion: apps/v1
   385      kind: StatefulSet
   386      name: cockroachdb
   387  spec:
   388    containers:
   389    - name: cockroachdb
   390      image: cockraochdb:1.1.1
   391  ---
   392  apiVersion: v1
   393  kind: Pod
   394  metadata:
   395    name: cockroachdb-1
   396    namespace: myapp-staging
   397    ownerReferences:
   398    - apiVersion: apps/v1
   399      kind: StatefulSet
   400      name: cockroachdb
   401  spec:
   402    containers:
   403    - name: cockroachdb
   404      image: cockraochdb:1.1.1
   405  ---
   406  apiVersion: v1
   407  kind: Pod
   408  metadata:
   409    name: cockroachdb-2
   410    namespace: myapp-staging
   411    ownerReferences:
   412    - apiVersion: apps/v1
   413      kind: StatefulSet
   414      name: cockroachdb
   415  spec:
   416    containers:
   417    - name: cockroachdb
   418      image: cockraochdb:1.1.0
   419  ---
   420  apiVersion: apps/v1
   421  kind: StatefulSet
   422  metadata:
   423    name: cockroachdb
   424    namespace: myapp-staging
   425    ownerReferences:
   426    - apiVersion: app.k8s.io/v1beta1
   427      kind: Application
   428      name: myapp
   429  spec:
   430    replicas: 3
   431    containers:
   432    - name: cockroachdb
   433      image: cockraochdb:1.1.1
   434  ---
   435  apiVersion: v1
   436  kind: Service
   437  metadata:
   438    name: cockroachdb
   439    namespace: myapp-staging
   440    ownerReferences:
   441    - apiVersion: app.k8s.io/v1beta1
   442      kind: Application
   443      name: myapp
   444  ---
   445  apiVersion: app.k8s.io/v1beta1
   446  kind: Application
   447  metadata:
   448    labels:
   449      app.kubernetes.io/name: myapp
   450    name: myapp
   451    namespace: myapp-staging
   452  `
   453  	out := &bytes.Buffer{}
   454  	err := Pipeline{
   455  		Inputs:  []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
   456  		Outputs: []Writer{TreeWriter{Writer: out}}, // Structure unspecified
   457  	}.Execute()
   458  	if !assert.NoError(t, err) {
   459  		t.FailNow()
   460  	}
   461  
   462  	if !assert.Equal(t, `.
   463  └── [Resource]  Application myapp-staging/myapp
   464      ├── [Resource]  Service myapp-staging/cockroachdb
   465      └── [Resource]  StatefulSet myapp-staging/cockroachdb
   466          ├── [Resource]  Pod myapp-staging/cockroachdb-0
   467          ├── [Resource]  Pod myapp-staging/cockroachdb-1
   468          └── [Resource]  Pod myapp-staging/cockroachdb-2
   469  `, out.String()) {
   470  		t.FailNow()
   471  	}
   472  }
   473  
   474  func TestPrinter_Write_Structure_Defaulting_when_ownerRefs_absent(t *testing.T) {
   475  	in := `
   476  apiVersion: v1
   477  kind: Pod
   478  metadata:
   479    name: cockroachdb-0
   480    namespace: myapp-staging
   481  spec:
   482    containers:
   483    - name: cockroachdb
   484      image: cockraochdb:1.1.1
   485  ---
   486  apiVersion: v1
   487  kind: Pod
   488  metadata:
   489    name: cockroachdb-1
   490    namespace: myapp-staging
   491  spec:
   492    containers:
   493    - name: cockroachdb
   494      image: cockraochdb:1.1.1
   495  ---
   496  apiVersion: v1
   497  kind: Pod
   498  metadata:
   499    name: cockroachdb-2
   500    namespace: myapp-staging
   501  spec:
   502    containers:
   503    - name: cockroachdb
   504      image: cockraochdb:1.1.0
   505  ---
   506  apiVersion: apps/v1
   507  kind: StatefulSet
   508  metadata:
   509    name: cockroachdb
   510    namespace: myapp-staging
   511  spec:
   512    replicas: 3
   513    containers:
   514    - name: cockroachdb
   515      image: cockraochdb:1.1.1
   516  ---
   517  apiVersion: v1
   518  kind: Service
   519  metadata:
   520    name: cockroachdb
   521    namespace: myapp-staging
   522  ---
   523  apiVersion: app.k8s.io/v1beta1
   524  kind: Application
   525  metadata:
   526    labels:
   527      app.kubernetes.io/name: myapp
   528    name: myapp
   529    namespace: myapp-staging
   530  `
   531  	out := &bytes.Buffer{}
   532  	err := Pipeline{
   533  		Inputs:  []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
   534  		Outputs: []Writer{TreeWriter{Writer: out}}, // Structure unspecified
   535  	}.Execute()
   536  	if !assert.NoError(t, err) {
   537  		t.FailNow()
   538  	}
   539  
   540  	if !assert.Equal(t, `
   541  ├── [.]  Service myapp-staging/cockroachdb
   542  ├── [.]  StatefulSet myapp-staging/cockroachdb
   543  ├── [.]  Pod myapp-staging/cockroachdb-0
   544  ├── [.]  Pod myapp-staging/cockroachdb-1
   545  ├── [.]  Pod myapp-staging/cockroachdb-2
   546  └── [.]  Application myapp-staging/myapp
   547  `, out.String()) {
   548  		t.FailNow()
   549  	}
   550  }
   551  
   552  func TestPrinter_Write_error_when_owner_missing(t *testing.T) {
   553  	in := `
   554  ---
   555  apiVersion: v1
   556  kind: Service
   557  metadata:
   558    name: cockroachdb
   559    namespace: myapp-staging
   560    ownerReferences:
   561    - apiVersion: app.k8s.io/v1beta1
   562      kind: Application
   563      name: nginx
   564  ---
   565  apiVersion: app.k8s.io/v1beta1
   566  kind: Application
   567  metadata:
   568    labels:
   569      app.kubernetes.io/name: myapp
   570    name: myapp
   571    namespace: myapp-staging
   572  `
   573  	out := &bytes.Buffer{}
   574  	err := Pipeline{
   575  		Inputs:  []Reader{&ByteReader{Reader: bytes.NewBufferString(in)}},
   576  		Outputs: []Writer{TreeWriter{Writer: out}},
   577  	}.Execute()
   578  	require.Error(t, err)
   579  	assert.Equal(t, "owner 'Application myapp-staging/nginx' not found in input, but found as an owner of input objects", err.Error())
   580  }
   581  

View as plain text