diff --git a/scheduler/filter/filter.go b/scheduler/filter/filter.go index 3e56d5dfcc..c17419acc4 100644 --- a/scheduler/filter/filter.go +++ b/scheduler/filter/filter.go @@ -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 diff --git a/scheduler/filter/filters_test.go b/scheduler/filter/filters_test.go index 0de71f086e..55c42f5501 100644 --- a/scheduler/filter/filters_test.go +++ b/scheduler/filter/filters_test.go @@ -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) diff --git a/scheduler/scheduler.go b/scheduler/scheduler.go index 2b11870491..86c608f6e4 100644 --- a/scheduler/scheduler.go +++ b/scheduler/scheduler.go @@ -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 }