// 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 }
// POST /networks/create func postNetworksCreate(c *context, w http.ResponseWriter, r *http.Request) { var request apitypes.NetworkCreate if err := json.NewDecoder(r.Body).Decode(&request); err != nil { httpError(w, err.Error(), http.StatusBadRequest) return } if request.Driver == "" { request.Driver = "overlay" } response, err := c.cluster.CreateNetwork(&request) if err != nil { httpError(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(response) }