Skip to content

Commit 0f28f32

Browse files
authored
Merge pull request #584 from hashicorp/mr/TF-1450-policy-override
Add OPA support for task stages
2 parents 7a3cfda + 34922c8 commit 0f28f32

8 files changed

+441
-30
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
* Add OPA support to the Policy Set APIs by @mrinalirao [#575](https://github.com/hashicorp/go-tfe/pull/575)
1010
* Add OPA support to the Policy APIs by @mrinalirao [#579](https://github.com/hashicorp/go-tfe/pull/579)
1111
* Add Policy Evaluation and Policy Set Outcome APIs by @mrinalirao [#583](https://github.com/hashicorp/go-tfe/pull/583)
12+
* Add OPA support to Task Stage APIs by @mrinalirao [#584](https://github.com/hashicorp/go-tfe/pull/584)
1213

1314
# v1.12.0
1415

helper_test.go

+30
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,36 @@ func createPolicySet(t *testing.T, client *Client, org *Organization, policies [
556556
}
557557
}
558558

559+
func createPolicySetWithOptions(t *testing.T, client *Client, org *Organization, policies []*Policy, workspaces []*Workspace, opts PolicySetCreateOptions) (*PolicySet, func()) {
560+
var orgCleanup func()
561+
562+
if org == nil {
563+
org, orgCleanup = createOrganization(t, client)
564+
}
565+
566+
ctx := context.Background()
567+
ps, err := client.PolicySets.Create(ctx, org.Name, PolicySetCreateOptions{
568+
Name: String(randomString(t)),
569+
Policies: policies,
570+
Workspaces: workspaces,
571+
Kind: opts.Kind,
572+
Overridable: opts.Overridable,
573+
})
574+
if err != nil {
575+
t.Fatal(err)
576+
}
577+
return ps, func() {
578+
if err := client.PolicySets.Delete(ctx, ps.ID); err != nil {
579+
t.Errorf("Error destroying policy set! WARNING: Dangling resources\n"+
580+
"may exist! The full error is shown below.\n\n"+
581+
"PolicySet: %s\nError: %s", ps.ID, err)
582+
}
583+
if orgCleanup != nil {
584+
orgCleanup()
585+
}
586+
}
587+
}
588+
559589
func createPolicySetVersion(t *testing.T, client *Client, ps *PolicySet) (*PolicySetVersion, func()) {
560590
var psCleanup func()
561591

mocks/task_stages_mocks.go

+15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

policy_integration_beta_test.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -235,10 +235,9 @@ func TestPoliciesList_Beta(t *testing.T) {
235235
defer pTestCleanup2()
236236
opaOptions := PolicyCreateOptions{
237237
Kind: OPA,
238-
Query: String("terraform.policy1.deny"),
238+
Query: String("data.example.rule"),
239239
Enforce: []*EnforcementOptions{
240240
{
241-
Path: String(".rego"),
242241
Mode: EnforcementMode(EnforcementMandatory),
243242
},
244243
},
@@ -322,10 +321,9 @@ func TestPoliciesUpdate_Beta(t *testing.T) {
322321
options := PolicyCreateOptions{
323322
Description: String("A sample policy"),
324323
Kind: OPA,
325-
Query: String("terraform.main"),
324+
Query: String("data.example.rule"),
326325
Enforce: []*EnforcementOptions{
327326
{
328-
Path: String(".rego"),
329327
Mode: EnforcementMode(EnforcementMandatory),
330328
},
331329
},

run.go

+26-25
Original file line numberDiff line numberDiff line change
@@ -53,31 +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"
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+
RunPostPlanAwaitingDecision RunStatus = "post_plan_awaiting_decision"
77+
RunPostPlanCompleted RunStatus = "post_plan_completed"
78+
RunPostPlanRunning RunStatus = "post_plan_running"
79+
RunPrePlanCompleted RunStatus = "pre_plan_completed"
80+
RunPrePlanRunning RunStatus = "pre_plan_running"
81+
RunQueuing RunStatus = "queuing"
8182
)
8283

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

task_result.go

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const (
2929
TaskPending TaskResultStatus = "pending"
3030
TaskRunning TaskResultStatus = "running"
3131
TaskUnreachable TaskResultStatus = "unreachable"
32+
TaskErrored TaskResultStatus = "errored"
3233
)
3334

3435
// TaskEnforcementLevel is an enum that describes the enforcement levels for a run task

task_stages.go

+64-1
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@ type TaskStages interface {
1515
// Read a task stage by ID
1616
Read(ctx context.Context, taskStageID string, options *TaskStageReadOptions) (*TaskStage, error)
1717

18-
// List all task stages for a given rrun
18+
// List all task stages for a given run
1919
List(ctx context.Context, runID string, options *TaskStageListOptions) (*TaskStageList, error)
20+
21+
// **Note: This function is still in BETA and subject to change.**
22+
// Override a task stage for a given run
23+
Override(ctx context.Context, taskStageID string, options TaskStageOverrideOptions) (*TaskStage, error)
2024
}
2125

2226
// taskStages implements TaskStages
@@ -33,19 +37,51 @@ const (
3337
PreApply Stage = "pre_apply"
3438
)
3539

40+
// TaskStageStatus is an enum that represents all possible statuses for a task stage
41+
type TaskStageStatus string
42+
43+
const (
44+
TaskStagePending TaskStageStatus = "pending"
45+
TaskStageRunning TaskStageStatus = "running"
46+
TaskStagePassed TaskStageStatus = "passed"
47+
TaskStageFailed TaskStageStatus = "failed"
48+
TaskStageAwaitingOverride TaskStageStatus = "awaiting_override"
49+
)
50+
51+
// Permissions represents the permission types for overridding a task stage
52+
type Permissions struct {
53+
CanOverridePolicy *bool `jsonapi:"attr,can-override-policy"`
54+
CanOverrideTasks *bool `jsonapi:"attr,can-override-tasks"`
55+
CanOverride *bool `jsonapi:"attr,can-override"`
56+
}
57+
58+
// Actions represents a task stage actions
59+
type Actions struct {
60+
IsOverridable *bool `jsonapi:"attr,is-overridable"`
61+
}
62+
3663
// TaskStage represents a TFC/E run's stage where run tasks can occur
3764
type TaskStage struct {
3865
ID string `jsonapi:"primary,task-stages"`
3966
Stage Stage `jsonapi:"attr,stage"`
67+
Status TaskStageStatus `jsonapi:"attr,status"`
4068
StatusTimestamps TaskStageStatusTimestamps `jsonapi:"attr,status-timestamps"`
4169
CreatedAt time.Time `jsonapi:"attr,created-at,iso8601"`
4270
UpdatedAt time.Time `jsonapi:"attr,updated-at,iso8601"`
71+
Permissions *Permissions `jsonapi:"attr,permissions"`
72+
Actions *Actions `jsonapi:"attr,actions"`
4373

4474
Run *Run `jsonapi:"relation,run"`
4575
TaskResults []*TaskResult `jsonapi:"relation,task-results"`
4676
PolicyEvaluations []*PolicyEvaluation `jsonapi:"relation,policy-evaluations"`
4777
}
4878

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+
4985
// TaskStageList represents a list of task stages
5086
type TaskStageList struct {
5187
*Pagination
@@ -66,6 +102,9 @@ type TaskStageIncludeOpt string
66102

67103
const TaskStageTaskResults TaskStageIncludeOpt = "task_results"
68104

105+
// **Note: This field is still in BETA and subject to change.**
106+
const PolicyEvaluationsTaskResults TaskStageIncludeOpt = "policy_evaluations"
107+
69108
// TaskStageReadOptions represents the set of options when reading a task stage
70109
type TaskStageReadOptions struct {
71110
// Optional: A list of relations to include.
@@ -123,6 +162,28 @@ func (s *taskStages) List(ctx context.Context, runID string, options *TaskStageL
123162
return tlist, nil
124163
}
125164

165+
// **Note: This function is still in BETA and subject to change.**
166+
// Override a task stages for a run
167+
func (s *taskStages) Override(ctx context.Context, taskStageID string, options TaskStageOverrideOptions) (*TaskStage, error) {
168+
if !validStringID(&taskStageID) {
169+
return nil, ErrInvalidTaskStageID
170+
}
171+
172+
u := fmt.Sprintf("task-stages/%s/actions/override", taskStageID)
173+
req, err := s.client.NewRequest("POST", u, &options)
174+
if err != nil {
175+
return nil, err
176+
}
177+
178+
t := &TaskStage{}
179+
err = req.Do(ctx, t)
180+
if err != nil {
181+
return nil, err
182+
}
183+
184+
return t, nil
185+
}
186+
126187
func (o *TaskStageReadOptions) valid() error {
127188
if o == nil {
128189
return nil // nothing to validate
@@ -140,6 +201,8 @@ func validateTaskStageIncludeParams(params []TaskStageIncludeOpt) error {
140201
switch p {
141202
case TaskStageTaskResults:
142203
// do nothing
204+
case PolicyEvaluationsTaskResults:
205+
// do nothing
143206
default:
144207
return ErrInvalidIncludeValue
145208
}

0 commit comments

Comments
 (0)