| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- package test
- import (
- "bytes"
- "fmt"
- "net/http"
- "os"
- "testing"
- "time"
- "github.com/coreos/etcd/third_party/github.com/coreos/go-etcd/etcd"
- "github.com/coreos/etcd/tests"
- "github.com/coreos/etcd/third_party/github.com/stretchr/testify/assert"
- )
- // remove the node and node rejoin with previous log
- func TestRemoveNode(t *testing.T) {
- procAttr := new(os.ProcAttr)
- procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr}
- clusterSize := 4
- argGroup, etcds, _ := CreateCluster(clusterSize, procAttr, false)
- defer DestroyCluster(etcds)
- time.Sleep(time.Second)
- c := etcd.NewClient(nil)
- c.SyncCluster()
- resp, _ := tests.Put("http://localhost:7001/v2/admin/config", "application/json", bytes.NewBufferString(`{"activeSize":4, "syncInterval":1}`))
- if !assert.Equal(t, resp.StatusCode, 200) {
- t.FailNow()
- }
- rmReq, _ := http.NewRequest("DELETE", "http://127.0.0.1:7001/remove/node3", nil)
- client := &http.Client{}
- for i := 0; i < 2; i++ {
- for i := 0; i < 2; i++ {
- r, _ := tests.Put("http://localhost:7001/v2/admin/config", "application/json", bytes.NewBufferString(`{"activeSize":3}`))
- if !assert.Equal(t, r.StatusCode, 200) {
- t.FailNow()
- }
- client.Do(rmReq)
- fmt.Println("send remove to node3 and wait for its exiting")
- time.Sleep(100 * time.Millisecond)
- resp, err := c.Get("_etcd/machines", false, false)
- if err != nil {
- panic(err)
- }
- if len(resp.Node.Nodes) != 3 {
- t.Fatal("cannot remove peer")
- }
- etcds[2].Kill()
- etcds[2].Wait()
- if i == 1 {
- // rejoin with log
- etcds[2], err = os.StartProcess(EtcdBinPath, argGroup[2], procAttr)
- } else {
- // rejoin without log
- etcds[2], err = os.StartProcess(EtcdBinPath, append(argGroup[2], "-f"), procAttr)
- }
- if err != nil {
- panic(err)
- }
- r, _ = tests.Put("http://localhost:7001/v2/admin/config", "application/json", bytes.NewBufferString(`{"activeSize":4}`))
- if !assert.Equal(t, r.StatusCode, 200) {
- t.FailNow()
- }
- time.Sleep(time.Second + time.Second)
- resp, err = c.Get("_etcd/machines", false, false)
- if err != nil {
- panic(err)
- }
- if len(resp.Node.Nodes) != 4 {
- t.Fatalf("add peer fails #1 (%d != 4)", len(resp.Node.Nodes))
- }
- }
- // first kill the node, then remove it, then add it back
- for i := 0; i < 2; i++ {
- r, _ := tests.Put("http://localhost:7001/v2/admin/config", "application/json", bytes.NewBufferString(`{"activeSize":3}`))
- if !assert.Equal(t, r.StatusCode, 200) {
- t.FailNow()
- }
- etcds[2].Kill()
- fmt.Println("kill node3 and wait for its exiting")
- etcds[2].Wait()
- client.Do(rmReq)
- time.Sleep(100 * time.Millisecond)
- resp, err := c.Get("_etcd/machines", false, false)
- if err != nil {
- panic(err)
- }
- if len(resp.Node.Nodes) != 3 {
- t.Fatal("cannot remove peer")
- }
- if i == 1 {
- // rejoin with log
- etcds[2], err = os.StartProcess(EtcdBinPath, append(argGroup[2]), procAttr)
- } else {
- // rejoin without log
- etcds[2], err = os.StartProcess(EtcdBinPath, append(argGroup[2], "-f"), procAttr)
- }
- if err != nil {
- panic(err)
- }
- r, _ = tests.Put("http://localhost:7001/v2/admin/config", "application/json", bytes.NewBufferString(`{"activeSize":4}`))
- if !assert.Equal(t, r.StatusCode, 200) {
- t.FailNow()
- }
- time.Sleep(time.Second + time.Second)
- resp, err = c.Get("_etcd/machines", false, false)
- if err != nil {
- panic(err)
- }
- if len(resp.Node.Nodes) != 4 {
- t.Fatalf("add peer fails #2 (%d != 4)", len(resp.Node.Nodes))
- }
- }
- }
- }
|