Skip to content

Commit 04727c0

Browse files
authored
chore: add experiment toggle for terraform workspace caching (#20559)
Experiments passed to provisioners to determine behavior. This adds `--experiments` flag to provisioner daemons. Prior to this, provisioners had no method to turn on/off experiments.
1 parent ac2c161 commit 04727c0

File tree

15 files changed

+65
-15
lines changed

15 files changed

+65
-15
lines changed

cli/server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1476,6 +1476,7 @@ func newProvisionerDaemon(
14761476
Listener: terraformServer,
14771477
Logger: provisionerLogger,
14781478
WorkDirectory: workDir,
1479+
Experiments: coderAPI.Experiments,
14791480
},
14801481
CachePath: tfDir,
14811482
Tracer: tracer,

coderd/apidoc/docs.go

Lines changed: 5 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

Lines changed: 5 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/coderd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1999,6 +1999,7 @@ func (api *API) CreateInMemoryTaggedProvisionerDaemon(dialCtx context.Context, n
19991999
api.NotificationsEnqueuer,
20002000
&api.PrebuildsReconciler,
20012001
api.ProvisionerdServerMetrics,
2002+
api.Experiments,
20022003
)
20032004
if err != nil {
20042005
return nil, err

coderd/provisionerdserver/provisionerdserver.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ type server struct {
121121
NotificationsEnqueuer notifications.Enqueuer
122122
PrebuildsOrchestrator *atomic.Pointer[prebuilds.ReconciliationOrchestrator]
123123
UsageInserter *atomic.Pointer[usage.Inserter]
124+
Experiments codersdk.Experiments
124125

125126
OIDCConfig promoauth.OAuth2Config
126127

@@ -182,6 +183,7 @@ func NewServer(
182183
enqueuer notifications.Enqueuer,
183184
prebuildsOrchestrator *atomic.Pointer[prebuilds.ReconciliationOrchestrator],
184185
metrics *Metrics,
186+
experiments codersdk.Experiments,
185187
) (proto.DRPCProvisionerDaemonServer, error) {
186188
// Fail-fast if pointers are nil
187189
if lifecycleCtx == nil {
@@ -253,6 +255,7 @@ func NewServer(
253255
PrebuildsOrchestrator: prebuildsOrchestrator,
254256
UsageInserter: usageInserter,
255257
metrics: metrics,
258+
Experiments: experiments,
256259
}
257260

258261
if s.heartbeatFn == nil {

coderd/provisionerdserver/provisionerdserver_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"storj.io/drpc"
2727

2828
"cdr.dev/slog/sloggers/slogtest"
29+
"github.com/coder/coder/v2/coderd"
2930
"github.com/coder/coder/v2/coderd/util/ptr"
3031
"github.com/coder/quartz"
3132
"github.com/coder/serpent"
@@ -4162,7 +4163,7 @@ func setup(t *testing.T, ignoreLogErrors bool, ov *overrides) (proto.DRPCProvisi
41624163
defOrg, err := db.GetDefaultOrganization(context.Background())
41634164
require.NoError(t, err, "default org not found")
41644165

4165-
deploymentValues := &codersdk.DeploymentValues{}
4166+
deploymentValues := coderdtest.DeploymentValues(t)
41664167
var externalAuthConfigs []*externalauth.Config
41674168
tss := testTemplateScheduleStore()
41684169
uqhss := testUserQuietHoursScheduleStore()
@@ -4285,6 +4286,7 @@ func setup(t *testing.T, ignoreLogErrors bool, ov *overrides) (proto.DRPCProvisi
42854286
notifEnq,
42864287
&op,
42874288
provisionerdserver.NewMetrics(logger),
4289+
coderd.ReadExperiments(logger, deploymentValues.Experiments),
42884290
)
42894291
require.NoError(t, err)
42904292
return srv, db, ps, daemon

codersdk/deployment.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3646,6 +3646,8 @@ const (
36463646
ExperimentOAuth2 Experiment = "oauth2" // Enables OAuth2 provider functionality.
36473647
ExperimentMCPServerHTTP Experiment = "mcp-server-http" // Enables the MCP HTTP server functionality.
36483648
ExperimentWorkspaceSharing Experiment = "workspace-sharing" // Enables updating workspace ACLs for sharing with users and groups.
3649+
// ExperimentTerraformWorkspace uses the "Terraform Workspaces" feature, not to be confused with Coder Workspaces.
3650+
ExperimentTerraformWorkspace Experiment = "terraform-directory-reuse" // Enables reuse of existing terraform directory for builds
36493651
)
36503652

36513653
func (e Experiment) DisplayName() string {
@@ -3666,6 +3668,8 @@ func (e Experiment) DisplayName() string {
36663668
return "MCP HTTP Server Functionality"
36673669
case ExperimentWorkspaceSharing:
36683670
return "Workspace Sharing"
3671+
case ExperimentTerraformWorkspace:
3672+
return "Terraform Directory Reuse"
36693673
default:
36703674
// Split on hyphen and convert to title case
36713675
// e.g. "web-push" -> "Web Push", "mcp-server-http" -> "Mcp Server Http"

docs/reference/api/schemas.md

Lines changed: 11 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/cli/provisioner_start.md

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

enterprise/cli/provisionerdaemonstart.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/coder/coder/v2/cli/clilog"
2424
"github.com/coder/coder/v2/cli/cliui"
2525
"github.com/coder/coder/v2/cli/cliutil"
26+
"github.com/coder/coder/v2/coderd"
2627
"github.com/coder/coder/v2/coderd/database"
2728
"github.com/coder/coder/v2/codersdk"
2829
"github.com/coder/coder/v2/codersdk/drpcsdk"
@@ -48,6 +49,7 @@ func (r *RootCmd) provisionerDaemonStart() *serpent.Command {
4849
preSharedKey string
4950
provisionerKey string
5051
verbose bool
52+
experiments []string
5153

5254
prometheusEnable bool
5355
prometheusAddress string
@@ -186,6 +188,7 @@ func (r *RootCmd) provisionerDaemonStart() *serpent.Command {
186188
Listener: terraformServer,
187189
Logger: logger.Named("terraform"),
188190
WorkDirectory: tempDir,
191+
Experiments: coderd.ReadExperiments(logger, experiments),
189192
},
190193
CachePath: cacheDir,
191194
})
@@ -378,6 +381,14 @@ func (r *RootCmd) provisionerDaemonStart() *serpent.Command {
378381
Value: serpent.StringOf(&prometheusAddress),
379382
Default: "127.0.0.1:2112",
380383
},
384+
{
385+
Name: "Experiments",
386+
Description: "Enable one or more experiments. These are not ready for production. Separate multiple experiments with commas, or enter '*' to opt-in to all available experiments.",
387+
Flag: "experiments",
388+
Env: "CODER_EXPERIMENTS",
389+
Value: serpent.StringArrayOf(&experiments),
390+
YAML: "experiments",
391+
},
381392
}
382393
orgContext.AttachOptions(cmd)
383394

0 commit comments

Comments
 (0)