From a9874aba63defcb3303ea73ab2781bbe599be8c7 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Fri, 7 Mar 2025 15:01:09 +0000 Subject: [PATCH] fix(agent/agentcontainers): correct definition of remoteEnv --- agent/agentcontainers/containers_dockercli.go | 13 ++++++------ .../containers_internal_test.go | 20 +++++++++++++------ agent/agentcontainers/devcontainer_meta.go | 5 +++++ 3 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 agent/agentcontainers/devcontainer_meta.go diff --git a/agent/agentcontainers/containers_dockercli.go b/agent/agentcontainers/containers_dockercli.go index 5218153bde427..4d4bd68ee0f10 100644 --- a/agent/agentcontainers/containers_dockercli.go +++ b/agent/agentcontainers/containers_dockercli.go @@ -182,17 +182,18 @@ func devcontainerEnv(ctx context.Context, execer agentexec.Execer, container str if !ok { return nil, nil } - meta := struct { - RemoteEnv map[string]string `json:"remoteEnv"` - }{} + + meta := make([]DevContainerMeta, 0) if err := json.Unmarshal([]byte(rawMeta), &meta); err != nil { return nil, xerrors.Errorf("unmarshal devcontainer.metadata: %w", err) } // The environment variables are stored in the `remoteEnv` key. - env := make([]string, 0, len(meta.RemoteEnv)) - for k, v := range meta.RemoteEnv { - env = append(env, fmt.Sprintf("%s=%s", k, v)) + env := make([]string, 0) + for _, m := range meta { + for k, v := range m.RemoteEnv { + env = append(env, fmt.Sprintf("%s=%s", k, v)) + } } slices.Sort(env) return env, nil diff --git a/agent/agentcontainers/containers_internal_test.go b/agent/agentcontainers/containers_internal_test.go index d48b95ebd74a6..fc3928229f2f5 100644 --- a/agent/agentcontainers/containers_internal_test.go +++ b/agent/agentcontainers/containers_internal_test.go @@ -53,7 +53,7 @@ func TestIntegrationDocker(t *testing.T) { Cmd: []string{"sleep", "infnity"}, Labels: map[string]string{ "com.coder.test": testLabelValue, - "devcontainer.metadata": `{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}`, + "devcontainer.metadata": `[{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}]`, }, Mounts: []string{testTempDir + ":" + testTempDir}, ExposedPorts: []string{fmt.Sprintf("%d/tcp", testRandPort)}, @@ -437,7 +437,7 @@ func TestDockerEnvInfoer(t *testing.T) { }{ { image: "busybox:latest", - labels: map[string]string{`devcontainer.metadata`: `{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}`}, + labels: map[string]string{`devcontainer.metadata`: `[{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}]`}, expectedEnv: []string{"FOO=bar", "MULTILINE=foo\nbar\nbaz"}, expectedUsername: "root", @@ -445,7 +445,7 @@ func TestDockerEnvInfoer(t *testing.T) { }, { image: "busybox:latest", - labels: map[string]string{`devcontainer.metadata`: `{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}`}, + labels: map[string]string{`devcontainer.metadata`: `[{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}]`}, expectedEnv: []string{"FOO=bar", "MULTILINE=foo\nbar\nbaz"}, containerUser: "root", expectedUsername: "root", @@ -453,14 +453,14 @@ func TestDockerEnvInfoer(t *testing.T) { }, { image: "codercom/enterprise-minimal:ubuntu", - labels: map[string]string{`devcontainer.metadata`: `{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}`}, + labels: map[string]string{`devcontainer.metadata`: `[{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}]`}, expectedEnv: []string{"FOO=bar", "MULTILINE=foo\nbar\nbaz"}, expectedUsername: "coder", expectedUserShell: "/bin/bash", }, { image: "codercom/enterprise-minimal:ubuntu", - labels: map[string]string{`devcontainer.metadata`: `{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}`}, + labels: map[string]string{`devcontainer.metadata`: `[{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}]`}, expectedEnv: []string{"FOO=bar", "MULTILINE=foo\nbar\nbaz"}, containerUser: "coder", expectedUsername: "coder", @@ -468,7 +468,15 @@ func TestDockerEnvInfoer(t *testing.T) { }, { image: "codercom/enterprise-minimal:ubuntu", - labels: map[string]string{`devcontainer.metadata`: `{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}`}, + labels: map[string]string{`devcontainer.metadata`: `[{"remoteEnv": {"FOO": "bar", "MULTILINE": "foo\nbar\nbaz"}}]`}, + expectedEnv: []string{"FOO=bar", "MULTILINE=foo\nbar\nbaz"}, + containerUser: "root", + expectedUsername: "root", + expectedUserShell: "/bin/bash", + }, + { + image: "codercom/enterprise-minimal:ubuntu", + labels: map[string]string{`devcontainer.metadata`: `[{"remoteEnv": {"FOO": "bar"}},{"remoteEnv": {"MULTILINE": "foo\nbar\nbaz"}}]`}, expectedEnv: []string{"FOO=bar", "MULTILINE=foo\nbar\nbaz"}, containerUser: "root", expectedUsername: "root", diff --git a/agent/agentcontainers/devcontainer_meta.go b/agent/agentcontainers/devcontainer_meta.go new file mode 100644 index 0000000000000..39ae4ff39b17c --- /dev/null +++ b/agent/agentcontainers/devcontainer_meta.go @@ -0,0 +1,5 @@ +package agentcontainers + +type DevContainerMeta struct { + RemoteEnv map[string]string `json:"remoteEnv,omitempty"` +}