From 1d9e95c8934d2ed92ffc7945804692612eb043ec Mon Sep 17 00:00:00 2001 From: Yannis Zarkadas Date: Sat, 2 Oct 2021 18:05:32 -0400 Subject: [PATCH] api/krusty: Ensure sort ordering works with CLI flag and kustomization Sort order can be defined in two places: - (new) kustomization file - (old) CLI flag We want the kustomization file to take precedence over the CLI flag. Eventually, we may want to move away from having a CLI flag altogether: https://github.com/kubernetes-sigs/kustomize/issues/3947 Case 1: Sort order set in kustomization file AND in CLI flag. Print a warning and let the kustomization file take precedence. Case 2: Sort order set in CLI flag only or not at all. Follow the CLI flag (defaults to legacy) and reorder at the end. Case 3: Sort order set in kustomization file only. Simply build the kustomization. Signed-off-by: Yannis Zarkadas --- api/krusty/kustomizer.go | 41 +++++++++++++++++++++-- kustomize/commands/build/reorderoutput.go | 3 +- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/api/krusty/kustomizer.go b/api/krusty/kustomizer.go index 5f1f27ff293..b9969599984 100644 --- a/api/krusty/kustomizer.go +++ b/api/krusty/kustomizer.go @@ -5,6 +5,7 @@ package krusty import ( "fmt" + "log" "sigs.k8s.io/kustomize/api/internal/builtins" pLdr "sigs.k8s.io/kustomize/api/internal/plugins/loader" @@ -18,6 +19,7 @@ import ( "sigs.k8s.io/kustomize/api/types" "sigs.k8s.io/kustomize/kyaml/filesys" "sigs.k8s.io/kustomize/kyaml/openapi" + "sigs.k8s.io/kustomize/kyaml/resid" ) // Kustomizer performs kustomizations. @@ -89,8 +91,43 @@ func (b *Kustomizer) Run( if err != nil { return nil, err } - if b.options.DoLegacyResourceSort { - err = builtins.NewLegacyOrderTransformerPlugin().Transform(m) + // Sort order can be defined in two places: + // - (new) kustomization file + // - (old) CLI flag + // + // We want the kustomization file to take precedence over the CLI flag. + // Eventually, we may want to move away from having a CLI flag altogether: + // https://github.com/kubernetes-sigs/kustomize/issues/3947 + + // Case 1: Sort order set in kustomization file. + if kt.Kustomization().SortOptions != nil { + // If set in CLI flag too, warn the user. + if b.options.SortModeSetExplicitly { + log.Println("Warning: Sorting order is set both in 'kustomization.yaml'" + + " ('sortOptions') and in a CLI flag ('--reorder'). Using the" + + " kustomization file over the CLI flag.") + } + pl := &builtins.SortOrderTransformerPlugin{ + SortOptions: kt.Kustomization().SortOptions, + IsTopLevel: true, + } + err = pl.Transform(m) + if err != nil { + return nil, err + } + } else if b.options.DoLegacyResourceSort && kt.Kustomization().SortOptions == nil { + // Case 2: Sort order set in CLI flag only or not at all. + pl := &builtins.SortOrderTransformerPlugin{ + SortOptions: &types.SortOptions{ + Order: types.LegacySortOrder, + LegacySortOptions: &types.LegacySortOptions{ + OrderFirst: resid.OrderFirst, + OrderLast: resid.OrderLast, + }, + }, + IsTopLevel: true, + } + err = pl.Transform(m) if err != nil { return nil, err } diff --git a/kustomize/commands/build/reorderoutput.go b/kustomize/commands/build/reorderoutput.go index c0495bedc0c..ea3c4625d60 100644 --- a/kustomize/commands/build/reorderoutput.go +++ b/kustomize/commands/build/reorderoutput.go @@ -24,7 +24,8 @@ func AddFlagReorderOutput(set *pflag.FlagSet) { set.StringVar( &theFlags.reorderOutput, flagReorderOutputName, legacy.String(), - "Reorder the resources just before output. "+ + "Please use the new 'sortOptions' field in kustomization.yaml instead"+ + "of this flag. Reorder the resources just before output. "+ "Use '"+legacy.String()+"' to apply a legacy reordering "+ "(Namespaces first, Webhooks last, etc). "+ "Use '"+none.String()+"' to suppress a final reordering.")