etcdserver: introduce the cluster and member
This introduces two new concepts: the cluster and the member. Members are logical etcd instances that have a name, raft ID, and a list of peer and client addresses. A cluster is made up of a list of members.
This commit is contained in:
115
etcdserver/cluster_store_test.go
Normal file
115
etcdserver/cluster_store_test.go
Normal file
@ -0,0 +1,115 @@
|
||||
package etcdserver
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
etcdErr "github.com/coreos/etcd/error"
|
||||
"github.com/coreos/etcd/store"
|
||||
)
|
||||
|
||||
func TestClusterStoreGet(t *testing.T) {
|
||||
tests := []struct {
|
||||
mems []Member
|
||||
wmems []Member
|
||||
}{
|
||||
{
|
||||
[]Member{{Name: "node1", ID: 1}},
|
||||
[]Member{{Name: "node1", ID: 1}},
|
||||
},
|
||||
{
|
||||
[]Member{},
|
||||
[]Member{},
|
||||
},
|
||||
{
|
||||
[]Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
|
||||
[]Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
|
||||
},
|
||||
{
|
||||
[]Member{{Name: "node2", ID: 2}, {Name: "node1", ID: 1}},
|
||||
[]Member{{Name: "node1", ID: 1}, {Name: "node2", ID: 2}},
|
||||
},
|
||||
}
|
||||
for i, tt := range tests {
|
||||
c := Cluster{}
|
||||
err := c.AddSlice(tt.mems)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
cs := NewClusterStore(&getAllStore{}, c)
|
||||
|
||||
if g := cs.Get(); !reflect.DeepEqual(g, c) {
|
||||
t.Errorf("#%d: mems = %v, want %v", i, g, c)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestClusterStoreDelete(t *testing.T) {
|
||||
st := &storeGetAllDeleteRecorder{}
|
||||
c := Cluster{}
|
||||
c.Add(Member{Name: "node", ID: 1})
|
||||
cs := NewClusterStore(st, c)
|
||||
cs.Delete(1)
|
||||
|
||||
wdeletes := []string{machineKVPrefix + "1"}
|
||||
if !reflect.DeepEqual(st.deletes, wdeletes) {
|
||||
t.Error("deletes = %v, want %v", st.deletes, wdeletes)
|
||||
}
|
||||
}
|
||||
|
||||
// simpleStore implements basic create and get.
|
||||
type simpleStore struct {
|
||||
storeRecorder
|
||||
st map[string]string
|
||||
}
|
||||
|
||||
func (s *simpleStore) Create(key string, _ bool, value string, _ bool, _ time.Time) (*store.Event, error) {
|
||||
if s.st == nil {
|
||||
s.st = make(map[string]string)
|
||||
}
|
||||
s.st[key] = value
|
||||
return nil, nil
|
||||
}
|
||||
func (s *simpleStore) Get(key string, _, _ bool) (*store.Event, error) {
|
||||
val, ok := s.st[key]
|
||||
if !ok {
|
||||
return nil, etcdErr.NewError(etcdErr.EcodeKeyNotFound, "", 0)
|
||||
}
|
||||
ev := &store.Event{Node: &store.NodeExtern{Key: key, Value: stringp(val)}}
|
||||
return ev, nil
|
||||
}
|
||||
|
||||
// getAllStore inherits simpleStore, and makes Get return all keys.
|
||||
type getAllStore struct {
|
||||
simpleStore
|
||||
}
|
||||
|
||||
func (s *getAllStore) Get(_ string, _, _ bool) (*store.Event, error) {
|
||||
nodes := make([]*store.NodeExtern, 0)
|
||||
for k, v := range s.st {
|
||||
nodes = append(nodes, &store.NodeExtern{Key: k, Value: stringp(v)})
|
||||
}
|
||||
return &store.Event{Node: &store.NodeExtern{Nodes: nodes}}, nil
|
||||
}
|
||||
|
||||
type storeDeleteRecorder struct {
|
||||
storeRecorder
|
||||
deletes []string
|
||||
}
|
||||
|
||||
func (s *storeDeleteRecorder) Delete(key string, _, _ bool) (*store.Event, error) {
|
||||
s.deletes = append(s.deletes, key)
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
type storeGetAllDeleteRecorder struct {
|
||||
getAllStore
|
||||
deletes []string
|
||||
}
|
||||
|
||||
func (s *storeGetAllDeleteRecorder) Delete(key string, _, _ bool) (*store.Event, error) {
|
||||
s.deletes = append(s.deletes, key)
|
||||
return nil, nil
|
||||
}
|
Reference in New Issue
Block a user