Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 61246bc

Browse files
authored
fix(agent/agentcontainers): correct definition of remoteEnv (#16845)
`devcontainer.metadata` is apparently an array, not an object. Missed this first time round! ``` error= get container env info: github.com/coder/coder/v2/agent/reconnectingpty.(*Server).handleConn /home/runner/work/coder/coder/agent/reconnectingpty/server.go:193 - read devcontainer remoteEnv: github.com/coder/coder/v2/agent/agentcontainers.EnvInfo /home/runner/work/coder/coder/agent/agentcontainers/containers_dockercli.go:119 - unmarshal devcontainer.metadata: github.com/coder/coder/v2/agent/agentcontainers.devcontainerEnv /home/runner/work/coder/coder/agent/agentcontainers/containers_dockercli.go:189 - json: cannot unmarshal array into Go value of type struct { RemoteEnv map[string]string "json:\"remoteEnv\"" } ```
1 parent 32c36d5 commit 61246bc

File tree

3 files changed

+26
-12
lines changed

3 files changed

+26
-12
lines changed

agent/agentcontainers/containers_dockercli.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -182,17 +182,18 @@ func devcontainerEnv(ctx context.Context, execer agentexec.Execer, container str
182182
if !ok {
183183
return nil, nil
184184
}
185-
meta := struct {
186-
RemoteEnv map[string]string `json:"remoteEnv"`
187-
}{}
185+
186+
meta := make([]DevContainerMeta, 0)
188187
if err := json.Unmarshal([]byte(rawMeta), &meta); err != nil {
189188
return nil, xerrors.Errorf("unmarshal devcontainer.metadata: %w", err)
190189
}
191190

192191
// The environment variables are stored in the `remoteEnv` key.
193-
env := make([]string, 0, len(meta.RemoteEnv))
194-
for k, v := range meta.RemoteEnv {
195-
env = append(env, fmt.Sprintf("%s=%s", k, v))
192+
env := make([]string, 0)
193+
for _, m := range meta {
194+
for k, v := range m.RemoteEnv {
195+
env = append(env, fmt.Sprintf("%s=%s", k, v))
196+
}
196197
}
197198
slices.Sort(env)
198199
return env, nil

agent/agentcontainers/containers_internal_test.go

+14-6
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func TestIntegrationDocker(t *testing.T) {
5353
Cmd: []string{"sleep", "infnity"},
5454
Labels: map[string]string{
5555
"com.coder.test": testLabelValue,
56-
"devcontainer.metadata": `{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}`,
56+
"devcontainer.metadata": `[{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}]`,
5757
},
5858
Mounts: []string{testTempDir + ":" + testTempDir},
5959
ExposedPorts: []string{fmt.Sprintf("%d/tcp", testRandPort)},
@@ -437,38 +437,46 @@ func TestDockerEnvInfoer(t *testing.T) {
437437
}{
438438
{
439439
image: "busybox:latest",
440-
labels: map[string]string{`devcontainer.metadata`: `{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}`},
440+
labels: map[string]string{`devcontainer.metadata`: `[{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}]`},
441441

442442
expectedEnv: []string{"FOO=bar", "MULTILINE=foo\nbar\nbaz"},
443443
expectedUsername: "root",
444444
expectedUserShell: "/bin/sh",
445445
},
446446
{
447447
image: "busybox:latest",
448-
labels: map[string]string{`devcontainer.metadata`: `{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}`},
448+
labels: map[string]string{`devcontainer.metadata`: `[{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}]`},
449449
expectedEnv: []string{"FOO=bar", "MULTILINE=foo\nbar\nbaz"},
450450
containerUser: "root",
451451
expectedUsername: "root",
452452
expectedUserShell: "/bin/sh",
453453
},
454454
{
455455
image: "codercom/enterprise-minimal:ubuntu",
456-
labels: map[string]string{`devcontainer.metadata`: `{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}`},
456+
labels: map[string]string{`devcontainer.metadata`: `[{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}]`},
457457
expectedEnv: []string{"FOO=bar", "MULTILINE=foo\nbar\nbaz"},
458458
expectedUsername: "coder",
459459
expectedUserShell: "/bin/bash",
460460
},
461461
{
462462
image: "codercom/enterprise-minimal:ubuntu",
463-
labels: map[string]string{`devcontainer.metadata`: `{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}`},
463+
labels: map[string]string{`devcontainer.metadata`: `[{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}]`},
464464
expectedEnv: []string{"FOO=bar", "MULTILINE=foo\nbar\nbaz"},
465465
containerUser: "coder",
466466
expectedUsername: "coder",
467467
expectedUserShell: "/bin/bash",
468468
},
469469
{
470470
image: "codercom/enterprise-minimal:ubuntu",
471-
labels: map[string]string{`devcontainer.metadata`: `{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}`},
471+
labels: map[string]string{`devcontainer.metadata`: `[{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}]`},
472+
expectedEnv: []string{"FOO=bar", "MULTILINE=foo\nbar\nbaz"},
473+
containerUser: "root",
474+
expectedUsername: "root",
475+
expectedUserShell: "/bin/bash",
476+
},
477+
{
478+
image: "codercom/enterprise-minimal:ubuntu",
479+
labels: map[string]string{`devcontainer.metadata`: `[{"remoteEnv": {"FOO": "bar"}},{"remoteEnv": {"MULTILINE": "foo\nbar\nbaz"}}]`},
472480
expectedEnv: []string{"FOO=bar", "MULTILINE=foo\nbar\nbaz"},
473481
containerUser: "root",
474482
expectedUsername: "root",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package agentcontainers
2+
3+
type DevContainerMeta struct {
4+
RemoteEnv map[string]string `json:"remoteEnv,omitempty"`
5+
}

0 commit comments

Comments
 (0)