Skip to content

Commit 99d124e

Browse files
authored
feat(agent): enable devcontainers by default (#18533)
1 parent fcf9371 commit 99d124e

File tree

11 files changed

+59
-59
lines changed

11 files changed

+59
-59
lines changed

agent/agent.go

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,8 @@ type Options struct {
8989
ServiceBannerRefreshInterval time.Duration
9090
BlockFileTransfer bool
9191
Execer agentexec.Execer
92-
93-
ExperimentalDevcontainersEnabled bool
94-
ContainerAPIOptions []agentcontainers.Option // Enable ExperimentalDevcontainersEnabled for these to be effective.
92+
Devcontainers bool
93+
DevcontainerAPIOptions []agentcontainers.Option // Enable Devcontainers for these to be effective.
9594
}
9695

9796
type Client interface {
@@ -190,8 +189,8 @@ func New(options Options) Agent {
190189
metrics: newAgentMetrics(prometheusRegistry),
191190
execer: options.Execer,
192191

193-
experimentalDevcontainersEnabled: options.ExperimentalDevcontainersEnabled,
194-
containerAPIOptions: options.ContainerAPIOptions,
192+
devcontainers: options.Devcontainers,
193+
containerAPIOptions: options.DevcontainerAPIOptions,
195194
}
196195
// Initially, we have a closed channel, reflecting the fact that we are not initially connected.
197196
// Each time we connect we replace the channel (while holding the closeMutex) with a new one
@@ -272,9 +271,9 @@ type agent struct {
272271
metrics *agentMetrics
273272
execer agentexec.Execer
274273

275-
experimentalDevcontainersEnabled bool
276-
containerAPIOptions []agentcontainers.Option
277-
containerAPI atomic.Pointer[agentcontainers.API] // Set by apiHandler.
274+
devcontainers bool
275+
containerAPIOptions []agentcontainers.Option
276+
containerAPI atomic.Pointer[agentcontainers.API] // Set by apiHandler.
278277
}
279278

280279
func (a *agent) TailnetConn() *tailnet.Conn {
@@ -311,7 +310,7 @@ func (a *agent) init() {
311310
return a.reportConnection(id, connectionType, ip)
312311
},
313312

314-
ExperimentalDevContainersEnabled: a.experimentalDevcontainersEnabled,
313+
ExperimentalContainers: a.devcontainers,
315314
})
316315
if err != nil {
317316
panic(err)
@@ -340,7 +339,7 @@ func (a *agent) init() {
340339
a.metrics.connectionsTotal, a.metrics.reconnectingPTYErrors,
341340
a.reconnectingPTYTimeout,
342341
func(s *reconnectingpty.Server) {
343-
s.ExperimentalDevcontainersEnabled = a.experimentalDevcontainersEnabled
342+
s.ExperimentalContainers = a.devcontainers
344343
},
345344
)
346345
go a.runLoop()
@@ -1087,9 +1086,9 @@ func (a *agent) handleManifest(manifestOK *checkpoint) func(ctx context.Context,
10871086
slog.F("parent_id", manifest.ParentID),
10881087
slog.F("agent_id", manifest.AgentID),
10891088
)
1090-
if a.experimentalDevcontainersEnabled {
1089+
if a.devcontainers {
10911090
a.logger.Info(ctx, "devcontainers are not supported on sub agents, disabling feature")
1092-
a.experimentalDevcontainersEnabled = false
1091+
a.devcontainers = false
10931092
}
10941093
}
10951094
a.client.RewriteDERPMap(manifest.DERPMap)
@@ -1145,7 +1144,7 @@ func (a *agent) handleManifest(manifestOK *checkpoint) func(ctx context.Context,
11451144
scripts = manifest.Scripts
11461145
scriptRunnerOpts []agentscripts.InitOption
11471146
)
1148-
if a.experimentalDevcontainersEnabled {
1147+
if a.devcontainers {
11491148
var dcScripts []codersdk.WorkspaceAgentScript
11501149
scripts, dcScripts = agentcontainers.ExtractAndInitializeDevcontainerScripts(manifest.Devcontainers, scripts)
11511150
// See ExtractAndInitializeDevcontainerScripts for motivation

agent/agent_test.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1954,8 +1954,8 @@ func TestAgent_ReconnectingPTYContainer(t *testing.T) {
19541954

19551955
// nolint: dogsled
19561956
conn, _, _, _, _ := setupAgent(t, agentsdk.Manifest{}, 0, func(_ *agenttest.Client, o *agent.Options) {
1957-
o.ExperimentalDevcontainersEnabled = true
1958-
o.ContainerAPIOptions = append(o.ContainerAPIOptions,
1957+
o.Devcontainers = true
1958+
o.DevcontainerAPIOptions = append(o.DevcontainerAPIOptions,
19591959
agentcontainers.WithContainerLabelIncludeFilter("this.label.does.not.exist.ignore.devcontainers", "true"),
19601960
)
19611961
})
@@ -2161,9 +2161,9 @@ func TestAgent_DevcontainerAutostart(t *testing.T) {
21612161

21622162
//nolint:dogsled
21632163
_, agentClient, _, _, _ := setupAgent(t, manifest, 0, func(_ *agenttest.Client, o *agent.Options) {
2164-
o.ExperimentalDevcontainersEnabled = true
2165-
o.ContainerAPIOptions = append(
2166-
o.ContainerAPIOptions,
2164+
o.Devcontainers = true
2165+
o.DevcontainerAPIOptions = append(
2166+
o.DevcontainerAPIOptions,
21672167
// Only match this specific dev container.
21682168
agentcontainers.WithClock(mClock),
21692169
agentcontainers.WithContainerLabelIncludeFilter("devcontainer.local_folder", tempWorkspaceFolder),
@@ -2312,8 +2312,8 @@ func TestAgent_DevcontainerRecreate(t *testing.T) {
23122312

23132313
//nolint:dogsled
23142314
conn, client, _, _, _ := setupAgent(t, manifest, 0, func(_ *agenttest.Client, o *agent.Options) {
2315-
o.ExperimentalDevcontainersEnabled = true
2316-
o.ContainerAPIOptions = append(o.ContainerAPIOptions,
2315+
o.Devcontainers = true
2316+
o.DevcontainerAPIOptions = append(o.DevcontainerAPIOptions,
23172317
agentcontainers.WithContainerLabelIncludeFilter("devcontainer.local_folder", workspaceFolder),
23182318
)
23192319
})
@@ -2438,8 +2438,7 @@ func TestAgent_DevcontainersDisabledForSubAgent(t *testing.T) {
24382438

24392439
// Setup the agent with devcontainers enabled initially.
24402440
//nolint:dogsled
2441-
conn, _, _, _, _ := setupAgent(t, manifest, 0, func(_ *agenttest.Client, o *agent.Options) {
2442-
o.ExperimentalDevcontainersEnabled = true
2441+
conn, _, _, _, _ := setupAgent(t, manifest, 0, func(*agenttest.Client, *agent.Options) {
24432442
})
24442443

24452444
// Query the containers API endpoint. This should fail because

agent/agentssh/agentssh.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,10 @@ type Config struct {
113113
BlockFileTransfer bool
114114
// ReportConnection.
115115
ReportConnection reportConnectionFunc
116-
// Experimental: allow connecting to running containers if
117-
// CODER_AGENT_DEVCONTAINERS_ENABLE=true.
118-
ExperimentalDevContainersEnabled bool
116+
// Experimental: allow connecting to running containers via Docker exec.
117+
// Note that this is different from the devcontainers feature, which uses
118+
// subagents.
119+
ExperimentalContainers bool
119120
}
120121

121122
type Server struct {
@@ -435,7 +436,7 @@ func (s *Server) sessionHandler(session ssh.Session) {
435436
switch ss := session.Subsystem(); ss {
436437
case "":
437438
case "sftp":
438-
if s.config.ExperimentalDevContainersEnabled && container != "" {
439+
if s.config.ExperimentalContainers && container != "" {
439440
closeCause("sftp not yet supported with containers")
440441
_ = session.Exit(1)
441442
return
@@ -549,7 +550,7 @@ func (s *Server) sessionStart(logger slog.Logger, session ssh.Session, env []str
549550

550551
var ei usershell.EnvInfoer
551552
var err error
552-
if s.config.ExperimentalDevContainersEnabled && container != "" {
553+
if s.config.ExperimentalContainers && container != "" {
553554
ei, err = agentcontainers.EnvInfo(ctx, s.Execer, container, containerUser)
554555
if err != nil {
555556
s.metrics.sessionErrors.WithLabelValues(magicTypeLabel, ptyLabel, "container_env_info").Add(1)

agent/api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func (a *agent) apiHandler(aAPI proto.DRPCAgentClient26) (http.Handler, func() e
4040
cacheDuration: cacheDuration,
4141
}
4242

43-
if a.experimentalDevcontainersEnabled {
43+
if a.devcontainers {
4444
containerAPIOpts := []agentcontainers.Option{
4545
agentcontainers.WithExecer(a.execer),
4646
agentcontainers.WithCommandEnv(a.sshServer.CommandEnv),

agent/reconnectingpty/server.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ type Server struct {
3131
connCount atomic.Int64
3232
reconnectingPTYs sync.Map
3333
timeout time.Duration
34-
35-
ExperimentalDevcontainersEnabled bool
34+
// Experimental: allow connecting to running containers via Docker exec.
35+
// Note that this is different from the devcontainers feature, which uses
36+
// subagents.
37+
ExperimentalContainers bool
3638
}
3739

3840
// NewServer returns a new ReconnectingPTY server
@@ -187,7 +189,7 @@ func (s *Server) handleConn(ctx context.Context, logger slog.Logger, conn net.Co
187189
}()
188190

189191
var ei usershell.EnvInfoer
190-
if s.ExperimentalDevcontainersEnabled && msg.Container != "" {
192+
if s.ExperimentalContainers && msg.Container != "" {
191193
dei, err := agentcontainers.EnvInfo(ctx, s.commandCreator.Execer, msg.Container, msg.ContainerUser)
192194
if err != nil {
193195
return xerrors.Errorf("get container env info: %w", err)

cli/agent.go

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@ func (r *RootCmd) workspaceAgent() *serpent.Command {
5555
blockFileTransfer bool
5656
agentHeaderCommand string
5757
agentHeader []string
58-
59-
experimentalDevcontainersEnabled bool
58+
devcontainers bool
6059
)
6160
cmd := &serpent.Command{
6261
Use: "agent",
@@ -321,7 +320,7 @@ func (r *RootCmd) workspaceAgent() *serpent.Command {
321320
return xerrors.Errorf("create agent execer: %w", err)
322321
}
323322

324-
if experimentalDevcontainersEnabled {
323+
if devcontainers {
325324
logger.Info(ctx, "agent devcontainer detection enabled")
326325
} else {
327326
logger.Info(ctx, "agent devcontainer detection not enabled")
@@ -359,11 +358,11 @@ func (r *RootCmd) workspaceAgent() *serpent.Command {
359358
SSHMaxTimeout: sshMaxTimeout,
360359
Subsystems: subsystems,
361360

362-
PrometheusRegistry: prometheusRegistry,
363-
BlockFileTransfer: blockFileTransfer,
364-
Execer: execer,
365-
ExperimentalDevcontainersEnabled: experimentalDevcontainersEnabled,
366-
ContainerAPIOptions: []agentcontainers.Option{
361+
PrometheusRegistry: prometheusRegistry,
362+
BlockFileTransfer: blockFileTransfer,
363+
Execer: execer,
364+
Devcontainers: devcontainers,
365+
DevcontainerAPIOptions: []agentcontainers.Option{
367366
agentcontainers.WithSubAgentURL(r.agentURL.String()),
368367
},
369368
})
@@ -506,10 +505,10 @@ func (r *RootCmd) workspaceAgent() *serpent.Command {
506505
},
507506
{
508507
Flag: "devcontainers-enable",
509-
Default: "false",
508+
Default: "true",
510509
Env: "CODER_AGENT_DEVCONTAINERS_ENABLE",
511510
Description: "Allow the agent to automatically detect running devcontainers.",
512-
Value: serpent.BoolOf(&experimentalDevcontainersEnabled),
511+
Value: serpent.BoolOf(&devcontainers),
513512
},
514513
}
515514

cli/exp_rpty_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ func TestExpRpty(t *testing.T) {
116116
})
117117

118118
_ = agenttest.New(t, client.URL, agentToken, func(o *agent.Options) {
119-
o.ExperimentalDevcontainersEnabled = true
120-
o.ContainerAPIOptions = append(o.ContainerAPIOptions,
119+
o.Devcontainers = true
120+
o.DevcontainerAPIOptions = append(o.DevcontainerAPIOptions,
121121
agentcontainers.WithContainerLabelIncludeFilter(wantLabel, "true"),
122122
)
123123
})

cli/open_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -334,8 +334,8 @@ func TestOpenVSCodeDevContainer(t *testing.T) {
334334
})
335335

336336
_ = agenttest.New(t, client.URL, agentToken, func(o *agent.Options) {
337-
o.ExperimentalDevcontainersEnabled = true
338-
o.ContainerAPIOptions = append(o.ContainerAPIOptions,
337+
o.Devcontainers = true
338+
o.DevcontainerAPIOptions = append(o.DevcontainerAPIOptions,
339339
agentcontainers.WithContainerCLI(mccli),
340340
agentcontainers.WithContainerLabelIncludeFilter("this.label.does.not.exist.ignore.devcontainers", "true"),
341341
)
@@ -509,8 +509,8 @@ func TestOpenVSCodeDevContainer_NoAgentDirectory(t *testing.T) {
509509
})
510510

511511
_ = agenttest.New(t, client.URL, agentToken, func(o *agent.Options) {
512-
o.ExperimentalDevcontainersEnabled = true
513-
o.ContainerAPIOptions = append(o.ContainerAPIOptions,
512+
o.Devcontainers = true
513+
o.DevcontainerAPIOptions = append(o.DevcontainerAPIOptions,
514514
agentcontainers.WithContainerCLI(mccli),
515515
agentcontainers.WithContainerLabelIncludeFilter("this.label.does.not.exist.ignore.devcontainers", "true"),
516516
)

cli/ssh_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2029,8 +2029,8 @@ func TestSSH_Container(t *testing.T) {
20292029
})
20302030

20312031
_ = agenttest.New(t, client.URL, agentToken, func(o *agent.Options) {
2032-
o.ExperimentalDevcontainersEnabled = true
2033-
o.ContainerAPIOptions = append(o.ContainerAPIOptions,
2032+
o.Devcontainers = true
2033+
o.DevcontainerAPIOptions = append(o.DevcontainerAPIOptions,
20342034
agentcontainers.WithContainerLabelIncludeFilter("this.label.does.not.exist.ignore.devcontainers", "true"),
20352035
)
20362036
})
@@ -2069,8 +2069,8 @@ func TestSSH_Container(t *testing.T) {
20692069
Warnings: nil,
20702070
}, nil).AnyTimes()
20712071
_ = agenttest.New(t, client.URL, agentToken, func(o *agent.Options) {
2072-
o.ExperimentalDevcontainersEnabled = true
2073-
o.ContainerAPIOptions = append(o.ContainerAPIOptions,
2072+
o.Devcontainers = true
2073+
o.DevcontainerAPIOptions = append(o.DevcontainerAPIOptions,
20742074
agentcontainers.WithContainerCLI(mLister),
20752075
agentcontainers.WithContainerLabelIncludeFilter("this.label.does.not.exist.ignore.devcontainers", "true"),
20762076
)

cli/testdata/coder_agent_--help.golden

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ OPTIONS:
3333
--debug-address string, $CODER_AGENT_DEBUG_ADDRESS (default: 127.0.0.1:2113)
3434
The bind address to serve a debug HTTP server.
3535

36-
--devcontainers-enable bool, $CODER_AGENT_DEVCONTAINERS_ENABLE (default: false)
36+
--devcontainers-enable bool, $CODER_AGENT_DEVCONTAINERS_ENABLE (default: true)
3737
Allow the agent to automatically detect running devcontainers.
3838

3939
--log-dir string, $CODER_AGENT_LOG_DIR (default: /tmp)

coderd/workspaceagents_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,8 +1250,8 @@ func TestWorkspaceAgentContainers(t *testing.T) {
12501250
return agents
12511251
}).Do()
12521252
_ = agenttest.New(t, client.URL, r.AgentToken, func(o *agent.Options) {
1253-
o.ExperimentalDevcontainersEnabled = true
1254-
o.ContainerAPIOptions = append(o.ContainerAPIOptions,
1253+
o.Devcontainers = true
1254+
o.DevcontainerAPIOptions = append(o.DevcontainerAPIOptions,
12551255
agentcontainers.WithContainerLabelIncludeFilter("this.label.does.not.exist.ignore.devcontainers", "true"),
12561256
)
12571257
})
@@ -1358,8 +1358,8 @@ func TestWorkspaceAgentContainers(t *testing.T) {
13581358
}).Do()
13591359
_ = agenttest.New(t, client.URL, r.AgentToken, func(o *agent.Options) {
13601360
o.Logger = logger.Named("agent")
1361-
o.ExperimentalDevcontainersEnabled = true
1362-
o.ContainerAPIOptions = append(o.ContainerAPIOptions,
1361+
o.Devcontainers = true
1362+
o.DevcontainerAPIOptions = append(o.DevcontainerAPIOptions,
13631363
agentcontainers.WithContainerCLI(mcl),
13641364
agentcontainers.WithContainerLabelIncludeFilter("this.label.does.not.exist.ignore.devcontainers", "true"),
13651365
)
@@ -1473,9 +1473,9 @@ func TestWorkspaceAgentRecreateDevcontainer(t *testing.T) {
14731473
}).Do()
14741474
_ = agenttest.New(t, client.URL, r.AgentToken, func(o *agent.Options) {
14751475
o.Logger = logger.Named("agent")
1476-
o.ExperimentalDevcontainersEnabled = true
1477-
o.ContainerAPIOptions = append(
1478-
o.ContainerAPIOptions,
1476+
o.Devcontainers = true
1477+
o.DevcontainerAPIOptions = append(
1478+
o.DevcontainerAPIOptions,
14791479
agentcontainers.WithContainerCLI(mccli),
14801480
agentcontainers.WithDevcontainerCLI(mdccli),
14811481
agentcontainers.WithWatcher(watcher.NewNoop()),

0 commit comments

Comments
 (0)