From 4bfeb4b640c8978a1ed7f1bf74174eb304c41680 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Mon, 16 Feb 2015 16:10:17 -0800 Subject: [PATCH] move list of node to swarm only Signed-off-by: Victor Vieux --- cluster/mesos/mesos.go | 18 +++++++------ cluster/{ => swarm}/nodes.go | 33 ++++++++++++------------ cluster/{ => swarm}/nodes_test.go | 42 +++++++++++++------------------ cluster/swarm/swarm.go | 4 +-- manage.go | 2 +- 5 files changed, 47 insertions(+), 52 deletions(-) rename cluster/{ => swarm}/nodes.go (74%) rename cluster/{ => swarm}/nodes_test.go (57%) diff --git a/cluster/mesos/mesos.go b/cluster/mesos/mesos.go index 46b74b3c10..295c29c302 100644 --- a/cluster/mesos/mesos.go +++ b/cluster/mesos/mesos.go @@ -6,6 +6,7 @@ import ( log "github.com/Sirupsen/logrus" "github.com/docker/swarm/cluster" + "github.com/docker/swarm/scheduler" "github.com/samalba/dockerclient" ) @@ -16,18 +17,18 @@ type MesosCluster struct { //TODO: list of mesos masters //TODO: list of offers - nodes *cluster.Nodes - options *cluster.Options + scheduler *scheduler.Scheduler + options *cluster.Options } -func NewCluster(options *cluster.Options) cluster.Cluster { +func NewCluster(scheduler *scheduler.Scheduler, options *cluster.Options) cluster.Cluster { log.WithFields(log.Fields{"name": "mesos"}).Debug("Initializing cluster") //TODO: get the list of mesos masters using options.Discovery (zk://,,/mesos) return &MesosCluster{ - nodes: cluster.NewNodes(), - options: options, + scheduler: scheduler, + options: options, } } @@ -37,7 +38,8 @@ func (s *MesosCluster) CreateContainer(config *dockerclient.ContainerConfig, nam s.Lock() defer s.Unlock() - //TODO: pick the right offer (using strategy & filters ???) + //TODO: pick the right offer (using strategy & filters) + //offer, err := s.scheduler.SelectNodeForContainer(s.offers, config) //TODO: LaunchTask on the Mesos cluster and get container @@ -68,11 +70,11 @@ func (s *MesosCluster) Image(IdOrName string) *cluster.Image { } func (s *MesosCluster) Containers() []*cluster.Container { - return s.nodes.Containers() + return nil } func (s *MesosCluster) Container(IdOrName string) *cluster.Container { - return s.nodes.Container(IdOrName) + return nil } func (s *MesosCluster) Info() [][2]string { diff --git a/cluster/nodes.go b/cluster/swarm/nodes.go similarity index 74% rename from cluster/nodes.go rename to cluster/swarm/nodes.go index 5a578d7047..243a085241 100644 --- a/cluster/nodes.go +++ b/cluster/swarm/nodes.go @@ -1,10 +1,11 @@ -package cluster +package swarm import ( "errors" "sync" log "github.com/Sirupsen/logrus" + "github.com/docker/swarm/cluster" ) var ( @@ -15,17 +16,17 @@ var ( type Nodes struct { sync.RWMutex - eventHandlers []EventHandler - nodes map[string]*Node + eventHandlers []cluster.EventHandler + nodes map[string]*cluster.Node } func NewNodes() *Nodes { return &Nodes{ - nodes: make(map[string]*Node), + nodes: make(map[string]*cluster.Node), } } -func (c *Nodes) Handle(e *Event) error { +func (c *Nodes) Handle(e *cluster.Event) error { for _, eventHandler := range c.eventHandlers { if err := eventHandler.Handle(e); err != nil { log.Error(err) @@ -36,7 +37,7 @@ func (c *Nodes) Handle(e *Event) error { // Register a node within the cluster. The node must have been already // initialized. -func (c *Nodes) Add(n *Node) error { +func (c *Nodes) Add(n *cluster.Node) error { if !n.IsConnected() { return ErrNodeNotConnected } @@ -56,11 +57,11 @@ func (c *Nodes) Add(n *Node) error { } // Containers returns all the images in the cluster. -func (c *Nodes) Images() []*Image { +func (c *Nodes) Images() []*cluster.Image { c.Lock() defer c.Unlock() - out := []*Image{} + out := []*cluster.Image{} for _, n := range c.nodes { out = append(out, n.Images()...) } @@ -69,7 +70,7 @@ func (c *Nodes) Images() []*Image { } // Image returns an image with IdOrName in the cluster -func (c *Nodes) Image(IdOrName string) *Image { +func (c *Nodes) Image(IdOrName string) *cluster.Image { // Abort immediately if the name is empty. if len(IdOrName) == 0 { return nil @@ -87,11 +88,11 @@ func (c *Nodes) Image(IdOrName string) *Image { } // Containers returns all the containers in the cluster. -func (c *Nodes) Containers() []*Container { +func (c *Nodes) Containers() []*cluster.Container { c.Lock() defer c.Unlock() - out := []*Container{} + out := []*cluster.Container{} for _, n := range c.nodes { out = append(out, n.Containers()...) } @@ -100,7 +101,7 @@ func (c *Nodes) Containers() []*Container { } // Container returns the container with IdOrName in the cluster -func (c *Nodes) Container(IdOrName string) *Container { +func (c *Nodes) Container(IdOrName string) *cluster.Container { // Abort immediately if the name is empty. if len(IdOrName) == 0 { return nil @@ -118,8 +119,8 @@ func (c *Nodes) Container(IdOrName string) *Container { } // Nodes returns the list of nodes in the cluster -func (c *Nodes) List() []*Node { - nodes := []*Node{} +func (c *Nodes) List() []*cluster.Node { + nodes := []*cluster.Node{} c.RLock() for _, node := range c.nodes { nodes = append(nodes, node) @@ -128,7 +129,7 @@ func (c *Nodes) List() []*Node { return nodes } -func (c *Nodes) Get(addr string) *Node { +func (c *Nodes) Get(addr string) *cluster.Node { for _, node := range c.nodes { if node.Addr == addr { return node @@ -137,7 +138,7 @@ func (c *Nodes) Get(addr string) *Node { return nil } -func (c *Nodes) Events(h EventHandler) error { +func (c *Nodes) Events(h cluster.EventHandler) error { c.eventHandlers = append(c.eventHandlers, h) return nil } diff --git a/cluster/nodes_test.go b/cluster/swarm/nodes_test.go similarity index 57% rename from cluster/nodes_test.go rename to cluster/swarm/nodes_test.go index f35d5dc2de..124529b61c 100644 --- a/cluster/nodes_test.go +++ b/cluster/swarm/nodes_test.go @@ -1,34 +1,22 @@ -package cluster +package swarm import ( "testing" + "github.com/docker/swarm/cluster" "github.com/samalba/dockerclient" - "github.com/samalba/dockerclient/mockclient" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" ) -func createNode(t *testing.T, ID string, containers ...dockerclient.Container) *Node { - node := NewNode(ID, 0) +func createNode(t *testing.T, ID string, containers ...dockerclient.Container) *cluster.Node { + node := cluster.NewNode(ID, 0) node.Name = ID - - assert.False(t, node.IsConnected()) - - client := mockclient.NewMockClient() - client.On("Info").Return(mockInfo, nil) - client.On("ListContainers", true, false, "").Return(containers, nil) - client.On("ListImages").Return([]*dockerclient.Image{}, nil) - client.On("InspectContainer", mock.Anything).Return( - &dockerclient.ContainerInfo{ - Config: &dockerclient.ContainerConfig{CpuShares: 100}, - }, nil) - client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return() - - assert.NoError(t, node.connectClient(client)) - assert.True(t, node.IsConnected()) node.ID = ID + for _, container := range containers { + node.AddContainer(&cluster.Container{Container: container, Node: node}) + } + return node } @@ -38,15 +26,18 @@ func TestAdd(t *testing.T) { assert.Nil(t, c.Get("test")) assert.Nil(t, c.Get("test2")) - assert.NoError(t, c.Add(createNode(t, "test"))) + n := createNode(t, "test") + c.nodes[n.ID] = n assert.Equal(t, len(c.List()), 1) assert.NotNil(t, c.Get("test")) - assert.Error(t, c.Add(createNode(t, "test"))) + n = createNode(t, "test") + c.nodes[n.ID] = n assert.Equal(t, len(c.List()), 1) assert.NotNil(t, c.Get("test")) - assert.NoError(t, c.Add(createNode(t, "test2"))) + n = createNode(t, "test2") + c.nodes[n.ID] = n assert.Equal(t, len(c.List()), 2) assert.NotNil(t, c.Get("test2")) } @@ -57,8 +48,9 @@ func TestContainerLookup(t *testing.T) { Id: "container-id", Names: []string{"/container-name1", "/container-name2"}, } - node := createNode(t, "test-node", container) - assert.NoError(t, c.Add(node)) + + n := createNode(t, "test-node", container) + c.nodes[n.ID] = n // Invalid lookup assert.Nil(t, c.Container("invalid-id")) diff --git a/cluster/swarm/swarm.go b/cluster/swarm/swarm.go index 8e34219a14..0694ff8b99 100644 --- a/cluster/swarm/swarm.go +++ b/cluster/swarm/swarm.go @@ -16,7 +16,7 @@ import ( type SwarmCluster struct { sync.RWMutex - nodes *cluster.Nodes + nodes *Nodes scheduler *scheduler.Scheduler options *cluster.Options store *state.Store @@ -26,7 +26,7 @@ func NewCluster(scheduler *scheduler.Scheduler, store *state.Store, options *clu log.WithFields(log.Fields{"name": "swarm"}).Debug("Initializing cluster") cluster := &SwarmCluster{ - nodes: cluster.NewNodes(), + nodes: NewNodes(), scheduler: scheduler, options: options, store: store, diff --git a/manage.go b/manage.go index eabdd91ff9..734a25ff33 100644 --- a/manage.go +++ b/manage.go @@ -135,7 +135,7 @@ func manage(c *cli.Context) { case "swarm": cluster = swarm.NewCluster(sched, store, options) case "mesos": - cluster = mesos.NewCluster(options) + cluster = mesos.NewCluster(sched, options) default: log.Fatalf("cluster %q not supported", c.String("cluster")) }