diff --git a/README.md b/README.md index 675cf4f..00bb0a6 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,7 @@ param BAZ=qux bc,is,dc,svc ``` -Please note that boolean flags need to be specified with a value, e.g. `upsert-only true`. +Please note that boolean flags need to be specified with a value, e.g. `allow-deletion true`. Tailor will automatically pick up any file named `Tailorfile.` or `Tailorfile` in the working directory. Alternatively, a specific file can be selected via `tailor -f somefile`. diff --git a/cmd/tailor/main.go b/cmd/tailor/main.go index ee5701d..f3dbd9d 100644 --- a/cmd/tailor/main.go +++ b/cmd/tailor/main.go @@ -111,9 +111,9 @@ var ( "ignore-unknown-parameters", "If true, will not stop processing if a provided parameter does not exist in the template.", ).Bool() - diffUpsertOnlyFlag = diffCommand.Flag( - "upsert-only", - "Don't delete resource, only create / update.", + diffAllowDeletionFlag = diffCommand.Flag( + "allow-deletion", + "Allow deletion of resource as well.", ).Short('u').Bool() diffAllowRecreateFlag = diffCommand.Flag( "allow-recreate", @@ -159,9 +159,9 @@ var ( "ignore-unknown-parameters", "If true, will not stop processing if a provided parameter does not exist in the template.", ).Bool() - applyUpsertOnlyFlag = applyCommand.Flag( - "upsert-only", - "Don't delete resource, only create / apply.", + applyAllowDeletionFlag = applyCommand.Flag( + "allow-deletion", + "Allow deletion of resource as well.", ).Short('u').Bool() applyAllowRecreateFlag = applyCommand.Flag( "allow-recreate", @@ -362,7 +362,7 @@ func main() { preservePathFlag, *diffPreserveImmutableFieldsFlag, *diffIgnoreUnknownParametersFlag, - *diffUpsertOnlyFlag, + *diffAllowDeletionFlag, *diffAllowRecreateFlag, *diffRevealSecretsFlag, false, // verification only when changes are applied @@ -399,7 +399,7 @@ func main() { preservePathFlag, *applyPreserveImmutableFieldsFlag, *applyIgnoreUnknownParametersFlag, - *applyUpsertOnlyFlag, + *applyAllowDeletionFlag, *applyAllowRecreateFlag, *applyRevealSecretsFlag, *applyVerifyFlag, diff --git a/pkg/cli/options.go b/pkg/cli/options.go index 1f89365..6c0b295 100644 --- a/pkg/cli/options.go +++ b/pkg/cli/options.go @@ -46,7 +46,7 @@ type CompareOptions struct { PreservePaths []string PreserveImmutableFields bool IgnoreUnknownParameters bool - UpsertOnly bool + AllowDeletion bool AllowRecreate bool RevealSecrets bool Verify bool @@ -159,7 +159,7 @@ func NewCompareOptions( preserveFlag []string, preserveImmutableFieldsFlag bool, ignoreUnknownParametersFlag bool, - upsertOnlyFlag bool, + allowDeletionFlag bool, allowRecreateFlag bool, revealSecretsFlag bool, verifyFlag bool, @@ -284,10 +284,10 @@ func NewCompareOptions( o.IgnoreUnknownParameters = true } - if upsertOnlyFlag { - o.UpsertOnly = true - } else if fileFlags["upsert-only"] == "true" { - o.UpsertOnly = true + if allowDeletionFlag { + o.AllowDeletion = true + } else if fileFlags["allow-deletion"] == "true" { + o.AllowDeletion = true } if allowRecreateFlag { diff --git a/pkg/commands/diff.go b/pkg/commands/diff.go index 082a2bd..2ef4019 100644 --- a/pkg/commands/diff.go +++ b/pkg/commands/diff.go @@ -136,7 +136,7 @@ func calculateChangeset(w io.Writer, compareOptions *cli.CompareOptions, ocClien w, platformBasedList, templateBasedList, - compareOptions.UpsertOnly, + compareOptions.AllowDeletion, compareOptions.AllowRecreate, compareOptions.RevealSecrets, compareOptions.PathsToPreserve(), @@ -148,8 +148,8 @@ func calculateChangeset(w io.Writer, compareOptions *cli.CompareOptions, ocClien return updateRequired, changeset, nil } -func compare(w io.Writer, remoteResourceList *openshift.ResourceList, localResourceList *openshift.ResourceList, upsertOnly bool, allowRecreate bool, revealSecrets bool, preservePaths []string) (*openshift.Changeset, error) { - changeset, err := openshift.NewChangeset(remoteResourceList, localResourceList, upsertOnly, allowRecreate, preservePaths) +func compare(w io.Writer, remoteResourceList *openshift.ResourceList, localResourceList *openshift.ResourceList, allowDeletion bool, allowRecreate bool, revealSecrets bool, preservePaths []string) (*openshift.Changeset, error) { + changeset, err := openshift.NewChangeset(remoteResourceList, localResourceList, allowDeletion, allowRecreate, preservePaths) if err != nil { return changeset, err } diff --git a/pkg/openshift/changeset.go b/pkg/openshift/changeset.go index 6613fc5..18654c4 100644 --- a/pkg/openshift/changeset.go +++ b/pkg/openshift/changeset.go @@ -40,7 +40,7 @@ type Changeset struct { Noop []*Change } -func NewChangeset(platformBasedList, templateBasedList *ResourceList, upsertOnly bool, allowRecreate bool, preservePaths []string) (*Changeset, error) { +func NewChangeset(platformBasedList, templateBasedList *ResourceList, allowDeletion bool, allowRecreate bool, preservePaths []string) (*Changeset, error) { changeset := &Changeset{ Create: []*Change{}, Delete: []*Change{}, @@ -49,7 +49,7 @@ func NewChangeset(platformBasedList, templateBasedList *ResourceList, upsertOnly } // items to delete - if !upsertOnly { + if allowDeletion { for _, item := range platformBasedList.Items { if _, err := templateBasedList.getItem(item.Kind, item.Name); err != nil { change := &Change{ diff --git a/pkg/openshift/changeset_test.go b/pkg/openshift/changeset_test.go index f7e8e67..8953beb 100644 --- a/pkg/openshift/changeset_test.go +++ b/pkg/openshift/changeset_test.go @@ -51,13 +51,13 @@ func TestNewChangesetCreationOfResources(t *testing.T) { if err != nil { t.Fatal(err) } - upsertOnly := false + allowDeletion := true allowRecreate := false preservePaths := []string{} cs, err := NewChangeset( platformBasedList, templateBasedList, - upsertOnly, + allowDeletion, allowRecreate, preservePaths, ) @@ -598,9 +598,29 @@ items: filter := &ResourceFilter{ Kinds: []string{"PersistentVolumeClaim"}, } - changeset := getChangeset(t, filter, platformInput, templateInput, false, true, []string{}) - if len(changeset.Delete) != 1 { - t.Errorf("Changeset.Delete is blank but should not be") + + tests := map[string]struct { + allowDeletion bool + wantChanges int + }{ + "when deletion is not allowed": { + allowDeletion: false, // default + wantChanges: 0, + }, + "when deletion is allowed": { + allowDeletion: true, + wantChanges: 1, + }, + } + + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + changeset := getChangeset(t, filter, platformInput, templateInput, tc.allowDeletion, true, []string{}) + gotChanges := len(changeset.Delete) + if gotChanges != tc.wantChanges { + t.Errorf("Changeset.Delete is %d but should not be %d", gotChanges, tc.wantChanges) + } + }) } } @@ -635,7 +655,7 @@ func TestCalculateChangesImmutableFields(t *testing.T) { } } -func getChangeset(t *testing.T, filter *ResourceFilter, platformInput, templateInput []byte, upsertOnly bool, allowRecreate bool, preservePaths []string) *Changeset { +func getChangeset(t *testing.T, filter *ResourceFilter, platformInput, templateInput []byte, allowDeletion bool, allowRecreate bool, preservePaths []string) *Changeset { platformBasedList, err := NewPlatformBasedResourceList(filter, platformInput) if err != nil { t.Error("Could not create platform based list:", err) @@ -644,7 +664,7 @@ func getChangeset(t *testing.T, filter *ResourceFilter, platformInput, templateI if err != nil { t.Error("Could not create template based list:", err) } - changeset, err := NewChangeset(platformBasedList, templateBasedList, upsertOnly, allowRecreate, preservePaths) + changeset, err := NewChangeset(platformBasedList, templateBasedList, allowDeletion, allowRecreate, preservePaths) if err != nil { t.Error("Could not create changeset:", err) }