remove_node_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package test
  2. import (
  3. "bytes"
  4. "fmt"
  5. "net/http"
  6. "os"
  7. "testing"
  8. "time"
  9. "github.com/coreos/etcd/third_party/github.com/coreos/go-etcd/etcd"
  10. "github.com/coreos/etcd/tests"
  11. "github.com/coreos/etcd/third_party/github.com/stretchr/testify/assert"
  12. )
  13. // remove the node and node rejoin with previous log
  14. func TestRemoveNode(t *testing.T) {
  15. procAttr := new(os.ProcAttr)
  16. procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr}
  17. clusterSize := 3
  18. argGroup, etcds, _ := CreateCluster(clusterSize, procAttr, false)
  19. defer DestroyCluster(etcds)
  20. time.Sleep(time.Second)
  21. c := etcd.NewClient(nil)
  22. c.SyncCluster()
  23. resp, _ := tests.Put("http://localhost:7001/v2/admin/config", "application/json", bytes.NewBufferString(`{"syncInterval":1}`))
  24. if !assert.Equal(t, resp.StatusCode, 200) {
  25. t.FailNow()
  26. }
  27. rmReq, _ := http.NewRequest("DELETE", "http://127.0.0.1:7001/remove/node3", nil)
  28. client := &http.Client{}
  29. for i := 0; i < 2; i++ {
  30. for i := 0; i < 2; i++ {
  31. client.Do(rmReq)
  32. fmt.Println("send remove to node3 and wait for its exiting")
  33. time.Sleep(100 * time.Millisecond)
  34. resp, err := c.Get("_etcd/machines", false, false)
  35. if err != nil {
  36. panic(err)
  37. }
  38. if len(resp.Node.Nodes) != 2 {
  39. t.Fatal("cannot remove peer")
  40. }
  41. etcds[2].Kill()
  42. etcds[2].Wait()
  43. if i == 1 {
  44. // rejoin with log
  45. etcds[2], err = os.StartProcess(EtcdBinPath, argGroup[2], procAttr)
  46. } else {
  47. // rejoin without log
  48. etcds[2], err = os.StartProcess(EtcdBinPath, append(argGroup[2], "-f"), procAttr)
  49. }
  50. if err != nil {
  51. panic(err)
  52. }
  53. time.Sleep(time.Second + time.Second)
  54. resp, err = c.Get("_etcd/machines", false, false)
  55. if err != nil {
  56. panic(err)
  57. }
  58. if len(resp.Node.Nodes) != 3 {
  59. t.Fatalf("add peer fails #1 (%d != 3)", len(resp.Node.Nodes))
  60. }
  61. }
  62. // first kill the node, then remove it, then add it back
  63. for i := 0; i < 2; i++ {
  64. etcds[2].Kill()
  65. fmt.Println("kill node3 and wait for its exiting")
  66. etcds[2].Wait()
  67. client.Do(rmReq)
  68. resp, err := c.Get("_etcd/machines", false, false)
  69. if err != nil {
  70. panic(err)
  71. }
  72. if len(resp.Node.Nodes) != 2 {
  73. t.Fatal("cannot remove peer")
  74. }
  75. if i == 1 {
  76. // rejoin with log
  77. etcds[2], err = os.StartProcess(EtcdBinPath, append(argGroup[2]), procAttr)
  78. } else {
  79. // rejoin without log
  80. etcds[2], err = os.StartProcess(EtcdBinPath, append(argGroup[2], "-f"), procAttr)
  81. }
  82. if err != nil {
  83. panic(err)
  84. }
  85. time.Sleep(time.Second)
  86. resp, err = c.Get("_etcd/machines", false, false)
  87. if err != nil {
  88. panic(err)
  89. }
  90. if len(resp.Node.Nodes) != 3 {
  91. t.Fatalf("add peer fails #2 (%d != 3)", len(resp.Node.Nodes))
  92. }
  93. }
  94. }
  95. }