Merge pull request #1986 from allencloud/move-experiemental-about-rescheduling-out-of-config

move more details about rescheduling out of experimental
This commit is contained in:
Victor Vieux 2016-03-17 11:00:56 -07:00
commit 9de8f77d55
1 changed files with 20 additions and 27 deletions

View File

@ -6,7 +6,6 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/docker/swarm/experimental"
"github.com/samalba/dockerclient" "github.com/samalba/dockerclient"
) )
@ -87,19 +86,18 @@ func BuildContainerConfig(c dockerclient.ContainerConfig) *ContainerConfig {
json.Unmarshal([]byte(labels), &constraints) json.Unmarshal([]byte(labels), &constraints)
} }
if experimental.ENABLED { // parse reschedule policy from labels (ex. docker run --label 'com.docker.swarm.reschedule-policies=on-node-failure')
// parse reschedule policy from labels (ex. docker run --label 'com.docker.swarm.reschedule-policies=on-node-failure') if labels, ok := c.Labels[SwarmLabelNamespace+".reschedule-policies"]; ok {
if labels, ok := c.Labels[SwarmLabelNamespace+".reschedule-policies"]; ok { json.Unmarshal([]byte(labels), &reschedulePolicies)
json.Unmarshal([]byte(labels), &reschedulePolicies)
}
} }
// parse affinities/constraints/reschedule policies from env (ex. docker run -e affinity:container==redis -e affinity:image==nginx -e constraint:region==us-east -e constraint:storage==ssd -e reschedule:off) // parse affinities/constraints/reschedule policies from env (ex. docker run -e affinity:container==redis -e affinity:image==nginx -e constraint:region==us-east -e constraint:storage==ssd -e reschedule:off)
for _, e := range c.Env { for _, e := range c.Env {
if ok, key, value := parseEnv(e); ok && key == "affinity" { if ok, key, value := parseEnv(e); ok && key == "affinity" {
affinities = append(affinities, value) affinities = append(affinities, value)
} else if ok && key == "constraint" { } else if ok && key == "constraint" {
constraints = append(constraints, value) constraints = append(constraints, value)
} else if experimental.ENABLED && ok && key == "reschedule" { } else if ok && key == "reschedule" {
reschedulePolicies = append(reschedulePolicies, value) reschedulePolicies = append(reschedulePolicies, value)
} else { } else {
env = append(env, e) env = append(env, e)
@ -123,12 +121,10 @@ func BuildContainerConfig(c dockerclient.ContainerConfig) *ContainerConfig {
} }
} }
if experimental.ENABLED { // store reschedule policies in labels
// store reschedule policies in labels if len(reschedulePolicies) > 0 {
if len(reschedulePolicies) > 0 { if labels, err := json.Marshal(reschedulePolicies); err == nil {
if labels, err := json.Marshal(reschedulePolicies); err == nil { c.Labels[SwarmLabelNamespace+".reschedule-policies"] = string(labels)
c.Labels[SwarmLabelNamespace+".reschedule-policies"] = string(labels)
}
} }
} }
@ -233,22 +229,19 @@ func (c *ContainerConfig) HasReschedulePolicy(p string) bool {
// Validate returns an error if the config isn't valid // Validate returns an error if the config isn't valid
func (c *ContainerConfig) Validate() error { func (c *ContainerConfig) Validate() error {
//TODO: add validation for affinities and constraints //TODO: add validation for affinities and constraints
reschedulePolicies := c.extractExprs("reschedule-policies")
if experimental.ENABLED { if len(reschedulePolicies) > 1 {
reschedulePolicies := c.extractExprs("reschedule-policies") return errors.New("too many reschedule policies")
if len(reschedulePolicies) > 1 { } else if len(reschedulePolicies) == 1 {
return errors.New("too many reschedule policies") valid := false
} else if len(reschedulePolicies) == 1 { for _, validReschedulePolicy := range []string{"off", "on-node-failure"} {
valid := false if reschedulePolicies[0] == validReschedulePolicy {
for _, validReschedulePolicy := range []string{"off", "on-node-failure"} { valid = true
if reschedulePolicies[0] == validReschedulePolicy {
valid = true
}
}
if !valid {
return fmt.Errorf("invalid reschedule policy: %s", reschedulePolicies[0])
} }
} }
if !valid {
return fmt.Errorf("invalid reschedule policy: %s", reschedulePolicies[0])
}
} }
return nil return nil