mirror of https://github.com/docker/docs.git
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:
commit
9de8f77d55
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue