Skip to content

Commit

Permalink
Pass optional comment to the override API + tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mrinalirao committed Nov 11, 2022
1 parent ab2c729 commit 3d24aa6
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 36 deletions.
8 changes: 4 additions & 4 deletions mocks/task_stages_mocks.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

52 changes: 26 additions & 26 deletions run.go
Expand Up @@ -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.
Expand Down
12 changes: 9 additions & 3 deletions task_stages.go
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
}
Expand Down
48 changes: 45 additions & 3 deletions task_stages_integration_beta_test.go
Expand Up @@ -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)
Expand All @@ -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)
})

Expand Down Expand Up @@ -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")
})
}

0 comments on commit 3d24aa6

Please sign in to comment.