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