diff --git a/scheduler/filter/affinity.go b/scheduler/filter/affinity.go index 6bc458d586..6727819e5a 100644 --- a/scheduler/filter/affinity.go +++ b/scheduler/filter/affinity.go @@ -76,3 +76,16 @@ func (f *AffinityFilter) Filter(config *cluster.ContainerConfig, nodes []*node.N return nodes, nil } + +// Get a list of the affinities found in the container config. +func (f *AffinityFilter) GetAllFilters(config *cluster.ContainerConfig) ([]string, error) { + allAffinities := []string{} + affinities, err := parseExprs(config.Affinities()) + if err != nil { + return nil, err + } + for _, affinity := range affinities { + allAffinities = append(allAffinities, fmt.Sprintf("%s%s%s (soft=%t)", affinity.key, OPERATORS[affinity.operator], affinity.value, affinity.isSoft)) + } + return allAffinities, nil +} diff --git a/scheduler/filter/constraint.go b/scheduler/filter/constraint.go index 841d5feb3b..dcf454be93 100644 --- a/scheduler/filter/constraint.go +++ b/scheduler/filter/constraint.go @@ -51,3 +51,16 @@ func (f *ConstraintFilter) Filter(config *cluster.ContainerConfig, nodes []*node } return nodes, nil } + +// Get a list of the constraints found in the container config. +func (f *ConstraintFilter) GetAllFilters(config *cluster.ContainerConfig) ([]string, error) { + allConstraints := []string{} + constraints, err := parseExprs(config.Constraints()) + if err != nil { + return nil, err + } + for _, constraint := range constraints { + allConstraints = append(allConstraints, fmt.Sprintf("%s%s%s", constraint.key, OPERATORS[constraint.operator], constraint.value)) + } + return allConstraints, nil +} diff --git a/scheduler/filter/dependency.go b/scheduler/filter/dependency.go index 4a0ea9fdf0..0e8c078462 100644 --- a/scheduler/filter/dependency.go +++ b/scheduler/filter/dependency.go @@ -56,8 +56,8 @@ func (f *DependencyFilter) Filter(config *cluster.ContainerConfig, nodes []*node return candidates, nil } -// Get a string representation of the dependencies found in the container config. -func (f *DependencyFilter) String(config *cluster.ContainerConfig) string { +// Get a list of the dependencies found in the container config. +func (f *DependencyFilter) GetAllFilters(config *cluster.ContainerConfig) ([]string, error) { dependencies := []string{} for _, volume := range config.HostConfig.VolumesFrom { dependencies = append(dependencies, fmt.Sprintf("--volumes-from=%s", volume)) @@ -68,6 +68,12 @@ func (f *DependencyFilter) String(config *cluster.ContainerConfig) string { if strings.HasPrefix(config.HostConfig.NetworkMode, "container:") { dependencies = append(dependencies, fmt.Sprintf("--net=%s", config.HostConfig.NetworkMode)) } + return dependencies, nil +} + +// Get a string representation of the dependencies found in the container config. +func (f *DependencyFilter) String(config *cluster.ContainerConfig) string { + dependencies, _ := f.GetAllFilters(config) return strings.Join(dependencies, " ") } diff --git a/scheduler/filter/filter.go b/scheduler/filter/filter.go index c17419acc4..b414c24f72 100644 --- a/scheduler/filter/filter.go +++ b/scheduler/filter/filter.go @@ -14,6 +14,9 @@ type Filter interface { // Return a subset of nodes that were accepted by the filtering policy. Filter(*cluster.ContainerConfig, []*node.Node, bool) ([]*node.Node, error) + + // Return a list of constraints/filters provided + GetAllFilters(*cluster.ContainerConfig) ([]string, error) } var ( diff --git a/scheduler/filter/health.go b/scheduler/filter/health.go index d6a27b54af..12f805c710 100644 --- a/scheduler/filter/health.go +++ b/scheduler/filter/health.go @@ -36,3 +36,8 @@ func (f *HealthFilter) Filter(_ *cluster.ContainerConfig, nodes []*node.Node, _ return result, nil } + +// Implements interface function, but currently redundant since we don't have node constraints +func (f *HealthFilter) GetAllFilters(config *cluster.ContainerConfig) ([]string, error) { + return nil, nil +} diff --git a/scheduler/filter/port.go b/scheduler/filter/port.go index 757a6c6b6a..2145ab44fd 100644 --- a/scheduler/filter/port.go +++ b/scheduler/filter/port.go @@ -119,6 +119,24 @@ func (p *PortFilter) compare(requested dockerclient.PortBinding, bindings map[st return false } +// Get a list of the port constraints found in the container config. +func (p *PortFilter) GetAllFilters(config *cluster.ContainerConfig) ([]string, error) { + allPortConstraints := []string{} + if config.HostConfig.NetworkMode == "host" { + for port := range config.ExposedPorts { + allPortConstraints = append(allPortConstraints, fmt.Sprintf("port %s (Host mode)", port)) + } + return allPortConstraints, nil + } + + for _, port := range config.HostConfig.PortBindings { + for _, binding := range port { + allPortConstraints = append(allPortConstraints, fmt.Sprintf("port %s", binding.HostPort)) + } + } + return allPortConstraints, nil +} + func bindsAllInterfaces(binding dockerclient.PortBinding) bool { return binding.HostIp == "0.0.0.0" || binding.HostIp == "" }