Skip to content

Commit 0ef6226

Browse files
fix(agent/agentcontainers): treat customizations as array (#18357)
This PR fixes a mistake from the previous PR #18342. Merged configuration results in the customization being an array not an object. This PR also moves `displayApps` from being an array to being an object, like the terraform provider has.
1 parent 949ab4b commit 0ef6226

File tree

5 files changed

+97
-21
lines changed

5 files changed

+97
-21
lines changed

agent/agentcontainers/api.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,14 +1099,33 @@ func (api *API) injectSubAgentIntoContainerLocked(ctx context.Context, dc coders
10991099
directory = DevcontainerDefaultContainerWorkspaceFolder
11001100
}
11011101

1102-
var displayApps []codersdk.DisplayApp
1102+
displayAppsMap := map[codersdk.DisplayApp]bool{
1103+
// NOTE(DanielleMaywood):
1104+
// We use the same defaults here as set in terraform-provider-coder.
1105+
// https://github.com/coder/terraform-provider-coder/blob/c1c33f6d556532e75662c0ca373ed8fdea220eb5/provider/agent.go#L38-L51
1106+
codersdk.DisplayAppVSCodeDesktop: true,
1107+
codersdk.DisplayAppVSCodeInsiders: false,
1108+
codersdk.DisplayAppWebTerminal: true,
1109+
codersdk.DisplayAppSSH: true,
1110+
codersdk.DisplayAppPortForward: true,
1111+
}
11031112

11041113
if config, err := api.dccli.ReadConfig(ctx, dc.WorkspaceFolder, dc.ConfigPath); err != nil {
11051114
api.logger.Error(ctx, "unable to read devcontainer config", slog.Error(err))
11061115
} else {
11071116
coderCustomization := config.MergedConfiguration.Customizations.Coder
1108-
if coderCustomization != nil {
1109-
displayApps = coderCustomization.DisplayApps
1117+
1118+
for _, customization := range coderCustomization {
1119+
for app, enabled := range customization.DisplayApps {
1120+
displayAppsMap[app] = enabled
1121+
}
1122+
}
1123+
}
1124+
1125+
displayApps := make([]codersdk.DisplayApp, 0, len(displayAppsMap))
1126+
for app, enabled := range displayAppsMap {
1127+
if enabled {
1128+
displayApps = append(displayApps, app)
11101129
}
11111130
}
11121131

agent/agentcontainers/api_test.go

Lines changed: 60 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,27 +1450,76 @@ func TestAPI(t *testing.T) {
14501450

14511451
tests := []struct {
14521452
name string
1453-
customization *agentcontainers.CoderCustomization
1453+
customization []agentcontainers.CoderCustomization
14541454
afterCreate func(t *testing.T, subAgent agentcontainers.SubAgent)
14551455
}{
14561456
{
14571457
name: "WithoutCustomization",
14581458
customization: nil,
14591459
},
14601460
{
1461-
name: "WithDisplayApps",
1462-
customization: &agentcontainers.CoderCustomization{
1463-
DisplayApps: []codersdk.DisplayApp{
1464-
codersdk.DisplayAppSSH,
1465-
codersdk.DisplayAppWebTerminal,
1466-
codersdk.DisplayAppVSCodeInsiders,
1461+
name: "WithDefaultDisplayApps",
1462+
customization: []agentcontainers.CoderCustomization{},
1463+
afterCreate: func(t *testing.T, subAgent agentcontainers.SubAgent) {
1464+
require.Len(t, subAgent.DisplayApps, 4)
1465+
assert.Contains(t, subAgent.DisplayApps, codersdk.DisplayAppVSCodeDesktop)
1466+
assert.Contains(t, subAgent.DisplayApps, codersdk.DisplayAppWebTerminal)
1467+
assert.Contains(t, subAgent.DisplayApps, codersdk.DisplayAppSSH)
1468+
assert.Contains(t, subAgent.DisplayApps, codersdk.DisplayAppPortForward)
1469+
},
1470+
},
1471+
{
1472+
name: "WithAllDisplayApps",
1473+
customization: []agentcontainers.CoderCustomization{
1474+
{
1475+
DisplayApps: map[codersdk.DisplayApp]bool{
1476+
codersdk.DisplayAppSSH: true,
1477+
codersdk.DisplayAppWebTerminal: true,
1478+
codersdk.DisplayAppVSCodeDesktop: true,
1479+
codersdk.DisplayAppVSCodeInsiders: true,
1480+
codersdk.DisplayAppPortForward: true,
1481+
},
1482+
},
1483+
},
1484+
afterCreate: func(t *testing.T, subAgent agentcontainers.SubAgent) {
1485+
require.Len(t, subAgent.DisplayApps, 5)
1486+
assert.Contains(t, subAgent.DisplayApps, codersdk.DisplayAppSSH)
1487+
assert.Contains(t, subAgent.DisplayApps, codersdk.DisplayAppWebTerminal)
1488+
assert.Contains(t, subAgent.DisplayApps, codersdk.DisplayAppVSCodeDesktop)
1489+
assert.Contains(t, subAgent.DisplayApps, codersdk.DisplayAppVSCodeInsiders)
1490+
assert.Contains(t, subAgent.DisplayApps, codersdk.DisplayAppPortForward)
1491+
},
1492+
},
1493+
{
1494+
name: "WithSomeDisplayAppsDisabled",
1495+
customization: []agentcontainers.CoderCustomization{
1496+
{
1497+
DisplayApps: map[codersdk.DisplayApp]bool{
1498+
codersdk.DisplayAppSSH: false,
1499+
codersdk.DisplayAppWebTerminal: false,
1500+
codersdk.DisplayAppVSCodeInsiders: false,
1501+
1502+
// We'll enable vscode in this layer, and disable
1503+
// it in the next layer to ensure a layer can be
1504+
// disabled.
1505+
codersdk.DisplayAppVSCodeDesktop: true,
1506+
1507+
// We disable port-forward in this layer, and
1508+
// then re-enable it in the next layer to ensure
1509+
// that behavior works.
1510+
codersdk.DisplayAppPortForward: false,
1511+
},
1512+
},
1513+
{
1514+
DisplayApps: map[codersdk.DisplayApp]bool{
1515+
codersdk.DisplayAppVSCodeDesktop: false,
1516+
codersdk.DisplayAppPortForward: true,
1517+
},
14671518
},
14681519
},
14691520
afterCreate: func(t *testing.T, subAgent agentcontainers.SubAgent) {
1470-
require.Len(t, subAgent.DisplayApps, 3)
1471-
assert.Equal(t, codersdk.DisplayAppSSH, subAgent.DisplayApps[0])
1472-
assert.Equal(t, codersdk.DisplayAppWebTerminal, subAgent.DisplayApps[1])
1473-
assert.Equal(t, codersdk.DisplayAppVSCodeInsiders, subAgent.DisplayApps[2])
1521+
require.Len(t, subAgent.DisplayApps, 1)
1522+
assert.Contains(t, subAgent.DisplayApps, codersdk.DisplayAppPortForward)
14741523
},
14751524
},
14761525
}

agent/agentcontainers/devcontainercli.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ type DevcontainerConfiguration struct {
2727
}
2828

2929
type DevcontainerCustomizations struct {
30-
Coder *CoderCustomization `json:"coder,omitempty"`
30+
Coder []CoderCustomization `json:"coder,omitempty"`
3131
}
3232

3333
type CoderCustomization struct {
34-
DisplayApps []codersdk.DisplayApp `json:"displayApps,omitempty"`
34+
DisplayApps map[codersdk.DisplayApp]bool `json:"displayApps,omitempty"`
3535
}
3636

3737
// DevcontainerCLI is an interface for the devcontainer CLI.

agent/agentcontainers/devcontainercli_test.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,10 +258,18 @@ func TestDevcontainerCLI_ArgsAndParsing(t *testing.T) {
258258
wantConfig: agentcontainers.DevcontainerConfig{
259259
MergedConfiguration: agentcontainers.DevcontainerConfiguration{
260260
Customizations: agentcontainers.DevcontainerCustomizations{
261-
Coder: &agentcontainers.CoderCustomization{
262-
DisplayApps: []codersdk.DisplayApp{
263-
codersdk.DisplayAppVSCodeDesktop,
264-
codersdk.DisplayAppWebTerminal,
261+
Coder: []agentcontainers.CoderCustomization{
262+
{
263+
DisplayApps: map[codersdk.DisplayApp]bool{
264+
codersdk.DisplayAppVSCodeDesktop: true,
265+
codersdk.DisplayAppWebTerminal: true,
266+
},
267+
},
268+
{
269+
DisplayApps: map[codersdk.DisplayApp]bool{
270+
codersdk.DisplayAppVSCodeInsiders: true,
271+
codersdk.DisplayAppWebTerminal: false,
272+
},
265273
},
266274
},
267275
},

agent/agentcontainers/testdata/devcontainercli/readconfig/read-config-with-coder-customization.log

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)