move list of node to swarm only

Signed-off-by: Victor Vieux <vieux@docker.com>
This commit is contained in:
Victor Vieux 2015-02-16 16:10:17 -08:00
parent 47e03120f5
commit 4bfeb4b640
5 changed files with 47 additions and 52 deletions

View File

@ -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,17 +17,17 @@ type MesosCluster struct {
//TODO: list of mesos masters
//TODO: list of offers
nodes *cluster.Nodes
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://<ip1>,<ip2>,<ip3>/mesos)
return &MesosCluster{
nodes: cluster.NewNodes(),
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 {

View File

@ -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
}

View File

@ -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"))

View File

@ -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,

View File

@ -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"))
}