@@ -19,11 +19,23 @@ import (
19
19
"golang.org/x/xerrors"
20
20
21
21
"cdr.dev/slog"
22
+ "github.com/coder/coder/coderd/parameter"
22
23
"github.com/coder/coder/provisionerd/proto"
23
24
sdkproto "github.com/coder/coder/provisionersdk/proto"
24
25
"github.com/coder/retry"
25
26
)
26
27
28
+ const (
29
+ missingParameterErrorText = "missing parameter"
30
+ )
31
+
32
+ // IsMissingParameterError returns whether the error message provided
33
+ // is a missing parameter error. This can indicate to consumers that
34
+ // they should check parameters.
35
+ func IsMissingParameterError (err string ) bool {
36
+ return strings .Contains (err , missingParameterErrorText )
37
+ }
38
+
27
39
// Dialer represents the function to create a daemon client connection.
28
40
type Dialer func (ctx context.Context ) (proto.DRPCProvisionerDaemonClient , error )
29
41
@@ -352,32 +364,53 @@ func (p *provisionerDaemon) runProjectImport(ctx context.Context, provisioner sd
352
364
valueByName [parameterValue .Name ] = parameterValue
353
365
}
354
366
for _ , parameterSchema := range parameterSchemas {
367
+ if parameterSchema .Name == parameter .CoderWorkspaceTransition {
368
+ // Hardcode the workspace transition variable. We'll
369
+ // make it do stuff later!
370
+ continue
371
+ }
355
372
_ , ok := valueByName [parameterSchema .Name ]
356
373
if ! ok {
357
- p .cancelActiveJobf ("missing parameter : %s" , parameterSchema .Name )
374
+ p .cancelActiveJobf ("%s : %s" , missingParameterErrorText , parameterSchema .Name )
358
375
return
359
376
}
360
377
}
378
+ // Checks if the schema has defined a workspace transition variable.
379
+ // If not, we don't need to check for resources provisioned in a stopped state.
380
+ hasWorkspaceTransition := false
381
+ for _ , parameterSchema := range parameterSchemas {
382
+ if parameterSchema .Name != parameter .CoderWorkspaceTransition {
383
+ continue
384
+ }
385
+ hasWorkspaceTransition = true
386
+ break
387
+ }
361
388
362
- startResources , err := p .runProjectImportProvision (ctx , provisioner , job , append (updateResponse .ParameterValues , & sdkproto.ParameterValue {
363
- DestinationScheme : sdkproto .ParameterDestination_PROVISIONER_VARIABLE ,
364
- // TODO: Make this a constant higher-up in the stack.
365
- Name : "coder_workspace_transition" ,
366
- Value : "start" ,
367
- }))
368
- if err != nil {
369
- p .cancelActiveJobf ("project import provision for start: %s" , err )
370
- return
389
+ startParameters := updateResponse .ParameterValues
390
+ if hasWorkspaceTransition {
391
+ startParameters = append (updateResponse .ParameterValues , & sdkproto.ParameterValue {
392
+ DestinationScheme : sdkproto .ParameterDestination_PROVISIONER_VARIABLE ,
393
+ Name : parameter .CoderWorkspaceTransition ,
394
+ Value : "start" ,
395
+ })
371
396
}
372
- stopResources , err := p .runProjectImportProvision (ctx , provisioner , job , append (updateResponse .ParameterValues , & sdkproto.ParameterValue {
373
- DestinationScheme : sdkproto .ParameterDestination_PROVISIONER_VARIABLE ,
374
- Name : "coder_workspace_transition" ,
375
- Value : "stop" ,
376
- }))
397
+ startResources , err := p .runProjectImportProvision (ctx , provisioner , job , startParameters )
377
398
if err != nil {
378
399
p .cancelActiveJobf ("project import provision for start: %s" , err )
379
400
return
380
401
}
402
+ stopResources := startResources
403
+ if hasWorkspaceTransition {
404
+ stopResources , err = p .runProjectImportProvision (ctx , provisioner , job , append (updateResponse .ParameterValues , & sdkproto.ParameterValue {
405
+ DestinationScheme : sdkproto .ParameterDestination_PROVISIONER_VARIABLE ,
406
+ Name : "coder_workspace_transition" ,
407
+ Value : "stop" ,
408
+ }))
409
+ if err != nil {
410
+ p .cancelActiveJobf ("project import provision for start: %s" , err )
411
+ return
412
+ }
413
+ }
381
414
382
415
_ , err = p .client .CompleteJob (ctx , & proto.CompletedJob {
383
416
JobId : job .JobId ,
0 commit comments