From 20ec7a889efc54600a3c87ecc3b88284a022624d Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Fri, 3 Apr 2015 15:56:26 -0700 Subject: [PATCH] add strategy and filters to docker info Signed-off-by: Victor Vieux --- cluster/swarm/cluster.go | 6 +++++- scheduler/filter/affinity.go | 5 +++++ scheduler/filter/constraint.go | 5 +++++ scheduler/filter/dependency.go | 5 +++++ scheduler/filter/filter.go | 2 ++ scheduler/filter/health.go | 5 +++++ scheduler/filter/port.go | 5 +++++ scheduler/scheduler.go | 16 ++++++++++++++++ scheduler/strategy/binpack.go | 5 +++++ scheduler/strategy/random.go | 5 +++++ scheduler/strategy/spread.go | 5 +++++ scheduler/strategy/strategy.go | 2 ++ 12 files changed, 65 insertions(+), 1 deletion(-) diff --git a/cluster/swarm/cluster.go b/cluster/swarm/cluster.go index 244f25076f..5d04edf045 100644 --- a/cluster/swarm/cluster.go +++ b/cluster/swarm/cluster.go @@ -268,7 +268,11 @@ func (c *Cluster) listNodes() []cluster.Node { // Info is exported func (c *Cluster) Info() [][2]string { - info := [][2]string{{"\bNodes", fmt.Sprintf("%d", len(c.nodes))}} + info := [][2]string{ + {"\bStrategy", c.scheduler.Strategy()}, + {"\bFilters", c.scheduler.Filters()}, + {"\bNodes", fmt.Sprintf("%d", len(c.nodes))}, + } for _, node := range c.nodes { info = append(info, [2]string{node.Name(), node.Addr()}) diff --git a/scheduler/filter/affinity.go b/scheduler/filter/affinity.go index b0557962aa..ba0bd7d0e0 100644 --- a/scheduler/filter/affinity.go +++ b/scheduler/filter/affinity.go @@ -13,6 +13,11 @@ import ( type AffinityFilter struct { } +// Name returns the name of the filter +func (f *AffinityFilter) Name() string { + return "affinity" +} + // Filter is exported func (f *AffinityFilter) Filter(config *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) { affinities, err := parseExprs("affinity", config.Env) diff --git a/scheduler/filter/constraint.go b/scheduler/filter/constraint.go index 160a642d76..5992123dfb 100644 --- a/scheduler/filter/constraint.go +++ b/scheduler/filter/constraint.go @@ -12,6 +12,11 @@ import ( type ConstraintFilter struct { } +// Name returns the name of the filter +func (f *ConstraintFilter) Name() string { + return "constraint" +} + // Filter is exported func (f *ConstraintFilter) Filter(config *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) { constraints, err := parseExprs("constraint", config.Env) diff --git a/scheduler/filter/dependency.go b/scheduler/filter/dependency.go index 77db704f7f..3bd0113d2d 100644 --- a/scheduler/filter/dependency.go +++ b/scheduler/filter/dependency.go @@ -12,6 +12,11 @@ import ( type DependencyFilter struct { } +// Name returns the name of the filter +func (f *DependencyFilter) Name() string { + return "dependency" +} + // Filter is exported func (f *DependencyFilter) Filter(config *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) { if len(nodes) == 0 { diff --git a/scheduler/filter/filter.go b/scheduler/filter/filter.go index 601a09dd6d..3a53bd2588 100644 --- a/scheduler/filter/filter.go +++ b/scheduler/filter/filter.go @@ -10,6 +10,8 @@ import ( // Filter is exported type Filter interface { + Name() string + // Return a subset of nodes that were accepted by the filtering policy. Filter(*dockerclient.ContainerConfig, []cluster.Node) ([]cluster.Node, error) } diff --git a/scheduler/filter/health.go b/scheduler/filter/health.go index 3e05ecbc5d..63cf35bd69 100644 --- a/scheduler/filter/health.go +++ b/scheduler/filter/health.go @@ -16,6 +16,11 @@ var ( type HealthFilter struct { } +// Name returns the name of the filter +func (f *HealthFilter) Name() string { + return "health" +} + // Filter is exported func (f *HealthFilter) Filter(_ *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) { result := []cluster.Node{} diff --git a/scheduler/filter/port.go b/scheduler/filter/port.go index cd92fa1c31..4b141fe3f6 100644 --- a/scheduler/filter/port.go +++ b/scheduler/filter/port.go @@ -13,6 +13,11 @@ import ( type PortFilter struct { } +// Name returns the name of the filter +func (p *PortFilter) Name() string { + return "port" +} + // Filter is exported func (p *PortFilter) Filter(config *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) { for _, port := range config.HostConfig.PortBindings { diff --git a/scheduler/scheduler.go b/scheduler/scheduler.go index 8b148c7bb0..95ad74f74e 100644 --- a/scheduler/scheduler.go +++ b/scheduler/scheduler.go @@ -1,6 +1,7 @@ package scheduler import ( + "strings" "sync" "github.com/docker/swarm/cluster" @@ -34,3 +35,18 @@ func (s *Scheduler) SelectNodeForContainer(nodes []cluster.Node, config *dockerc return s.strategy.PlaceContainer(config, accepted) } + +// Strategy returns the strategy name +func (s *Scheduler) Strategy() string { + return s.strategy.Name() +} + +// Filters returns the list of filter's name +func (s *Scheduler) Filters() string { + filters := []string{} + for _, f := range s.filters { + filters = append(filters, f.Name()) + } + + return strings.Join(filters, ", ") +} diff --git a/scheduler/strategy/binpack.go b/scheduler/strategy/binpack.go index 3382d21a85..45c2e8257d 100644 --- a/scheduler/strategy/binpack.go +++ b/scheduler/strategy/binpack.go @@ -16,6 +16,11 @@ func (p *BinpackPlacementStrategy) Initialize() error { return nil } +// Name returns the name of the strategy +func (p *BinpackPlacementStrategy) Name() string { + return "binpack" +} + // PlaceContainer is exported func (p *BinpackPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []cluster.Node) (cluster.Node, error) { weightedNodes, err := weighNodes(config, nodes) diff --git a/scheduler/strategy/random.go b/scheduler/strategy/random.go index 47e44ad5cf..3dfe4505e2 100644 --- a/scheduler/strategy/random.go +++ b/scheduler/strategy/random.go @@ -18,6 +18,11 @@ func (p *RandomPlacementStrategy) Initialize() error { return nil } +// Name returns the name of the strategy +func (p *RandomPlacementStrategy) Name() string { + return "random" +} + // PlaceContainer is exported func (p *RandomPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []cluster.Node) (cluster.Node, error) { if size := len(nodes); size > 0 { diff --git a/scheduler/strategy/spread.go b/scheduler/strategy/spread.go index eb2e533b87..e7d75018c8 100644 --- a/scheduler/strategy/spread.go +++ b/scheduler/strategy/spread.go @@ -16,6 +16,11 @@ func (p *SpreadPlacementStrategy) Initialize() error { return nil } +// Name returns the name of the strategy +func (p *SpreadPlacementStrategy) Name() string { + return "spread" +} + // PlaceContainer is exported func (p *SpreadPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []cluster.Node) (cluster.Node, error) { weightedNodes, err := weighNodes(config, nodes) diff --git a/scheduler/strategy/strategy.go b/scheduler/strategy/strategy.go index b5fae08049..88b34b5113 100644 --- a/scheduler/strategy/strategy.go +++ b/scheduler/strategy/strategy.go @@ -10,6 +10,8 @@ import ( // PlacementStrategy is exported type PlacementStrategy interface { + Name() string + Initialize() error // Given a container configuration and a set of nodes, select the target // node where the container should be scheduled.