From 8232a897c6eea7c3f29e3b10e2574d934465521b Mon Sep 17 00:00:00 2001 From: Ezra Silvera Date: Wed, 13 Jan 2016 15:28:38 +0200 Subject: [PATCH] Implement network functions for mesos cluster: CreateNetwork(), RemoveNetwork(), and Networks() Signed-off-by: Ezra Silvera Adding error messages Signed-off-by: Ezra Silvera fix formatting Signed-off-by: Ezra Silvera fix formatting Signed-off-by: Ezra Silvera --- cluster/mesos/cluster.go | 58 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/cluster/mesos/cluster.go b/cluster/mesos/cluster.go index d268117d93..23f597c98d 100644 --- a/cluster/mesos/cluster.go +++ b/cluster/mesos/cluster.go @@ -9,6 +9,7 @@ import ( "io" "os" "sort" + "strings" "sync" "time" @@ -244,7 +245,47 @@ func (c *Cluster) RemoveImages(name string, force bool) ([]*dockerclient.ImageDe // CreateNetwork creates a network in the cluster func (c *Cluster) CreateNetwork(request *dockerclient.NetworkCreate) (*dockerclient.NetworkCreateResponse, error) { - return nil, errNotSupported + 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(dockerclient.ContainerConfig{Env: []string{"constraint:node==" + parts[0]}}) + } + + 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 +} + +func (c *Cluster) refreshNetworks() { + var wg sync.WaitGroup + for _, s := range c.agents { + e := s.engine + wg.Add(1) + go func(e *cluster.Engine) { + e.RefreshNetworks() + wg.Done() + }(e) + } + wg.Wait() } // CreateVolume creates a volume in the cluster @@ -254,7 +295,9 @@ func (c *Cluster) CreateVolume(request *dockerclient.VolumeCreateRequest) (*clus // RemoveNetwork removes network from the cluster func (c *Cluster) RemoveNetwork(network *cluster.Network) error { - return errNotSupported + err := network.Engine.RemoveNetwork(network) + c.refreshNetworks() + return err } // RemoveVolumes removes volumes from the cluster @@ -334,7 +377,16 @@ func (c *Cluster) RenameContainer(container *cluster.Container, newName string) // Networks returns all the networks in the cluster. func (c *Cluster) Networks() cluster.Networks { - return cluster.Networks{} + c.RLock() + defer c.RUnlock() + + out := cluster.Networks{} + for _, s := range c.agents { + out = append(out, s.engine.Networks()...) + } + + return out + } // Volumes returns all the volumes in the cluster.