From 98f0064fe900793b358bc30f7d8c2ffc14c5eac9 Mon Sep 17 00:00:00 2001 From: Guillaume Tardif Date: Thu, 10 Sep 2020 11:59:49 +0200 Subject: [PATCH] =?UTF-8?q?Properly=20send=20env=20variables=20containing?= =?UTF-8?q?=20=E2=80=9C=3D=E2=80=9C=20in=20their=20value=20in=20ACI=20payl?= =?UTF-8?q?oad.=20Also=20properly=20send=20quoted=20values?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guillaume Tardif --- aci/convert/container.go | 3 +-- aci/convert/container_test.go | 18 ++++++++++++++++++ aci/convert/convert.go | 13 +++++++++++++ api/containers/api.go | 10 ++++++++-- cli/cmd/testdata/inspect-out-id.golden | 2 -- tests/aci-e2e/e2e-aci_test.go | 10 ++++++++++ tests/e2e/testdata/inspect-id.golden | 2 -- 7 files changed, 50 insertions(+), 8 deletions(-) diff --git a/aci/convert/container.go b/aci/convert/container.go index 5d1d6e51f..131994cac 100644 --- a/aci/convert/container.go +++ b/aci/convert/container.go @@ -21,7 +21,6 @@ import ( "strings" "github.com/compose-spec/compose-go/types" - "github.com/docker/compose-cli/api/containers" ) @@ -71,7 +70,7 @@ func ContainerToComposeProject(r containers.ContainerConfig) (types.Project, err func toComposeEnvs(opts []string) types.MappingWithEquals { result := map[string]*string{} for _, env := range opts { - tokens := strings.Split(env, "=") + tokens := strings.SplitN(env, "=", 2) if len(tokens) > 1 { result[tokens[0]] = &tokens[1] } else { diff --git a/aci/convert/container_test.go b/aci/convert/container_test.go index 1227aa9ec..1f9efba0b 100644 --- a/aci/convert/container_test.go +++ b/aci/convert/container_test.go @@ -53,3 +53,21 @@ func TestConvertRestartPolicy(t *testing.T) { assert.Equal(t, service1.Name, container.ID) assert.Equal(t, service1.Deploy.RestartPolicy.Condition, "none") } + +func TestConvertEnvVariables(t *testing.T) { + container := containers.ContainerConfig{ + ID: "container1", + Environment: []string{ + "key=value", + "key2=value=with=equal", + }, + } + project, err := ContainerToComposeProject(container) + assert.NilError(t, err) + service1 := project.Services[0] + assert.Equal(t, service1.Name, container.ID) + assert.DeepEqual(t, service1.Environment, types.MappingWithEquals{ + "key": to.StringPtr("value"), + "key2": to.StringPtr("value=with=equal"), + }) +} diff --git a/aci/convert/convert.go b/aci/convert/convert.go index eb505b4c1..a6c8d0101 100644 --- a/aci/convert/convert.go +++ b/aci/convert/convert.go @@ -429,6 +429,18 @@ func ContainerGroupToContainer(containerID string, cg containerinstance.Containe status := GetStatus(cc, cg) platform := string(cg.OsType) + var envVars map[string]string = nil + if cc.EnvironmentVariables != nil && len(*cc.EnvironmentVariables) != 0 { + envVars = map[string]string{} + for _, envVar := range *cc.EnvironmentVariables { + envVars[*envVar.Name] = *envVar.Value + } + } + + var config *containers.RuntimeConfig = nil + if envVars != nil { + config = &containers.RuntimeConfig{Env: envVars} + } c := containers.Container{ ID: containerID, Status: status, @@ -444,6 +456,7 @@ func ContainerGroupToContainer(containerID string, cg containerinstance.Containe Ports: ToPorts(cg.IPAddress, *cc.Ports), Platform: platform, RestartPolicyCondition: toContainerRestartPolicy(cg.RestartPolicy), + Config: config, } return c diff --git a/api/containers/api.go b/api/containers/api.go index 565bcf233..8efbb4a1f 100644 --- a/api/containers/api.go +++ b/api/containers/api.go @@ -47,12 +47,18 @@ type Container struct { MemoryLimit uint64 PidsCurrent uint64 PidsLimit uint64 - Labels []string - Ports []Port + Config *RuntimeConfig `json:",omitempty"` + Labels []string `json:",omitempty"` + Ports []Port `json:",omitempty"` Platform string RestartPolicyCondition string } +// RuntimeConfig config of a created container +type RuntimeConfig struct { + Env map[string]string `json:",omitempty"` +} + // Port represents a published port of a container type Port struct { // HostPort is the port number on the host diff --git a/cli/cmd/testdata/inspect-out-id.golden b/cli/cmd/testdata/inspect-out-id.golden index db549f913..13c82d0d6 100644 --- a/cli/cmd/testdata/inspect-out-id.golden +++ b/cli/cmd/testdata/inspect-out-id.golden @@ -9,8 +9,6 @@ "MemoryLimit": 0, "PidsCurrent": 0, "PidsLimit": 0, - "Labels": null, - "Ports": null, "Platform": "Linux", "RestartPolicyCondition": "none" } diff --git a/tests/aci-e2e/e2e-aci_test.go b/tests/aci-e2e/e2e-aci_test.go index a31335d4c..ca9cc73e5 100644 --- a/tests/aci-e2e/e2e-aci_test.go +++ b/tests/aci-e2e/e2e-aci_test.go @@ -543,6 +543,7 @@ func TestRunEnvVars(t *testing.T) { "-e", "MYSQL_DATABASE=mytestdb", "-e", "MYSQL_USER", "-e", "MYSQL_PASSWORD=userpwd", + "-e", "DATASOURCE_URL=jdbc:mysql://mydb.mysql.database.azure.com/db1?useSSL=true&requireSSL=false&serverTimezone=America/Recife", "mysql:5.7", ) cmd.Env = append(cmd.Env, "MYSQL_USER=user1") @@ -555,7 +556,16 @@ func TestRunEnvVars(t *testing.T) { containerInspect, err := ParseContainerInspect(res.Stdout()) assert.NilError(t, err) + assert.Assert(t, containerInspect.Config != nil, "nil container config") + assert.Assert(t, containerInspect.Config.Env != nil, "nil container env variables") assert.Equal(t, containerInspect.Image, "mysql:5.7") + envVars := containerInspect.Config.Env + assert.Equal(t, len(envVars), 5) + assert.Equal(t, envVars["MYSQL_ROOT_PASSWORD"], "rootpwd") + assert.Equal(t, envVars["MYSQL_DATABASE"], "mytestdb") + assert.Equal(t, envVars["MYSQL_USER"], "user1") + assert.Equal(t, envVars["MYSQL_PASSWORD"], "userpwd") + assert.Equal(t, envVars["DATASOURCE_URL"], "jdbc:mysql://mydb.mysql.database.azure.com/db1?useSSL=true&requireSSL=false&serverTimezone=America/Recife") check := func(t poll.LogT) poll.Result { res := c.RunDockerOrExitError("logs", container) diff --git a/tests/e2e/testdata/inspect-id.golden b/tests/e2e/testdata/inspect-id.golden index db549f913..13c82d0d6 100644 --- a/tests/e2e/testdata/inspect-id.golden +++ b/tests/e2e/testdata/inspect-id.golden @@ -9,8 +9,6 @@ "MemoryLimit": 0, "PidsCurrent": 0, "PidsLimit": 0, - "Labels": null, - "Ports": null, "Platform": "Linux", "RestartPolicyCondition": "none" }