mirror of https://github.com/docker/docs.git
reschedule with soft image affinity
Signed-off-by: Xian Chaobo <xianchaobo@huawei.com>
This commit is contained in:
parent
28cd51b65f
commit
8c7c0b248b
|
@ -146,3 +146,18 @@ func (c *ContainerConfig) Affinities() []string {
|
||||||
func (c *ContainerConfig) Constraints() []string {
|
func (c *ContainerConfig) Constraints() []string {
|
||||||
return c.extractExprs("constraints")
|
return c.extractExprs("constraints")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AddSoftImageAffinity
|
||||||
|
func (c *ContainerConfig) AddSoftImageAffinity(image string) error {
|
||||||
|
affnities_json := c.Labels[SwarmLabelNamespace+".affinities"]
|
||||||
|
var affinities []string
|
||||||
|
json.Unmarshal([]byte(affnities_json), &affinities)
|
||||||
|
affinities = append(affinities, "image==~"+image)
|
||||||
|
|
||||||
|
labels, err := json.Marshal(affinities)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
c.Labels[SwarmLabelNamespace+".affinities"] = string(labels)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -89,6 +89,20 @@ func (c *Cluster) generateUniqueID() string {
|
||||||
|
|
||||||
// CreateContainer aka schedule a brand new container into the cluster.
|
// CreateContainer aka schedule a brand new container into the cluster.
|
||||||
func (c *Cluster) CreateContainer(config *cluster.ContainerConfig, name string) (*cluster.Container, error) {
|
func (c *Cluster) CreateContainer(config *cluster.ContainerConfig, name string) (*cluster.Container, error) {
|
||||||
|
container, err := c.createContainer(config, name, false)
|
||||||
|
|
||||||
|
// fails with image not found, then try to reschedule with soft-image-affinity
|
||||||
|
if err != nil && strings.HasSuffix(err.Error(), "not found") {
|
||||||
|
// Check if the image exists in the cluster
|
||||||
|
// If exists, retry with a soft-image-affinity
|
||||||
|
if image := c.Image(config.Image); image != nil {
|
||||||
|
container, err = c.createContainer(config, name, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return container, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Cluster) createContainer(config *cluster.ContainerConfig, name string, with_soft_image_affinity bool) (*cluster.Container, error) {
|
||||||
c.scheduler.Lock()
|
c.scheduler.Lock()
|
||||||
defer c.scheduler.Unlock()
|
defer c.scheduler.Unlock()
|
||||||
|
|
||||||
|
@ -100,13 +114,18 @@ func (c *Cluster) CreateContainer(config *cluster.ContainerConfig, name string)
|
||||||
// Associate a Swarm ID to the container we are creating.
|
// Associate a Swarm ID to the container we are creating.
|
||||||
config.SetSwarmID(c.generateUniqueID())
|
config.SetSwarmID(c.generateUniqueID())
|
||||||
|
|
||||||
n, err := c.scheduler.SelectNodeForContainer(c.listNodes(), config)
|
config_temp := config
|
||||||
|
if with_soft_image_affinity {
|
||||||
|
config_temp.AddSoftImageAffinity(config.Image)
|
||||||
|
}
|
||||||
|
|
||||||
|
n, err := c.scheduler.SelectNodeForContainer(c.listNodes(), config_temp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if nn, ok := c.engines[n.ID]; ok {
|
if nn, ok := c.engines[n.ID]; ok {
|
||||||
container, err := nn.Create(config, name, true)
|
container, err := nn.Create(config_temp, name, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue