From 84dc8f14ca9fc412065f426b362b06fbbc37f317 Mon Sep 17 00:00:00 2001 From: mrinalirao Date: Fri, 11 Nov 2022 14:22:29 +1100 Subject: [PATCH] Pass optional comment to the override API + tests --- run.go | 52 ++++++++++++++-------------- task_stages.go | 12 +++++-- task_stages_integration_beta_test.go | 48 +++++++++++++++++++++++-- 3 files changed, 80 insertions(+), 32 deletions(-) diff --git a/run.go b/run.go index 6655e2b23..22739824a 100644 --- a/run.go +++ b/run.go @@ -53,32 +53,32 @@ type RunStatus string // List all available run statuses. const ( - RunApplied RunStatus = "applied" - RunApplying RunStatus = "applying" - RunApplyQueued RunStatus = "apply_queued" - RunCanceled RunStatus = "canceled" - RunConfirmed RunStatus = "confirmed" - RunCostEstimated RunStatus = "cost_estimated" - RunCostEstimating RunStatus = "cost_estimating" - RunDiscarded RunStatus = "discarded" - RunErrored RunStatus = "errored" - RunFetching RunStatus = "fetching" - RunFetchingCompleted RunStatus = "fetching_completed" - RunPending RunStatus = "pending" - RunPlanned RunStatus = "planned" - RunPlannedAndFinished RunStatus = "planned_and_finished" - RunPlanning RunStatus = "planning" - RunPlanQueued RunStatus = "plan_queued" - RunPolicyChecked RunStatus = "policy_checked" - RunPolicyChecking RunStatus = "policy_checking" - RunPolicyOverride RunStatus = "policy_override" - RunPolicySoftFailed RunStatus = "policy_soft_failed" - RunPostPlanCompleted RunStatus = "post_plan_completed" - RunPostPlanRunning RunStatus = "post_plan_running" - RunPrePlanCompleted RunStatus = "pre_plan_completed" - RunPrePlanRunning RunStatus = "pre_plan_running" - RunQueuing RunStatus = "queuing" - RunAwaitingDecision RunStatus = "post_plan_awaiting_decision" + RunApplied RunStatus = "applied" + RunApplying RunStatus = "applying" + RunApplyQueued RunStatus = "apply_queued" + RunCanceled RunStatus = "canceled" + RunConfirmed RunStatus = "confirmed" + RunCostEstimated RunStatus = "cost_estimated" + RunCostEstimating RunStatus = "cost_estimating" + RunDiscarded RunStatus = "discarded" + RunErrored RunStatus = "errored" + RunFetching RunStatus = "fetching" + RunFetchingCompleted RunStatus = "fetching_completed" + RunPending RunStatus = "pending" + RunPlanned RunStatus = "planned" + RunPlannedAndFinished RunStatus = "planned_and_finished" + RunPlanning RunStatus = "planning" + RunPlanQueued RunStatus = "plan_queued" + RunPolicyChecked RunStatus = "policy_checked" + RunPolicyChecking RunStatus = "policy_checking" + RunPolicyOverride RunStatus = "policy_override" + RunPolicySoftFailed RunStatus = "policy_soft_failed" + RunPostPlanCompleted RunStatus = "post_plan_completed" + RunPostPlanRunning RunStatus = "post_plan_running" + RunPrePlanCompleted RunStatus = "pre_plan_completed" + RunPrePlanRunning RunStatus = "pre_plan_running" + RunQueuing RunStatus = "queuing" + RunPostPlanAwaitingDecision RunStatus = "post_plan_awaiting_decision" ) // RunSource represents a source type of a run. diff --git a/task_stages.go b/task_stages.go index 8d72eb05f..5cb81ee0d 100644 --- a/task_stages.go +++ b/task_stages.go @@ -20,7 +20,7 @@ type TaskStages interface { // **Note: This function is still in BETA and subject to change.** // Override a task stage for a given run - Override(ctx context.Context, taskStageID string) (*TaskStage, error) + Override(ctx context.Context, taskStageID string, options TaskStageOverrideOptions) (*TaskStage, error) } // taskStages implements TaskStages @@ -76,6 +76,12 @@ type TaskStage struct { PolicyEvaluations []*PolicyEvaluation `jsonapi:"relation,policy-evaluations"` } +// TaskStageOverrideOptions represents the options for overriding a TaskStage. +type TaskStageOverrideOptions struct { + // An optional explanation for why the stage was overridden + Comment *string `json:"comment,omitempty"` +} + // TaskStageList represents a list of task stages type TaskStageList struct { *Pagination @@ -158,13 +164,13 @@ func (s *taskStages) List(ctx context.Context, runID string, options *TaskStageL // **Note: This function is still in BETA and subject to change.** // Override a task stages for a run -func (s *taskStages) Override(ctx context.Context, taskStageID string) (*TaskStage, error) { +func (s *taskStages) Override(ctx context.Context, taskStageID string, options TaskStageOverrideOptions) (*TaskStage, error) { if !validStringID(&taskStageID) { return nil, ErrInvalidTaskStageID } u := fmt.Sprintf("task-stages/%s/actions/override", taskStageID) - req, err := s.client.NewRequest("POST", u, nil) + req, err := s.client.NewRequest("POST", u, &options) if err != nil { return nil, err } diff --git a/task_stages_integration_beta_test.go b/task_stages_integration_beta_test.go index ce3d85432..cb1f097e6 100644 --- a/task_stages_integration_beta_test.go +++ b/task_stages_integration_beta_test.go @@ -205,7 +205,7 @@ func TestTaskStageOverride_Beta(t *testing.T) { Overridable: Bool(true), } createPolicySetWithOptions(t, client, orgTest, []*Policy{pTest}, []*Workspace{wTest}, opts) - rTest, tTestCleanup := createRunWaitForStatus(t, client, wTest, RunAwaitingDecision) + rTest, tTestCleanup := createRunWaitForStatus(t, client, wTest, RunPostPlanAwaitingDecision) defer tTestCleanup() taskStageList, err := client.TaskStages.List(ctx, rTest.ID, nil) @@ -216,7 +216,49 @@ func TestTaskStageOverride_Beta(t *testing.T) { assert.Equal(t, TaskStageAwaitingOverride, taskStageList.Items[0].Status) assert.Equal(t, 1, len(taskStageList.Items[0].PolicyEvaluations)) - _, err = client.TaskStages.Override(ctx, taskStageList.Items[0].ID) + _, err = client.TaskStages.Override(ctx, taskStageList.Items[0].ID, TaskStageOverrideOptions{}) + require.NoError(t, err) + }) + + t.Run("when the policy failed with options", func(t *testing.T) { + orgTest, orgTestCleanup := createOrganization(t, client) + defer orgTestCleanup() + + options := PolicyCreateOptions{ + Description: String("A sample policy"), + Kind: OPA, + Query: String("data.example.rule"), + Enforce: []*EnforcementOptions{ + { + Mode: EnforcementMode(EnforcementMandatory), + }, + }, + } + pTest, pTestCleanup := createUploadedPolicyWithOptions(t, client, false, orgTest, options) + defer pTestCleanup() + + wTest, wTestCleanup := createWorkspace(t, client, orgTest) + defer wTestCleanup() + opts := PolicySetCreateOptions{ + Kind: OPA, + Overridable: Bool(true), + } + createPolicySetWithOptions(t, client, orgTest, []*Policy{pTest}, []*Workspace{wTest}, opts) + rTest, tTestCleanup := createRunWaitForStatus(t, client, wTest, RunPostPlanAwaitingDecision) + defer tTestCleanup() + + taskStageList, err := client.TaskStages.List(ctx, rTest.ID, nil) + require.NoError(t, err) + + require.NotEmpty(t, taskStageList.Items) + assert.NotEmpty(t, taskStageList.Items[0].ID) + assert.Equal(t, TaskStageAwaitingOverride, taskStageList.Items[0].Status) + assert.Equal(t, 1, len(taskStageList.Items[0].PolicyEvaluations)) + + taskStageOverrideOptions := TaskStageOverrideOptions{ + Comment: String("test comment"), + } + ts, err := client.TaskStages.Override(ctx, taskStageList.Items[0].ID, taskStageOverrideOptions) require.NoError(t, err) }) @@ -254,7 +296,7 @@ func TestTaskStageOverride_Beta(t *testing.T) { assert.Equal(t, TaskStagePassed, taskStageList.Items[0].Status) assert.Equal(t, 1, len(taskStageList.Items[0].PolicyEvaluations)) - _, err = client.TaskStages.Override(ctx, taskStageList.Items[0].ID) + _, err = client.TaskStages.Override(ctx, taskStageList.Items[0].ID, TaskStageOverrideOptions{}) assert.Errorf(t, err, "transition not allowed") }) }