@@ -945,26 +945,21 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
945
945
defer provisionerdWaitGroup .Wait ()
946
946
provisionerdMetrics := provisionerd .NewMetrics (options .PrometheusRegistry )
947
947
948
- // Create a list of daemon types. The length is the total number of built-in provisioners, and
949
- // the slice value is the type for each. This is just an easy way to pass the types
950
- // to a single loop. Ensuring each provisioner has a unique suffix with their index.
951
- daemons := make ([]codersdk.ProvisionerType , 0 )
952
- for i := int64 (0 ); i < vals .Provisioner .DaemonsTerraform .Value (); i ++ {
953
- daemons = append (daemons , codersdk .ProvisionerTypeTerraform )
948
+ // Built in provisioner daemons will support the same types.
949
+ // By default, this is the slice {"terraform"}
950
+ provisionerTypes := make ([]codersdk.ProvisionerType , 0 )
951
+ for _ , pt := range vals .Provisioner .DaemonTypes {
952
+ provisionerTypes = append (provisionerTypes , codersdk .ProvisionerType (pt ))
954
953
}
955
- for i := int64 (0 ); i < vals .Provisioner .DaemonsEcho .Value (); i ++ {
956
- daemons = append (daemons , codersdk .ProvisionerTypeEcho )
957
- }
958
-
959
- for i , provisionerType := range daemons {
954
+ for i := int64 (0 ); i < vals .Provisioner .Daemons .Value (); i ++ {
960
955
suffix := fmt .Sprintf ("%d" , i )
961
956
// The suffix is added to the hostname, so we may need to trim to fit into
962
957
// the 64 character limit.
963
958
hostname := stringutil .Truncate (cliutil .Hostname (), 63 - len (suffix ))
964
959
name := fmt .Sprintf ("%s-%s" , hostname , suffix )
965
960
daemonCacheDir := filepath .Join (cacheDir , fmt .Sprintf ("provisioner-%d" , i ))
966
961
daemon , err := newProvisionerDaemon (
967
- ctx , coderAPI , provisionerdMetrics , logger , vals , daemonCacheDir , errCh , & provisionerdWaitGroup , name , provisionerType ,
962
+ ctx , coderAPI , provisionerdMetrics , logger , vals , daemonCacheDir , errCh , & provisionerdWaitGroup , name , provisionerTypes ,
968
963
)
969
964
if err != nil {
970
965
return xerrors .Errorf ("create provisioner daemon: %w" , err )
@@ -1352,7 +1347,7 @@ func newProvisionerDaemon(
1352
1347
errCh chan error ,
1353
1348
wg * sync.WaitGroup ,
1354
1349
name string ,
1355
- provisionerType codersdk.ProvisionerType ,
1350
+ provisionerTypes [] codersdk.ProvisionerType ,
1356
1351
) (srv * provisionerd.Server , err error ) {
1357
1352
ctx , cancel := context .WithCancel (ctx )
1358
1353
defer func () {
@@ -1372,82 +1367,88 @@ func newProvisionerDaemon(
1372
1367
return nil , xerrors .Errorf ("mkdir work dir: %w" , err )
1373
1368
}
1374
1369
1370
+ // Omit any duplicates
1371
+ provisionerTypes = slice .Unique (provisionerTypes )
1372
+
1373
+ // Populate the connector with the supported types.
1375
1374
connector := provisionerd.LocalProvisioners {}
1376
- switch provisionerType {
1377
- case codersdk .ProvisionerTypeEcho :
1378
- echoClient , echoServer := drpc .MemTransportPipe ()
1379
- wg .Add (1 )
1380
- go func () {
1381
- defer wg .Done ()
1382
- <- ctx .Done ()
1383
- _ = echoClient .Close ()
1384
- _ = echoServer .Close ()
1385
- }()
1386
- wg .Add (1 )
1387
- go func () {
1388
- defer wg .Done ()
1389
- defer cancel ()
1375
+ for _ , provisionerType := range provisionerTypes {
1376
+ switch provisionerType {
1377
+ case codersdk .ProvisionerTypeEcho :
1378
+ echoClient , echoServer := drpc .MemTransportPipe ()
1379
+ wg .Add (1 )
1380
+ go func () {
1381
+ defer wg .Done ()
1382
+ <- ctx .Done ()
1383
+ _ = echoClient .Close ()
1384
+ _ = echoServer .Close ()
1385
+ }()
1386
+ wg .Add (1 )
1387
+ go func () {
1388
+ defer wg .Done ()
1389
+ defer cancel ()
1390
1390
1391
- err := echo .Serve (ctx , & provisionersdk.ServeOptions {
1392
- Listener : echoServer ,
1393
- WorkDirectory : workDir ,
1394
- Logger : logger .Named ("echo" ),
1395
- })
1396
- if err != nil {
1397
- select {
1398
- case errCh <- err :
1399
- default :
1391
+ err := echo .Serve (ctx , & provisionersdk.ServeOptions {
1392
+ Listener : echoServer ,
1393
+ WorkDirectory : workDir ,
1394
+ Logger : logger .Named ("echo" ),
1395
+ })
1396
+ if err != nil {
1397
+ select {
1398
+ case errCh <- err :
1399
+ default :
1400
+ }
1400
1401
}
1402
+ }()
1403
+ connector [string (database .ProvisionerTypeEcho )] = sdkproto .NewDRPCProvisionerClient (echoClient )
1404
+ case codersdk .ProvisionerTypeTerraform :
1405
+ tfDir := filepath .Join (cacheDir , "tf" )
1406
+ err = os .MkdirAll (tfDir , 0o700 )
1407
+ if err != nil {
1408
+ return nil , xerrors .Errorf ("mkdir terraform dir: %w" , err )
1401
1409
}
1402
- }()
1403
- connector [string (database .ProvisionerTypeEcho )] = sdkproto .NewDRPCProvisionerClient (echoClient )
1404
- case codersdk .ProvisionerTypeTerraform :
1405
- tfDir := filepath .Join (cacheDir , "tf" )
1406
- err = os .MkdirAll (tfDir , 0o700 )
1407
- if err != nil {
1408
- return nil , xerrors .Errorf ("mkdir terraform dir: %w" , err )
1409
- }
1410
1410
1411
- tracer := coderAPI .TracerProvider .Tracer (tracing .TracerName )
1412
- terraformClient , terraformServer := drpc .MemTransportPipe ()
1413
- wg .Add (1 )
1414
- go func () {
1415
- defer wg .Done ()
1416
- <- ctx .Done ()
1417
- _ = terraformClient .Close ()
1418
- _ = terraformServer .Close ()
1419
- }()
1420
- wg .Add (1 )
1421
- go func () {
1422
- defer wg .Done ()
1423
- defer cancel ()
1424
-
1425
- err := terraform .Serve (ctx , & terraform.ServeOptions {
1426
- ServeOptions : & provisionersdk.ServeOptions {
1427
- Listener : terraformServer ,
1428
- Logger : logger .Named ("terraform" ),
1429
- WorkDirectory : workDir ,
1430
- },
1431
- CachePath : tfDir ,
1432
- Tracer : tracer ,
1433
- })
1434
- if err != nil && ! xerrors .Is (err , context .Canceled ) {
1435
- select {
1436
- case errCh <- err :
1437
- default :
1411
+ tracer := coderAPI .TracerProvider .Tracer (tracing .TracerName )
1412
+ terraformClient , terraformServer := drpc .MemTransportPipe ()
1413
+ wg .Add (1 )
1414
+ go func () {
1415
+ defer wg .Done ()
1416
+ <- ctx .Done ()
1417
+ _ = terraformClient .Close ()
1418
+ _ = terraformServer .Close ()
1419
+ }()
1420
+ wg .Add (1 )
1421
+ go func () {
1422
+ defer wg .Done ()
1423
+ defer cancel ()
1424
+
1425
+ err := terraform .Serve (ctx , & terraform.ServeOptions {
1426
+ ServeOptions : & provisionersdk.ServeOptions {
1427
+ Listener : terraformServer ,
1428
+ Logger : logger .Named ("terraform" ),
1429
+ WorkDirectory : workDir ,
1430
+ },
1431
+ CachePath : tfDir ,
1432
+ Tracer : tracer ,
1433
+ })
1434
+ if err != nil && ! xerrors .Is (err , context .Canceled ) {
1435
+ select {
1436
+ case errCh <- err :
1437
+ default :
1438
+ }
1438
1439
}
1439
- }
1440
- }()
1440
+ }()
1441
1441
1442
- connector [string (database .ProvisionerTypeTerraform )] = sdkproto .NewDRPCProvisionerClient (terraformClient )
1443
- default :
1444
- return nil , fmt .Errorf ("unknown provisioner type %q" , provisionerType )
1442
+ connector [string (database .ProvisionerTypeTerraform )] = sdkproto .NewDRPCProvisionerClient (terraformClient )
1443
+ default :
1444
+ return nil , fmt .Errorf ("unknown provisioner type %q" , provisionerType )
1445
+ }
1445
1446
}
1446
1447
1447
1448
return provisionerd .New (func (dialCtx context.Context ) (proto.DRPCProvisionerDaemonClient , error ) {
1448
1449
// This debounces calls to listen every second. Read the comment
1449
1450
// in provisionerdserver.go to learn more!
1450
- return coderAPI .CreateInMemoryProvisionerDaemon (dialCtx , name , []codersdk. ProvisionerType { provisionerType } )
1451
+ return coderAPI .CreateInMemoryProvisionerDaemon (dialCtx , name , provisionerTypes )
1451
1452
}, & provisionerd.Options {
1452
1453
Logger : logger .Named (fmt .Sprintf ("provisionerd-%s" , name )),
1453
1454
UpdateInterval : time .Second ,
0 commit comments