Adding node listing

This commit is contained in:
Armon Dadgar 2013-12-12 10:48:36 -08:00
parent 9a76a2bf12
commit d3cba241bf
4 changed files with 66 additions and 0 deletions

View File

@ -63,3 +63,23 @@ func (c *Catalog) ListDatacenters(args *struct{}, reply *[]string) error {
*reply = dcs
return nil
}
// ListNodes is used to query the nodes in a DC
func (c *Catalog) ListNodes(dc string, reply *rpc.Nodes) error {
if done, err := c.srv.forward("Catalog.ListNodes", dc, dc, reply); done {
return err
}
// Get the current nodes
state := c.srv.fsm.State()
rawNodes := state.Nodes()
// Format the response
nodes := rpc.Nodes(make([]rpc.Node, len(rawNodes)/2))
for i := 0; i < len(rawNodes); i += 2 {
nodes[i] = rpc.Node{rawNodes[i], rawNodes[i+1]}
}
*reply = nodes
return nil
}

View File

@ -183,3 +183,37 @@ func TestCatalogListDatacenters(t *testing.T) {
t.Fatalf("bad: %v", out)
}
}
func TestCatalogListNodes(t *testing.T) {
dir1, s1 := testServer(t)
defer os.RemoveAll(dir1)
defer s1.Shutdown()
client := rpcClient(t, s1)
defer client.Close()
var out rpc.Nodes
err := client.Call("Catalog.ListNodes", "dc1", &out)
if err == nil || err.Error() != "No cluster leader" {
t.Fatalf("err: %v", err)
}
// Wait for leader
time.Sleep(100 * time.Millisecond)
// Just add a node
s1.fsm.State().EnsureNode("foo", "127.0.0.1")
if err := client.Call("Catalog.ListNodes", "dc1", &out); err != nil {
t.Fatalf("err: %v", err)
}
if len(out) != 1 {
t.Fatalf("bad: %v", out)
}
if out[0].Node != "foo" {
t.Fatalf("bad: %v", out)
}
if out[0].Address != "127.0.0.1" {
t.Fatalf("bad: %v", out)
}
}

View File

@ -34,6 +34,11 @@ func NewFSM() (*consulFSM, error) {
return fsm, nil
}
// State is used to return a handle to the current state
func (c *consulFSM) State() *StateStore {
return c.state
}
func (c *consulFSM) Apply(buf []byte) interface{} {
switch rpc.MessageType(buf[0]) {
case rpc.RegisterRequestType:

View File

@ -39,6 +39,13 @@ type DeregisterRequest struct {
ServiceName string
}
// Used to return information about a node
type Node struct {
Node string
Address string
}
type Nodes []Node
// Decode is used to decode a MsgPack encoded object
func Decode(buf []byte, out interface{}) error {
var handle codec.MsgpackHandle