Skip to content

Commit e26141f

Browse files
committed
chore: allow terraform & echo built-in provisioners
Built-in provisioners server their respective types, not both.
1 parent 845407f commit e26141f

File tree

5 files changed

+47
-24
lines changed

5 files changed

+47
-24
lines changed

cli/server.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -944,15 +944,21 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
944944
var provisionerdWaitGroup sync.WaitGroup
945945
defer provisionerdWaitGroup.Wait()
946946
provisionerdMetrics := provisionerd.NewMetrics(options.PrometheusRegistry)
947-
for i := int64(0); i < vals.Provisioner.Daemons.Value(); i++ {
947+
// Create a list of daemon types. The length is the total number of built in provisioners, and
948+
// the slice value is the type for each.
949+
daemons := append(
950+
fill(make([]codersdk.ProvisionerType, vals.Provisioner.DaemonsTerraform.Value()), codersdk.ProvisionerTypeTerraform),
951+
fill(make([]codersdk.ProvisionerType, vals.Provisioner.DaemonsEcho.Value()), codersdk.ProvisionerTypeEcho)...,
952+
)
953+
for i, provisionerType := range daemons {
948954
suffix := fmt.Sprintf("%d", i)
949955
// The suffix is added to the hostname, so we may need to trim to fit into
950956
// the 64 character limit.
951957
hostname := stringutil.Truncate(cliutil.Hostname(), 63-len(suffix))
952958
name := fmt.Sprintf("%s-%s", hostname, suffix)
953959
daemonCacheDir := filepath.Join(cacheDir, fmt.Sprintf("provisioner-%d", i))
954960
daemon, err := newProvisionerDaemon(
955-
ctx, coderAPI, provisionerdMetrics, logger, vals, daemonCacheDir, errCh, &provisionerdWaitGroup, name,
961+
ctx, coderAPI, provisionerdMetrics, logger, vals, daemonCacheDir, errCh, &provisionerdWaitGroup, name, provisionerType,
956962
)
957963
if err != nil {
958964
return xerrors.Errorf("create provisioner daemon: %w", err)
@@ -1340,6 +1346,7 @@ func newProvisionerDaemon(
13401346
errCh chan error,
13411347
wg *sync.WaitGroup,
13421348
name string,
1349+
provisionerType codersdk.ProvisionerType,
13431350
) (srv *provisionerd.Server, err error) {
13441351
ctx, cancel := context.WithCancel(ctx)
13451352
defer func() {
@@ -1360,7 +1367,8 @@ func newProvisionerDaemon(
13601367
}
13611368

13621369
connector := provisionerd.LocalProvisioners{}
1363-
if cfg.Provisioner.DaemonsEcho {
1370+
switch provisionerType {
1371+
case codersdk.ProvisionerTypeEcho:
13641372
echoClient, echoServer := drpc.MemTransportPipe()
13651373
wg.Add(1)
13661374
go func() {
@@ -1387,7 +1395,7 @@ func newProvisionerDaemon(
13871395
}
13881396
}()
13891397
connector[string(database.ProvisionerTypeEcho)] = sdkproto.NewDRPCProvisionerClient(echoClient)
1390-
} else {
1398+
case codersdk.ProvisionerTypeTerraform:
13911399
tfDir := filepath.Join(cacheDir, "tf")
13921400
err = os.MkdirAll(tfDir, 0o700)
13931401
if err != nil {
@@ -1426,12 +1434,14 @@ func newProvisionerDaemon(
14261434
}()
14271435

14281436
connector[string(database.ProvisionerTypeTerraform)] = sdkproto.NewDRPCProvisionerClient(terraformClient)
1437+
default:
1438+
return nil, fmt.Errorf("unknown provisioner type %q", provisionerType)
14291439
}
14301440

14311441
return provisionerd.New(func(dialCtx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
14321442
// This debounces calls to listen every second. Read the comment
14331443
// in provisionerdserver.go to learn more!
1434-
return coderAPI.CreateInMemoryProvisionerDaemon(dialCtx, name)
1444+
return coderAPI.CreateInMemoryProvisionerDaemon(dialCtx, name, []codersdk.ProvisionerType{provisionerType})
14351445
}, &provisionerd.Options{
14361446
Logger: logger.Named(fmt.Sprintf("provisionerd-%s", name)),
14371447
UpdateInterval: time.Second,
@@ -2574,3 +2584,11 @@ func getPostgresDB(ctx context.Context, logger slog.Logger, postgresURL string,
25742584

25752585
return sqlDB, dbURL, nil
25762586
}
2587+
2588+
// fill will fill the src with the value 'v'
2589+
func fill[T any](src []T, v T) []T {
2590+
for i := range src {
2591+
src[i] = v
2592+
}
2593+
return src
2594+
}

cli/server_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,7 +1367,7 @@ func TestServer(t *testing.T) {
13671367
"--in-memory",
13681368
"--http-address", ":0",
13691369
"--access-url", "http://example.com",
1370-
"--provisioner-daemons-echo",
1370+
"--provisioner-daemons-echo=3",
13711371
"--log-human", fiName,
13721372
)
13731373
clitest.Start(t, root)
@@ -1385,7 +1385,7 @@ func TestServer(t *testing.T) {
13851385
"--in-memory",
13861386
"--http-address", ":0",
13871387
"--access-url", "http://example.com",
1388-
"--provisioner-daemons-echo",
1388+
"--provisioner-daemons-echo=3",
13891389
"--log-human", fi,
13901390
)
13911391
clitest.Start(t, root)
@@ -1403,7 +1403,7 @@ func TestServer(t *testing.T) {
14031403
"--in-memory",
14041404
"--http-address", ":0",
14051405
"--access-url", "http://example.com",
1406-
"--provisioner-daemons-echo",
1406+
"--provisioner-daemons-echo=3",
14071407
"--log-json", fi,
14081408
)
14091409
clitest.Start(t, root)
@@ -1424,7 +1424,7 @@ func TestServer(t *testing.T) {
14241424
"--in-memory",
14251425
"--http-address", ":0",
14261426
"--access-url", "http://example.com",
1427-
"--provisioner-daemons-echo",
1427+
"--provisioner-daemons-echo=3",
14281428
"--log-stackdriver", fi,
14291429
)
14301430
// Attach pty so we get debug output from the command if this test

coderd/coderd.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,7 +1351,7 @@ func compressHandler(h http.Handler) http.Handler {
13511351

13521352
// CreateInMemoryProvisionerDaemon is an in-memory connection to a provisionerd.
13531353
// Useful when starting coderd and provisionerd in the same process.
1354-
func (api *API) CreateInMemoryProvisionerDaemon(dialCtx context.Context, name string) (client proto.DRPCProvisionerDaemonClient, err error) {
1354+
func (api *API) CreateInMemoryProvisionerDaemon(dialCtx context.Context, name string, provisionerTypes []codersdk.ProvisionerType) (client proto.DRPCProvisionerDaemonClient, err error) {
13551355
tracer := api.TracerProvider.Tracer(tracing.TracerName)
13561356
clientSession, serverSession := drpc.MemTransportPipe()
13571357
defer func() {
@@ -1368,18 +1368,21 @@ func (api *API) CreateInMemoryProvisionerDaemon(dialCtx context.Context, name st
13681368
return nil, xerrors.Errorf("unable to fetch default org for in memory provisioner: %w", err)
13691369
}
13701370

1371+
dbTypes := make([]database.ProvisionerType, 0, len(provisionerTypes))
1372+
for _, tp := range provisionerTypes {
1373+
dbTypes = append(dbTypes, database.ProvisionerType(tp))
1374+
}
1375+
13711376
//nolint:gocritic // in-memory provisioners are owned by system
13721377
daemon, err := api.Database.UpsertProvisionerDaemon(dbauthz.AsSystemRestricted(dialCtx), database.UpsertProvisionerDaemonParams{
13731378
Name: name,
13741379
OrganizationID: defaultOrg.ID,
13751380
CreatedAt: dbtime.Now(),
1376-
Provisioners: []database.ProvisionerType{
1377-
database.ProvisionerTypeEcho, database.ProvisionerTypeTerraform,
1378-
},
1379-
Tags: provisionersdk.MutateTags(uuid.Nil, nil),
1380-
LastSeenAt: sql.NullTime{Time: dbtime.Now(), Valid: true},
1381-
Version: buildinfo.Version(),
1382-
APIVersion: proto.CurrentVersion.String(),
1381+
Provisioners: dbTypes,
1382+
Tags: provisionersdk.MutateTags(uuid.Nil, nil),
1383+
LastSeenAt: sql.NullTime{Time: dbtime.Now(), Valid: true},
1384+
Version: buildinfo.Version(),
1385+
APIVersion: proto.CurrentVersion.String(),
13831386
})
13841387
if err != nil {
13851388
return nil, xerrors.Errorf("failed to create in-memory provisioner daemon: %w", err)

coderd/coderdtest/coderdtest.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ func NewProvisionerDaemon(t testing.TB, coderAPI *coderd.API) io.Closer {
578578
}()
579579

580580
daemon := provisionerd.New(func(dialCtx context.Context) (provisionerdproto.DRPCProvisionerDaemonClient, error) {
581-
return coderAPI.CreateInMemoryProvisionerDaemon(dialCtx, "test")
581+
return coderAPI.CreateInMemoryProvisionerDaemon(dialCtx, "test", []codersdk.ProvisionerType{codersdk.ProvisionerTypeEcho})
582582
}, &provisionerd.Options{
583583
Logger: coderAPI.Logger.Named("provisionerd").Leveled(slog.LevelDebug),
584584
UpdateInterval: 250 * time.Millisecond,

codersdk/deployment.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -406,8 +406,10 @@ type ExternalAuthConfig struct {
406406
}
407407

408408
type ProvisionerConfig struct {
409-
Daemons serpent.Int64 `json:"daemons" typescript:",notnull"`
410-
DaemonsEcho serpent.Bool `json:"daemons_echo" typescript:",notnull"`
409+
// DaemonsTerraform for legacy reasons is just called "daemons". It is the default
410+
// choice.
411+
DaemonsTerraform serpent.Int64 `json:"daemons" typescript:",notnull"`
412+
DaemonsEcho serpent.Int64 `json:"daemons_echo" typescript:",notnull"`
411413
DaemonPollInterval serpent.Duration `json:"daemon_poll_interval" typescript:",notnull"`
412414
DaemonPollJitter serpent.Duration `json:"daemon_poll_jitter" typescript:",notnull"`
413415
ForceCancelInterval serpent.Duration `json:"force_cancel_interval" typescript:",notnull"`
@@ -1404,21 +1406,21 @@ when required by your organization's security policy.`,
14041406
// Provisioner settings
14051407
{
14061408
Name: "Provisioner Daemons",
1407-
Description: "Number of provisioner daemons to create on start. If builds are stuck in queued state for a long time, consider increasing this.",
1409+
Description: "Number of terraform provisioner daemons to create on start. If builds are stuck in queued state for a long time, consider increasing this.",
14081410
Flag: "provisioner-daemons",
14091411
Env: "CODER_PROVISIONER_DAEMONS",
14101412
Default: "3",
1411-
Value: &c.Provisioner.Daemons,
1413+
Value: &c.Provisioner.DaemonsTerraform,
14121414
Group: &deploymentGroupProvisioning,
14131415
YAML: "daemons",
14141416
},
14151417
{
14161418
Name: "Echo Provisioner",
1417-
Description: "Whether to use echo provisioner daemons instead of Terraform. This is for E2E tests.",
1419+
Description: "Number of built-in echo provisioners to create on start. Can be done alongside actual terraform provisioners. This is for E2E tests.",
14181420
Flag: "provisioner-daemons-echo",
14191421
Env: "CODER_PROVISIONER_DAEMONS_ECHO",
14201422
Hidden: true,
1421-
Default: "false",
1423+
Default: "0",
14221424
Value: &c.Provisioner.DaemonsEcho,
14231425
Group: &deploymentGroupProvisioning,
14241426
YAML: "daemonsEcho",

0 commit comments

Comments
 (0)