From cdd42a5c6b4e77604d6fd2e9bd394d484d66581d Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Tue, 15 Dec 2015 16:55:06 -0800 Subject: [PATCH] display all the containers that are part of a global network on inspect update godeps Signed-off-by: Victor Vieux --- Godeps/Godeps.json | 2 +- .../github.com/samalba/dockerclient/types.go | 4 +- api/handlers.go | 14 +++--- cluster/network.go | 8 +++- cluster/network_test.go | 46 +++++++++++++++++++ test/integration/api/network.bats | 2 + 6 files changed, 67 insertions(+), 9 deletions(-) diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 28b7ba951e..bfa2851099 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -131,7 +131,7 @@ }, { "ImportPath": "github.com/samalba/dockerclient", - "Rev": "4656b1bc6cbc06b75d65983475e4809cbd53ebb5" + "Rev": "0197eaa42571af873532ba11499f6ccdf16a5f3a" }, { "ImportPath": "github.com/samuel/go-zookeeper/zk", diff --git a/Godeps/_workspace/src/github.com/samalba/dockerclient/types.go b/Godeps/_workspace/src/github.com/samalba/dockerclient/types.go index 95dcb42d2b..37c99d4f59 100644 --- a/Godeps/_workspace/src/github.com/samalba/dockerclient/types.go +++ b/Godeps/_workspace/src/github.com/samalba/dockerclient/types.go @@ -502,10 +502,12 @@ type NetworkResource struct { Driver string IPAM IPAM Containers map[string]EndpointResource + Options map[string]string } -//EndpointResource contains network resources allocated and usd for a container in a network +// EndpointResource contains network resources allocated and used for a container in a network type EndpointResource struct { + Name string EndpointID string MacAddress string IPv4Address string diff --git a/api/handlers.go b/api/handlers.go index 62cd1e229e..3e341b0615 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -785,11 +785,8 @@ func ping(c *context, w http.ResponseWriter, r *http.Request) { func proxyNetwork(c *context, w http.ResponseWriter, r *http.Request) { var id = mux.Vars(r)["networkid"] if network := c.cluster.Networks().Uniq().Get(id); network != nil { - - // Set the network ID in the proxied URL path. - r.URL.Path = strings.Replace(r.URL.Path, id, network.ID, 1) - - proxy(c.tlsConfig, network.Engine.Addr, w, r) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(network) return } httpError(w, fmt.Sprintf("No such network: %s", id), http.StatusNotFound) @@ -835,8 +832,13 @@ func proxyNetworkContainerOperation(c *context, w http.ResponseWriter, r *http.R return } + cb := func(resp *http.Response) { + // force fresh networks on this engine + container.Engine.RefreshNetworks() + } + // request is forwarded to the container's address - if err := proxy(c.tlsConfig, container.Engine.Addr, w, r); err != nil { + if err := proxyAsync(c.tlsConfig, container.Engine.Addr, w, r, cb); err != nil { httpError(w, err.Error(), http.StatusNotFound) } } diff --git a/cluster/network.go b/cluster/network.go index 214cdcd8e2..498c15e74a 100644 --- a/cluster/network.go +++ b/cluster/network.go @@ -21,7 +21,13 @@ type Networks []*Network func (networks Networks) Uniq() Networks { tmp := make(map[string]*Network) for _, network := range networks { - tmp[network.ID] = network + if _, ok := tmp[network.ID]; ok { + for id, endpoint := range network.Containers { + tmp[network.ID].Containers[id] = endpoint + } + } else { + tmp[network.ID] = network + } } uniq := Networks{} for _, network := range tmp { diff --git a/cluster/network_test.go b/cluster/network_test.go index 7bd88c2167..9457a23aa5 100644 --- a/cluster/network_test.go +++ b/cluster/network_test.go @@ -34,3 +34,49 @@ func TestNetworksFilter(t *testing.T) { assert.True(t, network.ID == "aaaaaaaaaa1" || network.ID == "ababababab") } } + +func TestNetworkUniq(t *testing.T) { + engine1 := &Engine{ID: "id1"} + engine2 := &Engine{ID: "id2"} + networks := Networks{ + {dockerclient.NetworkResource{ + ID: "global", + Name: "global", + Containers: map[string]dockerclient.EndpointResource{ + "c1": {}, + }, + }, engine1}, + {dockerclient.NetworkResource{ + ID: "global", + Name: "global", + Containers: map[string]dockerclient.EndpointResource{ + "c2": {}, + }, + }, engine2}, + {dockerclient.NetworkResource{ + ID: "local1", + Name: "local", + Containers: map[string]dockerclient.EndpointResource{ + "c3": {}, + }, + }, engine1}, + {dockerclient.NetworkResource{ + ID: "local2", + Name: "local", + Containers: map[string]dockerclient.EndpointResource{ + "c4": {}, + }, + }, engine2}, + } + + global := networks.Uniq().Get("global") + assert.NotNil(t, global) + assert.Equal(t, 2, len(global.Containers)) + + local1 := networks.Uniq().Get("local1") + assert.NotNil(t, local1) + assert.Equal(t, 1, len(local1.Containers)) + + local3 := networks.Uniq().Get("local3") + assert.Nil(t, local3) +} diff --git a/test/integration/api/network.bats b/test/integration/api/network.bats index 60825eb7bd..344a4d150e 100644 --- a/test/integration/api/network.bats +++ b/test/integration/api/network.bats @@ -25,6 +25,8 @@ function teardown() { run docker_swarm network inspect bridge [ "$status" -ne 0 ] + sleep 1 + run docker_swarm network inspect node-0/bridge [[ "${output}" != *"\"Containers\": {}"* ]]