github.com/rhatdan/docker@v0.7.7-0.20180119204836-47a0dcbcd20a/api/server/router/network/filter.go (about)

     1  package 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  )
     8  
     9  func filterNetworkByType(nws []types.NetworkResource, netType string) ([]types.NetworkResource, error) {
    10  	retNws := []types.NetworkResource{}
    11  	switch netType {
    12  	case "builtin":
    13  		for _, nw := range nws {
    14  			if runconfig.IsPreDefinedNetwork(nw.Name) {
    15  				retNws = append(retNws, nw)
    16  			}
    17  		}
    18  	case "custom":
    19  		for _, nw := range nws {
    20  			if !runconfig.IsPreDefinedNetwork(nw.Name) {
    21  				retNws = append(retNws, nw)
    22  			}
    23  		}
    24  	default:
    25  		return nil, invalidFilter(netType)
    26  	}
    27  	return retNws, nil
    28  }
    29  
    30  type invalidFilter string
    31  
    32  func (e invalidFilter) Error() string {
    33  	return "Invalid filter: 'type'='" + string(e) + "'"
    34  }
    35  
    36  func (e invalidFilter) InvalidParameter() {}
    37  
    38  // filterNetworks filters network list according to user specified filter
    39  // and returns user chosen networks
    40  func filterNetworks(nws []types.NetworkResource, filter filters.Args) ([]types.NetworkResource, error) {
    41  	// if filter is empty, return original network list
    42  	if filter.Len() == 0 {
    43  		return nws, nil
    44  	}
    45  
    46  	displayNet := []types.NetworkResource{}
    47  	for _, nw := range nws {
    48  		if filter.Contains("driver") {
    49  			if !filter.ExactMatch("driver", nw.Driver) {
    50  				continue
    51  			}
    52  		}
    53  		if filter.Contains("name") {
    54  			if !filter.Match("name", nw.Name) {
    55  				continue
    56  			}
    57  		}
    58  		if filter.Contains("id") {
    59  			if !filter.Match("id", nw.ID) {
    60  				continue
    61  			}
    62  		}
    63  		if filter.Contains("label") {
    64  			if !filter.MatchKVList("label", nw.Labels) {
    65  				continue
    66  			}
    67  		}
    68  		if filter.Contains("scope") {
    69  			if !filter.ExactMatch("scope", nw.Scope) {
    70  				continue
    71  			}
    72  		}
    73  		displayNet = append(displayNet, nw)
    74  	}
    75  
    76  	if filter.Contains("type") {
    77  		typeNet := []types.NetworkResource{}
    78  		errFilter := filter.WalkValues("type", func(fval string) error {
    79  			passList, err := filterNetworkByType(displayNet, fval)
    80  			if err != nil {
    81  				return err
    82  			}
    83  			typeNet = append(typeNet, passList...)
    84  			return nil
    85  		})
    86  		if errFilter != nil {
    87  			return nil, errFilter
    88  		}
    89  		displayNet = typeNet
    90  	}
    91  
    92  	return displayNet, nil
    93  }