mirror of https://github.com/docker/docs.git
57 lines
1.3 KiB
Go
57 lines
1.3 KiB
Go
package filter
|
|
|
|
import (
|
|
"errors"
|
|
|
|
log "github.com/Sirupsen/logrus"
|
|
"github.com/docker/swarm/cluster"
|
|
"github.com/samalba/dockerclient"
|
|
)
|
|
|
|
type Filter interface {
|
|
// Return a subset of nodes that were accepted by the filtering policy.
|
|
Filter(*dockerclient.ContainerConfig, []*cluster.Node) ([]*cluster.Node, error)
|
|
}
|
|
|
|
var (
|
|
filters map[string]Filter
|
|
ErrNotSupported = errors.New("filter not supported")
|
|
)
|
|
|
|
func init() {
|
|
filters = map[string]Filter{
|
|
"affinity": &AffinityFilter{},
|
|
"health": &HealthFilter{},
|
|
"constraint": &ConstraintFilter{},
|
|
"port": &PortFilter{},
|
|
"dependency": &DependencyFilter{},
|
|
}
|
|
}
|
|
|
|
func New(names []string) ([]Filter, error) {
|
|
var selectedFilters []Filter
|
|
|
|
for _, name := range names {
|
|
if filter, exists := filters[name]; exists {
|
|
log.WithField("name", name).Debug("Initializing filter")
|
|
selectedFilters = append(selectedFilters, filter)
|
|
} else {
|
|
return nil, ErrNotSupported
|
|
}
|
|
}
|
|
return selectedFilters, nil
|
|
}
|
|
|
|
// Apply a set of filters in batch.
|
|
func ApplyFilters(filters []Filter, config *dockerclient.ContainerConfig, nodes []*cluster.Node) ([]*cluster.Node, error) {
|
|
var err error
|
|
|
|
for _, filter := range filters {
|
|
nodes, err = filter.Filter(config, nodes)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return nodes, nil
|
|
}
|