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" log "github.com/Sirupsen/logrus"
"github.com/docker/swarm/cluster" "github.com/docker/swarm/cluster"
"github.com/docker/swarm/scheduler"
"github.com/samalba/dockerclient" "github.com/samalba/dockerclient"
) )
@ -16,18 +17,18 @@ type MesosCluster struct {
//TODO: list of mesos masters //TODO: list of mesos masters
//TODO: list of offers //TODO: list of offers
nodes *cluster.Nodes scheduler *scheduler.Scheduler
options *cluster.Options 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") log.WithFields(log.Fields{"name": "mesos"}).Debug("Initializing cluster")
//TODO: get the list of mesos masters using options.Discovery (zk://<ip1>,<ip2>,<ip3>/mesos) //TODO: get the list of mesos masters using options.Discovery (zk://<ip1>,<ip2>,<ip3>/mesos)
return &MesosCluster{ return &MesosCluster{
nodes: cluster.NewNodes(), scheduler: scheduler,
options: options, options: options,
} }
} }
@ -37,7 +38,8 @@ func (s *MesosCluster) CreateContainer(config *dockerclient.ContainerConfig, nam
s.Lock() s.Lock()
defer s.Unlock() 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 //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 { func (s *MesosCluster) Containers() []*cluster.Container {
return s.nodes.Containers() return nil
} }
func (s *MesosCluster) Container(IdOrName string) *cluster.Container { func (s *MesosCluster) Container(IdOrName string) *cluster.Container {
return s.nodes.Container(IdOrName) return nil
} }
func (s *MesosCluster) Info() [][2]string { func (s *MesosCluster) Info() [][2]string {

View File

@ -1,10 +1,11 @@
package cluster package swarm
import ( import (
"errors" "errors"
"sync" "sync"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
"github.com/docker/swarm/cluster"
) )
var ( var (
@ -15,17 +16,17 @@ var (
type Nodes struct { type Nodes struct {
sync.RWMutex sync.RWMutex
eventHandlers []EventHandler eventHandlers []cluster.EventHandler
nodes map[string]*Node nodes map[string]*cluster.Node
} }
func NewNodes() *Nodes { func NewNodes() *Nodes {
return &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 { for _, eventHandler := range c.eventHandlers {
if err := eventHandler.Handle(e); err != nil { if err := eventHandler.Handle(e); err != nil {
log.Error(err) 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 // Register a node within the cluster. The node must have been already
// initialized. // initialized.
func (c *Nodes) Add(n *Node) error { func (c *Nodes) Add(n *cluster.Node) error {
if !n.IsConnected() { if !n.IsConnected() {
return ErrNodeNotConnected return ErrNodeNotConnected
} }
@ -56,11 +57,11 @@ func (c *Nodes) Add(n *Node) error {
} }
// Containers returns all the images in the cluster. // Containers returns all the images in the cluster.
func (c *Nodes) Images() []*Image { func (c *Nodes) Images() []*cluster.Image {
c.Lock() c.Lock()
defer c.Unlock() defer c.Unlock()
out := []*Image{} out := []*cluster.Image{}
for _, n := range c.nodes { for _, n := range c.nodes {
out = append(out, n.Images()...) out = append(out, n.Images()...)
} }
@ -69,7 +70,7 @@ func (c *Nodes) Images() []*Image {
} }
// Image returns an image with IdOrName in the cluster // 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. // Abort immediately if the name is empty.
if len(IdOrName) == 0 { if len(IdOrName) == 0 {
return nil return nil
@ -87,11 +88,11 @@ func (c *Nodes) Image(IdOrName string) *Image {
} }
// Containers returns all the containers in the cluster. // Containers returns all the containers in the cluster.
func (c *Nodes) Containers() []*Container { func (c *Nodes) Containers() []*cluster.Container {
c.Lock() c.Lock()
defer c.Unlock() defer c.Unlock()
out := []*Container{} out := []*cluster.Container{}
for _, n := range c.nodes { for _, n := range c.nodes {
out = append(out, n.Containers()...) out = append(out, n.Containers()...)
} }
@ -100,7 +101,7 @@ func (c *Nodes) Containers() []*Container {
} }
// Container returns the container with IdOrName in the cluster // 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. // Abort immediately if the name is empty.
if len(IdOrName) == 0 { if len(IdOrName) == 0 {
return nil return nil
@ -118,8 +119,8 @@ func (c *Nodes) Container(IdOrName string) *Container {
} }
// Nodes returns the list of nodes in the cluster // Nodes returns the list of nodes in the cluster
func (c *Nodes) List() []*Node { func (c *Nodes) List() []*cluster.Node {
nodes := []*Node{} nodes := []*cluster.Node{}
c.RLock() c.RLock()
for _, node := range c.nodes { for _, node := range c.nodes {
nodes = append(nodes, node) nodes = append(nodes, node)
@ -128,7 +129,7 @@ func (c *Nodes) List() []*Node {
return nodes return nodes
} }
func (c *Nodes) Get(addr string) *Node { func (c *Nodes) Get(addr string) *cluster.Node {
for _, node := range c.nodes { for _, node := range c.nodes {
if node.Addr == addr { if node.Addr == addr {
return node return node
@ -137,7 +138,7 @@ func (c *Nodes) Get(addr string) *Node {
return nil return nil
} }
func (c *Nodes) Events(h EventHandler) error { func (c *Nodes) Events(h cluster.EventHandler) error {
c.eventHandlers = append(c.eventHandlers, h) c.eventHandlers = append(c.eventHandlers, h)
return nil return nil
} }

View File

@ -1,34 +1,22 @@
package cluster package swarm
import ( import (
"testing" "testing"
"github.com/docker/swarm/cluster"
"github.com/samalba/dockerclient" "github.com/samalba/dockerclient"
"github.com/samalba/dockerclient/mockclient"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
) )
func createNode(t *testing.T, ID string, containers ...dockerclient.Container) *Node { func createNode(t *testing.T, ID string, containers ...dockerclient.Container) *cluster.Node {
node := NewNode(ID, 0) node := cluster.NewNode(ID, 0)
node.Name = ID 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 node.ID = ID
for _, container := range containers {
node.AddContainer(&cluster.Container{Container: container, Node: node})
}
return node return node
} }
@ -38,15 +26,18 @@ func TestAdd(t *testing.T) {
assert.Nil(t, c.Get("test")) assert.Nil(t, c.Get("test"))
assert.Nil(t, c.Get("test2")) 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.Equal(t, len(c.List()), 1)
assert.NotNil(t, c.Get("test")) 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.Equal(t, len(c.List()), 1)
assert.NotNil(t, c.Get("test")) 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.Equal(t, len(c.List()), 2)
assert.NotNil(t, c.Get("test2")) assert.NotNil(t, c.Get("test2"))
} }
@ -57,8 +48,9 @@ func TestContainerLookup(t *testing.T) {
Id: "container-id", Id: "container-id",
Names: []string{"/container-name1", "/container-name2"}, 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 // Invalid lookup
assert.Nil(t, c.Container("invalid-id")) assert.Nil(t, c.Container("invalid-id"))

View File

@ -16,7 +16,7 @@ import (
type SwarmCluster struct { type SwarmCluster struct {
sync.RWMutex sync.RWMutex
nodes *cluster.Nodes nodes *Nodes
scheduler *scheduler.Scheduler scheduler *scheduler.Scheduler
options *cluster.Options options *cluster.Options
store *state.Store 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") log.WithFields(log.Fields{"name": "swarm"}).Debug("Initializing cluster")
cluster := &SwarmCluster{ cluster := &SwarmCluster{
nodes: cluster.NewNodes(), nodes: NewNodes(),
scheduler: scheduler, scheduler: scheduler,
options: options, options: options,
store: store, store: store,

View File

@ -135,7 +135,7 @@ func manage(c *cli.Context) {
case "swarm": case "swarm":
cluster = swarm.NewCluster(sched, store, options) cluster = swarm.NewCluster(sched, store, options)
case "mesos": case "mesos":
cluster = mesos.NewCluster(options) cluster = mesos.NewCluster(sched, options)
default: default:
log.Fatalf("cluster %q not supported", c.String("cluster")) log.Fatalf("cluster %q not supported", c.String("cluster"))
} }