diff --git a/scheduler/filter/affinity.go b/scheduler/filter/affinity.go index 2f50b48415..554060c027 100644 --- a/scheduler/filter/affinity.go +++ b/scheduler/filter/affinity.go @@ -64,7 +64,7 @@ func (f *AffinityFilter) Filter(config *cluster.ContainerConfig, nodes []*node.N } if len(candidates) == 0 { if affinity.isSoft { - return nodes, nil + continue } return nil, fmt.Errorf("unable to find a node that satisfies %s%s%s", affinity.key, OPERATORS[affinity.operator], affinity.value) } diff --git a/scheduler/filter/constraint.go b/scheduler/filter/constraint.go index d09192d0b8..b95a587149 100644 --- a/scheduler/filter/constraint.go +++ b/scheduler/filter/constraint.go @@ -43,7 +43,7 @@ func (f *ConstraintFilter) Filter(config *cluster.ContainerConfig, nodes []*node } if len(candidates) == 0 { if constraint.isSoft { - return nodes, nil + continue } return nil, fmt.Errorf("unable to find a node that satisfies %s%s%s", constraint.key, OPERATORS[constraint.operator], constraint.value) } diff --git a/test/integration/affinities.bats b/test/integration/affinities.bats index 1d4feaf4a5..c27ef3c7e0 100644 --- a/test/integration/affinities.bats +++ b/test/integration/affinities.bats @@ -125,3 +125,18 @@ function teardown() { [ "$status" -eq 0 ] [[ "${output}" != *'"Name": "node-1"'* ]] } + +@test "soft affinity" { + start_docker_with_busybox 2 + + # Create a new image just on the second host. + docker -H ${HOSTS[1]} tag busybox test + + swarm_manage + + docker_swarm run --name c1 -e affinity:image==~not_exist -e affinity:image==test -d busybox:latest sh + + run docker_swarm inspect c1 + [ "$status" -eq 0 ] + [[ "${output}" == *'"Name": "node-1"'* ]] +} diff --git a/test/integration/constraints.bats b/test/integration/constraints.bats index 65d72afa6b..abc98d3997 100644 --- a/test/integration/constraints.bats +++ b/test/integration/constraints.bats @@ -39,6 +39,22 @@ function teardown() { [[ "${output}" == *'"Name": "node-1"'* ]] } +@test "soft constraint" { + start_docker_with_busybox 2 + swarm_manage + + docker_swarm run --name c1 -e constraint:storagedriver==~not_exist -e constraint:node==node-0 -d busybox:latest sh + docker_swarm run --name c2 -e constraint:storagedriver==~not_exist -e constraint:node==node-0 -d busybox:latest sh + + run docker_swarm inspect c1 + [ "$status" -eq 0 ] + [[ "${output}" == *'"Name": "node-0"'* ]] + + run docker_swarm inspect c2 + [ "$status" -eq 0 ] + [[ "${output}" == *'"Name": "node-0"'* ]] +} + @test "label constraints" { start_docker_with_busybox 1 --label foo=a start_docker_with_busybox 1 --label foo=b