diff --git a/flags.go b/flags.go index 3ae1ab52f6..2cdb612cbf 100644 --- a/flags.go +++ b/flags.go @@ -55,4 +55,9 @@ var ( Usage: "PlacementStrategy to use [binpacking, random]", Value: "binpacking:0.05", } + flFilter = cli.StringSliceFlag{ + Name: "filter, f", + Usage: "Filter to use [health, label, port]", + Value: &cli.StringSlice{"health", "label", "port"}, + } ) diff --git a/main.go b/main.go index 22162c99ff..cf524bdfba 100644 --- a/main.go +++ b/main.go @@ -82,7 +82,7 @@ func main() { ShortName: "m", Usage: "manage a docker cluster", Flags: []cli.Flag{ - flStrategy, + flStrategy, flFilter, flDiscovery, flHosts, flHeartBeat, flTls, flTlsCaCert, flTlsCert, flTlsKey, flTlsVerify, flEnableCors}, diff --git a/manage.go b/manage.go index 24eead05a3..d44010ce09 100644 --- a/manage.go +++ b/manage.go @@ -102,14 +102,20 @@ func manage(c *cli.Context) { if err != nil { log.Fatal(err) } + + // see https://github.com/codegangsta/cli/issues/160 + names := c.StringSlice("filter") + if c.IsSet("filter") || c.IsSet("f") { + names = names[3:] + } + fs, err := filter.New(names) + if err != nil { + log.Fatal(err) + } sched := scheduler.NewScheduler( cluster, s, - []filter.Filter{ - &filter.HealthFilter{}, - &filter.LabelFilter{}, - &filter.PortFilter{}, - }, + fs, ) // see https://github.com/codegangsta/cli/issues/160 diff --git a/scheduler/filter/filter.go b/scheduler/filter/filter.go index c995b7cdf7..21fdf721a4 100644 --- a/scheduler/filter/filter.go +++ b/scheduler/filter/filter.go @@ -1,6 +1,9 @@ package filter import ( + "errors" + + log "github.com/Sirupsen/logrus" "github.com/docker/swarm/cluster" "github.com/samalba/dockerclient" ) @@ -10,6 +13,33 @@ type Filter interface { 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{ + "health": &HealthFilter{}, + "label": &LabelFilter{}, + "port": &PortFilter{}, + } +} + +func New(names []string) ([]Filter, error) { + var selectedFilters []Filter + + for _, name := range names { + if filter, exists := filters[name]; exists { + log.Debugf("Initialising %q filter", name) + 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