// CreateNetwork creates a network in the cluster func (c *Cluster) CreateNetwork(request *types.NetworkCreate) (*types.NetworkCreateResponse, error) { var ( parts = strings.SplitN(request.Name, "/", 2) config = &cluster.ContainerConfig{} ) if len(parts) == 2 { // a node was specified, create the container only on this node request.Name = parts[1] config = cluster.BuildContainerConfig(containertypes.Config{Env: []string{"constraint:node==" + parts[0]}}, containertypes.HostConfig{}, networktypes.NetworkingConfig{}) } c.scheduler.Lock() nodes, err := c.scheduler.SelectNodesForContainer(c.listNodes(), config) c.scheduler.Unlock() if err != nil { return nil, err } if nodes == nil { return nil, errors.New("cannot find node to create network") } n := nodes[0] s, ok := c.agents[n.ID] if !ok { return nil, fmt.Errorf("Unable to create network on agent %q", n.ID) } resp, err := s.engine.CreateNetwork(request) c.refreshNetworks() return resp, err }
// CreateNetwork creates a network in the cluster func (c *Cluster) CreateNetwork(request *types.NetworkCreate) (response *types.NetworkCreateResponse, err error) { var ( parts = strings.SplitN(request.Name, "/", 2) config = &cluster.ContainerConfig{} ) if len(parts) == 2 { // a node was specified, create the container only on this node request.Name = parts[1] config = cluster.BuildContainerConfig(containertypes.Config{Env: []string{"constraint:node==" + parts[0]}}, containertypes.HostConfig{}, networktypes.NetworkingConfig{}) } nodes, err := c.scheduler.SelectNodesForContainer(c.listNodes(), config) if err != nil { return nil, err } if nodes != nil { resp, err := c.engines[nodes[0].ID].CreateNetwork(request) if err == nil { if network := c.engines[nodes[0].ID].Networks().Get(resp.ID); network != nil && network.Scope == "global" { for id, engine := range c.engines { if id != nodes[0].ID { engine.AddNetwork(network) } } } } return resp, err } return nil, nil }