blob: 7d15cea0c74fce1e8b6e233c8b1b2ad0775203d7 [file] [log] [blame]
package network
import (
"fmt"
"github.com/docker/docker/runconfig"
"github.com/docker/engine-api/types/filters"
"github.com/docker/libnetwork"
)
type filterHandler func([]libnetwork.Network, string) ([]libnetwork.Network, error)
var (
// AcceptedFilters is an acceptable filters for validation
AcceptedFilters = map[string]bool{
"driver": true,
"type": true,
"name": true,
"id": true,
"label": true,
}
)
func filterNetworkByType(nws []libnetwork.Network, netType string) (retNws []libnetwork.Network, err error) {
switch netType {
case "builtin":
for _, nw := range nws {
if runconfig.IsPreDefinedNetwork(nw.Name()) {
retNws = append(retNws, nw)
}
}
case "custom":
for _, nw := range nws {
if !runconfig.IsPreDefinedNetwork(nw.Name()) {
retNws = append(retNws, nw)
}
}
default:
return nil, fmt.Errorf("Invalid filter: 'type'='%s'", netType)
}
return retNws, nil
}
// FilterNetworks filters network list according to user specified filter
// and returns user chosen networks
func FilterNetworks(nws []libnetwork.Network, filter filters.Args) ([]libnetwork.Network, error) {
// if filter is empty, return original network list
if filter.Len() == 0 {
return nws, nil
}
var displayNet []libnetwork.Network
for _, nw := range nws {
if filter.Include("driver") {
if !filter.ExactMatch("driver", nw.Type()) {
continue
}
}
if filter.Include("name") {
if !filter.Match("name", nw.Name()) {
continue
}
}
if filter.Include("id") {
if !filter.Match("id", nw.ID()) {
continue
}
}
if filter.Include("label") {
if !filter.MatchKVList("label", nw.Info().Labels()) {
continue
}
}
displayNet = append(displayNet, nw)
}
if filter.Include("type") {
var typeNet []libnetwork.Network
errFilter := filter.WalkValues("type", func(fval string) error {
passList, err := filterNetworkByType(displayNet, fval)
if err != nil {
return err
}
typeNet = append(typeNet, passList...)
return nil
})
if errFilter != nil {
return nil, errFilter
}
displayNet = typeNet
}
return displayNet, nil
}