...

Source file src/sigs.k8s.io/kustomize/api/krusty/sortordertransformer_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  	"github.com/stretchr/testify/require"
    10  	"sigs.k8s.io/kustomize/api/krusty"
    11  	kusttest_test "sigs.k8s.io/kustomize/api/testutils/kusttest"
    12  )
    13  
    14  //nolint:gochecknoglobals
    15  var sortOrderResources = `
    16  apiVersion: v1
    17  kind: Service
    18  metadata:
    19    name: papaya
    20  ---
    21  apiVersion: v1
    22  kind: Role
    23  metadata:
    24    name: banana
    25  ---
    26  apiVersion: v1
    27  kind: ValidatingWebhookConfiguration
    28  metadata:
    29    name: pomegranate
    30  ---
    31  apiVersion: v1
    32  kind: LimitRange
    33  metadata:
    34    name: peach
    35  ---
    36  apiVersion: v1
    37  kind: Deployment
    38  metadata:
    39    name: pear
    40  ---
    41  apiVersion: v1
    42  kind: Namespace
    43  metadata:
    44    name: apple
    45  ---
    46  apiVersion: v1
    47  kind: Secret
    48  metadata:
    49    name: quince
    50  ---
    51  apiVersion: v1
    52  kind: Ingress
    53  metadata:
    54    name: durian
    55  ---
    56  apiVersion: v1
    57  kind: ConfigMap
    58  metadata:
    59    name: apricot
    60  `
    61  
    62  //nolint:gochecknoglobals
    63  var legacyOrderResources = `
    64  apiVersion: v1
    65  kind: Namespace
    66  metadata:
    67    name: apple
    68  ---
    69  apiVersion: v1
    70  kind: Role
    71  metadata:
    72    name: banana
    73  ---
    74  apiVersion: v1
    75  kind: ConfigMap
    76  metadata:
    77    name: apricot
    78  ---
    79  apiVersion: v1
    80  kind: Secret
    81  metadata:
    82    name: quince
    83  ---
    84  apiVersion: v1
    85  kind: Service
    86  metadata:
    87    name: papaya
    88  ---
    89  apiVersion: v1
    90  kind: LimitRange
    91  metadata:
    92    name: peach
    93  ---
    94  apiVersion: v1
    95  kind: Deployment
    96  metadata:
    97    name: pear
    98  ---
    99  apiVersion: v1
   100  kind: Ingress
   101  metadata:
   102    name: durian
   103  ---
   104  apiVersion: v1
   105  kind: ValidatingWebhookConfiguration
   106  metadata:
   107    name: pomegranate
   108  `
   109  
   110  func TestCustomOrdering(t *testing.T) {
   111  	th := kusttest_test.MakeHarness(t)
   112  	th.WriteK("base", `
   113  resources:
   114  - resources.yaml
   115  
   116  sortOptions:
   117    order: legacy
   118    legacySortOptions:
   119      orderFirst:
   120      - MutatingWebhookConfiguration
   121      - ValidatingWebhookConfiguration
   122      - ResourceQuota
   123      - StorageClass
   124      - CustomResourceDefinition
   125      - ServiceAccount
   126      - PodSecurityPolicy
   127      - Role
   128      - ClusterRole
   129      - RoleBinding
   130      - ClusterRoleBinding
   131      - ConfigMap
   132      - Secret
   133      - Endpoints
   134      - Service
   135      - LimitRange
   136      - PriorityClass
   137      - PersistentVolume
   138      - PersistentVolumeClaim
   139      - StatefulSet
   140      - CronJob
   141      - PodDisruptionBudget
   142      orderLast:
   143      - Namespace
   144      - Deployment
   145  `)
   146  	th.WriteF("base/resources.yaml", sortOrderResources)
   147  
   148  	th.AssertActualEqualsExpected(
   149  		th.Run("base", th.MakeDefaultOptions()),
   150  		`
   151  apiVersion: v1
   152  kind: ValidatingWebhookConfiguration
   153  metadata:
   154    name: pomegranate
   155  ---
   156  apiVersion: v1
   157  kind: Role
   158  metadata:
   159    name: banana
   160  ---
   161  apiVersion: v1
   162  kind: ConfigMap
   163  metadata:
   164    name: apricot
   165  ---
   166  apiVersion: v1
   167  kind: Secret
   168  metadata:
   169    name: quince
   170  ---
   171  apiVersion: v1
   172  kind: Service
   173  metadata:
   174    name: papaya
   175  ---
   176  apiVersion: v1
   177  kind: LimitRange
   178  metadata:
   179    name: peach
   180  ---
   181  apiVersion: v1
   182  kind: Ingress
   183  metadata:
   184    name: durian
   185  ---
   186  apiVersion: v1
   187  kind: Namespace
   188  metadata:
   189    name: apple
   190  ---
   191  apiVersion: v1
   192  kind: Deployment
   193  metadata:
   194    name: pear
   195  `)
   196  }
   197  
   198  func TestDefaultLegacyOrdering(t *testing.T) {
   199  	th := kusttest_test.MakeHarness(t)
   200  	th.WriteK("base", `
   201  resources:
   202  - resources.yaml
   203  
   204  sortOptions:
   205    order: legacy
   206  `)
   207  	th.WriteF("base/resources.yaml", sortOrderResources)
   208  	th.AssertActualEqualsExpected(
   209  		th.Run("base", th.MakeDefaultOptions()), legacyOrderResources)
   210  }
   211  
   212  func TestFIFOOrdering(t *testing.T) {
   213  	th := kusttest_test.MakeHarness(t)
   214  	th.WriteK("base", `
   215  resources:
   216  - resources.yaml
   217  
   218  sortOptions:
   219    order: fifo
   220  `)
   221  	th.WriteF("base/resources.yaml", sortOrderResources)
   222  	th.AssertActualEqualsExpected(
   223  		th.Run("base", th.MakeDefaultOptions()), sortOrderResources)
   224  }
   225  
   226  func TestInvalidLegacySortOptionsWithoutOrderKey(t *testing.T) {
   227  	th := kusttest_test.MakeHarness(t)
   228  	th.WriteK("base", `
   229  resources:
   230  - resources.yaml
   231  
   232  sortOptions:
   233    legacySortOptions: {}
   234  `)
   235  	th.WriteF("base/resources.yaml", sortOrderResources)
   236  	err := th.RunWithErr("base", th.MakeDefaultOptions())
   237  	require.ErrorContains(t, err, "the field 'sortOptions.order' must be one of [fifo, legacy]")
   238  }
   239  
   240  func TestInvalidLegacySortOptionsWithFIFOOrder(t *testing.T) {
   241  	th := kusttest_test.MakeHarness(t)
   242  	th.WriteK("base", `
   243  resources:
   244  - resources.yaml
   245  
   246  sortOptions:
   247    order: fifo
   248    legacySortOptions: {}
   249  `)
   250  	th.WriteF("base/resources.yaml", sortOrderResources)
   251  	err := th.RunWithErr("base", th.MakeDefaultOptions())
   252  	require.ErrorContains(t, err, "the field 'sortOptions.legacySortOptions' is set but the selected sort order is 'fifo', not 'legacy'")
   253  }
   254  
   255  // If the sort order is defined both in a CLI flag and the kustomization file,
   256  // the kustomization file takes precedence.
   257  func TestCLIAndKustomizationSet(t *testing.T) {
   258  	th := kusttest_test.MakeHarness(t)
   259  	th.WriteK("base", `
   260  resources:
   261  - resources.yaml
   262  
   263  sortOptions:
   264    order: fifo
   265  `)
   266  	th.WriteF("base/resources.yaml", sortOrderResources)
   267  	kustOptions := th.MakeDefaultOptions()
   268  	kustOptions.Reorder = krusty.ReorderOptionLegacy
   269  	th.AssertActualEqualsExpected(th.Run("base", kustOptions), sortOrderResources)
   270  }
   271  
   272  // If no sort order is set in the kustomization file, validate that we fallback
   273  // to the default legacy sort ordering.
   274  func TestKustomizationSortOrderNotSet(t *testing.T) {
   275  	th := kusttest_test.MakeHarness(t)
   276  	th.WriteK("base", `
   277  resources:
   278  - resources.yaml
   279  `)
   280  	th.WriteF("base/resources.yaml", sortOrderResources)
   281  	kustOptions := th.MakeDefaultOptions()
   282  	kustOptions.Reorder = krusty.ReorderOptionUnspecified
   283  	th.AssertActualEqualsExpected(th.Run("base", kustOptions), legacyOrderResources)
   284  }
   285  
   286  func TestChildKustomizationSortOrder(t *testing.T) {
   287  	th := kusttest_test.MakeHarness(t)
   288  	th.WriteK("base", `
   289  resources:
   290  - resources.yaml
   291  
   292  sortOptions:
   293    order: legacy
   294  `)
   295  	th.WriteF("base/resources.yaml", sortOrderResources)
   296  	th.WriteK("overlay", `
   297  resources:
   298  - ../base
   299  
   300  sortOptions:
   301    order: fifo
   302  `)
   303  
   304  	kustOptions := th.MakeDefaultOptions()
   305  	// If child kustomization ordering takes effect, the order will be legacy,
   306  	// otherwise fifo.
   307  	th.AssertActualEqualsExpected(th.Run("overlay", kustOptions), sortOrderResources)
   308  }
   309  
   310  func TestSortOrderGivenAsTransformer(t *testing.T) {
   311  	th := kusttest_test.MakeHarness(t)
   312  	th.WriteK("base", `
   313  resources:
   314  - resources.yaml
   315  
   316  transformers:
   317  - sort_order.yaml
   318  `)
   319  	th.WriteF("base/resources.yaml", sortOrderResources)
   320  	th.WriteF("base/sort_order.yaml", `
   321  apiVersion: builtin
   322  kind: SortOrderTransformer
   323  metadata:
   324    name: notImportantHere
   325  sortOptions:
   326    order: fifo`)
   327  
   328  	kustOptions := th.MakeDefaultOptions()
   329  	err := th.RunWithErr("base", kustOptions)
   330  	require.ErrorContains(t, err, "unable to load builtin SortOrderTransformer.builtin.[noGrp]")
   331  }
   332  

View as plain text