From 59a88d1cf659a035cf89d9b346fb918fd6cc0af6 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Fri, 15 Apr 2016 13:43:38 -0700 Subject: [PATCH] e2e: add member remove test --- e2e/ctl_v3_member_test.go | 73 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/e2e/ctl_v3_member_test.go b/e2e/ctl_v3_member_test.go index 6d51c12ae..e00507a36 100644 --- a/e2e/ctl_v3_member_test.go +++ b/e2e/ctl_v3_member_test.go @@ -14,9 +14,18 @@ package e2e -import "testing" +import ( + "encoding/json" + "fmt" + "io" + "strings" + "testing" -func TestCtlV3MemberList(t *testing.T) { testCtl(t, memberListTest) } + "github.com/coreos/etcd/etcdserver/etcdserverpb" +) + +func TestCtlV3MemberList(t *testing.T) { testCtl(t, memberListTest) } +func TestCtlV3MemberRemove(t *testing.T) { testCtl(t, memberRemoveTest, withQuorum()) } func memberListTest(cx ctlCtx) { if err := ctlV3MemberList(cx); err != nil { @@ -32,3 +41,63 @@ func ctlV3MemberList(cx ctlCtx) error { } return spawnWithExpects(cmdArgs, lines...) } + +func getMemberList(cx ctlCtx) (etcdserverpb.MemberListResponse, error) { + cmdArgs := append(cx.PrefixArgs(), "--write-out", "json", "member", "list") + + proc, err := spawnCmd(cmdArgs) + if err != nil { + return etcdserverpb.MemberListResponse{}, err + } + var txt string + txt, err = proc.Expect("members") + if err != nil { + return etcdserverpb.MemberListResponse{}, err + } + if err = proc.Close(); err != nil { + return etcdserverpb.MemberListResponse{}, err + } + + resp := etcdserverpb.MemberListResponse{} + dec := json.NewDecoder(strings.NewReader(txt)) + if err := dec.Decode(&resp); err == io.EOF { + return etcdserverpb.MemberListResponse{}, err + } + return resp, nil +} + +func memberRemoveTest(cx ctlCtx) { + n1 := cx.cfg.clusterSize + if n1 < 2 { + cx.t.Fatalf("%d-node is too small to test 'member remove'", n1) + } + resp, err := getMemberList(cx) + if err != nil { + cx.t.Fatal(err) + } + if n1 != len(resp.Members) { + cx.t.Fatalf("expected %d, got %d", n1, len(resp.Members)) + } + + var ( + n2 = n1 - 1 + memIDToRemove = fmt.Sprintf("%x", resp.Header.MemberId) + cluserID = fmt.Sprintf("%x", resp.Header.ClusterId) + ) + if err = ctlV3MemberRemove(cx, memIDToRemove, cluserID); err != nil { + cx.t.Fatal(err) + } + + resp, err = getMemberList(cx) + if err != nil { + cx.t.Fatal(err) + } + if n2 != len(resp.Members) { + cx.t.Fatalf("expected %d, got %d", n2, len(resp.Members)) + } +} + +func ctlV3MemberRemove(cx ctlCtx, memberID, clusterID string) error { + cmdArgs := append(cx.PrefixArgs(), "member", "remove", memberID) + return spawnWithExpect(cmdArgs, fmt.Sprintf("%s removed from cluster %s", memberID, clusterID)) +}