add strategy and filters to docker info

Signed-off-by: Victor Vieux <victorvieux@gmail.com>
This commit is contained in:
Victor Vieux 2015-04-03 15:56:26 -07:00
parent 64d691a448
commit 20ec7a889e
12 changed files with 65 additions and 1 deletions

View File

@ -268,7 +268,11 @@ func (c *Cluster) listNodes() []cluster.Node {
// Info is exported // Info is exported
func (c *Cluster) Info() [][2]string { 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 { for _, node := range c.nodes {
info = append(info, [2]string{node.Name(), node.Addr()}) info = append(info, [2]string{node.Name(), node.Addr()})

View File

@ -13,6 +13,11 @@ import (
type AffinityFilter struct { type AffinityFilter struct {
} }
// Name returns the name of the filter
func (f *AffinityFilter) Name() string {
return "affinity"
}
// Filter is exported // Filter is exported
func (f *AffinityFilter) Filter(config *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) { func (f *AffinityFilter) Filter(config *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) {
affinities, err := parseExprs("affinity", config.Env) affinities, err := parseExprs("affinity", config.Env)

View File

@ -12,6 +12,11 @@ import (
type ConstraintFilter struct { type ConstraintFilter struct {
} }
// Name returns the name of the filter
func (f *ConstraintFilter) Name() string {
return "constraint"
}
// Filter is exported // Filter is exported
func (f *ConstraintFilter) Filter(config *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) { func (f *ConstraintFilter) Filter(config *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) {
constraints, err := parseExprs("constraint", config.Env) constraints, err := parseExprs("constraint", config.Env)

View File

@ -12,6 +12,11 @@ import (
type DependencyFilter struct { type DependencyFilter struct {
} }
// Name returns the name of the filter
func (f *DependencyFilter) Name() string {
return "dependency"
}
// Filter is exported // Filter is exported
func (f *DependencyFilter) Filter(config *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) { func (f *DependencyFilter) Filter(config *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) {
if len(nodes) == 0 { if len(nodes) == 0 {

View File

@ -10,6 +10,8 @@ import (
// Filter is exported // Filter is exported
type Filter interface { type Filter interface {
Name() string
// Return a subset of nodes that were accepted by the filtering policy. // Return a subset of nodes that were accepted by the filtering policy.
Filter(*dockerclient.ContainerConfig, []cluster.Node) ([]cluster.Node, error) Filter(*dockerclient.ContainerConfig, []cluster.Node) ([]cluster.Node, error)
} }

View File

@ -16,6 +16,11 @@ var (
type HealthFilter struct { type HealthFilter struct {
} }
// Name returns the name of the filter
func (f *HealthFilter) Name() string {
return "health"
}
// Filter is exported // Filter is exported
func (f *HealthFilter) Filter(_ *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) { func (f *HealthFilter) Filter(_ *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) {
result := []cluster.Node{} result := []cluster.Node{}

View File

@ -13,6 +13,11 @@ import (
type PortFilter struct { type PortFilter struct {
} }
// Name returns the name of the filter
func (p *PortFilter) Name() string {
return "port"
}
// Filter is exported // Filter is exported
func (p *PortFilter) Filter(config *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) { func (p *PortFilter) Filter(config *dockerclient.ContainerConfig, nodes []cluster.Node) ([]cluster.Node, error) {
for _, port := range config.HostConfig.PortBindings { for _, port := range config.HostConfig.PortBindings {

View File

@ -1,6 +1,7 @@
package scheduler package scheduler
import ( import (
"strings"
"sync" "sync"
"github.com/docker/swarm/cluster" "github.com/docker/swarm/cluster"
@ -34,3 +35,18 @@ func (s *Scheduler) SelectNodeForContainer(nodes []cluster.Node, config *dockerc
return s.strategy.PlaceContainer(config, accepted) 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, ", ")
}

View File

@ -16,6 +16,11 @@ func (p *BinpackPlacementStrategy) Initialize() error {
return nil return nil
} }
// Name returns the name of the strategy
func (p *BinpackPlacementStrategy) Name() string {
return "binpack"
}
// PlaceContainer is exported // PlaceContainer is exported
func (p *BinpackPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []cluster.Node) (cluster.Node, error) { func (p *BinpackPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []cluster.Node) (cluster.Node, error) {
weightedNodes, err := weighNodes(config, nodes) weightedNodes, err := weighNodes(config, nodes)

View File

@ -18,6 +18,11 @@ func (p *RandomPlacementStrategy) Initialize() error {
return nil return nil
} }
// Name returns the name of the strategy
func (p *RandomPlacementStrategy) Name() string {
return "random"
}
// PlaceContainer is exported // PlaceContainer is exported
func (p *RandomPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []cluster.Node) (cluster.Node, error) { func (p *RandomPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []cluster.Node) (cluster.Node, error) {
if size := len(nodes); size > 0 { if size := len(nodes); size > 0 {

View File

@ -16,6 +16,11 @@ func (p *SpreadPlacementStrategy) Initialize() error {
return nil return nil
} }
// Name returns the name of the strategy
func (p *SpreadPlacementStrategy) Name() string {
return "spread"
}
// PlaceContainer is exported // PlaceContainer is exported
func (p *SpreadPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []cluster.Node) (cluster.Node, error) { func (p *SpreadPlacementStrategy) PlaceContainer(config *dockerclient.ContainerConfig, nodes []cluster.Node) (cluster.Node, error) {
weightedNodes, err := weighNodes(config, nodes) weightedNodes, err := weighNodes(config, nodes)

View File

@ -10,6 +10,8 @@ import (
// PlacementStrategy is exported // PlacementStrategy is exported
type PlacementStrategy interface { type PlacementStrategy interface {
Name() string
Initialize() error Initialize() error
// Given a container configuration and a set of nodes, select the target // Given a container configuration and a set of nodes, select the target
// node where the container should be scheduled. // node where the container should be scheduled.