From 24fe2c04e50719166fd8cfc18c428adf5f4f4d29 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Tue, 2 Feb 2016 14:53:34 -0800 Subject: [PATCH] support docker network ls --filter type=XXX Signed-off-by: Victor Vieux --- api/handlers.go | 10 +++++++- cluster/network.go | 39 ++++++++++++++++++++++++++----- cluster/network_test.go | 2 +- test/integration/api/network.bats | 28 ++++++++++++++++++++++ 4 files changed, 71 insertions(+), 8 deletions(-) diff --git a/api/handlers.go b/api/handlers.go index f0345db20c..e34ac36f75 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -245,8 +245,16 @@ func getNetworks(c *context, w http.ResponseWriter, r *http.Request) { return } + types := filters.Get("type") + for _, typ := range types { + if typ != "custom" && typ != "builtin" { + httpError(w, fmt.Sprintf("Invalid filter: 'type'='%s'", typ), http.StatusBadRequest) + return + } + } + out := []*dockerclient.NetworkResource{} - networks := c.cluster.Networks().Filter(filters.Get("name"), filters.Get("id")) + networks := c.cluster.Networks().Filter(filters.Get("name"), filters.Get("id"), types) for _, network := range networks { tmp := (*network).NetworkResource if tmp.Scope == "local" { diff --git a/cluster/network.go b/cluster/network.go index 4fb7a7dabb..b790564ac9 100644 --- a/cluster/network.go +++ b/cluster/network.go @@ -14,6 +14,10 @@ type Network struct { Engine *Engine } +func (network *Network) isPreDefined() bool { + return (network.Name == "none" || network.Name == "host" || network.Name == "bridge") +} + // Networks represents an array of networks type Networks []*Network @@ -37,17 +41,40 @@ func (networks Networks) Uniq() Networks { } // 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() +func (networks Networks) Filter(names []string, ids []string, types []string) Networks { + typeFilter := func(network *Network) bool { + if len(types) > 0 { + for _, typ := range types { + if typ == "custom" && !network.isPreDefined() { + return true + } + if typ == "builtin" && network.isPreDefined() { + return true + } + } + } else { + return true + } + return false } out := Networks{} - for _, idOrName := range append(names, ids...) { - if network := networks.Get(idOrName); network != nil { - out = append(out, network) + if len(names) == 0 && len(ids) == 0 { + for _, network := range networks.Uniq() { + if typeFilter(network) { + out = append(out, network) + } + } + } else { + for _, idOrName := range append(names, ids...) { + if network := networks.Get(idOrName); network != nil { + if typeFilter(network) { + out = append(out, network) + } + } } } + return out } diff --git a/cluster/network_test.go b/cluster/network_test.go index 9457a23aa5..577fa6e8e4 100644 --- a/cluster/network_test.go +++ b/cluster/network_test.go @@ -28,7 +28,7 @@ func TestNetworksFilter(t *testing.T) { }, engine}, } - filtered := networks.Filter([]string{"network_name"}, []string{"abababab"}) + filtered := networks.Filter([]string{"network_name"}, []string{"abababab"}, nil) assert.Equal(t, len(filtered), 2) for _, network := range filtered { assert.True(t, network.ID == "aaaaaaaaaa1" || network.ID == "ababababab") diff --git a/test/integration/api/network.bats b/test/integration/api/network.bats index c75f90aabd..fa9ad0048d 100644 --- a/test/integration/api/network.bats +++ b/test/integration/api/network.bats @@ -15,6 +15,34 @@ function teardown() { [ "${#lines[@]}" -eq 7 ] } +@test "docker network ls --filter type" { + # docker network ls --filter type is introduced in docker 1.10, skip older version without --filter type + run docker --version + if [[ "${output}" != "Docker version 1.1"* ]]; then + skip + fi + + start_docker 2 + swarm_manage + + run docker_swarm network ls --filter type=builtin + [ "${#lines[@]}" -eq 7 ] + + run docker_swarm network ls --filter type=custom + [ "${#lines[@]}" -eq 1 ] + + run docker_swarm network ls --filter type=foo + [ "$status" -ne 0 ] + + docker_swarm network create -d bridge test + run docker_swarm network ls + [ "${#lines[@]}" -eq 8 ] + + run docker_swarm network ls --filter type=custom + [ "${#lines[@]}" -eq 2 ] + +} + @test "docker network inspect" { start_docker_with_busybox 2 swarm_manage