remove_node_test.go 2.3 KB

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