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"` +} pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy