github.com/boynux/docker@v1.11.0-rc4/api/server/router/network/filter.go (about) 1 package network 2 3 import ( 4 "fmt" 5 "regexp" 6 "strings" 7 8 "github.com/docker/docker/runconfig" 9 "github.com/docker/engine-api/types/filters" 10 "github.com/docker/libnetwork" 11 ) 12 13 type filterHandler func([]libnetwork.Network, string) ([]libnetwork.Network, error) 14 15 var ( 16 // supportedFilters predefined some supported filter handler function 17 supportedFilters = map[string]filterHandler{ 18 "type": filterNetworkByType, 19 "name": filterNetworkByName, 20 "id": filterNetworkByID, 21 } 22 23 // acceptFilters is an acceptable filter flag list 24 // generated for validation. e.g. 25 // acceptedFilters = map[string]bool{ 26 // "type": true, 27 // "name": true, 28 // "id": true, 29 // } 30 acceptedFilters = func() map[string]bool { 31 ret := make(map[string]bool) 32 for k := range supportedFilters { 33 ret[k] = true 34 } 35 return ret 36 }() 37 ) 38 39 func filterNetworkByType(nws []libnetwork.Network, netType string) (retNws []libnetwork.Network, err error) { 40 switch netType { 41 case "builtin": 42 for _, nw := range nws { 43 if runconfig.IsPreDefinedNetwork(nw.Name()) { 44 retNws = append(retNws, nw) 45 } 46 } 47 case "custom": 48 for _, nw := range nws { 49 if !runconfig.IsPreDefinedNetwork(nw.Name()) { 50 retNws = append(retNws, nw) 51 } 52 } 53 default: 54 return nil, fmt.Errorf("Invalid filter: 'type'='%s'", netType) 55 } 56 return retNws, nil 57 } 58 59 func filterNetworkByName(nws []libnetwork.Network, name string) (retNws []libnetwork.Network, err error) { 60 for _, nw := range nws { 61 // exact match (fast path) 62 if nw.Name() == name { 63 retNws = append(retNws, nw) 64 continue 65 } 66 67 // regexp match (slow path) 68 match, err := regexp.MatchString(name, nw.Name()) 69 if err != nil || !match { 70 continue 71 } else { 72 retNws = append(retNws, nw) 73 } 74 } 75 return retNws, nil 76 } 77 78 func filterNetworkByID(nws []libnetwork.Network, id string) (retNws []libnetwork.Network, err error) { 79 for _, nw := range nws { 80 if strings.HasPrefix(nw.ID(), id) { 81 retNws = append(retNws, nw) 82 } 83 } 84 return retNws, nil 85 } 86 87 // filterAllNetworks filters network list according to user specified filter 88 // and returns user chosen networks 89 func filterNetworks(nws []libnetwork.Network, filter filters.Args) ([]libnetwork.Network, error) { 90 // if filter is empty, return original network list 91 if filter.Len() == 0 { 92 return nws, nil 93 } 94 95 var displayNet []libnetwork.Network 96 for fkey, fhandler := range supportedFilters { 97 errFilter := filter.WalkValues(fkey, func(fval string) error { 98 passList, err := fhandler(nws, fval) 99 if err != nil { 100 return err 101 } 102 displayNet = append(displayNet, passList...) 103 return nil 104 }) 105 if errFilter != nil { 106 return nil, errFilter 107 } 108 } 109 return displayNet, nil 110 }