...

Source file src/sigs.k8s.io/kustomize/api/filters/namespace/namespace_test.go

Documentation: sigs.k8s.io/kustomize/api/filters/namespace

     1  // Copyright 2019 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package namespace_test
     5  
     6  import (
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"sigs.k8s.io/kustomize/api/filters/namespace"
    12  	"sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig"
    13  	filtertest_test "sigs.k8s.io/kustomize/api/testutils/filtertest"
    14  	"sigs.k8s.io/kustomize/api/types"
    15  	"sigs.k8s.io/kustomize/kyaml/yaml"
    16  )
    17  
    18  var mutationTrackerStub = filtertest_test.MutationTrackerStub{}
    19  
    20  var tests = []TestCase{
    21  	{
    22  		name: "add",
    23  		input: `
    24  apiVersion: example.com/v1
    25  kind: Foo
    26  metadata:
    27    name: instance
    28  ---
    29  apiVersion: example.com/v1
    30  kind: Bar
    31  metadata:
    32    name: instance
    33  `,
    34  		expected: `
    35  apiVersion: example.com/v1
    36  kind: Foo
    37  metadata:
    38    name: instance
    39    namespace: foo
    40  ---
    41  apiVersion: example.com/v1
    42  kind: Bar
    43  metadata:
    44    name: instance
    45    namespace: foo
    46  `,
    47  		filter: namespace.Filter{Namespace: "foo"},
    48  	},
    49  
    50  	{
    51  		name: "null_ns",
    52  		input: `
    53  apiVersion: example.com/v1
    54  kind: Foo
    55  metadata:
    56    name: instance
    57    namespace: null
    58  ---
    59  apiVersion: example.com/v1
    60  kind: Bar
    61  metadata:
    62    name: instance
    63    namespace: null
    64  `,
    65  		expected: `
    66  apiVersion: example.com/v1
    67  kind: Foo
    68  metadata:
    69    name: instance
    70    namespace: foo
    71  ---
    72  apiVersion: example.com/v1
    73  kind: Bar
    74  metadata:
    75    name: instance
    76    namespace: foo
    77  `,
    78  		filter: namespace.Filter{Namespace: "foo"},
    79  	},
    80  
    81  	{
    82  		name: "add-recurse",
    83  		input: `
    84  apiVersion: example.com/v1
    85  kind: Foo
    86  ---
    87  apiVersion: example.com/v1
    88  kind: Bar
    89  `,
    90  		expected: `
    91  apiVersion: example.com/v1
    92  kind: Foo
    93  metadata:
    94    namespace: foo
    95  ---
    96  apiVersion: example.com/v1
    97  kind: Bar
    98  metadata:
    99    namespace: foo
   100  `,
   101  		filter: namespace.Filter{Namespace: "foo"},
   102  	},
   103  
   104  	{
   105  		name: "update",
   106  		input: `
   107  apiVersion: example.com/v1
   108  kind: Foo
   109  metadata:
   110    name: instance
   111    # update this namespace
   112    namespace: bar
   113  ---
   114  apiVersion: example.com/v1
   115  kind: Bar
   116  metadata:
   117    name: instance
   118    namespace: bar
   119  `,
   120  		expected: `
   121  apiVersion: example.com/v1
   122  kind: Foo
   123  metadata:
   124    name: instance
   125    # update this namespace
   126    namespace: foo
   127  ---
   128  apiVersion: example.com/v1
   129  kind: Bar
   130  metadata:
   131    name: instance
   132    namespace: foo
   133  `,
   134  		filter: namespace.Filter{Namespace: "foo"},
   135  	},
   136  
   137  	{
   138  		name: "update-rolebinding",
   139  		input: `
   140  apiVersion: example.com/v1
   141  kind: RoleBinding
   142  subjects:
   143  - name: default
   144  ---
   145  apiVersion: example.com/v1
   146  kind: RoleBinding
   147  subjects:
   148  - name: default
   149    namespace: foo
   150  ---
   151  apiVersion: example.com/v1
   152  kind: RoleBinding
   153  subjects:
   154  - name: something
   155  ---
   156  apiVersion: example.com/v1
   157  kind: RoleBinding
   158  subjects:
   159  - name: something
   160    namespace: foo
   161  `,
   162  		expected: `
   163  apiVersion: example.com/v1
   164  kind: RoleBinding
   165  subjects:
   166  - name: default
   167    namespace: bar
   168  metadata:
   169    namespace: bar
   170  ---
   171  apiVersion: example.com/v1
   172  kind: RoleBinding
   173  subjects:
   174  - name: default
   175    namespace: bar
   176  metadata:
   177    namespace: bar
   178  ---
   179  apiVersion: example.com/v1
   180  kind: RoleBinding
   181  subjects:
   182  - name: something
   183  metadata:
   184    namespace: bar
   185  ---
   186  apiVersion: example.com/v1
   187  kind: RoleBinding
   188  subjects:
   189  - name: something
   190    namespace: foo
   191  metadata:
   192    namespace: bar
   193  `,
   194  		filter: namespace.Filter{Namespace: "bar"},
   195  	},
   196  
   197  	{
   198  		name: "update-clusterrolebinding",
   199  		input: `
   200  apiVersion: rbac.authorization.k8s.io/v1
   201  kind: ClusterRoleBinding
   202  subjects:
   203  - name: default
   204  ---
   205  apiVersion: rbac.authorization.k8s.io/v1
   206  kind: ClusterRoleBinding
   207  subjects:
   208  - name: default
   209    namespace: foo
   210  ---
   211  apiVersion: rbac.authorization.k8s.io/v1
   212  kind: ClusterRoleBinding
   213  subjects:
   214  - name: something
   215  ---
   216  apiVersion: rbac.authorization.k8s.io/v1
   217  kind: ClusterRoleBinding
   218  subjects:
   219  - name: something
   220    namespace: foo
   221  `,
   222  		expected: `
   223  apiVersion: rbac.authorization.k8s.io/v1
   224  kind: ClusterRoleBinding
   225  subjects:
   226  - name: default
   227    namespace: bar
   228  ---
   229  apiVersion: rbac.authorization.k8s.io/v1
   230  kind: ClusterRoleBinding
   231  subjects:
   232  - name: default
   233    namespace: bar
   234  ---
   235  apiVersion: rbac.authorization.k8s.io/v1
   236  kind: ClusterRoleBinding
   237  subjects:
   238  - name: something
   239  ---
   240  apiVersion: rbac.authorization.k8s.io/v1
   241  kind: ClusterRoleBinding
   242  subjects:
   243  - name: something
   244    namespace: foo
   245  `,
   246  		filter: namespace.Filter{Namespace: "bar"},
   247  	},
   248  
   249  	{
   250  		name: "data-fieldspecs",
   251  		input: `
   252  apiVersion: example.com/v1
   253  kind: Foo
   254  metadata:
   255    name: instance
   256  ---
   257  apiVersion: example.com/v1
   258  kind: Bar
   259  metadata:
   260    name: instance
   261  `,
   262  		expected: `
   263  apiVersion: example.com/v1
   264  kind: Foo
   265  metadata:
   266    name: instance
   267    namespace: foo
   268  a:
   269    b:
   270      c: foo
   271  ---
   272  apiVersion: example.com/v1
   273  kind: Bar
   274  metadata:
   275    name: instance
   276    namespace: foo
   277  a:
   278    b:
   279      c: foo
   280  `,
   281  		filter: namespace.Filter{Namespace: "foo"},
   282  		fsslice: []types.FieldSpec{
   283  			{
   284  				Path:               "a/b/c",
   285  				CreateIfNotPresent: true,
   286  			},
   287  		},
   288  	},
   289  
   290  	{
   291  		name: "mutation tracker",
   292  		input: `
   293  apiVersion: example.com/v1
   294  kind: Foo
   295  metadata:
   296    name: instance
   297  ---
   298  apiVersion: example.com/v1
   299  kind: RoleBinding
   300  subjects:
   301  - name: default
   302  `,
   303  		expected: `
   304  apiVersion: example.com/v1
   305  kind: Foo
   306  metadata:
   307    name: instance
   308    namespace: bar
   309  a:
   310    b:
   311      c: bar
   312  ---
   313  apiVersion: example.com/v1
   314  kind: RoleBinding
   315  subjects:
   316  - name: default
   317    namespace: bar
   318  metadata:
   319    namespace: bar
   320  a:
   321    b:
   322      c: bar
   323  `,
   324  		filter: namespace.Filter{Namespace: "bar"},
   325  		fsslice: []types.FieldSpec{
   326  			{
   327  				Path:               "a/b/c",
   328  				CreateIfNotPresent: true,
   329  			},
   330  		},
   331  		mutationTracker: mutationTrackerStub.MutationTracker,
   332  		expectedSetValueArgs: []filtertest_test.SetValueArg{
   333  			{
   334  				Value:    "bar",
   335  				Tag:      "!!str",
   336  				NodePath: []string{"metadata", "namespace"},
   337  			},
   338  			{
   339  				Value:    "bar",
   340  				Tag:      "!!str",
   341  				NodePath: []string{"a", "b", "c"},
   342  			},
   343  			{
   344  				Value:    "bar",
   345  				Tag:      "!!str",
   346  				NodePath: []string{"metadata", "namespace"},
   347  			},
   348  			{
   349  				Value:    "bar",
   350  				Tag:      "!!str",
   351  				NodePath: []string{"namespace"},
   352  			},
   353  			{
   354  				Value:    "bar",
   355  				Tag:      "!!str",
   356  				NodePath: []string{"a", "b", "c"},
   357  			},
   358  		},
   359  	},
   360  
   361  	{
   362  		name: "numeric",
   363  		input: `
   364  apiVersion: example.com/v1
   365  kind: Foo
   366  metadata:
   367    name: instance
   368  ---
   369  apiVersion: example.com/v1
   370  kind: Bar
   371  metadata:
   372    name: instance
   373  `,
   374  		expected: `
   375  apiVersion: example.com/v1
   376  kind: Foo
   377  metadata:
   378    name: instance
   379    namespace: "01234"
   380  ---
   381  apiVersion: example.com/v1
   382  kind: Bar
   383  metadata:
   384    name: instance
   385    namespace: "01234"
   386  `,
   387  		filter: namespace.Filter{Namespace: "01234"},
   388  	},
   389  }
   390  
   391  type TestCase struct {
   392  	name                 string
   393  	input                string
   394  	expected             string
   395  	filter               namespace.Filter
   396  	fsslice              types.FsSlice
   397  	mutationTracker      func(key, value, tag string, node *yaml.RNode)
   398  	expectedSetValueArgs []filtertest_test.SetValueArg
   399  }
   400  
   401  var config = builtinconfig.MakeDefaultConfig()
   402  
   403  func TestNamespace_Filter(t *testing.T) {
   404  	for i := range tests {
   405  		mutationTrackerStub.Reset()
   406  		test := tests[i]
   407  		test.filter.WithMutationTracker(test.mutationTracker)
   408  		t.Run(test.name, func(t *testing.T) {
   409  			test.filter.FsSlice = append(config.NameSpace, test.fsslice...) //nolint:gocritic
   410  			if !assert.Equal(t,
   411  				strings.TrimSpace(test.expected),
   412  				strings.TrimSpace(
   413  					filtertest_test.RunFilter(t, test.input, test.filter))) {
   414  				t.FailNow()
   415  			}
   416  			assert.Equal(t, test.expectedSetValueArgs, mutationTrackerStub.SetValueArgs())
   417  		})
   418  	}
   419  }
   420  

View as plain text