github.com/zhouyu0/docker-note@v0.0.0-20190722021225-b8d3825084db/daemon/network/filter.go (about) 1 package network // import "github.com/docker/docker/daemon/network" 2 3 import ( 4 "github.com/docker/docker/api/types" 5 "github.com/docker/docker/api/types/filters" 6 "github.com/docker/docker/runconfig" 7 "github.com/pkg/errors" 8 ) 9 10 // FilterNetworks filters network list according to user specified filter 11 // and returns user chosen networks 12 func FilterNetworks(nws []types.NetworkResource, filter filters.Args) ([]types.NetworkResource, error) { 13 // if filter is empty, return original network list 14 if filter.Len() == 0 { 15 return nws, nil 16 } 17 18 displayNet := nws[:0] 19 for _, nw := range nws { 20 if filter.Contains("driver") { 21 if !filter.ExactMatch("driver", nw.Driver) { 22 continue 23 } 24 } 25 if filter.Contains("name") { 26 if !filter.Match("name", nw.Name) { 27 continue 28 } 29 } 30 if filter.Contains("id") { 31 if !filter.Match("id", nw.ID) { 32 continue 33 } 34 } 35 if filter.Contains("label") { 36 if !filter.MatchKVList("label", nw.Labels) { 37 continue 38 } 39 } 40 if filter.Contains("scope") { 41 if !filter.ExactMatch("scope", nw.Scope) { 42 continue 43 } 44 } 45 46 if filter.Contains("idOrName") { 47 if !filter.Match("name", nw.Name) && !filter.Match("id", nw.Name) { 48 continue 49 } 50 } 51 displayNet = append(displayNet, nw) 52 } 53 54 if filter.Contains("type") { 55 typeNet := []types.NetworkResource{} 56 errFilter := filter.WalkValues("type", func(fval string) error { 57 passList, err := filterNetworkByType(displayNet, fval) 58 if err != nil { 59 return err 60 } 61 typeNet = append(typeNet, passList...) 62 return nil 63 }) 64 if errFilter != nil { 65 return nil, errFilter 66 } 67 displayNet = typeNet 68 } 69 70 return displayNet, nil 71 } 72 73 func filterNetworkByType(nws []types.NetworkResource, netType string) ([]types.NetworkResource, error) { 74 retNws := []types.NetworkResource{} 75 switch netType { 76 case "builtin": 77 for _, nw := range nws { 78 if runconfig.IsPreDefinedNetwork(nw.Name) { 79 retNws = append(retNws, nw) 80 } 81 } 82 case "custom": 83 for _, nw := range nws { 84 if !runconfig.IsPreDefinedNetwork(nw.Name) { 85 retNws = append(retNws, nw) 86 } 87 } 88 default: 89 return nil, errors.Errorf("invalid filter: 'type'='%s'", netType) 90 } 91 return retNws, nil 92 }