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