@@ -18,6 +18,12 @@ type Runs interface {
18
18
Read (ctx context.Context , runID string ) (* Run , error )
19
19
// Create a new run with the given options.
20
20
Create (ctx context.Context , options RunCreateOptions ) (* Run , error )
21
+ // Apply a run that is paused waiting for confirmation after a plan.
22
+ Apply (ctx context.Context , runID string , options RunApplyOptions ) error
23
+ // Interrupt a run that is currently planning or applying.
24
+ Cancel (ctx context.Context , runID string , options RunCancelOptions ) error
25
+ // Skip any remaining work on runs that are paused waiting for confirmation or priority.
26
+ Discard (ctx context.Context , runID string , options RunDiscardOptions ) error
21
27
}
22
28
23
29
// runs implements Runs.
@@ -28,7 +34,7 @@ type runs struct {
28
34
// RunStatus represents a run state.
29
35
type RunStatus string
30
36
31
- //List all available run statuses.
37
+ // List all available run statuses.
32
38
const (
33
39
RunApplied RunStatus = "applied"
34
40
RunApplyQueued RunStatus = "apply_queued"
@@ -157,3 +163,70 @@ func (s *runs) Read(ctx context.Context, runID string) (*Run, error) {
157
163
158
164
return r , nil
159
165
}
166
+
167
+ // RunApplyOptions represents the options for applying a Run.
168
+ type RunApplyOptions struct {
169
+ Comment string `jsonapi:"attr,comment"`
170
+ ApplyAt * time.Time `jsonapi:"attr,apply-at,iso8601"`
171
+ }
172
+
173
+ // Apply a run that is paused waiting for confirmation after a plan.
174
+ func (s * runs ) Apply (ctx context.Context , runID string , options RunApplyOptions ) error {
175
+ if ! validStringID (& runID ) {
176
+ return errors .New ("invalid value for run ID" )
177
+ }
178
+
179
+ u := fmt .Sprintf ("runs/%s/actions/apply" , url .PathEscape (runID ))
180
+ req , err := s .client .newRequest ("POST" , u , & options )
181
+ if err != nil {
182
+ return err
183
+ }
184
+
185
+ req .Header .Set ("Content-Type" , "application/json" )
186
+
187
+ return s .client .do (ctx , req , nil )
188
+ }
189
+
190
+ // RunCancelOptions represents the options for canceling a Run.
191
+ type RunCancelOptions struct {
192
+ Comment string `jsonapi:"attr,comment"`
193
+ }
194
+
195
+ // Cancel interrupts a run that is currently planning or applying.
196
+ func (s * runs ) Cancel (ctx context.Context , runID string , options RunCancelOptions ) error {
197
+ if ! validStringID (& runID ) {
198
+ return errors .New ("invalid value for run ID" )
199
+ }
200
+
201
+ u := fmt .Sprintf ("runs/%s/actions/cancel" , url .PathEscape (runID ))
202
+ req , err := s .client .newRequest ("POST" , u , & options )
203
+ if err != nil {
204
+ return err
205
+ }
206
+
207
+ req .Header .Set ("Content-Type" , "application/json" )
208
+
209
+ return s .client .do (ctx , req , nil )
210
+ }
211
+
212
+ // RunDiscardOptions represents the options for discarding a Run.
213
+ type RunDiscardOptions struct {
214
+ Comment string `jsonapi:"attr,comment"`
215
+ }
216
+
217
+ // Discard skips any remaining work on runs that are paused waiting for confirmation or priority.
218
+ func (s * runs ) Discard (ctx context.Context , runID string , options RunDiscardOptions ) error {
219
+ if ! validStringID (& runID ) {
220
+ return errors .New ("invalid value for run ID" )
221
+ }
222
+
223
+ u := fmt .Sprintf ("runs/%s/actions/discard" , url .PathEscape (runID ))
224
+ req , err := s .client .newRequest ("POST" , u , & options )
225
+ if err != nil {
226
+ return err
227
+ }
228
+
229
+ req .Header .Set ("Content-Type" , "application/json" )
230
+
231
+ return s .client .do (ctx , req , nil )
232
+ }
0 commit comments