github.com/boynux/docker@v1.11.0-rc4/api/server/router/network/filter.go (about)

     1  package network
     2  
     3  import (
     4  	"fmt"
     5  	"regexp"
     6  	"strings"
     7  
     8  	"github.com/docker/docker/runconfig"
     9  	"github.com/docker/engine-api/types/filters"
    10  	"github.com/docker/libnetwork"
    11  )
    12  
    13  type filterHandler func([]libnetwork.Network, string) ([]libnetwork.Network, error)
    14  
    15  var (
    16  	// supportedFilters predefined some supported filter handler function
    17  	supportedFilters = map[string]filterHandler{
    18  		"type": filterNetworkByType,
    19  		"name": filterNetworkByName,
    20  		"id":   filterNetworkByID,
    21  	}
    22  
    23  	// acceptFilters is an acceptable filter flag list
    24  	// generated for validation. e.g.
    25  	// acceptedFilters = map[string]bool{
    26  	//     "type": true,
    27  	//     "name": true,
    28  	//     "id":   true,
    29  	// }
    30  	acceptedFilters = func() map[string]bool {
    31  		ret := make(map[string]bool)
    32  		for k := range supportedFilters {
    33  			ret[k] = true
    34  		}
    35  		return ret
    36  	}()
    37  )
    38  
    39  func filterNetworkByType(nws []libnetwork.Network, netType string) (retNws []libnetwork.Network, err error) {
    40  	switch netType {
    41  	case "builtin":
    42  		for _, nw := range nws {
    43  			if runconfig.IsPreDefinedNetwork(nw.Name()) {
    44  				retNws = append(retNws, nw)
    45  			}
    46  		}
    47  	case "custom":
    48  		for _, nw := range nws {
    49  			if !runconfig.IsPreDefinedNetwork(nw.Name()) {
    50  				retNws = append(retNws, nw)
    51  			}
    52  		}
    53  	default:
    54  		return nil, fmt.Errorf("Invalid filter: 'type'='%s'", netType)
    55  	}
    56  	return retNws, nil
    57  }
    58  
    59  func filterNetworkByName(nws []libnetwork.Network, name string) (retNws []libnetwork.Network, err error) {
    60  	for _, nw := range nws {
    61  		// exact match (fast path)
    62  		if nw.Name() == name {
    63  			retNws = append(retNws, nw)
    64  			continue
    65  		}
    66  
    67  		// regexp match (slow path)
    68  		match, err := regexp.MatchString(name, nw.Name())
    69  		if err != nil || !match {
    70  			continue
    71  		} else {
    72  			retNws = append(retNws, nw)
    73  		}
    74  	}
    75  	return retNws, nil
    76  }
    77  
    78  func filterNetworkByID(nws []libnetwork.Network, id string) (retNws []libnetwork.Network, err error) {
    79  	for _, nw := range nws {
    80  		if strings.HasPrefix(nw.ID(), id) {
    81  			retNws = append(retNws, nw)
    82  		}
    83  	}
    84  	return retNws, nil
    85  }
    86  
    87  // filterAllNetworks filters network list according to user specified filter
    88  // and returns user chosen networks
    89  func filterNetworks(nws []libnetwork.Network, filter filters.Args) ([]libnetwork.Network, error) {
    90  	// if filter is empty, return original network list
    91  	if filter.Len() == 0 {
    92  		return nws, nil
    93  	}
    94  
    95  	var displayNet []libnetwork.Network
    96  	for fkey, fhandler := range supportedFilters {
    97  		errFilter := filter.WalkValues(fkey, func(fval string) error {
    98  			passList, err := fhandler(nws, fval)
    99  			if err != nil {
   100  				return err
   101  			}
   102  			displayNet = append(displayNet, passList...)
   103  			return nil
   104  		})
   105  		if errFilter != nil {
   106  			return nil, errFilter
   107  		}
   108  	}
   109  	return displayNet, nil
   110  }