// CreateVolume creates a volume in the cluster func (c *Cluster) CreateVolume(request *dockerclient.VolumeCreateRequest) (*cluster.Volume, error) { var ( wg sync.WaitGroup volume *cluster.Volume err error parts = strings.SplitN(request.Name, "/", 2) node = "" ) if request.Name == "" { request.Name = stringid.GenerateRandomID() } else if len(parts) == 2 { node = parts[0] request.Name = parts[1] } if node == "" { c.RLock() for _, e := range c.engines { wg.Add(1) go func(engine *cluster.Engine) { defer wg.Done() v, er := engine.CreateVolume(request) if v != nil { volume = v err = nil } if er != nil && volume == nil { err = er } }(e) } c.RUnlock() wg.Wait() } else { config := cluster.BuildContainerConfig(dockerclient.ContainerConfig{Env: []string{"constraint:node==" + parts[0]}}) nodes, err := c.scheduler.SelectNodesForContainer(c.listNodes(), config) if err != nil { return nil, err } if nodes != nil { v, er := c.engines[nodes[0].ID].CreateVolume(request) if v != nil { volume = v err = nil } if er != nil && volume == nil { err = er } } } return volume, err }
// CreateVolume creates a volume in the cluster func (c *Cluster) CreateVolume(request *dockerclient.VolumeCreateRequest) (*cluster.Volume, error) { var ( wg sync.WaitGroup volume *cluster.Volume err error ) if request.Name == "" { request.Name = stringid.GenerateRandomID() } c.RLock() for _, e := range c.engines { wg.Add(1) go func(engine *cluster.Engine) { defer wg.Done() v, er := engine.CreateVolume(request) if v != nil { volume = v err = nil } if er != nil && volume == nil { err = er } }(e) } c.RUnlock() wg.Wait() return volume, err }