mirror of https://github.com/docker/docs.git
Merge pull request #1714 from vieux/soft_fix
fix soft / resource computation
This commit is contained in:
commit
f0667cd5bb
|
@ -54,17 +54,7 @@ func New(names []string) ([]Filter, error) {
|
|||
}
|
||||
|
||||
// ApplyFilters applies a set of filters in batch.
|
||||
func ApplyFilters(filters []Filter, config *cluster.ContainerConfig, nodes []*node.Node) ([]*node.Node, error) {
|
||||
candidates, err := applyFilters(filters, config, nodes, true)
|
||||
|
||||
if err != nil {
|
||||
candidates, err = applyFilters(filters, config, nodes, false)
|
||||
}
|
||||
|
||||
return candidates, err
|
||||
}
|
||||
|
||||
func applyFilters(filters []Filter, config *cluster.ContainerConfig, nodes []*node.Node, soft bool) ([]*node.Node, error) {
|
||||
func ApplyFilters(filters []Filter, config *cluster.ContainerConfig, nodes []*node.Node, soft bool) ([]*node.Node, error) {
|
||||
var (
|
||||
err error
|
||||
candidates = nodes
|
||||
|
|
|
@ -63,7 +63,10 @@ func TestApplyFilters(t *testing.T) {
|
|||
|
||||
//Tests for Soft affinity, it should be considered as last
|
||||
config := cluster.BuildContainerConfig(dockerclient.ContainerConfig{Env: []string{"affinity:image==~image-0:tag3"}})
|
||||
result, err = ApplyFilters(filters, config, nodes)
|
||||
result, err = ApplyFilters(filters, config, nodes, true)
|
||||
assert.Error(t, err)
|
||||
assert.Len(t, result, 0)
|
||||
result, err = ApplyFilters(filters, config, nodes, false)
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, result, 1)
|
||||
|
||||
|
|
|
@ -34,7 +34,16 @@ func New(strategy strategy.PlacementStrategy, filters []filter.Filter) *Schedule
|
|||
// SelectNodesForContainer will return a list of nodes where the container can
|
||||
// be scheduled, sorted by order or preference.
|
||||
func (s *Scheduler) SelectNodesForContainer(nodes []*node.Node, config *cluster.ContainerConfig) ([]*node.Node, error) {
|
||||
accepted, err := filter.ApplyFilters(s.filters, config, nodes)
|
||||
candidates, err := s.selectNodesForContainer(nodes, config, true)
|
||||
|
||||
if err != nil {
|
||||
candidates, err = s.selectNodesForContainer(nodes, config, false)
|
||||
}
|
||||
return candidates, err
|
||||
}
|
||||
|
||||
func (s *Scheduler) selectNodesForContainer(nodes []*node.Node, config *cluster.ContainerConfig, soft bool) ([]*node.Node, error) {
|
||||
accepted, err := filter.ApplyFilters(s.filters, config, nodes, soft)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
package scheduler
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/docker/swarm/cluster"
|
||||
"github.com/docker/swarm/scheduler/filter"
|
||||
"github.com/docker/swarm/scheduler/node"
|
||||
"github.com/docker/swarm/scheduler/strategy"
|
||||
"github.com/samalba/dockerclient"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestSelectNodesForContainer(t *testing.T) {
|
||||
var (
|
||||
s = Scheduler{
|
||||
strategy: &strategy.SpreadPlacementStrategy{},
|
||||
filters: []filter.Filter{&filter.ConstraintFilter{}},
|
||||
}
|
||||
|
||||
nodes = []*node.Node{
|
||||
{
|
||||
ID: "node-0-id",
|
||||
Name: "node-0-name",
|
||||
Addr: "node-0",
|
||||
TotalMemory: 1 * 1024 * 1024 * 1024,
|
||||
TotalCpus: 1,
|
||||
Labels: map[string]string{
|
||||
"group": "1",
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
ID: "node-1-id",
|
||||
Name: "node-1-name",
|
||||
Addr: "node-1",
|
||||
TotalMemory: 1 * 1024 * 1024 * 1024,
|
||||
TotalCpus: 2,
|
||||
Labels: map[string]string{
|
||||
"group": "2",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
config = cluster.BuildContainerConfig(dockerclient.ContainerConfig{
|
||||
Memory: 1024 * 1024 * 1024,
|
||||
CpuShares: 2,
|
||||
Env: []string{"constraint:group==~1"},
|
||||
})
|
||||
)
|
||||
candidates, err := s.SelectNodesForContainer(nodes, config)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, 1, len(candidates))
|
||||
assert.Equal(t, "node-1-id", candidates[0].ID)
|
||||
|
||||
}
|
Loading…
Reference in New Issue