github.com/zhouyu0/docker-note@v0.0.0-20190722021225-b8d3825084db/daemon/network/filter.go (about)

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