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  }