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"
|
|
)
|
|
|
|
// BinpackPlacementStrategy places a container onto the most packed node in the cluster.
|
|
type BinpackPlacementStrategy struct {
|
|
}
|
|
|
|
// Initialize a BinpackPlacementStrategy.
|
|
func (p *BinpackPlacementStrategy) Initialize() error {
|
|
return nil
|
|
}
|
|
|
|
// Name returns the name of the strategy.
|
|
func (p *BinpackPlacementStrategy) Name() string {
|
|
return "binpack"
|
|
}
|
|
|
|
// RankAndSort sorts nodes based on the binpack strategy applied to the container config.
|
|
func (p *BinpackPlacementStrategy) RankAndSort(config *cluster.ContainerConfig, nodes []*node.Node) ([]*node.Node, error) {
|
|
// for binpack, a healthy node should increase 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(sort.Reverse(weightedNodes))
|
|
output := make([]*node.Node, len(weightedNodes))
|
|
for i, n := range weightedNodes {
|
|
output[i] = n.Node
|
|
}
|
|
return output, nil
|
|
}
|