diff --git a/pkg/filters/filter_type.go b/pkg/filters/filter_type.go index ffb1f526..f6f6593e 100644 --- a/pkg/filters/filter_type.go +++ b/pkg/filters/filter_type.go @@ -12,4 +12,5 @@ const ( OnceDailySchedule FeedFilter GitFilter + WebhookFilter ) diff --git a/pkg/filters/filter_type_string.go b/pkg/filters/filter_type_string.go index 4938af8f..50ba9071 100644 --- a/pkg/filters/filter_type_string.go +++ b/pkg/filters/filter_type_string.go @@ -1,4 +1,4 @@ -// Code generated by "enumer -type=FilterType -json -output=C:\dev\go-octopusdeploy\pkg\filters\filter_type_string.go"; DO NOT EDIT. +// Code generated by "enumer -type=FilterType -json -output filter_type_string.go"; DO NOT EDIT. package filters @@ -8,11 +8,11 @@ import ( "strings" ) -const _FilterTypeName = "ContinuousDailyScheduleCronExpressionScheduleDailyScheduleDaysPerMonthScheduleDaysPerWeekScheduleMachineFilterOnceDailyScheduleFeedFilterGitFilter" +const _FilterTypeName = "ContinuousDailyScheduleCronExpressionScheduleDailyScheduleDaysPerMonthScheduleDaysPerWeekScheduleMachineFilterOnceDailyScheduleFeedFilterGitFilterWebhookFilter" -var _FilterTypeIndex = [...]uint8{0, 23, 45, 58, 78, 97, 110, 127, 137, 146} +var _FilterTypeIndex = [...]uint8{0, 23, 45, 58, 78, 97, 110, 127, 137, 146, 159} -const _FilterTypeLowerName = "continuousdailyschedulecronexpressionscheduledailyscheduledayspermonthscheduledaysperweekschedulemachinefilteroncedailyschedulefeedfiltergitfilter" +const _FilterTypeLowerName = "continuousdailyschedulecronexpressionscheduledailyscheduledayspermonthscheduledaysperweekschedulemachinefilteroncedailyschedulefeedfiltergitfilterwebhookfilter" func (i FilterType) String() string { if i < 0 || i >= FilterType(len(_FilterTypeIndex)-1) { @@ -34,9 +34,10 @@ func _FilterTypeNoOp() { _ = x[OnceDailySchedule-(6)] _ = x[FeedFilter-(7)] _ = x[GitFilter-(8)] + _ = x[WebhookFilter-(9)] } -var _FilterTypeValues = []FilterType{ContinuousDailySchedule, CronExpressionSchedule, DailySchedule, DaysPerMonthSchedule, DaysPerWeekSchedule, MachineFilter, OnceDailySchedule, FeedFilter, GitFilter} +var _FilterTypeValues = []FilterType{ContinuousDailySchedule, CronExpressionSchedule, DailySchedule, DaysPerMonthSchedule, DaysPerWeekSchedule, MachineFilter, OnceDailySchedule, FeedFilter, GitFilter, WebhookFilter} var _FilterTypeNameToValueMap = map[string]FilterType{ _FilterTypeName[0:23]: ContinuousDailySchedule, @@ -57,6 +58,8 @@ var _FilterTypeNameToValueMap = map[string]FilterType{ _FilterTypeLowerName[127:137]: FeedFilter, _FilterTypeName[137:146]: GitFilter, _FilterTypeLowerName[137:146]: GitFilter, + _FilterTypeName[146:159]: WebhookFilter, + _FilterTypeLowerName[146:159]: WebhookFilter, } var _FilterTypeNames = []string{ @@ -69,6 +72,7 @@ var _FilterTypeNames = []string{ _FilterTypeName[110:127], _FilterTypeName[127:137], _FilterTypeName[137:146], + _FilterTypeName[146:159], } // FilterTypeString retrieves an enum value from the enum constants string name. diff --git a/pkg/filters/json.go b/pkg/filters/json.go index babdd93b..32305b27 100644 --- a/pkg/filters/json.go +++ b/pkg/filters/json.go @@ -52,6 +52,10 @@ func FromJson(rawMessage *json.RawMessage) (ITriggerFilter, error) { var filter *GitTriggerFilter err := json.Unmarshal(*rawMessage, &filter) return filter, err + case WebhookFilter: + var filter *WebhookTriggerFilter + err := json.Unmarshal(*rawMessage, &filter) + return filter, err } return nil, fmt.Errorf("unable to unmarshal filter from JSON") diff --git a/pkg/filters/webhook_trigger_filter.go b/pkg/filters/webhook_trigger_filter.go new file mode 100644 index 00000000..61649316 --- /dev/null +++ b/pkg/filters/webhook_trigger_filter.go @@ -0,0 +1,28 @@ +package filters + +import "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/core" + +type WebhookTriggerFilter struct { + Secret core.SensitiveValue `json:"Secret"` + WebhookId string `json:"WebhookId,omitempty"` + + triggerFilter +} + +func NewWebhookTriggerFilter(secret core.SensitiveValue) *WebhookTriggerFilter { + + return &WebhookTriggerFilter{ + triggerFilter: *newTriggerFilter(WebhookFilter), + Secret: secret, + } +} + +func (t *WebhookTriggerFilter) GetFilterType() FilterType { + return t.Type +} + +func (t *WebhookTriggerFilter) SetFilterType(filterType FilterType) { + t.Type = filterType +} + +var _ ITriggerFilter = &WebhookTriggerFilter{} diff --git a/test/e2e/project_trigger_test.go b/test/e2e/project_trigger_test.go index b3f84145..51175c9e 100644 --- a/test/e2e/project_trigger_test.go +++ b/test/e2e/project_trigger_test.go @@ -7,8 +7,11 @@ import ( "github.com/OctopusDeploy/go-octopusdeploy/v2/internal" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/actions" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/client" - "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/environments" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/configuration" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/core" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/filters" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/lifecycles" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/projectgroups" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/projects" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/triggers" "github.com/stretchr/testify/assert" @@ -39,7 +42,7 @@ func AssertEqualProjectTriggers(t *testing.T, expected *triggers.ProjectTrigger, assert.Equal(t, expected.SpaceID, actual.SpaceID) } -func CreateTestProjectTrigger(t *testing.T, client *client.Client, project *projects.Project, environment *environments.Environment) *triggers.ProjectTrigger { +func CreateTestScheduledProjectTriggerWithOnceDailyFilter(t *testing.T, client *client.Client, project *projects.Project) *triggers.ProjectTrigger { require.NotNil(t, project) if client == nil { @@ -65,13 +68,13 @@ func CreateTestProjectTrigger(t *testing.T, client *client.Client, project *proj require.NotNil(t, projectTrigger) require.NoError(t, projectTrigger.Validate()) - createdProjectTrigger, err := client.ProjectTriggers.Add(projectTrigger) + createdProjectTrigger, err := triggers.Add(client, projectTrigger) require.NoError(t, err) require.NotNil(t, createdProjectTrigger) require.NotEmpty(t, createdProjectTrigger.GetID()) // verify the add operation was successful - projectTriggerToCompare, err := client.ProjectTriggers.GetByID(createdProjectTrigger.GetID()) + projectTriggerToCompare, err := triggers.GetById(client, project.SpaceID, createdProjectTrigger.GetID()) require.NoError(t, err) require.NotNil(t, projectTriggerToCompare) AssertEqualProjectTriggers(t, createdProjectTrigger, projectTriggerToCompare) @@ -87,11 +90,11 @@ func DeleteTestProjectTrigger(t *testing.T, client *client.Client, projectTrigge } require.NotNil(t, client) - err := client.ProjectTriggers.Delete(projectTrigger) + err := triggers.DeleteById(client, projectTrigger.SpaceID, projectTrigger.ID) assert.NoError(t, err) // verify the delete operation was successful - deletedProjectTrigger, err := client.ProjectTriggers.GetByID(projectTrigger.GetID()) + deletedProjectTrigger, err := triggers.GetById(client, projectTrigger.SpaceID, projectTrigger.GetID()) assert.Error(t, err) assert.Nil(t, deletedProjectTrigger) } @@ -111,189 +114,97 @@ func UpdateTestProjectTrigger(t *testing.T, client *client.Client, projectTrigge return projectTrigger } -func TestProjectTriggerAddGetUpdateDelete(t *testing.T) { - client := getOctopusClient() - require.NotNil(t, client) +func SetupClientAndProjectAndLifecycleAndProjectGroup(t *testing.T) (*client.Client, *projects.Project, *lifecycles.Lifecycle, + *projectgroups.ProjectGroup) { + + octopusClient := getOctopusClient() + require.NotNil(t, octopusClient) - space := GetDefaultSpace(t, client) + space := GetDefaultSpace(t, octopusClient) require.NotNil(t, space) - lifecycle := CreateTestLifecycle(t, client) + lifecycle := CreateTestLifecycle(t, octopusClient) require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, client, lifecycle) + t.Cleanup(func() { DeleteTestLifecycle(t, octopusClient, lifecycle) }) - projectGroup := CreateTestProjectGroup(t, client) + projectGroup := CreateTestProjectGroup(t, octopusClient) require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, client, projectGroup) + t.Cleanup(func() { DeleteTestProjectGroup(t, octopusClient, projectGroup) }) - project := CreateTestProject(t, client, space, lifecycle, projectGroup) + project := CreateTestProject(t, octopusClient, space, lifecycle, + projectGroup) require.NotNil(t, project) - defer DeleteTestProject(t, client, project) + t.Cleanup(func() { DeleteTestProject(t, octopusClient, project) }) + + return octopusClient, project, lifecycle, projectGroup +} + +func TestProjectTriggerAddGetUpdateDelete(t *testing.T) { + octopusClient, project, lifecycle, _ := SetupClientAndProjectAndLifecycleAndProjectGroup(t) - environment := CreateTestEnvironment(t, client) + environment := CreateTestEnvironment(t, octopusClient) require.NotNil(t, environment) - defer DeleteTestEnvironment(t, client, environment) + defer DeleteTestEnvironment(t, octopusClient, environment) - projectTrigger := CreateTestProjectTrigger(t, client, project, environment) + projectTrigger := CreateTestScheduledProjectTriggerWithOnceDailyFilter(t, octopusClient, project) require.NotNil(t, lifecycle) - defer DeleteTestProjectTrigger(t, client, projectTrigger) + defer DeleteTestProjectTrigger(t, octopusClient, projectTrigger) projectTrigger.Name = GetRandomName() - updatedProjectTrigger := UpdateTestProjectTrigger(t, client, projectTrigger) + updatedProjectTrigger := UpdateTestProjectTrigger(t, octopusClient, projectTrigger) require.NotNil(t, updatedProjectTrigger) } func TestProjectTriggerGetAll(t *testing.T) { - client := getOctopusClient() - require.NotNil(t, client) - - space := GetDefaultSpace(t, client) - require.NotNil(t, space) - - lifecycle := CreateTestLifecycle(t, client) - require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, client, lifecycle) - - projectGroup := CreateTestProjectGroup(t, client) - require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, client, projectGroup) - - project := CreateTestProject(t, client, space, lifecycle, projectGroup) - require.NotNil(t, project) - defer DeleteTestProject(t, client, project) - - projectTriggers, err := client.ProjectTriggers.GetAll() + octopusClient, project, _, _ := SetupClientAndProjectAndLifecycleAndProjectGroup(t) + projectTriggers, err := triggers.GetAll(octopusClient, project.SpaceID) require.NoError(t, err) require.NotNil(t, projectTriggers) } -// ----- new ----- +func TestProjectWebhookRunbookTrigger(t *testing.T) { -func New_CreateTestProjectTrigger(t *testing.T, client *client.Client, project *projects.Project) *triggers.ProjectTrigger { - require.NotNil(t, project) + octopusClient, project, lifecycle, projectGroup := SetupClientAndProjectAndLifecycleAndProjectGroup(t) - if client == nil { - client = getOctopusClient() + //feature toggle must be present and enabled to run this test, otherwise skip it + webhookTriggersFeatureToggle, err := configuration.Get(octopusClient, &configuration.FeatureToggleConfigurationQuery{Name: "webhook-triggers"}) + if err != nil { + t.Skip("Could not get feature toggle configuration") + } else if len(webhookTriggersFeatureToggle.FeatureToggles) == 0 { + t.Skip("WebhookTriggers feature toggle is not present") + } else if webhookTriggersFeatureToggle.FeatureToggles[0].IsEnabled == false { + t.Skip("WebhookTriggers feature toggle is not enabled") } - require.NotNil(t, client) - space := GetDefaultSpace(t, client) - require.NotNil(t, space) + environment := CreateTestEnvironment(t, octopusClient) + require.NotNil(t, environment) + defer DeleteTestEnvironment(t, octopusClient, environment) - now := time.Now() - start := time.Date(now.Year(), now.Month(), now.Day(), 9, 0, 0, 0, time.UTC) + runbook := CreateTestRunbook(t, octopusClient, lifecycle, projectGroup, project) + require.NotNil(t, runbook) + defer DeleteTestRunbook(t, octopusClient, runbook) - action := actions.NewAutoDeployAction(createRandomBoolean()) - filter := filters.NewOnceDailyScheduledTriggerFilter([]filters.Weekday{filters.Tuesday}, start) + action := actions.NewRunRunbookAction() + action.Runbook = runbook.GetID() + action.Environments = []string{environment.GetID()} + + password := getShortRandomName() + secret := core.SensitiveValue{HasValue: true, NewValue: &password} + + filter := filters.NewWebhookTriggerFilter(secret) projectTrigger := triggers.NewProjectTrigger(internal.GetRandomName(), internal.GetRandomName(), createRandomBoolean(), project, action, filter) require.NotNil(t, projectTrigger) require.NoError(t, projectTrigger.Validate()) - createdProjectTrigger, err := client.ProjectTriggers.Add(projectTrigger) + createdProjectTrigger, err := triggers.Add(octopusClient, projectTrigger) require.NoError(t, err) require.NotNil(t, createdProjectTrigger) require.NotEmpty(t, createdProjectTrigger.GetID()) // verify the add operation was successful - projectTriggerToCompare, err := triggers.GetById(client, space.ID, createdProjectTrigger.GetID()) + projectTriggerToCompare, err := triggers.GetById(octopusClient, project.SpaceID, createdProjectTrigger.GetID()) require.NoError(t, err) require.NotNil(t, projectTriggerToCompare) AssertEqualProjectTriggers(t, createdProjectTrigger, projectTriggerToCompare) - - return createdProjectTrigger -} - -func New_DeleteTestProjectTrigger(t *testing.T, client *client.Client, projectTrigger *triggers.ProjectTrigger) { - require.NotNil(t, projectTrigger) - - if client == nil { - client = getOctopusClient() - } - require.NotNil(t, client) - - space := GetDefaultSpace(t, client) - require.NotNil(t, space) - - err := triggers.DeleteById(client, space.ID, projectTrigger.ID) - assert.NoError(t, err) - - // verify the delete operation was successful - deletedProjectTrigger, err := triggers.GetById(client, space.ID, projectTrigger.GetID()) - assert.Error(t, err) - assert.Nil(t, deletedProjectTrigger) -} - -func New_UpdateTestProjectTrigger(t *testing.T, client *client.Client, projectTrigger *triggers.ProjectTrigger) *triggers.ProjectTrigger { - require.NotNil(t, projectTrigger) - - if client == nil { - client = getOctopusClient() - } - require.NotNil(t, client) - - space := GetDefaultSpace(t, client) - require.NotNil(t, space) - - projectTrigger, err := triggers.Update(client, projectTrigger) - assert.NoError(t, err) - assert.NotNil(t, projectTrigger) - - return projectTrigger -} - -func New_TestProjectTriggerAddGetUpdateDelete(t *testing.T) { - client := getOctopusClient() - require.NotNil(t, client) - - space := GetDefaultSpace(t, client) - require.NotNil(t, space) - - lifecycle := CreateTestLifecycle(t, client) - require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, client, lifecycle) - - projectGroup := CreateTestProjectGroup(t, client) - require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, client, projectGroup) - - project := CreateTestProject(t, client, space, lifecycle, projectGroup) - require.NotNil(t, project) - defer DeleteTestProject(t, client, project) - - environment := CreateTestEnvironment(t, client) - require.NotNil(t, environment) - defer DeleteTestEnvironment(t, client, environment) - - projectTrigger := New_CreateTestProjectTrigger(t, client, project) - require.NotNil(t, lifecycle) - defer New_DeleteTestProjectTrigger(t, client, projectTrigger) - - projectTrigger.Name = GetRandomName() - updatedProjectTrigger := New_UpdateTestProjectTrigger(t, client, projectTrigger) - require.NotNil(t, updatedProjectTrigger) -} - -func New_TestProjectTriggerGetAll(t *testing.T) { - client := getOctopusClient() - require.NotNil(t, client) - - space := GetDefaultSpace(t, client) - require.NotNil(t, space) - - lifecycle := CreateTestLifecycle(t, client) - require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, client, lifecycle) - - projectGroup := CreateTestProjectGroup(t, client) - require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, client, projectGroup) - - project := CreateTestProject(t, client, space, lifecycle, projectGroup) - require.NotNil(t, project) - defer DeleteTestProject(t, client, project) - - projectTriggers, err := triggers.GetAll(client, space.ID) - require.NoError(t, err) - require.NotNil(t, projectTriggers) }