display all the containers that are part of a global network on inspect

update godeps

Signed-off-by: Victor Vieux <victorvieux@gmail.com>
This commit is contained in:
Victor Vieux 2015-12-15 16:55:06 -08:00
parent 7291ec144c
commit cdd42a5c6b
6 changed files with 67 additions and 9 deletions

2
Godeps/Godeps.json generated
View File

@ -131,7 +131,7 @@
},
{
"ImportPath": "github.com/samalba/dockerclient",
"Rev": "4656b1bc6cbc06b75d65983475e4809cbd53ebb5"
"Rev": "0197eaa42571af873532ba11499f6ccdf16a5f3a"
},
{
"ImportPath": "github.com/samuel/go-zookeeper/zk",

View File

@ -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

View File

@ -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)
}
}

View File

@ -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 {

View File

@ -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)
}

View File

@ -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\": {}"* ]]