open-consul/consul/fsm_test.go

266 lines
5.2 KiB
Go
Raw Normal View History

2013-12-11 22:38:18 +00:00
package consul
import (
"bytes"
2013-12-19 20:03:57 +00:00
"github.com/hashicorp/consul/consul/structs"
"github.com/hashicorp/raft"
2013-12-11 22:38:18 +00:00
"testing"
)
type MockSink struct {
*bytes.Buffer
cancel bool
}
func (m *MockSink) ID() string {
return "Mock"
}
func (m *MockSink) Cancel() error {
m.cancel = true
return nil
}
func (m *MockSink) Close() error {
return nil
}
func makeLog(buf []byte) *raft.Log {
return &raft.Log{
Index: 1,
Term: 1,
Type: raft.LogCommand,
Data: buf,
}
}
2013-12-11 22:38:18 +00:00
func TestFSM_RegisterNode(t *testing.T) {
fsm, err := NewFSM()
if err != nil {
t.Fatalf("err: %v", err)
}
2013-12-19 20:03:57 +00:00
req := structs.RegisterRequest{
2013-12-11 23:34:10 +00:00
Datacenter: "dc1",
Node: "foo",
Address: "127.0.0.1",
}
2013-12-19 20:03:57 +00:00
buf, err := structs.Encode(structs.RegisterRequestType, req)
2013-12-11 23:34:10 +00:00
if err != nil {
t.Fatalf("err: %v", err)
}
resp := fsm.Apply(makeLog(buf))
2013-12-11 23:34:10 +00:00
if resp != nil {
t.Fatalf("resp: %v", resp)
}
// Verify we are registered
if found, _ := fsm.state.GetNode("foo"); !found {
t.Fatalf("not found!")
}
// Verify service registered
services := fsm.state.NodeServices("foo")
if len(services.Services) != 0 {
2013-12-11 23:34:10 +00:00
t.Fatalf("Services: %v", services)
}
}
func TestFSM_RegisterNode_Service(t *testing.T) {
fsm, err := NewFSM()
if err != nil {
t.Fatalf("err: %v", err)
}
2013-12-19 20:03:57 +00:00
req := structs.RegisterRequest{
2013-12-11 22:38:18 +00:00
Datacenter: "dc1",
Node: "foo",
Address: "127.0.0.1",
ServiceID: "db",
2013-12-11 22:38:18 +00:00
ServiceName: "db",
ServiceTag: "master",
ServicePort: 8000,
}
2013-12-19 20:03:57 +00:00
buf, err := structs.Encode(structs.RegisterRequestType, req)
2013-12-11 22:38:18 +00:00
if err != nil {
t.Fatalf("err: %v", err)
}
resp := fsm.Apply(makeLog(buf))
2013-12-11 22:38:18 +00:00
if resp != nil {
t.Fatalf("resp: %v", resp)
}
// Verify we are registered
if found, _ := fsm.state.GetNode("foo"); !found {
t.Fatalf("not found!")
}
// Verify service registered
services := fsm.state.NodeServices("foo")
if _, ok := services.Services["db"]; !ok {
2013-12-11 22:38:18 +00:00
t.Fatalf("not registered!")
}
}
2013-12-11 23:34:10 +00:00
func TestFSM_DeregisterService(t *testing.T) {
fsm, err := NewFSM()
if err != nil {
t.Fatalf("err: %v", err)
}
2013-12-19 20:03:57 +00:00
req := structs.RegisterRequest{
2013-12-11 23:34:10 +00:00
Datacenter: "dc1",
Node: "foo",
Address: "127.0.0.1",
ServiceID: "db",
2013-12-11 23:34:10 +00:00
ServiceName: "db",
ServiceTag: "master",
ServicePort: 8000,
}
2013-12-19 20:03:57 +00:00
buf, err := structs.Encode(structs.RegisterRequestType, req)
2013-12-11 23:34:10 +00:00
if err != nil {
t.Fatalf("err: %v", err)
}
resp := fsm.Apply(makeLog(buf))
2013-12-11 23:34:10 +00:00
if resp != nil {
t.Fatalf("resp: %v", resp)
}
2013-12-19 20:03:57 +00:00
dereg := structs.DeregisterRequest{
Datacenter: "dc1",
Node: "foo",
ServiceID: "db",
2013-12-11 23:34:10 +00:00
}
2013-12-19 20:03:57 +00:00
buf, err = structs.Encode(structs.DeregisterRequestType, dereg)
2013-12-11 23:34:10 +00:00
if err != nil {
t.Fatalf("err: %v", err)
}
resp = fsm.Apply(makeLog(buf))
2013-12-11 23:34:10 +00:00
if resp != nil {
t.Fatalf("resp: %v", resp)
}
// Verify we are registered
if found, _ := fsm.state.GetNode("foo"); !found {
t.Fatalf("not found!")
}
// Verify service not registered
services := fsm.state.NodeServices("foo")
if _, ok := services.Services["db"]; ok {
2013-12-11 23:34:10 +00:00
t.Fatalf("db registered!")
}
}
func TestFSM_DeregisterNode(t *testing.T) {
fsm, err := NewFSM()
if err != nil {
t.Fatalf("err: %v", err)
}
2013-12-19 20:03:57 +00:00
req := structs.RegisterRequest{
2013-12-11 23:34:10 +00:00
Datacenter: "dc1",
Node: "foo",
Address: "127.0.0.1",
ServiceID: "db",
2013-12-11 23:34:10 +00:00
ServiceName: "db",
ServiceTag: "master",
ServicePort: 8000,
}
2013-12-19 20:03:57 +00:00
buf, err := structs.Encode(structs.RegisterRequestType, req)
2013-12-11 23:34:10 +00:00
if err != nil {
t.Fatalf("err: %v", err)
}
resp := fsm.Apply(makeLog(buf))
2013-12-11 23:34:10 +00:00
if resp != nil {
t.Fatalf("resp: %v", resp)
}
2013-12-19 20:03:57 +00:00
dereg := structs.DeregisterRequest{
2013-12-11 23:34:10 +00:00
Datacenter: "dc1",
Node: "foo",
}
2013-12-19 20:03:57 +00:00
buf, err = structs.Encode(structs.DeregisterRequestType, dereg)
2013-12-11 23:34:10 +00:00
if err != nil {
t.Fatalf("err: %v", err)
}
resp = fsm.Apply(makeLog(buf))
2013-12-11 23:34:10 +00:00
if resp != nil {
t.Fatalf("resp: %v", resp)
}
// Verify we are registered
if found, _ := fsm.state.GetNode("foo"); found {
t.Fatalf("found!")
}
// Verify service not registered
services := fsm.state.NodeServices("foo")
if len(services.Services) != 0 {
2013-12-11 23:34:10 +00:00
t.Fatalf("Services: %v", services)
}
}
func TestFSM_SnapshotRestore(t *testing.T) {
fsm, err := NewFSM()
if err != nil {
t.Fatalf("err: %v", err)
}
// Add some state
2014-01-08 18:31:42 +00:00
fsm.state.EnsureNode(structs.Node{"foo", "127.0.0.1"})
fsm.state.EnsureNode(structs.Node{"baz", "127.0.0.2"})
fsm.state.EnsureService("foo", "web", "web", "", 80)
fsm.state.EnsureService("foo", "db", "db", "primary", 5000)
fsm.state.EnsureService("baz", "web", "web", "", 80)
fsm.state.EnsureService("baz", "db", "db", "secondary", 5000)
// Snapshot
snap, err := fsm.Snapshot()
if err != nil {
t.Fatalf("err: %v", err)
}
defer snap.Release()
// Persist
buf := bytes.NewBuffer(nil)
sink := &MockSink{buf, false}
if err := snap.Persist(sink); err != nil {
t.Fatalf("err: %v", err)
}
// Try to restore on a new FSM
fsm2, err := NewFSM()
if err != nil {
t.Fatalf("err: %v", err)
}
// Do a restore
if err := fsm2.Restore(sink); err != nil {
t.Fatalf("err: %v", err)
}
// Verify the contents
nodes := fsm2.state.Nodes()
2014-01-08 18:31:42 +00:00
if len(nodes) != 2 {
t.Fatalf("Bad: %v", nodes)
}
fooSrv := fsm2.state.NodeServices("foo")
if len(fooSrv.Services) != 2 {
t.Fatalf("Bad: %v", fooSrv)
}
if fooSrv.Services["db"].Tag != "primary" {
t.Fatalf("Bad: %v", fooSrv)
}
if fooSrv.Services["db"].Port != 5000 {
t.Fatalf("Bad: %v", fooSrv)
}
}