mirror of https://github.com/docker/docs.git
move list of node to swarm only
Signed-off-by: Victor Vieux <vieux@docker.com>
This commit is contained in:
parent
47e03120f5
commit
4bfeb4b640
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
@ -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"))
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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"))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue