diff --git a/api/handlers.go b/api/handlers.go index cd51ef7fd0..43d0224b88 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -171,8 +171,20 @@ func getImagesJSON(c *context, w http.ResponseWriter, r *http.Request) { // GET /networks func getNetworks(c *context, w http.ResponseWriter, r *http.Request) { + if err := r.ParseForm(); err != nil { + httpError(w, err.Error(), http.StatusInternalServerError) + return + } + + filters, err := dockerfilters.FromParam(r.Form.Get("filters")) + if err != nil { + httpError(w, err.Error(), http.StatusBadRequest) + return + } + out := []*dockerclient.NetworkResource{} - for _, network := range c.cluster.Networks().Uniq() { + networks := c.cluster.Networks().Filter(filters["name"], filters["id"]) + for _, network := range networks { tmp := (*network).NetworkResource if tmp.Scope == "local" { tmp.Name = network.Engine.Name + "/" + network.Name diff --git a/cluster/network.go b/cluster/network.go index 6c4e535ae9..214cdcd8e2 100644 --- a/cluster/network.go +++ b/cluster/network.go @@ -30,6 +30,21 @@ func (networks Networks) Uniq() Networks { return uniq } +// Filter returns networks filtered by names or ids +func (networks Networks) Filter(names []string, ids []string) Networks { + if len(names) == 0 && len(ids) == 0 { + return networks.Uniq() + } + + out := Networks{} + for _, idOrName := range append(names, ids...) { + if network := networks.Get(idOrName); network != nil { + out = append(out, network) + } + } + return out +} + // Get returns a network using it's ID or Name func (networks Networks) Get(IDOrName string) *Network { // Abort immediately if the name is empty. @@ -78,5 +93,4 @@ func (networks Networks) Get(IDOrName string) *Network { } return nil - } diff --git a/cluster/network_test.go b/cluster/network_test.go new file mode 100644 index 0000000000..7bd88c2167 --- /dev/null +++ b/cluster/network_test.go @@ -0,0 +1,36 @@ +package cluster + +import ( + "testing" + + "github.com/samalba/dockerclient" + "github.com/stretchr/testify/assert" +) + +func TestNetworksFilter(t *testing.T) { + engine := &Engine{ID: "id"} + networks := Networks{ + {dockerclient.NetworkResource{ + ID: "ababababab", + Name: "something", + }, engine}, + {dockerclient.NetworkResource{ + ID: "aaaaaaaaaa1", + Name: "network_name", + }, engine}, + {dockerclient.NetworkResource{ + ID: "bbbbbbbbbb", + Name: "somethingelse", + }, engine}, + {dockerclient.NetworkResource{ + ID: "aaaaaaaaa2", + Name: "foo", + }, engine}, + } + + filtered := networks.Filter([]string{"network_name"}, []string{"abababab"}) + assert.Equal(t, len(filtered), 2) + for _, network := range filtered { + assert.True(t, network.ID == "aaaaaaaaaa1" || network.ID == "ababababab") + } +}