From c6fa9cb17edc6614d51ac55f8b0a2d1a047ae318 Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Thu, 16 Jul 2015 14:42:20 +0100 Subject: [PATCH] refactor weaveCIDRsFromConfig to return an error message --- proxy/create_container_interceptor.go | 4 +++- proxy/create_exec_interceptor.go | 6 ++++-- proxy/proxy.go | 31 +++++++++++++-------------- proxy/start_container_interceptor.go | 10 +++------ 4 files changed, 25 insertions(+), 26 deletions(-) diff --git a/proxy/create_container_interceptor.go b/proxy/create_container_interceptor.go index da038b21..574b5c01 100644 --- a/proxy/create_container_interceptor.go +++ b/proxy/create_container_interceptor.go @@ -46,7 +46,9 @@ func (i *createContainerInterceptor) InterceptRequest(r *http.Request) error { return err } - if cidrs, ok := i.proxy.weaveCIDRsFromConfig(container.Config, container.HostConfig); ok { + if cidrs, err := i.proxy.weaveCIDRsFromConfig(container.Config, container.HostConfig); err != nil { + Info.Printf("Ignoring container due to %s", err) + } else { Info.Printf("Creating container with WEAVE_CIDR \"%s\"", strings.Join(cidrs, " ")) if container.HostConfig == nil { container.HostConfig = &docker.HostConfig{} diff --git a/proxy/create_exec_interceptor.go b/proxy/create_exec_interceptor.go index d8a15815..f15ed56f 100644 --- a/proxy/create_exec_interceptor.go +++ b/proxy/create_exec_interceptor.go @@ -30,8 +30,10 @@ func (i *createExecInterceptor) InterceptRequest(r *http.Request) error { } _, hasWeaveWait := container.Volumes["/w"] - cidrs, hasCIDRs := i.proxy.weaveCIDRsFromConfig(container.Config, container.HostConfig) - if hasCIDRs && hasWeaveWait { + cidrs, err := i.proxy.weaveCIDRsFromConfig(container.Config, container.HostConfig) + if err != nil { + Info.Printf("Ignoring container %s due to %s", container.ID, err) + } else if hasWeaveWait { Info.Printf("Exec in container %s with WEAVE_CIDR \"%s\"", container.ID, strings.Join(cidrs, " ")) cmd := append(weaveWaitEntrypoint, "-s") options.Cmd = append(cmd, options.Cmd...) diff --git a/proxy/proxy.go b/proxy/proxy.go index 2e29b844..d454a06c 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -2,6 +2,7 @@ package proxy import ( "crypto/tls" + "errors" "net" "net/http" "net/url" @@ -22,6 +23,10 @@ var ( containerCreateRegexp = regexp.MustCompile("^(/v[0-9\\.]*)?/containers/create$") containerStartRegexp = regexp.MustCompile("^(/v[0-9\\.]*)?/containers/[^/]*/(re)?start$") execCreateRegexp = regexp.MustCompile("^(/v[0-9\\.]*)?/containers/[^/]*/exec$") + + ErrInvalidNetworkMode = errors.New("--net option") + ErrWeaveCIDRNone = errors.New("WEAVE_CIDR=none") + ErrNoDefaultIPAM = errors.New("--no-default-ipam option") ) type Proxy struct { @@ -115,28 +120,22 @@ func (proxy *Proxy) ListenAndServe() error { return (&http.Server{Handler: proxy}).Serve(listener) } -func (proxy *Proxy) weaveCIDRsFromConfig(config *docker.Config, hostConfig *docker.HostConfig) ([]string, bool) { - if !validNetworkMode(hostConfig) { - return nil, false +func (proxy *Proxy) weaveCIDRsFromConfig(config *docker.Config, hostConfig *docker.HostConfig) ([]string, error) { + if hostConfig != nil && + hostConfig.NetworkMode != "" && + hostConfig.NetworkMode != "bridge" { + return nil, ErrInvalidNetworkMode } for _, e := range config.Env { if strings.HasPrefix(e, "WEAVE_CIDR=") { if e[11:] == "none" { - return nil, false + return nil, ErrWeaveCIDRNone } - return strings.Fields(e[11:]), true + return strings.Fields(e[11:]), nil } } - return nil, !proxy.NoDefaultIPAM -} - -func validNetworkMode(hostConfig *docker.HostConfig) bool { - return networkMode(hostConfig) == "bridge" -} - -func networkMode(hostConfig *docker.HostConfig) string { - if hostConfig == nil || hostConfig.NetworkMode == "" { - return "bridge" + if proxy.NoDefaultIPAM { + return nil, ErrNoDefaultIPAM } - return hostConfig.NetworkMode + return nil, nil } diff --git a/proxy/start_container_interceptor.go b/proxy/start_container_interceptor.go index b020fd34..803ca869 100644 --- a/proxy/start_container_interceptor.go +++ b/proxy/start_container_interceptor.go @@ -21,13 +21,9 @@ func (i *startContainerInterceptor) InterceptResponse(r *http.Response) error { return err } - if !validNetworkMode(container.HostConfig) { - Debug.Printf("Ignoring container %s with --net=%s", container.ID, networkMode(container.HostConfig)) - return nil - } - cidrs, ok := i.proxy.weaveCIDRsFromConfig(container.Config, container.HostConfig) - if !ok { - Debug.Print("No Weave CIDR, ignoring") + cidrs, err := i.proxy.weaveCIDRsFromConfig(container.Config, container.HostConfig) + if err != nil { + Info.Printf("Ignoring container %s due to %s", container.ID, err) return nil } Info.Printf("Attaching container %s with WEAVE_CIDR \"%s\" to weave network", container.ID, strings.Join(cidrs, " "))