mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Merge pull request #31551 from KarthikNayak/dry_run
Network: add support for 'dangling' filter
This commit is contained in:
commit
ba641fef28
3 changed files with 90 additions and 8 deletions
|
@ -118,6 +118,7 @@ var acceptedFilters = map[string]bool{
|
||||||
"id": true,
|
"id": true,
|
||||||
"label": true,
|
"label": true,
|
||||||
"scope": true,
|
"scope": true,
|
||||||
|
"dangling": true,
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidateFilters validates the list of filter args with the available filters.
|
// ValidateFilters validates the list of filter args with the available filters.
|
||||||
|
|
|
@ -3,6 +3,7 @@ package network // import "github.com/docker/docker/daemon/network"
|
||||||
import (
|
import (
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/filters"
|
"github.com/docker/docker/api/types/filters"
|
||||||
|
"github.com/docker/docker/errdefs"
|
||||||
"github.com/docker/docker/runconfig"
|
"github.com/docker/docker/runconfig"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
@ -51,6 +52,24 @@ func FilterNetworks(nws []types.NetworkResource, filter filters.Args) ([]types.N
|
||||||
displayNet = append(displayNet, nw)
|
displayNet = append(displayNet, nw)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if values := filter.Get("dangling"); len(values) > 0 {
|
||||||
|
if len(values) > 1 {
|
||||||
|
return nil, errdefs.InvalidParameter(errors.New(`got more than one value for filter key "dangling"`))
|
||||||
|
}
|
||||||
|
|
||||||
|
var danglingOnly bool
|
||||||
|
switch values[0] {
|
||||||
|
case "0", "false":
|
||||||
|
// dangling is false already
|
||||||
|
case "1", "true":
|
||||||
|
danglingOnly = true
|
||||||
|
default:
|
||||||
|
return nil, errdefs.InvalidParameter(errors.New(`invalid value for filter 'dangling', must be "true" (or "1"), or "false" (or "0")`))
|
||||||
|
}
|
||||||
|
|
||||||
|
displayNet = filterNetworkByUse(displayNet, danglingOnly)
|
||||||
|
}
|
||||||
|
|
||||||
if filter.Contains("type") {
|
if filter.Contains("type") {
|
||||||
typeNet := []types.NetworkResource{}
|
typeNet := []types.NetworkResource{}
|
||||||
errFilter := filter.WalkValues("type", func(fval string) error {
|
errFilter := filter.WalkValues("type", func(fval string) error {
|
||||||
|
@ -70,6 +89,25 @@ func FilterNetworks(nws []types.NetworkResource, filter filters.Args) ([]types.N
|
||||||
return displayNet, nil
|
return displayNet, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func filterNetworkByUse(nws []types.NetworkResource, danglingOnly bool) []types.NetworkResource {
|
||||||
|
retNws := []types.NetworkResource{}
|
||||||
|
|
||||||
|
filterFunc := func(nw types.NetworkResource) bool {
|
||||||
|
if danglingOnly {
|
||||||
|
return !runconfig.IsPreDefinedNetwork(nw.Name) && len(nw.Containers) == 0 && len(nw.Services) == 0
|
||||||
|
}
|
||||||
|
return runconfig.IsPreDefinedNetwork(nw.Name) || len(nw.Containers) > 0 || len(nw.Services) > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, nw := range nws {
|
||||||
|
if filterFunc(nw) {
|
||||||
|
retNws = append(retNws, nw)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return retNws
|
||||||
|
}
|
||||||
|
|
||||||
func filterNetworkByType(nws []types.NetworkResource, netType string) ([]types.NetworkResource, error) {
|
func filterNetworkByType(nws []types.NetworkResource, netType string) ([]types.NetworkResource, error) {
|
||||||
retNws := []types.NetworkResource{}
|
retNws := []types.NetworkResource{}
|
||||||
switch netType {
|
switch netType {
|
||||||
|
|
|
@ -42,6 +42,16 @@ func TestFilterNetworks(t *testing.T) {
|
||||||
Driver: "mykvdriver",
|
Driver: "mykvdriver",
|
||||||
Scope: "global",
|
Scope: "global",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "networkwithcontainer",
|
||||||
|
Driver: "nwc",
|
||||||
|
Scope: "local",
|
||||||
|
Containers: map[string]types.EndpointResource{
|
||||||
|
"customcontainer": {
|
||||||
|
Name: "customendpoint",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
bridgeDriverFilters := filters.NewArgs()
|
bridgeDriverFilters := filters.NewArgs()
|
||||||
|
@ -71,11 +81,18 @@ func TestFilterNetworks(t *testing.T) {
|
||||||
globalScopeFilters := filters.NewArgs()
|
globalScopeFilters := filters.NewArgs()
|
||||||
globalScopeFilters.Add("scope", "global")
|
globalScopeFilters.Add("scope", "global")
|
||||||
|
|
||||||
|
trueDanglingFilters := filters.NewArgs()
|
||||||
|
trueDanglingFilters.Add("dangling", "true")
|
||||||
|
|
||||||
|
falseDanglingFilters := filters.NewArgs()
|
||||||
|
falseDanglingFilters.Add("dangling", "false")
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
filter filters.Args
|
filter filters.Args
|
||||||
resultCount int
|
resultCount int
|
||||||
err string
|
err string
|
||||||
name string
|
name string
|
||||||
|
results []string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
filter: bridgeDriverFilters,
|
filter: bridgeDriverFilters,
|
||||||
|
@ -97,7 +114,7 @@ func TestFilterNetworks(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
filter: customDriverFilters,
|
filter: customDriverFilters,
|
||||||
resultCount: 3,
|
resultCount: 4,
|
||||||
err: "",
|
err: "",
|
||||||
name: "custom driver filters",
|
name: "custom driver filters",
|
||||||
},
|
},
|
||||||
|
@ -115,7 +132,7 @@ func TestFilterNetworks(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
filter: localScopeFilters,
|
filter: localScopeFilters,
|
||||||
resultCount: 4,
|
resultCount: 5,
|
||||||
err: "",
|
err: "",
|
||||||
name: "local scope filters",
|
name: "local scope filters",
|
||||||
},
|
},
|
||||||
|
@ -131,6 +148,20 @@ func TestFilterNetworks(t *testing.T) {
|
||||||
err: "",
|
err: "",
|
||||||
name: "global scope filters",
|
name: "global scope filters",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
filter: trueDanglingFilters,
|
||||||
|
resultCount: 3,
|
||||||
|
err: "",
|
||||||
|
name: "dangling filter is 'True'",
|
||||||
|
results: []string{"myoverlay", "mydrivernet", "mykvnet"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filter: falseDanglingFilters,
|
||||||
|
resultCount: 4,
|
||||||
|
err: "",
|
||||||
|
name: "dangling filter is 'False'",
|
||||||
|
results: []string{"host", "bridge", "none", "networkwithcontainer"},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, testCase := range testCases {
|
for _, testCase := range testCases {
|
||||||
|
@ -157,6 +188,18 @@ func TestFilterNetworks(t *testing.T) {
|
||||||
if len(result) != testCase.resultCount {
|
if len(result) != testCase.resultCount {
|
||||||
t.Fatalf("expect '%d' networks, got '%d' networks", testCase.resultCount, len(result))
|
t.Fatalf("expect '%d' networks, got '%d' networks", testCase.resultCount, len(result))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(testCase.results) > 0 {
|
||||||
|
resultMap := make(map[string]bool)
|
||||||
|
for _, r := range result {
|
||||||
|
resultMap[r.Name] = true
|
||||||
|
}
|
||||||
|
for _, r := range testCase.results {
|
||||||
|
if _, ok := resultMap[r]; !ok {
|
||||||
|
t.Fatalf("expected result: '%s' not found", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue