Skip to content

Commit 6f24977

Browse files
committed
Merge branch 'jjs/presets-api' into jjs/presets
2 parents 7c5de39 + af4eb7f commit 6f24977

39 files changed

+514
-358
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -809,7 +809,7 @@ provisioner/terraform/testdata/version:
809809
.PHONY: provisioner/terraform/testdata/version
810810

811811
test:
812-
$(GIT_FLAGS) gotestsum --format standard-quiet -- -v -short -count=1 ./...
812+
$(GIT_FLAGS) gotestsum --format standard-quiet -- -v -short -count=1 ./... $(if $(RUN),-run $(RUN))
813813
.PHONY: test
814814

815815
test-cli:

agent/agentcontainers/containers.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,10 @@ type Lister interface {
140140
// This should include running and stopped containers.
141141
List(ctx context.Context) (codersdk.WorkspaceAgentListContainersResponse, error)
142142
}
143+
144+
// NoopLister is a Lister interface that never returns any containers.
145+
type NoopLister struct{}
146+
147+
func (NoopLister) List(_ context.Context) (codersdk.WorkspaceAgentListContainersResponse, error) {
148+
return codersdk.WorkspaceAgentListContainersResponse{}, nil
149+
}

cli/agent.go

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"cdr.dev/slog/sloggers/slogjson"
2626
"cdr.dev/slog/sloggers/slogstackdriver"
2727
"github.com/coder/coder/v2/agent"
28+
"github.com/coder/coder/v2/agent/agentcontainers"
2829
"github.com/coder/coder/v2/agent/agentexec"
2930
"github.com/coder/coder/v2/agent/agentssh"
3031
"github.com/coder/coder/v2/agent/reaper"
@@ -37,21 +38,22 @@ import (
3738

3839
func (r *RootCmd) workspaceAgent() *serpent.Command {
3940
var (
40-
auth string
41-
logDir string
42-
scriptDataDir string
43-
pprofAddress string
44-
noReap bool
45-
sshMaxTimeout time.Duration
46-
tailnetListenPort int64
47-
prometheusAddress string
48-
debugAddress string
49-
slogHumanPath string
50-
slogJSONPath string
51-
slogStackdriverPath string
52-
blockFileTransfer bool
53-
agentHeaderCommand string
54-
agentHeader []string
41+
auth string
42+
logDir string
43+
scriptDataDir string
44+
pprofAddress string
45+
noReap bool
46+
sshMaxTimeout time.Duration
47+
tailnetListenPort int64
48+
prometheusAddress string
49+
debugAddress string
50+
slogHumanPath string
51+
slogJSONPath string
52+
slogStackdriverPath string
53+
blockFileTransfer bool
54+
agentHeaderCommand string
55+
agentHeader []string
56+
devcontainersEnabled bool
5557
)
5658
cmd := &serpent.Command{
5759
Use: "agent",
@@ -314,6 +316,15 @@ func (r *RootCmd) workspaceAgent() *serpent.Command {
314316
return xerrors.Errorf("create agent execer: %w", err)
315317
}
316318

319+
var containerLister agentcontainers.Lister
320+
if !devcontainersEnabled {
321+
logger.Info(ctx, "agent devcontainer detection not enabled")
322+
containerLister = &agentcontainers.NoopLister{}
323+
} else {
324+
logger.Info(ctx, "agent devcontainer detection enabled")
325+
containerLister = agentcontainers.NewDocker(execer)
326+
}
327+
317328
agnt := agent.New(agent.Options{
318329
Client: client,
319330
Logger: logger,
@@ -339,6 +350,7 @@ func (r *RootCmd) workspaceAgent() *serpent.Command {
339350
PrometheusRegistry: prometheusRegistry,
340351
BlockFileTransfer: blockFileTransfer,
341352
Execer: execer,
353+
ContainerLister: containerLister,
342354
})
343355

344356
promHandler := agent.PrometheusMetricsHandler(prometheusRegistry, logger)
@@ -461,6 +473,13 @@ func (r *RootCmd) workspaceAgent() *serpent.Command {
461473
Description: fmt.Sprintf("Block file transfer using known applications: %s.", strings.Join(agentssh.BlockedFileTransferCommands, ",")),
462474
Value: serpent.BoolOf(&blockFileTransfer),
463475
},
476+
{
477+
Flag: "devcontainers-enable",
478+
Default: "false",
479+
Env: "CODER_AGENT_DEVCONTAINERS_ENABLE",
480+
Description: "Allow the agent to automatically detect running devcontainers.",
481+
Value: serpent.BoolOf(&devcontainersEnabled),
482+
},
464483
}
465484

466485
return cmd

cli/testdata/coder_agent_--help.golden

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ 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)
37+
Allow the agent to automatically detect running devcontainers.
38+
3639
--log-dir string, $CODER_AGENT_LOG_DIR (default: /tmp)
3740
Specify the location for the agent log files.
3841

cli/testdata/coder_provisioner_list_--help.golden

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ OPTIONS:
1111
-O, --org string, $CODER_ORGANIZATION
1212
Select which organization (uuid or name) to use.
1313

14-
-c, --column [id|organization id|created at|last seen at|name|version|api version|tags|key name|status|current job id|current job status|previous job id|previous job status|organization] (default: name,organization,status,key name,created at,last seen at,version,tags)
14+
-c, --column [id|organization id|created at|last seen at|name|version|api version|tags|key name|status|current job id|current job status|current job template name|current job template icon|current job template display name|previous job id|previous job status|previous job template name|previous job template icon|previous job template display name|organization] (default: name,organization,status,key name,created at,last seen at,version,tags)
1515
Columns to display in table output.
1616

1717
-o, --output table|json (default: table)

cli/testdata/coder_provisioner_list_--output_json.golden

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@
2020
"current_job": null,
2121
"previous_job": {
2222
"id": "======[workspace build job ID]======",
23-
"status": "succeeded"
23+
"status": "succeeded",
24+
"template_name": "",
25+
"template_icon": "",
26+
"template_display_name": ""
2427
},
2528
"organization_name": "Coder"
2629
}

cli/testdata/coder_tokens_remove_--help.golden

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
coder v0.0.0-devel
22

33
USAGE:
4-
coder tokens remove <name>
4+
coder tokens remove <name|id|token>
55

66
Delete a token
77

cli/tokens.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cli
33
import (
44
"fmt"
55
"os"
6+
"strings"
67
"time"
78

89
"golang.org/x/exp/slices"
@@ -223,7 +224,7 @@ func (r *RootCmd) listTokens() *serpent.Command {
223224
func (r *RootCmd) removeToken() *serpent.Command {
224225
client := new(codersdk.Client)
225226
cmd := &serpent.Command{
226-
Use: "remove <name>",
227+
Use: "remove <name|id|token>",
227228
Aliases: []string{"delete"},
228229
Short: "Delete a token",
229230
Middleware: serpent.Chain(
@@ -233,7 +234,12 @@ func (r *RootCmd) removeToken() *serpent.Command {
233234
Handler: func(inv *serpent.Invocation) error {
234235
token, err := client.APIKeyByName(inv.Context(), codersdk.Me, inv.Args[0])
235236
if err != nil {
236-
return xerrors.Errorf("fetch api key by name %s: %w", inv.Args[0], err)
237+
// If it's a token, we need to extract the ID
238+
maybeID := strings.Split(inv.Args[0], "-")[0]
239+
token, err = client.APIKeyByID(inv.Context(), codersdk.Me, maybeID)
240+
if err != nil {
241+
return xerrors.Errorf("fetch api key by name or id: %w", err)
242+
}
237243
}
238244

239245
err = client.DeleteAPIKey(inv.Context(), codersdk.Me, token.ID)

cli/tokens_test.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func TestTokens(t *testing.T) {
9393
require.Contains(t, res, secondTokenID)
9494

9595
// Test creating a token for third user from second user's (non-admin) session
96-
inv, root = clitest.New(t, "tokens", "create", "--name", "token-two", "--user", thirdUser.ID.String())
96+
inv, root = clitest.New(t, "tokens", "create", "--name", "failed-token", "--user", thirdUser.ID.String())
9797
clitest.SetupConfig(t, secondUserClient, root)
9898
buf = new(bytes.Buffer)
9999
inv.Stdout = buf
@@ -113,6 +113,7 @@ func TestTokens(t *testing.T) {
113113
require.Len(t, tokens, 1)
114114
require.Equal(t, id, tokens[0].ID)
115115

116+
// Delete by name
116117
inv, root = clitest.New(t, "tokens", "rm", "token-one")
117118
clitest.SetupConfig(t, client, root)
118119
buf = new(bytes.Buffer)
@@ -122,4 +123,37 @@ func TestTokens(t *testing.T) {
122123
res = buf.String()
123124
require.NotEmpty(t, res)
124125
require.Contains(t, res, "deleted")
126+
127+
// Delete by ID
128+
inv, root = clitest.New(t, "tokens", "rm", secondTokenID)
129+
clitest.SetupConfig(t, client, root)
130+
buf = new(bytes.Buffer)
131+
inv.Stdout = buf
132+
err = inv.WithContext(ctx).Run()
133+
require.NoError(t, err)
134+
res = buf.String()
135+
require.NotEmpty(t, res)
136+
require.Contains(t, res, "deleted")
137+
138+
// Create third token
139+
inv, root = clitest.New(t, "tokens", "create", "--name", "token-three")
140+
clitest.SetupConfig(t, client, root)
141+
buf = new(bytes.Buffer)
142+
inv.Stdout = buf
143+
err = inv.WithContext(ctx).Run()
144+
require.NoError(t, err)
145+
res = buf.String()
146+
require.NotEmpty(t, res)
147+
fourthToken := res
148+
149+
// Delete by token
150+
inv, root = clitest.New(t, "tokens", "rm", fourthToken)
151+
clitest.SetupConfig(t, client, root)
152+
buf = new(bytes.Buffer)
153+
inv.Stdout = buf
154+
err = inv.WithContext(ctx).Run()
155+
require.NoError(t, err)
156+
res = buf.String()
157+
require.NotEmpty(t, res)
158+
require.Contains(t, res, "deleted")
125159
}

coderd/apidoc/docs.go

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

0 commit comments

Comments
 (0)