github.com/portworx/docker@v1.12.1/api/server/router/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" 8 "github.com/docker/engine-api/types/filters" 9 ) 10 11 type filterHandler func([]types.NetworkResource, string) ([]types.NetworkResource, 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 []types.NetworkResource, netType string) (retNws []types.NetworkResource, 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 []types.NetworkResource, filter filters.Args) ([]types.NetworkResource, error) { 47 // if filter is empty, return original network list 48 if filter.Len() == 0 { 49 return nws, nil 50 } 51 52 if err := filter.Validate(AcceptedFilters); err != nil { 53 return nil, err 54 } 55 56 displayNet := []types.NetworkResource{} 57 for _, nw := range nws { 58 if filter.Include("driver") { 59 if !filter.ExactMatch("driver", nw.Driver) { 60 continue 61 } 62 } 63 if filter.Include("name") { 64 if !filter.Match("name", nw.Name) { 65 continue 66 } 67 } 68 if filter.Include("id") { 69 if !filter.Match("id", nw.ID) { 70 continue 71 } 72 } 73 if filter.Include("label") { 74 if !filter.MatchKVList("label", nw.Labels) { 75 continue 76 } 77 } 78 displayNet = append(displayNet, nw) 79 } 80 81 if filter.Include("type") { 82 var typeNet []types.NetworkResource 83 errFilter := filter.WalkValues("type", func(fval string) error { 84 passList, err := filterNetworkByType(displayNet, fval) 85 if err != nil { 86 return err 87 } 88 typeNet = append(typeNet, passList...) 89 return nil 90 }) 91 if errFilter != nil { 92 return nil, errFilter 93 } 94 displayNet = typeNet 95 } 96 97 return displayNet, nil 98 }