forked from DeviaVir/go-tfe
/
admin_runs.go
106 lines (88 loc) · 2.8 KB
/
admin_runs.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package tfe
import (
"context"
"errors"
"fmt"
"net/url"
"strings"
)
// Compile-time proof of interface implementation.
var _ AdminRuns = (*adminRuns)(nil)
// AdminRuns Users Admin API contains endpoints to help site administrators manage
// user accounts.
//
// TFE API docs: https://www.terraform.io/docs/cloud/api/admin runs.html
type AdminRuns interface {
// List all the runs of the given installation.
List(ctx context.Context, options AdminRunsListOptions) (*AdminRunsList, error)
// Force-cancel a run by its ID.
ForceCancel(ctx context.Context, runID string, options RunForceCancelOptions) error
}
// runs implements Users.
type adminRuns struct {
client *Client
}
// AdminRunsList represents a list of runs.
type AdminRunsList struct {
*Pagination
*StatusCounts
Items []*Run
}
// AdminRunsListOptions represents the options for listing runs.
type AdminRunsListOptions struct {
ListOptions
RunStatus *string `url:"filter[status],omitempty"` // sending an empty param returns zero results
Query *string `url:"q"`
Include string `url:"include"`
}
func (o AdminRunsListOptions) valid() error {
if o.RunStatus != nil && *o.RunStatus != "" {
validRunStatus := []string{"pending", "plan_queued", "planning", "planned", "confirmed", "apply_queued", "applying", "applied", "discarded", "errored", "canceled", "cost_estimating", "cost_estimated", "policy_checking", "policy_override", "policy_soft_failed", "policy_checked", "planned_and_finished", "force_canceled"}
runStatus := strings.Split(*o.RunStatus, ",")
// iterate over our statuses
for _, status := range runStatus {
// start with invalid
valid := false
for _, s := range validRunStatus {
if status == s {
// found a match, set to true and continue to the next status
valid = true
break
}
}
if valid == false {
return fmt.Errorf("invalid value %s for run status", status)
}
}
}
return nil
}
// List all the runs of the terraform enterprise installation.
func (s *adminRuns) List(ctx context.Context, options AdminRunsListOptions) (*AdminRunsList, error) {
if err := options.valid(); err != nil {
return nil, err
}
u := fmt.Sprintf("admin/runs")
req, err := s.client.newRequest("GET", u, &options)
if err != nil {
return nil, err
}
rl := &AdminRunsList{}
err = s.client.do(ctx, req, rl)
if err != nil {
return nil, err
}
return rl, nil
}
// ForceCancel is used to forcefully cancel a run by its ID.
func (s *adminRuns) ForceCancel(ctx context.Context, runID string, options RunForceCancelOptions) error {
if !validStringID(&runID) {
return errors.New("invalid value for run ID")
}
u := fmt.Sprintf("admin/runs/%s/actions/force-cancel", url.QueryEscape(runID))
req, err := s.client.newRequest("POST", u, &options)
if err != nil {
return err
}
return s.client.do(ctx, req, nil)
}