From 7cc53c4c6854c13a9e08fc3901753ba396161351 Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Mon, 3 Aug 2015 12:28:17 +0100 Subject: [PATCH] [proxy] Handle case where no command is specified. The docker daemon can't do this because we set /w/w. --- prog/weavewait/main.go | 14 ++++++++------ proxy/create_container_interceptor.go | 9 +++++++++ test/610_proxy_wait_for_weave_test.sh | 5 +++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/prog/weavewait/main.go b/prog/weavewait/main.go index 9b1151bf..d88e89f3 100644 --- a/prog/weavewait/main.go +++ b/prog/weavewait/main.go @@ -7,16 +7,14 @@ import ( "os/signal" "syscall" - "github.com/weaveworks/weave/net" + weavenet "github.com/weaveworks/weave/net" + "github.com/weaveworks/weave/proxy" ) func main() { - if len(os.Args) <= 1 { - os.Exit(0) - } args := os.Args[1:] - if args[0] == "-s" { + if len(args) > 0 && args[0] == "-s" { args = args[1:] } else { usr2 := make(chan os.Signal) @@ -24,9 +22,13 @@ func main() { <-usr2 } - _, err := net.EnsureInterface("ethwe", -1) + _, err := weavenet.EnsureInterface("ethwe", -1) checkErr(err) + if len(args) == 0 { + checkErr(proxy.ErrNoCommandSpecified) + } + binary, err := exec.LookPath(args[0]) checkErr(err) diff --git a/proxy/create_container_interceptor.go b/proxy/create_container_interceptor.go index 5b6bfd7b..42b60ed1 100644 --- a/proxy/create_container_interceptor.go +++ b/proxy/create_container_interceptor.go @@ -3,6 +3,7 @@ package proxy import ( "bytes" "encoding/json" + "errors" "fmt" "io/ioutil" "net/http" @@ -15,6 +16,10 @@ import ( const MaxDockerHostname = 64 +var ( + ErrNoCommandSpecified = errors.New("No command specified") +) + type createContainerInterceptor struct{ proxy *Proxy } type createContainerRequestBody struct { @@ -105,6 +110,10 @@ func (i *createContainerInterceptor) setWeaveWaitEntrypoint(container *docker.Co } } + if len(container.Entrypoint) == 0 && len(container.Cmd) == 0 { + return ErrNoCommandSpecified + } + if len(container.Entrypoint) == 0 || container.Entrypoint[0] != weaveWaitEntrypoint[0] { container.Entrypoint = append(weaveWaitEntrypoint, container.Entrypoint...) } diff --git a/test/610_proxy_wait_for_weave_test.sh b/test/610_proxy_wait_for_weave_test.sh index 1d5e1276..8abd4440 100755 --- a/test/610_proxy_wait_for_weave_test.sh +++ b/test/610_proxy_wait_for_weave_test.sh @@ -33,4 +33,9 @@ proxy docker_on $HOST1 create --name c4 -v /tmp/1:/srv1 -v /tmp/2:/srv2 -e 'WEAV proxy docker_on $HOST1 start -ai c4 assert "docker_on $HOST1 inspect --format='{{range \$k, \$v := .Volumes}}{{\$k}} {{end}}' c4" "/srv1 /srv2 /w " +# Check errors are returned (when docker returns an error code) +assert_raises "docker -H tcp://$HOST1:12375 run -e 'WEAVE_CIDR=10.2.1.3/24' $SMALL_IMAGE foo 2>&1 | grep 'exec: \"foo\": executable file not found in \$PATH'" +# Check errors still happen when no command is specified +assert_raises "docker -H tcp://$HOST1:12375 run -e 'WEAVE_CIDR=10.2.1.3/24' $SMALL_IMAGE 2>&1 | grep 'Error response from daemon: No command specified'" + end_suite