Skip to content

Commit

Permalink
api/krusty: Ensure sort ordering works with CLI flag and kustomization
Browse files Browse the repository at this point in the history
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:
kubernetes-sigs#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 <yanniszark@gmail.com>
  • Loading branch information
yanniszark committed Dec 2, 2022
1 parent ca8d477 commit 39378da
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 52 deletions.
45 changes: 40 additions & 5 deletions api/krusty/kustomizer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -90,11 +91,9 @@ func (b *Kustomizer) Run(
if err != nil {
return nil, err
}
if b.options.DoLegacyResourceSort {
err = builtins.NewLegacyOrderTransformerPlugin().Transform(m)
if err != nil {
return nil, err
}
err = b.applySortOrder(m, kt)
if err != nil {
return nil, err
}
if b.options.AddManagedbyLabel || utils.StringSliceContains(kt.Kustomization().BuildMetadata, types.ManagedByLabelOption) {
t := builtins.LabelTransformerPlugin{
Expand Down Expand Up @@ -126,3 +125,39 @@ func (b *Kustomizer) Run(
}
return m, nil
}

func (b *Kustomizer) applySortOrder(m resmap.ResMap, kt *target.KustTarget) error {
// 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.Reorder != ReorderOptionUnspecified {
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,
}
err := pl.Transform(m)
if err != nil {
return err
}
} else if b.options.Reorder == ReorderOptionLegacy || b.options.Reorder == ReorderOptionUnspecified {
// Case 2: Sort order set in CLI flag only or not at all.
pl := &builtins.SortOrderTransformerPlugin{
SortOptions: &types.SortOptions{
Order: types.LegacySortOrder,
},
}
return pl.Transform(m)
}
return nil
}
40 changes: 18 additions & 22 deletions kustomize/commands/build/reorderoutput.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,48 +7,44 @@ import (
"fmt"

"github.com/spf13/pflag"
)

//go:generate stringer -type=reorderOutput
type reorderOutput int

const (
unspecified reorderOutput = iota
none
legacy
flag "github.com/spf13/pflag"
"sigs.k8s.io/kustomize/api/krusty"
)

const flagReorderOutputName = "reorder"

func AddFlagReorderOutput(set *pflag.FlagSet) {
set.StringVar(
&theFlags.reorderOutput, flagReorderOutputName,
legacy.String(),
"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.")
string(krusty.ReorderOptionLegacy),
"Reorder the resources just before output. Use '"+string(krusty.ReorderOptionLegacy)+"' to"+
" apply a legacy reordering (Namespaces first, Webhooks last, etc)."+
" Use '"+string(krusty.ReorderOptionNone)+"' to suppress a final reordering.")
}

func validateFlagReorderOutput() error {
switch theFlags.reorderOutput {
case none.String(), legacy.String():
case string(krusty.ReorderOptionNone), string(krusty.ReorderOptionLegacy):
return nil
default:
return fmt.Errorf(
"illegal flag value --%s %s; legal values: %v",
flagReorderOutputName, theFlags.reorderOutput,
[]string{legacy.String(), none.String()})
[]string{string(krusty.ReorderOptionLegacy), string(krusty.ReorderOptionNone)})
}
}

func getFlagReorderOutput() reorderOutput {
func getFlagReorderOutput(flags *flag.FlagSet) krusty.ReorderOption {
isReorderSet := flags.Changed(flagReorderOutputName)
if !isReorderSet {
theFlags.reorderOutput = string(krusty.ReorderOptionUnspecified)
}
switch theFlags.reorderOutput {
case none.String():
return none
case legacy.String():
return legacy
case string(krusty.ReorderOptionNone):
return krusty.ReorderOptionNone
case string(krusty.ReorderOptionLegacy):
return krusty.ReorderOptionLegacy
default:
return unspecified
return krusty.ReorderOptionUnspecified
}
}
25 changes: 0 additions & 25 deletions kustomize/commands/build/reorderoutput_string.go

This file was deleted.

0 comments on commit 39378da

Please sign in to comment.