Skip to content

Commit

Permalink
Merge pull request #3371 from weaveworks/parse-labels
Browse files Browse the repository at this point in the history
Parse labels
  • Loading branch information
bboreham committed Aug 10, 2018
2 parents e669ac6 + 1814bbd commit 8fb3da6
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 5 deletions.
29 changes: 24 additions & 5 deletions prog/weaveutil/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,9 @@ func containerFQDN(args []string) error {
return nil
}

func runContainer(args []string) error {
func parseContainerArgs(args []string) docker.CreateContainerOptions {
env := []string{}
labels := map[string]string{}
name := ""
net := ""
pid := ""
Expand All @@ -109,6 +110,10 @@ func runContainer(args []string) error {
env = append(env, args[i+1])
}
args = append(args[:i], args[i+2:]...)
case "-l", "--label":
key, value := parseLabel(args[i+1])
labels[key] = value
args = append(args[:i], args[i+2:]...)
case "--name":
name = args[i+1]
args = append(args[:i], args[i+2:]...)
Expand Down Expand Up @@ -161,19 +166,25 @@ func runContainer(args []string) error {
image := args[0]
cmds := args[1:]

config := docker.Config{Image: image, Env: env, Cmd: cmds, Labels: labels}
hostConfig := docker.HostConfig{NetworkMode: net, PidMode: pid, Privileged: privileged, RestartPolicy: restart, Binds: volumes, VolumesFrom: volumesFrom}
return docker.CreateContainerOptions{Name: name, Config: &config, HostConfig: &hostConfig}
}

func runContainer(args []string) error {
containerOptions := parseContainerArgs(args)

c, err := docker.NewVersionedClientFromEnv("1.18")
if err != nil {
return fmt.Errorf("unable to connect to docker: %s", err)
}

config := docker.Config{Image: image, Env: env, Cmd: cmds}
hostConfig := docker.HostConfig{NetworkMode: net, PidMode: pid, Privileged: privileged, RestartPolicy: restart, Binds: volumes, VolumesFrom: volumesFrom}
container, err := c.CreateContainer(docker.CreateContainerOptions{Name: name, Config: &config, HostConfig: &hostConfig})
container, err := c.CreateContainer(containerOptions)
if err != nil {
return fmt.Errorf("unable to create container: %s", err)
}

err = c.StartContainer(container.ID, &hostConfig)
err = c.StartContainer(container.ID, containerOptions.HostConfig)
if err != nil {
return fmt.Errorf("unable to start container: %s", err)
}
Expand All @@ -182,6 +193,14 @@ func runContainer(args []string) error {
return nil
}

func parseLabel(s string) (key, value string) {
pos := strings.Index(s, "=")
if pos == -1 { // no value - set it to blank
return s, ""
}
return s[:pos], s[pos+1:]
}

func listContainers(args []string) error {
if len(args) > 1 {
cmdUsage("list-containers", "[<label>]")
Expand Down
36 changes: 36 additions & 0 deletions prog/weaveutil/container_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package main

import (
"testing"

docker "github.com/fsouza/go-dockerclient"
"github.com/stretchr/testify/require"
)

func TestParseContainerArgs(t *testing.T) {
args := []string{"--name", "weave", "--privileged", "--net", "host",
"-l", "foo=bar", "-l", "foobar",
"-v", "/var/run/docker.sock:/var/run/docker.sock", "-v", "/etc:/host/etc",
"--restart", "always", "--pid", "host", "--volumes-from", "weavedb",
"-e", "WEAVE_DEBUG", "-e", "EXEC_IMAGE=weaveworks/weaveexec:latest",
"weaveworks/weave:latest", "cmd", "arg1", "arg2"}
expected := docker.CreateContainerOptions{
Name: "weave",
Config: &docker.Config{
Image: "weaveworks/weave:latest",
Env: []string{"WEAVE_DEBUG", "EXEC_IMAGE=weaveworks/weaveexec:latest"},
Cmd: []string{"cmd", "arg1", "arg2"},
Labels: map[string]string{"foo": "bar", "foobar": ""},
},
HostConfig: &docker.HostConfig{
NetworkMode: "host",
PidMode: "host",
Privileged: true,
RestartPolicy: docker.RestartPolicy{Name: "always"},
Binds: []string{"/var/run/docker.sock:/var/run/docker.sock", "/etc:/host/etc"},
VolumesFrom: []string{"weavedb"},
},
}
have := parseContainerArgs(args)
require.Equal(t, expected, have)
}

0 comments on commit 8fb3da6

Please sign in to comment.