mirror of https://github.com/docker/docs.git
41 lines
1.2 KiB
Go
41 lines
1.2 KiB
Go
package strategy
|
|
|
|
import (
|
|
"sort"
|
|
|
|
"github.com/docker/swarm/cluster"
|
|
"github.com/docker/swarm/scheduler/node"
|
|
)
|
|
|
|
// SpreadPlacementStrategy places a container on the node with the fewest running containers.
|
|
type SpreadPlacementStrategy struct {
|
|
}
|
|
|
|
// Initialize a SpreadPlacementStrategy.
|
|
func (p *SpreadPlacementStrategy) Initialize() error {
|
|
return nil
|
|
}
|
|
|
|
// Name returns the name of the strategy.
|
|
func (p *SpreadPlacementStrategy) Name() string {
|
|
return "spread"
|
|
}
|
|
|
|
// RankAndSort sorts nodes based on the spread strategy applied to the container config.
|
|
func (p *SpreadPlacementStrategy) RankAndSort(config *cluster.ContainerConfig, nodes []*node.Node) ([]*node.Node, error) {
|
|
// for spread, a healthy node should decrease its weight to increase its chance of being selected
|
|
// set healthFactor to -10 to make health degree [0, 100] overpower cpu + memory (each in range [0, 100])
|
|
const healthFactor int64 = -10
|
|
weightedNodes, err := weighNodes(config, nodes, healthFactor)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
sort.Sort(weightedNodes)
|
|
output := make([]*node.Node, len(weightedNodes))
|
|
for i, n := range weightedNodes {
|
|
output[i] = n.Node
|
|
}
|
|
return output, nil
|
|
}
|