Skip to content

Commit 84dc8f1

Browse files
committed
Pass optional comment to the override API + tests
1 parent ab2c729 commit 84dc8f1

File tree

3 files changed

+80
-32
lines changed

3 files changed

+80
-32
lines changed

run.go

+26-26
Original file line numberDiff line numberDiff line change
@@ -53,32 +53,32 @@ type RunStatus string
5353

5454
// List all available run statuses.
5555
const (
56-
RunApplied RunStatus = "applied"
57-
RunApplying RunStatus = "applying"
58-
RunApplyQueued RunStatus = "apply_queued"
59-
RunCanceled RunStatus = "canceled"
60-
RunConfirmed RunStatus = "confirmed"
61-
RunCostEstimated RunStatus = "cost_estimated"
62-
RunCostEstimating RunStatus = "cost_estimating"
63-
RunDiscarded RunStatus = "discarded"
64-
RunErrored RunStatus = "errored"
65-
RunFetching RunStatus = "fetching"
66-
RunFetchingCompleted RunStatus = "fetching_completed"
67-
RunPending RunStatus = "pending"
68-
RunPlanned RunStatus = "planned"
69-
RunPlannedAndFinished RunStatus = "planned_and_finished"
70-
RunPlanning RunStatus = "planning"
71-
RunPlanQueued RunStatus = "plan_queued"
72-
RunPolicyChecked RunStatus = "policy_checked"
73-
RunPolicyChecking RunStatus = "policy_checking"
74-
RunPolicyOverride RunStatus = "policy_override"
75-
RunPolicySoftFailed RunStatus = "policy_soft_failed"
76-
RunPostPlanCompleted RunStatus = "post_plan_completed"
77-
RunPostPlanRunning RunStatus = "post_plan_running"
78-
RunPrePlanCompleted RunStatus = "pre_plan_completed"
79-
RunPrePlanRunning RunStatus = "pre_plan_running"
80-
RunQueuing RunStatus = "queuing"
81-
RunAwaitingDecision RunStatus = "post_plan_awaiting_decision"
56+
RunApplied RunStatus = "applied"
57+
RunApplying RunStatus = "applying"
58+
RunApplyQueued RunStatus = "apply_queued"
59+
RunCanceled RunStatus = "canceled"
60+
RunConfirmed RunStatus = "confirmed"
61+
RunCostEstimated RunStatus = "cost_estimated"
62+
RunCostEstimating RunStatus = "cost_estimating"
63+
RunDiscarded RunStatus = "discarded"
64+
RunErrored RunStatus = "errored"
65+
RunFetching RunStatus = "fetching"
66+
RunFetchingCompleted RunStatus = "fetching_completed"
67+
RunPending RunStatus = "pending"
68+
RunPlanned RunStatus = "planned"
69+
RunPlannedAndFinished RunStatus = "planned_and_finished"
70+
RunPlanning RunStatus = "planning"
71+
RunPlanQueued RunStatus = "plan_queued"
72+
RunPolicyChecked RunStatus = "policy_checked"
73+
RunPolicyChecking RunStatus = "policy_checking"
74+
RunPolicyOverride RunStatus = "policy_override"
75+
RunPolicySoftFailed RunStatus = "policy_soft_failed"
76+
RunPostPlanCompleted RunStatus = "post_plan_completed"
77+
RunPostPlanRunning RunStatus = "post_plan_running"
78+
RunPrePlanCompleted RunStatus = "pre_plan_completed"
79+
RunPrePlanRunning RunStatus = "pre_plan_running"
80+
RunQueuing RunStatus = "queuing"
81+
RunPostPlanAwaitingDecision RunStatus = "post_plan_awaiting_decision"
8282
)
8383

8484
// RunSource represents a source type of a run.

task_stages.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ type TaskStages interface {
2020

2121
// **Note: This function is still in BETA and subject to change.**
2222
// Override a task stage for a given run
23-
Override(ctx context.Context, taskStageID string) (*TaskStage, error)
23+
Override(ctx context.Context, taskStageID string, options TaskStageOverrideOptions) (*TaskStage, error)
2424
}
2525

2626
// taskStages implements TaskStages
@@ -76,6 +76,12 @@ type TaskStage struct {
7676
PolicyEvaluations []*PolicyEvaluation `jsonapi:"relation,policy-evaluations"`
7777
}
7878

79+
// TaskStageOverrideOptions represents the options for overriding a TaskStage.
80+
type TaskStageOverrideOptions struct {
81+
// An optional explanation for why the stage was overridden
82+
Comment *string `json:"comment,omitempty"`
83+
}
84+
7985
// TaskStageList represents a list of task stages
8086
type TaskStageList struct {
8187
*Pagination
@@ -158,13 +164,13 @@ func (s *taskStages) List(ctx context.Context, runID string, options *TaskStageL
158164

159165
// **Note: This function is still in BETA and subject to change.**
160166
// Override a task stages for a run
161-
func (s *taskStages) Override(ctx context.Context, taskStageID string) (*TaskStage, error) {
167+
func (s *taskStages) Override(ctx context.Context, taskStageID string, options TaskStageOverrideOptions) (*TaskStage, error) {
162168
if !validStringID(&taskStageID) {
163169
return nil, ErrInvalidTaskStageID
164170
}
165171

166172
u := fmt.Sprintf("task-stages/%s/actions/override", taskStageID)
167-
req, err := s.client.NewRequest("POST", u, nil)
173+
req, err := s.client.NewRequest("POST", u, &options)
168174
if err != nil {
169175
return nil, err
170176
}

task_stages_integration_beta_test.go

+45-3
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ func TestTaskStageOverride_Beta(t *testing.T) {
205205
Overridable: Bool(true),
206206
}
207207
createPolicySetWithOptions(t, client, orgTest, []*Policy{pTest}, []*Workspace{wTest}, opts)
208-
rTest, tTestCleanup := createRunWaitForStatus(t, client, wTest, RunAwaitingDecision)
208+
rTest, tTestCleanup := createRunWaitForStatus(t, client, wTest, RunPostPlanAwaitingDecision)
209209
defer tTestCleanup()
210210

211211
taskStageList, err := client.TaskStages.List(ctx, rTest.ID, nil)
@@ -216,7 +216,49 @@ func TestTaskStageOverride_Beta(t *testing.T) {
216216
assert.Equal(t, TaskStageAwaitingOverride, taskStageList.Items[0].Status)
217217
assert.Equal(t, 1, len(taskStageList.Items[0].PolicyEvaluations))
218218

219-
_, err = client.TaskStages.Override(ctx, taskStageList.Items[0].ID)
219+
_, err = client.TaskStages.Override(ctx, taskStageList.Items[0].ID, TaskStageOverrideOptions{})
220+
require.NoError(t, err)
221+
})
222+
223+
t.Run("when the policy failed with options", func(t *testing.T) {
224+
orgTest, orgTestCleanup := createOrganization(t, client)
225+
defer orgTestCleanup()
226+
227+
options := PolicyCreateOptions{
228+
Description: String("A sample policy"),
229+
Kind: OPA,
230+
Query: String("data.example.rule"),
231+
Enforce: []*EnforcementOptions{
232+
{
233+
Mode: EnforcementMode(EnforcementMandatory),
234+
},
235+
},
236+
}
237+
pTest, pTestCleanup := createUploadedPolicyWithOptions(t, client, false, orgTest, options)
238+
defer pTestCleanup()
239+
240+
wTest, wTestCleanup := createWorkspace(t, client, orgTest)
241+
defer wTestCleanup()
242+
opts := PolicySetCreateOptions{
243+
Kind: OPA,
244+
Overridable: Bool(true),
245+
}
246+
createPolicySetWithOptions(t, client, orgTest, []*Policy{pTest}, []*Workspace{wTest}, opts)
247+
rTest, tTestCleanup := createRunWaitForStatus(t, client, wTest, RunPostPlanAwaitingDecision)
248+
defer tTestCleanup()
249+
250+
taskStageList, err := client.TaskStages.List(ctx, rTest.ID, nil)
251+
require.NoError(t, err)
252+
253+
require.NotEmpty(t, taskStageList.Items)
254+
assert.NotEmpty(t, taskStageList.Items[0].ID)
255+
assert.Equal(t, TaskStageAwaitingOverride, taskStageList.Items[0].Status)
256+
assert.Equal(t, 1, len(taskStageList.Items[0].PolicyEvaluations))
257+
258+
taskStageOverrideOptions := TaskStageOverrideOptions{
259+
Comment: String("test comment"),
260+
}
261+
ts, err := client.TaskStages.Override(ctx, taskStageList.Items[0].ID, taskStageOverrideOptions)
220262
require.NoError(t, err)
221263
})
222264

@@ -254,7 +296,7 @@ func TestTaskStageOverride_Beta(t *testing.T) {
254296
assert.Equal(t, TaskStagePassed, taskStageList.Items[0].Status)
255297
assert.Equal(t, 1, len(taskStageList.Items[0].PolicyEvaluations))
256298

257-
_, err = client.TaskStages.Override(ctx, taskStageList.Items[0].ID)
299+
_, err = client.TaskStages.Override(ctx, taskStageList.Items[0].ID, TaskStageOverrideOptions{})
258300
assert.Errorf(t, err, "transition not allowed")
259301
})
260302
}

0 commit comments

Comments
 (0)