|
|
@@ -26,6 +26,8 @@ import (
|
|
|
|
|
|
func TestCtlV3MemberList(t *testing.T) { testCtl(t, memberListTest) }
|
|
|
func TestCtlV3MemberRemove(t *testing.T) { testCtl(t, memberRemoveTest, withQuorum()) }
|
|
|
+func TestCtlV3MemberAdd(t *testing.T) { testCtl(t, memberAddTest) }
|
|
|
+func TestCtlV3MemberUpdate(t *testing.T) { testCtl(t, memberUpdateTest) }
|
|
|
|
|
|
func memberListTest(cx ctlCtx) {
|
|
|
if err := ctlV3MemberList(cx); err != nil {
|
|
|
@@ -101,3 +103,57 @@ 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))
|
|
|
}
|
|
|
+
|
|
|
+func memberAddTest(cx ctlCtx) {
|
|
|
+ peerURL := fmt.Sprintf("http://localhost:%d", etcdProcessBasePort+11)
|
|
|
+ cmdArgs := append(cx.PrefixArgs(), "member", "add", "newmember", fmt.Sprintf("--peerURLs=%s", peerURL))
|
|
|
+ if err := spawnWithExpect(cmdArgs, " added to cluster "); err != nil {
|
|
|
+ cx.t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ mresp, err := getMemberList(cx)
|
|
|
+ if err != nil {
|
|
|
+ cx.t.Fatal(err)
|
|
|
+ }
|
|
|
+ if len(mresp.Members) != 2 {
|
|
|
+ cx.t.Fatalf("expected 2, got %d", len(mresp.Members))
|
|
|
+ }
|
|
|
+
|
|
|
+ found := false
|
|
|
+ for _, mem := range mresp.Members {
|
|
|
+ for _, v := range mem.PeerURLs {
|
|
|
+ if v == peerURL {
|
|
|
+ found = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !found {
|
|
|
+ cx.t.Fatalf("expected %s in PeerURLs, got %+v", peerURL, mresp.Members)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func memberUpdateTest(cx ctlCtx) {
|
|
|
+ mr, err := getMemberList(cx)
|
|
|
+ if err != nil {
|
|
|
+ cx.t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ peerURL := fmt.Sprintf("http://localhost:%d", etcdProcessBasePort+11)
|
|
|
+ cmdArgs := append(cx.PrefixArgs(), "member", "update", fmt.Sprintf("%x", mr.Members[0].ID), fmt.Sprintf("--peerURLs=%s", peerURL))
|
|
|
+ if err = spawnWithExpect(cmdArgs, " updated in cluster "); err != nil {
|
|
|
+ cx.t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ mresp, err := getMemberList(cx)
|
|
|
+ if err != nil {
|
|
|
+ cx.t.Fatal(err)
|
|
|
+ }
|
|
|
+ if len(mresp.Members) != 1 {
|
|
|
+ cx.t.Fatalf("expected 1, got %d", len(mresp.Members))
|
|
|
+ }
|
|
|
+
|
|
|
+ if mresp.Members[0].PeerURLs[0] != peerURL {
|
|
|
+ cx.t.Fatalf("expected %s in PeerURLs, got %+v", peerURL, mresp.Members)
|
|
|
+ }
|
|
|
+}
|