From 32a12578f3b7d33951fa684abfc485a8b308fe5b Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Wed, 2 Sep 2015 13:39:57 +0100 Subject: [PATCH] Don't use go-dockerclient to en/decode inspects in the proxy --- proxy/common.go | 4 +-- proxy/inspect_container_interceptor.go | 26 ++++++++++----- proxy/inspect_exec_interceptor.go | 12 ++++--- proxy/json.go | 46 ++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 15 deletions(-) create mode 100644 proxy/json.go diff --git a/proxy/common.go b/proxy/common.go index 323b9611..7579cf99 100644 --- a/proxy/common.go +++ b/proxy/common.go @@ -105,8 +105,8 @@ func inspectContainerInPath(client *docker.Client, path string) (*docker.Contain return container, err } -func weaveContainerIPs(container *docker.Container) (mac string, ips []net.IP, nets []*net.IPNet, err error) { - stdout, stderr, err := callWeave("ps", container.ID) +func weaveContainerIPs(containerID string) (mac string, ips []net.IP, nets []*net.IPNet, err error) { + stdout, stderr, err := callWeave("ps", containerID) if err != nil || len(stderr) > 0 { err = errors.New(string(stderr)) return diff --git a/proxy/inspect_container_interceptor.go b/proxy/inspect_container_interceptor.go index 2010660b..59f9a062 100644 --- a/proxy/inspect_container_interceptor.go +++ b/proxy/inspect_container_interceptor.go @@ -3,7 +3,6 @@ package proxy import ( "net/http" - "github.com/fsouza/go-dockerclient" . "github.com/weaveworks/weave/common" ) @@ -18,26 +17,35 @@ func (i *inspectContainerInterceptor) InterceptResponse(r *http.Response) error return nil } - container := &docker.Container{} - if err := unmarshalResponseBody(r, container); err != nil { + container := map[string]interface{}{} + if err := unmarshalResponseBody(r, &container); err != nil { return err } if err := updateContainerNetworkSettings(container); err != nil { - Log.Warningf("Inspecting container %s failed: %s", container.ID, err) + Log.Warningf("Inspecting container %s failed: %s", container["Id"], err) } return marshalResponseBody(r, container) } -func updateContainerNetworkSettings(container *docker.Container) error { - mac, ips, nets, err := weaveContainerIPs(container) +func updateContainerNetworkSettings(container map[string]interface{}) error { + containerID, err := lookupString(container, "Id") + if err != nil { + return err + } + + mac, ips, nets, err := weaveContainerIPs(containerID) if err != nil || len(ips) == 0 { return err } - container.NetworkSettings.MacAddress = mac - container.NetworkSettings.IPAddress = ips[0].String() - container.NetworkSettings.IPPrefixLen, _ = nets[0].Mask.Size() + networkSettings, err := lookupObject(container, "NetworkSettings") + if err != nil { + return err + } + networkSettings["MacAddress"] = mac + networkSettings["IPAddress"] = ips[0].String() + networkSettings["IPPrefixLen"], _ = nets[0].Mask.Size() return nil } diff --git a/proxy/inspect_exec_interceptor.go b/proxy/inspect_exec_interceptor.go index d787fcdf..89707146 100644 --- a/proxy/inspect_exec_interceptor.go +++ b/proxy/inspect_exec_interceptor.go @@ -3,7 +3,6 @@ package proxy import ( "net/http" - "github.com/fsouza/go-dockerclient" . "github.com/weaveworks/weave/common" ) @@ -18,13 +17,18 @@ func (i *inspectExecInterceptor) InterceptResponse(r *http.Response) error { return nil } - exec := &docker.ExecInspect{} + exec := map[string]interface{}{} if err := unmarshalResponseBody(r, &exec); err != nil { return err } - if err := updateContainerNetworkSettings(&exec.Container); err != nil { - Log.Warningf("Inspecting exec %s failed: %s", exec.ID, err) + container, err := lookupObject(exec, "Container") + if err != nil { + return err + } + + if err := updateContainerNetworkSettings(container); err != nil { + Log.Warningf("Inspecting exec %s failed: %s", exec["Id"], err) } return marshalResponseBody(r, exec) diff --git a/proxy/json.go b/proxy/json.go new file mode 100644 index 00000000..d3728e18 --- /dev/null +++ b/proxy/json.go @@ -0,0 +1,46 @@ +package proxy + +import ( + "fmt" +) + +type UnmarshalWrongTypeError struct { + Field, Expected string + Got interface{} +} + +func (e *UnmarshalWrongTypeError) Error() string { + return fmt.Sprintf("Wrong type for %s field, expected %s, but got %T", e.Field, e.Expected, e.Got) +} + +// For parsing json objects. Look up (or create) a child object in the given map. +func lookupObject(m map[string]interface{}, key string) (map[string]interface{}, error) { + iface, ok := m[key] + if !ok || iface == nil { + result := map[string]interface{}{} + m[key] = result + return result, nil + } + + result, ok := iface.(map[string]interface{}) + if !ok { + return nil, &UnmarshalWrongTypeError{key, "object", iface} + } + + return result, nil +} + +// For parsing json objects. Look up (or create) a string in the given map. +func lookupString(m map[string]interface{}, key string) (string, error) { + iface, ok := m[key] + if !ok || iface == nil { + return "", nil + } + + result, ok := iface.(string) + if !ok { + return "", &UnmarshalWrongTypeError{key, "string", iface} + } + + return result, nil +}