From f8bcba2c4c91d611d583559a615739a02970af40 Mon Sep 17 00:00:00 2001 From: Joseph Tutela <98980386+hashimoon@users.noreply.github.com> Date: Wed, 10 Aug 2022 14:43:36 -0700 Subject: [PATCH] Allow FileTriggersEnabled to be set to false when Git tags are present (#468) * Allow FileTriggersEnabled to be set to `false` when Git tags are present * Bring tags-regex feature out of beta * add commit author to changelog * add TagsRegex defined helper Co-authored-by: Michael Yocca --- CHANGELOG.md | 1 + workspace.go | 22 ++++++++++++++++------ workspace_integration_test.go | 33 ++++++++++++++++++++++++++++----- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9999308e8..ec477c146 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * Adds additional Task Stage and Run Statuses for Pre-plan run tasks by @glennsarti [#469](https://github.com/hashicorp/go-tfe/pull/469) * Adds `stage` field to the create and update methods for Workspace Run Tasks by @glennsarti [#469](https://github.com/hashicorp/go-tfe/pull/469) * Adds `ResourcesProcessed`, `StateVersion`, `TerraformVersion`, `Modules`, `Providers`, and `Resources` fields to the State Version struct by @laurenolivia [#484](https://github.com/hashicorp/go-tfe/pull/484) +* Add support for disabled file trigger runs when setting Git tags by @hashimoon [#468](https://github.com/hashicorp/go-tfe/pull/468) # v1.6.0 diff --git a/workspace.go b/workspace.go index cc8ace07a..d5fe03611 100644 --- a/workspace.go +++ b/workspace.go @@ -1072,15 +1072,15 @@ func (o WorkspaceCreateOptions) valid() error { o.TriggerPatterns != nil && len(o.TriggerPatterns) > 0 { return ErrUnsupportedBothTriggerPatternsAndPrefixes } - if o.VCSRepo != nil && o.VCSRepo.TagsRegex != nil && + if tagRegexDefined(o.VCSRepo) && o.TriggerPatterns != nil && len(o.TriggerPatterns) > 0 { return ErrUnsupportedBothTagsRegexAndTriggerPatterns } - if o.VCSRepo != nil && o.VCSRepo.TagsRegex != nil && + if tagRegexDefined(o.VCSRepo) && o.TriggerPrefixes != nil && len(o.TriggerPrefixes) > 0 { return ErrUnsupportedBothTagsRegexAndTriggerPrefixes } - if o.VCSRepo != nil && o.VCSRepo.TagsRegex != nil && + if tagRegexDefined(o.VCSRepo) && o.FileTriggersEnabled != nil && *o.FileTriggersEnabled { return ErrUnsupportedBothTagsRegexAndFileTriggersEnabled } @@ -1103,15 +1103,15 @@ func (o WorkspaceUpdateOptions) valid() error { return ErrUnsupportedBothTriggerPatternsAndPrefixes } - if o.VCSRepo != nil && o.VCSRepo.TagsRegex != nil && + if tagRegexDefined(o.VCSRepo) && o.TriggerPatterns != nil && len(o.TriggerPatterns) > 0 { return ErrUnsupportedBothTagsRegexAndTriggerPatterns } - if o.VCSRepo != nil && o.VCSRepo.TagsRegex != nil && + if tagRegexDefined(o.VCSRepo) && o.TriggerPrefixes != nil && len(o.TriggerPrefixes) > 0 { return ErrUnsupportedBothTagsRegexAndTriggerPrefixes } - if o.VCSRepo != nil && o.VCSRepo.TagsRegex != nil && + if tagRegexDefined(o.VCSRepo) && o.FileTriggersEnabled != nil && *o.FileTriggersEnabled { return ErrUnsupportedBothTagsRegexAndFileTriggersEnabled } @@ -1221,3 +1221,13 @@ func validateWorkspaceIncludeParams(params []WSIncludeOpt) error { return nil } + +func tagRegexDefined(options *VCSRepoOptions) bool { + if options == nil { + return false + } + if options.TagsRegex != nil && *options.TagsRegex != "" { + return true + } + return false +} diff --git a/workspace_integration_test.go b/workspace_integration_test.go index 58a1b806a..61ac313b6 100644 --- a/workspace_integration_test.go +++ b/workspace_integration_test.go @@ -344,10 +344,10 @@ func TestWorkspacesCreate(t *testing.T) { assert.EqualError(t, err, ErrUnsupportedBothTriggerPatternsAndPrefixes.Error()) }) - t.Run("when options include tags-regex(behind a feature flag)", func(t *testing.T) { + t.Run("when options include tags-regex", func(t *testing.T) { // Remove the below organization creation and use the one from the outer scope once the feature flag is removed orgTest, orgTestCleanup := createOrganizationWithOptions(t, client, OrganizationCreateOptions{ - Name: String("tst-" + randomString(t)[0:20] + "-git-tag-ff-on"), + Name: String("tst-" + randomString(t)[0:20]), Email: String(fmt.Sprintf("%s@tfe.local", randomString(t))), }) defer orgTestCleanup() @@ -413,6 +413,18 @@ func TestWorkspacesCreate(t *testing.T) { assert.EqualError(t, err, ErrUnsupportedBothTagsRegexAndFileTriggersEnabled.Error()) }) + t.Run("when options include both non-empty tags-regex and file-triggers-enabled as false an error is not returned", func(t *testing.T) { + options := WorkspaceCreateOptions{ + Name: String("foobar"), + FileTriggersEnabled: Bool(false), + VCSRepo: &VCSRepoOptions{TagsRegex: String("foobar")}, + } + w, err := client.Workspaces.Create(ctx, orgTest.Name, options) + + require.NotNil(t, w) + require.NoError(t, err) + }) + t.Run("when options include trigger-patterns populated and empty trigger-paths workspace is created", func(t *testing.T) { // Remove the below organization creation and use the one from the outer scope once the feature flag is removed orgTest, orgTestCleanup := createOrganizationWithOptions(t, client, OrganizationCreateOptions{ @@ -832,11 +844,10 @@ func TestWorkspacesUpdate(t *testing.T) { } }) - t.Run("when options include VCSRepo tags-regex (behind a feature flag)", func(t *testing.T) { - skipIfBeta(t) + t.Run("when options include VCSRepo tags-regex", func(t *testing.T) { // Remove the below organization and workspace creation and use the one from the outer scope once the feature flag is removed orgTest, orgTestCleanup := createOrganizationWithOptions(t, client, OrganizationCreateOptions{ - Name: String("tst-" + randomString(t)[0:20] + "-git-tag-ff-on"), + Name: String("tst-" + randomString(t)[0:20]), Email: String(fmt.Sprintf("%s@tfe.local", randomString(t))), }) defer orgTestCleanup() @@ -889,6 +900,18 @@ func TestWorkspacesUpdate(t *testing.T) { assert.EqualError(t, err, ErrUnsupportedBothTagsRegexAndFileTriggersEnabled.Error()) }) + t.Run("when options include both non-empty tags-regex and file-triggers-enabled an error is returned", func(t *testing.T) { + options := WorkspaceUpdateOptions{ + Name: String("foobar"), + FileTriggersEnabled: Bool(true), + VCSRepo: &VCSRepoOptions{TagsRegex: String("foobar")}, + } + w, err := client.Workspaces.Update(ctx, orgTest.Name, wTest.Name, options) + + assert.Nil(t, w) + assert.EqualError(t, err, ErrUnsupportedBothTagsRegexAndFileTriggersEnabled.Error()) + }) + t.Run("when options include both tags-regex and trigger-prefixes an error is returned", func(t *testing.T) { options := WorkspaceUpdateOptions{ Name: String("foobar"),