From 02abbb6a6c7a7aef6e4ca4971fbbe00e841bd059 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Sun, 3 Nov 2013 15:49:00 -0700 Subject: [PATCH 1/9] Migration test. --- release_version.go | 2 + tests/fixtures/v1/README | 14 +++++++ tests/fixtures/v1/complete.1.sh | 4 ++ tests/fixtures/v1/complete.2.sh | 3 ++ tests/fixtures/v1/complete.3.sh | 3 ++ tests/fixtures/v1/complete.4.sh | 12 ++++++ tests/fixtures/v1/complete/conf | 1 + tests/fixtures/v1/complete/info | 18 +++++++++ tests/fixtures/v1/complete/log | Bin 0 -> 1289 bytes tests/functional/v1_migration_test.go | 51 ++++++++++++++++++++++++++ 10 files changed, 108 insertions(+) create mode 100644 release_version.go create mode 100644 tests/fixtures/v1/README create mode 100644 tests/fixtures/v1/complete.1.sh create mode 100644 tests/fixtures/v1/complete.2.sh create mode 100644 tests/fixtures/v1/complete.3.sh create mode 100644 tests/fixtures/v1/complete.4.sh create mode 100644 tests/fixtures/v1/complete/conf create mode 100644 tests/fixtures/v1/complete/info create mode 100644 tests/fixtures/v1/complete/log create mode 100644 tests/functional/v1_migration_test.go diff --git a/release_version.go b/release_version.go new file mode 100644 index 000000000..5285c9763 --- /dev/null +++ b/release_version.go @@ -0,0 +1,2 @@ +package main +const releaseVersion = "v0.1.2-33-g1a2a9d6" diff --git a/tests/fixtures/v1/README b/tests/fixtures/v1/README new file mode 100644 index 000000000..0940522bb --- /dev/null +++ b/tests/fixtures/v1/README @@ -0,0 +1,14 @@ +README + +The scripts in this directory should be run from the project root: + +$ cd $GOPATH/src/github.com/coreos/etcd +$ tests/fixtures/v1/complete.1.sh + +Scripts with numbers should be run in separate terminal windows (in order): + +$ tests/fixtures/v1/complete.1.sh +$ tests/fixtures/v1/complete.2.sh +$ tests/fixtures/v1/complete.3.sh + +The resulting server state data can be found in tmp/node0. diff --git a/tests/fixtures/v1/complete.1.sh b/tests/fixtures/v1/complete.1.sh new file mode 100644 index 000000000..ee77deaed --- /dev/null +++ b/tests/fixtures/v1/complete.1.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +./build +./etcd -d tmp/node0 -n node0 diff --git a/tests/fixtures/v1/complete.2.sh b/tests/fixtures/v1/complete.2.sh new file mode 100644 index 000000000..1b067eb2b --- /dev/null +++ b/tests/fixtures/v1/complete.2.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +./etcd -s 127.0.0.1:7002 -c 127.0.0.1:4002 -C 127.0.0.1:7001 -d tmp/node2 -n node2 diff --git a/tests/fixtures/v1/complete.3.sh b/tests/fixtures/v1/complete.3.sh new file mode 100644 index 000000000..a1c9c6b3e --- /dev/null +++ b/tests/fixtures/v1/complete.3.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +./etcd -s 127.0.0.1:7003 -c 127.0.0.1:4003 -C 127.0.0.1:7001 -d tmp/node3 -n node3 diff --git a/tests/fixtures/v1/complete.4.sh b/tests/fixtures/v1/complete.4.sh new file mode 100644 index 000000000..b228b1a1d --- /dev/null +++ b/tests/fixtures/v1/complete.4.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +curl -L http://127.0.0.1:4001/v1/keys/message -d value="Hello world" +curl -L http://127.0.0.1:4001/v1/keys/message -d value="Hello etcd" +curl -L http://127.0.0.1:4001/v1/keys/message -X DELETE +curl -L http://127.0.0.1:4001/v1/keys/foo -d value=bar -d ttl=5 +curl -L http://127.0.0.1:4001/v1/keys/foo -d value=one +curl -L http://127.0.0.1:4001/v1/keys/foo -d prevValue=two -d value=three +curl -L http://127.0.0.1:4001/v1/keys/foo -d prevValue=one -d value=two +curl -L http://127.0.0.1:4001/v1/keys/bar -d prevValue= -d value=four +curl -L http://127.0.0.1:4001/v1/keys/bar -d prevValue= -d value=five +curl -X DELETE http://127.0.0.1:4001/v1/keys/_etcd/machines diff --git a/tests/fixtures/v1/complete/conf b/tests/fixtures/v1/complete/conf new file mode 100644 index 000000000..827bb86d1 --- /dev/null +++ b/tests/fixtures/v1/complete/conf @@ -0,0 +1 @@ +{"commitIndex":13,"peers":[]} \ No newline at end of file diff --git a/tests/fixtures/v1/complete/info b/tests/fixtures/v1/complete/info new file mode 100644 index 000000000..398c8e1e8 --- /dev/null +++ b/tests/fixtures/v1/complete/info @@ -0,0 +1,18 @@ +{ + "name": "node0", + "raftURL": "http://127.0.0.1:7001", + "etcdURL": "http://127.0.0.1:4001", + "webURL": "", + "raftListenHost": "127.0.0.1:7001", + "etcdListenHost": "127.0.0.1:4001", + "raftTLS": { + "CertFile": "", + "KeyFile": "", + "CAFile": "" + }, + "etcdTLS": { + "CertFile": "", + "KeyFile": "", + "CAFile": "" + } +} diff --git a/tests/fixtures/v1/complete/log b/tests/fixtures/v1/complete/log new file mode 100644 index 0000000000000000000000000000000000000000..5ed55603d845adc26e3651e53fabe6cc9cf59427 GIT binary patch literal 1289 zcmbu9&rjPh6vr8C!k^$hq!loeclV)6;9^=T3bHjLlU+JhL@m6sprNRgTEQ#n+#9v+u@;u;d z6%{dBGA`_JGHeuQYcyO7t-y(&V{r#hNE|>_CD(wAQIg-2sw2pA>pj>qPl^0E%t|=V zYQd^!dcHz8>Rd&!l=%3PUS0$k$=Syl(#dNi($pTLL(V=SXtTDILJkhZw|UkyFJYgv z&oi=qOhfzDHq8G?%6TnXs=!yWHXX)Y69-t(gFtsf6Gpx?P5U9LTA$$@F6P*RQrR)Tm4l4J(NYAjEzZXN?O$mfKDPeT^TwV7-c3XlCZmW$&;9pC?HKd7slV5Yi z8DE6Gm|`d8n(o}by{GCmxo_}_(9Jf`Y&4(a_E731Ul979PNEU}|4u>?v~`wu68& Date: Sun, 3 Nov 2013 15:58:16 -0700 Subject: [PATCH 2/9] Update migration. --- tests/fixtures/v1/README | 1 + tests/fixtures/v1/complete/conf | 2 +- tests/fixtures/v1/complete/log | Bin 1289 -> 1643 bytes 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/fixtures/v1/README b/tests/fixtures/v1/README index 0940522bb..8e24d1bc6 100644 --- a/tests/fixtures/v1/README +++ b/tests/fixtures/v1/README @@ -10,5 +10,6 @@ Scripts with numbers should be run in separate terminal windows (in order): $ tests/fixtures/v1/complete.1.sh $ tests/fixtures/v1/complete.2.sh $ tests/fixtures/v1/complete.3.sh +$ tests/fixtures/v1/complete.4.sh The resulting server state data can be found in tmp/node0. diff --git a/tests/fixtures/v1/complete/conf b/tests/fixtures/v1/complete/conf index 827bb86d1..2c5bb4e81 100644 --- a/tests/fixtures/v1/complete/conf +++ b/tests/fixtures/v1/complete/conf @@ -1 +1 @@ -{"commitIndex":13,"peers":[]} \ No newline at end of file +{"commitIndex":16,"peers":[{"name":"node3","connectionString":""}]} \ No newline at end of file diff --git a/tests/fixtures/v1/complete/log b/tests/fixtures/v1/complete/log index 5ed55603d845adc26e3651e53fabe6cc9cf59427..72bda1d35f6abf4cca845fd6b57c9b997c901b41 100644 GIT binary patch delta 351 zcmeC=dd)Mzh|5wpJ=N0GFv-$#qD?WYg(VjU^F(fSB;m z%WSJ{plfUxVrXh*VrFG*sApthY-D0;W@@f$U}j}tpj6AH00yR}Tpa9^mompPa!h7s zsbJ)sT*Fev$Tc~GRcEq1tH)#}7SYKytTC(>mRuY>6S>uq-S9Mq)yRa4gLkqgn-TyU C@Ff)h From 44356dc654f00252b935323cf9769f7c0c4574f2 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Sun, 3 Nov 2013 16:02:59 -0700 Subject: [PATCH 3/9] Update migration script. --- tests/fixtures/v1/complete.4.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/fixtures/v1/complete.4.sh b/tests/fixtures/v1/complete.4.sh index b228b1a1d..15c756eb0 100644 --- a/tests/fixtures/v1/complete.4.sh +++ b/tests/fixtures/v1/complete.4.sh @@ -3,10 +3,11 @@ curl -L http://127.0.0.1:4001/v1/keys/message -d value="Hello world" curl -L http://127.0.0.1:4001/v1/keys/message -d value="Hello etcd" curl -L http://127.0.0.1:4001/v1/keys/message -X DELETE -curl -L http://127.0.0.1:4001/v1/keys/foo -d value=bar -d ttl=5 +curl -L http://127.0.0.1:4001/v1/keys/message2 -d value="Hola" +curl -L http://127.0.0.1:4001/v1/keys/expiring -d value=bar -d ttl=5 curl -L http://127.0.0.1:4001/v1/keys/foo -d value=one curl -L http://127.0.0.1:4001/v1/keys/foo -d prevValue=two -d value=three curl -L http://127.0.0.1:4001/v1/keys/foo -d prevValue=one -d value=two curl -L http://127.0.0.1:4001/v1/keys/bar -d prevValue= -d value=four curl -L http://127.0.0.1:4001/v1/keys/bar -d prevValue= -d value=five -curl -X DELETE http://127.0.0.1:4001/v1/keys/_etcd/machines +curl -X DELETE http://127.0.0.1:7001/remove/node2 From bf76af8fd1ae74f16cfa055ee7328638da2c5bb7 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Mon, 4 Nov 2013 13:16:45 -0700 Subject: [PATCH 4/9] Update migration. --- tests/fixtures/v1/README | 2 +- tests/fixtures/v1/complete/conf | 1 - tests/fixtures/v1/complete/info | 18 --------- tests/fixtures/v1/complete/log | Bin 1643 -> 0 bytes tests/fixtures/v1/{complete.1.sh => run.1.sh} | 0 tests/fixtures/v1/{complete.2.sh => run.2.sh} | 0 tests/fixtures/v1/{complete.3.sh => run.3.sh} | 0 tests/fixtures/v1/{complete.4.sh => run.4.sh} | 0 tests/functional/v1_migration_test.go | 35 +++++++++++------- 9 files changed, 22 insertions(+), 34 deletions(-) delete mode 100644 tests/fixtures/v1/complete/conf delete mode 100644 tests/fixtures/v1/complete/info delete mode 100644 tests/fixtures/v1/complete/log rename tests/fixtures/v1/{complete.1.sh => run.1.sh} (100%) rename tests/fixtures/v1/{complete.2.sh => run.2.sh} (100%) rename tests/fixtures/v1/{complete.3.sh => run.3.sh} (100%) rename tests/fixtures/v1/{complete.4.sh => run.4.sh} (100%) diff --git a/tests/fixtures/v1/README b/tests/fixtures/v1/README index 8e24d1bc6..e930eda7d 100644 --- a/tests/fixtures/v1/README +++ b/tests/fixtures/v1/README @@ -12,4 +12,4 @@ $ tests/fixtures/v1/complete.2.sh $ tests/fixtures/v1/complete.3.sh $ tests/fixtures/v1/complete.4.sh -The resulting server state data can be found in tmp/node0. +The resulting server state data can be found in tmp/node*. diff --git a/tests/fixtures/v1/complete/conf b/tests/fixtures/v1/complete/conf deleted file mode 100644 index 2c5bb4e81..000000000 --- a/tests/fixtures/v1/complete/conf +++ /dev/null @@ -1 +0,0 @@ -{"commitIndex":16,"peers":[{"name":"node3","connectionString":""}]} \ No newline at end of file diff --git a/tests/fixtures/v1/complete/info b/tests/fixtures/v1/complete/info deleted file mode 100644 index 398c8e1e8..000000000 --- a/tests/fixtures/v1/complete/info +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "node0", - "raftURL": "http://127.0.0.1:7001", - "etcdURL": "http://127.0.0.1:4001", - "webURL": "", - "raftListenHost": "127.0.0.1:7001", - "etcdListenHost": "127.0.0.1:4001", - "raftTLS": { - "CertFile": "", - "KeyFile": "", - "CAFile": "" - }, - "etcdTLS": { - "CertFile": "", - "KeyFile": "", - "CAFile": "" - } -} diff --git a/tests/fixtures/v1/complete/log b/tests/fixtures/v1/complete/log deleted file mode 100644 index 72bda1d35f6abf4cca845fd6b57c9b997c901b41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1643 zcmbuAO>dh(5Qh8R&8BVA9D72X3)y8^Fx+~GRH>DcG)}4>aacRFn6+Tzq_XSwj7JPIO*gX6rT*_u($r(_>k^VM0Zv4#TP&z64<_`UoK{4%cR diff --git a/tests/fixtures/v1/complete.1.sh b/tests/fixtures/v1/run.1.sh similarity index 100% rename from tests/fixtures/v1/complete.1.sh rename to tests/fixtures/v1/run.1.sh diff --git a/tests/fixtures/v1/complete.2.sh b/tests/fixtures/v1/run.2.sh similarity index 100% rename from tests/fixtures/v1/complete.2.sh rename to tests/fixtures/v1/run.2.sh diff --git a/tests/fixtures/v1/complete.3.sh b/tests/fixtures/v1/run.3.sh similarity index 100% rename from tests/fixtures/v1/complete.3.sh rename to tests/fixtures/v1/run.3.sh diff --git a/tests/fixtures/v1/complete.4.sh b/tests/fixtures/v1/run.4.sh similarity index 100% rename from tests/fixtures/v1/complete.4.sh rename to tests/fixtures/v1/run.4.sh diff --git a/tests/functional/v1_migration_test.go b/tests/functional/v1_migration_test.go index f6f892287..f5d76fee5 100644 --- a/tests/functional/v1_migration_test.go +++ b/tests/functional/v1_migration_test.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "os" "os/exec" + "path/filepath" "testing" "time" @@ -18,22 +19,29 @@ func TestV1Migration(t *testing.T) { os.RemoveAll(path) defer os.RemoveAll(path) - // Copy over fixture files. - if err := exec.Command("cp", "-r", "../fixtures/v1/complete", path).Run(); err != nil { - panic("Fixture initialization error") - } + nodes := []string{"node0", "node1"} + for i, node := range nodes { + nodepath := filepath.Join(path, node) - procAttr := new(os.ProcAttr) - procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr} - args := []string{"etcd", fmt.Sprintf("-d=%s", path)} + // Copy over fixture files. + if err := exec.Command("cp", "-r", "../fixtures/v1/" + node, nodepath).Run(); err != nil { + panic("Fixture initialization error") + } - process, err := os.StartProcess(EtcdBinPath, args, procAttr) - if err != nil { - t.Fatal("start process failed:" + err.Error()) - return + procAttr := new(os.ProcAttr) + procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr} + + args := []string{"etcd", fmt.Sprintf("-d=%s", nodepath)} + args = append(args, "-c", fmt.Sprintf("127.0.0.1:%d", 4001 + i)) + args = append(args, "-s", fmt.Sprintf("127.0.0.1:%d", 7001 + i)) + process, err := os.StartProcess(EtcdBinPath, args, procAttr) + if err != nil { + t.Fatal("start process failed:" + err.Error()) + return + } + defer process.Kill() + time.Sleep(time.Second) } - defer process.Kill() - time.Sleep(time.Second) // Ensure deleted message is removed. @@ -48,4 +56,3 @@ func TestV1Migration(t *testing.T) { assert.Nil(t, err, "") assert.Equal(t, resp.StatusCode, 404, "") } - From 6b5d6ecd8b21c61a19e18b618a3378ce2c47d3d4 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Mon, 4 Nov 2013 13:46:43 -0700 Subject: [PATCH 5/9] Cluster migration test. --- tests/fixtures/v1/node0/conf | 1 + tests/fixtures/v1/node0/info | 18 ++++++++++++++++++ tests/fixtures/v1/node0/log | Bin 0 -> 1540 bytes tests/fixtures/v1/node2/conf | 1 + tests/fixtures/v1/node2/info | 18 ++++++++++++++++++ tests/fixtures/v1/node2/log | Bin 0 -> 1540 bytes tests/fixtures/v1/node3/conf | 1 + tests/fixtures/v1/node3/info | 18 ++++++++++++++++++ tests/fixtures/v1/node3/log | Bin 0 -> 1540 bytes tests/functional/v1_migration_test.go | 13 ++++++++++--- 10 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 tests/fixtures/v1/node0/conf create mode 100644 tests/fixtures/v1/node0/info create mode 100644 tests/fixtures/v1/node0/log create mode 100644 tests/fixtures/v1/node2/conf create mode 100644 tests/fixtures/v1/node2/info create mode 100644 tests/fixtures/v1/node2/log create mode 100644 tests/fixtures/v1/node3/conf create mode 100644 tests/fixtures/v1/node3/info create mode 100644 tests/fixtures/v1/node3/log diff --git a/tests/fixtures/v1/node0/conf b/tests/fixtures/v1/node0/conf new file mode 100644 index 000000000..8f401dbe4 --- /dev/null +++ b/tests/fixtures/v1/node0/conf @@ -0,0 +1 @@ +{"commitIndex":15,"peers":[{"name":"node2","connectionString":""}]} \ No newline at end of file diff --git a/tests/fixtures/v1/node0/info b/tests/fixtures/v1/node0/info new file mode 100644 index 000000000..398c8e1e8 --- /dev/null +++ b/tests/fixtures/v1/node0/info @@ -0,0 +1,18 @@ +{ + "name": "node0", + "raftURL": "http://127.0.0.1:7001", + "etcdURL": "http://127.0.0.1:4001", + "webURL": "", + "raftListenHost": "127.0.0.1:7001", + "etcdListenHost": "127.0.0.1:4001", + "raftTLS": { + "CertFile": "", + "KeyFile": "", + "CAFile": "" + }, + "etcdTLS": { + "CertFile": "", + "KeyFile": "", + "CAFile": "" + } +} diff --git a/tests/fixtures/v1/node0/log b/tests/fixtures/v1/node0/log new file mode 100644 index 0000000000000000000000000000000000000000..de3e7075e9396556e207ce78f30e80d042202a7a GIT binary patch literal 1540 zcmbu9O>dh(5Qf{PADd0vBt7N+>CM`9wwTRz(!?up)P*$d{bGqSjSrmSF5} z3;PfJMOUU!mhl8I**wm!$hl+4GHqS!B1;HyGfN8?rj@BO^g~CY<8mm2NC>eLJ8?QQaYkPly0Q3yM9j%27}P|0#9S6Yn9~C0=XYadu1Q8mu#bEE?I!Tgd%zW>iG5VP z{sm|6Het_d?9#4!K*sut+-q_lQ7b~LYLd7fT_l$hl}Q4n|>Sr E08;vuA^-pY literal 0 HcmV?d00001 diff --git a/tests/fixtures/v1/node2/conf b/tests/fixtures/v1/node2/conf new file mode 100644 index 000000000..19d6a9c92 --- /dev/null +++ b/tests/fixtures/v1/node2/conf @@ -0,0 +1 @@ +{"commitIndex":15,"peers":[{"name":"node0","connectionString":""}]} \ No newline at end of file diff --git a/tests/fixtures/v1/node2/info b/tests/fixtures/v1/node2/info new file mode 100644 index 000000000..85114a5f8 --- /dev/null +++ b/tests/fixtures/v1/node2/info @@ -0,0 +1,18 @@ +{ + "name": "node2", + "raftURL": "http://127.0.0.1:7002", + "etcdURL": "http://127.0.0.1:4002", + "webURL": "", + "raftListenHost": "127.0.0.1:7002", + "etcdListenHost": "127.0.0.1:4002", + "raftTLS": { + "CertFile": "", + "KeyFile": "", + "CAFile": "" + }, + "etcdTLS": { + "CertFile": "", + "KeyFile": "", + "CAFile": "" + } +} diff --git a/tests/fixtures/v1/node2/log b/tests/fixtures/v1/node2/log new file mode 100644 index 0000000000000000000000000000000000000000..de3e7075e9396556e207ce78f30e80d042202a7a GIT binary patch literal 1540 zcmbu9O>dh(5Qf{PADd0vBt7N+>CM`9wwTRz(!?up)P*$d{bGqSjSrmSF5} z3;PfJMOUU!mhl8I**wm!$hl+4GHqS!B1;HyGfN8?rj@BO^g~CY<8mm2NC>eLJ8?QQaYkPly0Q3yM9j%27}P|0#9S6Yn9~C0=XYadu1Q8mu#bEE?I!Tgd%zW>iG5VP z{sm|6Het_d?9#4!K*sut+-q_lQ7b~LYLd7fT_l$hl}Q4n|>Sr E08;vuA^-pY literal 0 HcmV?d00001 diff --git a/tests/fixtures/v1/node3/conf b/tests/fixtures/v1/node3/conf new file mode 100644 index 000000000..d8a5840de --- /dev/null +++ b/tests/fixtures/v1/node3/conf @@ -0,0 +1 @@ +{"commitIndex":15,"peers":[{"name":"node0","connectionString":""},{"name":"node2","connectionString":""}]} \ No newline at end of file diff --git a/tests/fixtures/v1/node3/info b/tests/fixtures/v1/node3/info new file mode 100644 index 000000000..5e5cb3f3a --- /dev/null +++ b/tests/fixtures/v1/node3/info @@ -0,0 +1,18 @@ +{ + "name": "node3", + "raftURL": "http://127.0.0.1:7003", + "etcdURL": "http://127.0.0.1:4003", + "webURL": "", + "raftListenHost": "127.0.0.1:7003", + "etcdListenHost": "127.0.0.1:4003", + "raftTLS": { + "CertFile": "", + "KeyFile": "", + "CAFile": "" + }, + "etcdTLS": { + "CertFile": "", + "KeyFile": "", + "CAFile": "" + } +} diff --git a/tests/fixtures/v1/node3/log b/tests/fixtures/v1/node3/log new file mode 100644 index 0000000000000000000000000000000000000000..de3e7075e9396556e207ce78f30e80d042202a7a GIT binary patch literal 1540 zcmbu9O>dh(5Qf{PADd0vBt7N+>CM`9wwTRz(!?up)P*$d{bGqSjSrmSF5} z3;PfJMOUU!mhl8I**wm!$hl+4GHqS!B1;HyGfN8?rj@BO^g~CY<8mm2NC>eLJ8?QQaYkPly0Q3yM9j%27}P|0#9S6Yn9~C0=XYadu1Q8mu#bEE?I!Tgd%zW>iG5VP z{sm|6Het_d?9#4!K*sut+-q_lQ7b~LYLd7fT_l$hl}Q4n|>Sr E08;vuA^-pY literal 0 HcmV?d00001 diff --git a/tests/functional/v1_migration_test.go b/tests/functional/v1_migration_test.go index f5d76fee5..b4c9a07bc 100644 --- a/tests/functional/v1_migration_test.go +++ b/tests/functional/v1_migration_test.go @@ -19,13 +19,19 @@ func TestV1Migration(t *testing.T) { os.RemoveAll(path) defer os.RemoveAll(path) - nodes := []string{"node0", "node1"} + nodes := []string{"node0", "node2"} for i, node := range nodes { nodepath := filepath.Join(path, node) + fixturepath, _ := filepath.Abs(filepath.Join("../fixtures/v1/", node)) + fmt.Println("FIXPATH =", fixturepath) + fmt.Println("NODEPATH =", nodepath) + os.MkdirAll(filepath.Dir(nodepath), 0777) // Copy over fixture files. - if err := exec.Command("cp", "-r", "../fixtures/v1/" + node, nodepath).Run(); err != nil { - panic("Fixture initialization error") + c := exec.Command("cp", "-rf", fixturepath, nodepath) + if out, err := c.CombinedOutput(); err != nil { + fmt.Println(">>>>>>\n", string(out), "<<<<<<") + panic("Fixture initialization error:" + err.Error()) } procAttr := new(os.ProcAttr) @@ -43,6 +49,7 @@ func TestV1Migration(t *testing.T) { time.Sleep(time.Second) } + time.Sleep(120 * time.Second) // Ensure deleted message is removed. resp, err := tests.Get("http://localhost:4001/v2/keys/message") From 35d971970790ff34c9eb07cb970124a5ff6d0239 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Mon, 4 Nov 2013 13:56:02 -0700 Subject: [PATCH 6/9] Add v1.solo migration fixture. --- tests/fixtures/{v1 => v1.cluster}/README | 10 +++++----- tests/fixtures/{v1 => v1.cluster}/node0/conf | 0 tests/fixtures/{v1 => v1.cluster}/node0/info | 0 tests/fixtures/{v1 => v1.cluster}/node0/log | Bin tests/fixtures/{v1 => v1.cluster}/node2/conf | 0 tests/fixtures/{v1 => v1.cluster}/node2/info | 0 tests/fixtures/{v1 => v1.cluster}/node2/log | Bin tests/fixtures/{v1 => v1.cluster}/node3/conf | 0 tests/fixtures/{v1 => v1.cluster}/node3/info | 0 tests/fixtures/{v1 => v1.cluster}/node3/log | Bin tests/fixtures/{v1 => v1.cluster}/run.1.sh | 0 tests/fixtures/{v1 => v1.cluster}/run.2.sh | 0 tests/fixtures/{v1 => v1.cluster}/run.3.sh | 0 tests/fixtures/{v1 => v1.cluster}/run.4.sh | 0 tests/fixtures/v1.solo/README | 13 +++++++++++++ tests/fixtures/v1.solo/node0/conf | 1 + tests/fixtures/v1.solo/node0/info | 18 ++++++++++++++++++ tests/fixtures/v1.solo/node0/log | Bin 0 -> 275 bytes tests/fixtures/v1.solo/run.1.sh | 4 ++++ tests/fixtures/v1.solo/run.2.sh | 3 +++ 20 files changed, 44 insertions(+), 5 deletions(-) rename tests/fixtures/{v1 => v1.cluster}/README (59%) rename tests/fixtures/{v1 => v1.cluster}/node0/conf (100%) rename tests/fixtures/{v1 => v1.cluster}/node0/info (100%) rename tests/fixtures/{v1 => v1.cluster}/node0/log (100%) rename tests/fixtures/{v1 => v1.cluster}/node2/conf (100%) rename tests/fixtures/{v1 => v1.cluster}/node2/info (100%) rename tests/fixtures/{v1 => v1.cluster}/node2/log (100%) rename tests/fixtures/{v1 => v1.cluster}/node3/conf (100%) rename tests/fixtures/{v1 => v1.cluster}/node3/info (100%) rename tests/fixtures/{v1 => v1.cluster}/node3/log (100%) rename tests/fixtures/{v1 => v1.cluster}/run.1.sh (100%) mode change 100644 => 100755 rename tests/fixtures/{v1 => v1.cluster}/run.2.sh (100%) mode change 100644 => 100755 rename tests/fixtures/{v1 => v1.cluster}/run.3.sh (100%) mode change 100644 => 100755 rename tests/fixtures/{v1 => v1.cluster}/run.4.sh (100%) mode change 100644 => 100755 create mode 100644 tests/fixtures/v1.solo/README create mode 100644 tests/fixtures/v1.solo/node0/conf create mode 100644 tests/fixtures/v1.solo/node0/info create mode 100644 tests/fixtures/v1.solo/node0/log create mode 100755 tests/fixtures/v1.solo/run.1.sh create mode 100755 tests/fixtures/v1.solo/run.2.sh diff --git a/tests/fixtures/v1/README b/tests/fixtures/v1.cluster/README similarity index 59% rename from tests/fixtures/v1/README rename to tests/fixtures/v1.cluster/README index e930eda7d..8e144444a 100644 --- a/tests/fixtures/v1/README +++ b/tests/fixtures/v1.cluster/README @@ -3,13 +3,13 @@ README The scripts in this directory should be run from the project root: $ cd $GOPATH/src/github.com/coreos/etcd -$ tests/fixtures/v1/complete.1.sh +$ tests/fixtures/v1/run.1.sh Scripts with numbers should be run in separate terminal windows (in order): -$ tests/fixtures/v1/complete.1.sh -$ tests/fixtures/v1/complete.2.sh -$ tests/fixtures/v1/complete.3.sh -$ tests/fixtures/v1/complete.4.sh +$ tests/fixtures/v1/run.1.sh +$ tests/fixtures/v1/run.2.sh +$ tests/fixtures/v1/run.3.sh +$ tests/fixtures/v1/run.4.sh The resulting server state data can be found in tmp/node*. diff --git a/tests/fixtures/v1/node0/conf b/tests/fixtures/v1.cluster/node0/conf similarity index 100% rename from tests/fixtures/v1/node0/conf rename to tests/fixtures/v1.cluster/node0/conf diff --git a/tests/fixtures/v1/node0/info b/tests/fixtures/v1.cluster/node0/info similarity index 100% rename from tests/fixtures/v1/node0/info rename to tests/fixtures/v1.cluster/node0/info diff --git a/tests/fixtures/v1/node0/log b/tests/fixtures/v1.cluster/node0/log similarity index 100% rename from tests/fixtures/v1/node0/log rename to tests/fixtures/v1.cluster/node0/log diff --git a/tests/fixtures/v1/node2/conf b/tests/fixtures/v1.cluster/node2/conf similarity index 100% rename from tests/fixtures/v1/node2/conf rename to tests/fixtures/v1.cluster/node2/conf diff --git a/tests/fixtures/v1/node2/info b/tests/fixtures/v1.cluster/node2/info similarity index 100% rename from tests/fixtures/v1/node2/info rename to tests/fixtures/v1.cluster/node2/info diff --git a/tests/fixtures/v1/node2/log b/tests/fixtures/v1.cluster/node2/log similarity index 100% rename from tests/fixtures/v1/node2/log rename to tests/fixtures/v1.cluster/node2/log diff --git a/tests/fixtures/v1/node3/conf b/tests/fixtures/v1.cluster/node3/conf similarity index 100% rename from tests/fixtures/v1/node3/conf rename to tests/fixtures/v1.cluster/node3/conf diff --git a/tests/fixtures/v1/node3/info b/tests/fixtures/v1.cluster/node3/info similarity index 100% rename from tests/fixtures/v1/node3/info rename to tests/fixtures/v1.cluster/node3/info diff --git a/tests/fixtures/v1/node3/log b/tests/fixtures/v1.cluster/node3/log similarity index 100% rename from tests/fixtures/v1/node3/log rename to tests/fixtures/v1.cluster/node3/log diff --git a/tests/fixtures/v1/run.1.sh b/tests/fixtures/v1.cluster/run.1.sh old mode 100644 new mode 100755 similarity index 100% rename from tests/fixtures/v1/run.1.sh rename to tests/fixtures/v1.cluster/run.1.sh diff --git a/tests/fixtures/v1/run.2.sh b/tests/fixtures/v1.cluster/run.2.sh old mode 100644 new mode 100755 similarity index 100% rename from tests/fixtures/v1/run.2.sh rename to tests/fixtures/v1.cluster/run.2.sh diff --git a/tests/fixtures/v1/run.3.sh b/tests/fixtures/v1.cluster/run.3.sh old mode 100644 new mode 100755 similarity index 100% rename from tests/fixtures/v1/run.3.sh rename to tests/fixtures/v1.cluster/run.3.sh diff --git a/tests/fixtures/v1/run.4.sh b/tests/fixtures/v1.cluster/run.4.sh old mode 100644 new mode 100755 similarity index 100% rename from tests/fixtures/v1/run.4.sh rename to tests/fixtures/v1.cluster/run.4.sh diff --git a/tests/fixtures/v1.solo/README b/tests/fixtures/v1.solo/README new file mode 100644 index 000000000..65d86d323 --- /dev/null +++ b/tests/fixtures/v1.solo/README @@ -0,0 +1,13 @@ +README + +The scripts in this directory should be run from the project root: + +$ cd $GOPATH/src/github.com/coreos/etcd +$ tests/fixtures/v1.solo/run.1.sh + +Scripts with numbers should be run in separate terminal windows (in order): + +$ tests/fixtures/v1/run.1.sh +$ tests/fixtures/v1/run.2.sh + +The resulting server state data can be found in tmp/node0. diff --git a/tests/fixtures/v1.solo/node0/conf b/tests/fixtures/v1.solo/node0/conf new file mode 100644 index 000000000..95106f8b1 --- /dev/null +++ b/tests/fixtures/v1.solo/node0/conf @@ -0,0 +1 @@ +{"commitIndex":1,"peers":[]} \ No newline at end of file diff --git a/tests/fixtures/v1.solo/node0/info b/tests/fixtures/v1.solo/node0/info new file mode 100644 index 000000000..398c8e1e8 --- /dev/null +++ b/tests/fixtures/v1.solo/node0/info @@ -0,0 +1,18 @@ +{ + "name": "node0", + "raftURL": "http://127.0.0.1:7001", + "etcdURL": "http://127.0.0.1:4001", + "webURL": "", + "raftListenHost": "127.0.0.1:7001", + "etcdListenHost": "127.0.0.1:4001", + "raftTLS": { + "CertFile": "", + "KeyFile": "", + "CAFile": "" + }, + "etcdTLS": { + "CertFile": "", + "KeyFile": "", + "CAFile": "" + } +} diff --git a/tests/fixtures/v1.solo/node0/log b/tests/fixtures/v1.solo/node0/log new file mode 100644 index 0000000000000000000000000000000000000000..661d21d0e8daad5ddc3c14c5b7153ce0dbe55f4f GIT binary patch literal 275 zcmZ{fy>h}Z5QGUdjw@;^jcROk5NxC;NRb8x=nX!Ii7k0-@snYAckWD$PK9o@r~M=Z zuZ0eSk6~~0iGH7(lPj#e-DQ&<{1%(Ga8??5Q8C2RXr`kh>N)JRmSbtN3hBNr6dwrS2^^?L A4FCWD literal 0 HcmV?d00001 diff --git a/tests/fixtures/v1.solo/run.1.sh b/tests/fixtures/v1.solo/run.1.sh new file mode 100755 index 000000000..ee77deaed --- /dev/null +++ b/tests/fixtures/v1.solo/run.1.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +./build +./etcd -d tmp/node0 -n node0 diff --git a/tests/fixtures/v1.solo/run.2.sh b/tests/fixtures/v1.solo/run.2.sh new file mode 100755 index 000000000..96bd3e862 --- /dev/null +++ b/tests/fixtures/v1.solo/run.2.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +curl -L http://127.0.0.1:4001/v1/keys/message -d value="Hello world" From d3bfc49b7cfe17b1d27f1b75cf14d205112f4964 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Mon, 4 Nov 2013 14:36:20 -0700 Subject: [PATCH 7/9] Remove leading slash from handlers. --- server/v1/delete_key_handler.go | 2 +- server/v1/get_key_handler.go | 2 +- server/v1/set_key_handler.go | 2 +- server/v1/watch_key_handler.go | 2 +- server/v2/delete_handler.go | 2 +- server/v2/get_handler.go | 2 +- server/v2/post_handler.go | 2 +- server/v2/put_handler.go | 2 +- tests/functional/v1_migration_test.go | 50 +++++++++++++++++++++++++-- 9 files changed, 56 insertions(+), 10 deletions(-) diff --git a/server/v1/delete_key_handler.go b/server/v1/delete_key_handler.go index 44fe459e4..561196b95 100644 --- a/server/v1/delete_key_handler.go +++ b/server/v1/delete_key_handler.go @@ -8,7 +8,7 @@ import ( // Removes a key from the store. func DeleteKeyHandler(w http.ResponseWriter, req *http.Request, s Server) error { vars := mux.Vars(req) - key := "/" + vars["key"] + key := vars["key"] c := s.Store().CommandFactory().CreateDeleteCommand(key, false) return s.Dispatch(c, w, req) } diff --git a/server/v1/get_key_handler.go b/server/v1/get_key_handler.go index 53558e142..9a68212c6 100644 --- a/server/v1/get_key_handler.go +++ b/server/v1/get_key_handler.go @@ -10,7 +10,7 @@ import ( // Retrieves the value for a given key. func GetKeyHandler(w http.ResponseWriter, req *http.Request, s Server) error { vars := mux.Vars(req) - key := "/" + vars["key"] + key := vars["key"] // Retrieve the key from the store. event, err := s.Store().Get(key, false, false, s.CommitIndex(), s.Term()) diff --git a/server/v1/set_key_handler.go b/server/v1/set_key_handler.go index 7acfe7ecb..c047ebfb7 100644 --- a/server/v1/set_key_handler.go +++ b/server/v1/set_key_handler.go @@ -12,7 +12,7 @@ import ( // Sets the value for a given key. func SetKeyHandler(w http.ResponseWriter, req *http.Request, s Server) error { vars := mux.Vars(req) - key := "/" + vars["key"] + key := vars["key"] req.ParseForm() diff --git a/server/v1/watch_key_handler.go b/server/v1/watch_key_handler.go index e8db56c30..8a617a50b 100644 --- a/server/v1/watch_key_handler.go +++ b/server/v1/watch_key_handler.go @@ -14,7 +14,7 @@ import ( func WatchKeyHandler(w http.ResponseWriter, req *http.Request, s Server) error { var err error vars := mux.Vars(req) - key := "/" + vars["key"] + key := vars["key"] // Create a command to watch from a given index (default 0). var sinceIndex uint64 = 0 diff --git a/server/v2/delete_handler.go b/server/v2/delete_handler.go index 7afc02f04..17030c757 100644 --- a/server/v2/delete_handler.go +++ b/server/v2/delete_handler.go @@ -8,7 +8,7 @@ import ( func DeleteHandler(w http.ResponseWriter, req *http.Request, s Server) error { vars := mux.Vars(req) - key := "/" + vars["key"] + key := vars["key"] recursive := (req.FormValue("recursive") == "true") c := s.Store().CommandFactory().CreateDeleteCommand(key, recursive) diff --git a/server/v2/get_handler.go b/server/v2/get_handler.go index 39e932fe0..640533b05 100644 --- a/server/v2/get_handler.go +++ b/server/v2/get_handler.go @@ -18,7 +18,7 @@ func GetHandler(w http.ResponseWriter, req *http.Request, s Server) error { var event *store.Event vars := mux.Vars(req) - key := "/" + vars["key"] + key := vars["key"] // Help client to redirect the request to the current leader if req.FormValue("consistent") == "true" && s.State() != raft.Leader { diff --git a/server/v2/post_handler.go b/server/v2/post_handler.go index 4dc98b925..ca94b4a93 100644 --- a/server/v2/post_handler.go +++ b/server/v2/post_handler.go @@ -10,7 +10,7 @@ import ( func PostHandler(w http.ResponseWriter, req *http.Request, s Server) error { vars := mux.Vars(req) - key := "/" + vars["key"] + key := vars["key"] value := req.FormValue("value") expireTime, err := store.TTL(req.FormValue("ttl")) diff --git a/server/v2/put_handler.go b/server/v2/put_handler.go index 3afb018b7..cb44a7237 100644 --- a/server/v2/put_handler.go +++ b/server/v2/put_handler.go @@ -15,7 +15,7 @@ func PutHandler(w http.ResponseWriter, req *http.Request, s Server) error { var c raft.Command vars := mux.Vars(req) - key := "/" + vars["key"] + key := vars["key"] req.ParseForm() diff --git a/tests/functional/v1_migration_test.go b/tests/functional/v1_migration_test.go index b4c9a07bc..a01d00c20 100644 --- a/tests/functional/v1_migration_test.go +++ b/tests/functional/v1_migration_test.go @@ -14,7 +14,53 @@ import ( ) // Ensure that we can start a v2 node from the log of a v1 node. -func TestV1Migration(t *testing.T) { +func TestV1SoloMigration(t *testing.T) { + path, _ := ioutil.TempDir("", "etcd-") + os.MkdirAll(path, 0777) + defer os.RemoveAll(path) + + nodepath := filepath.Join(path, "node0") + fixturepath, _ := filepath.Abs("../fixtures/v1.solo/node0") + + + // Copy over fixture files. + c := exec.Command("cp", "-rf", fixturepath, nodepath) + if out, err := c.CombinedOutput(); err != nil { + fmt.Println(">>>>>>\n", string(out), "<<<<<<") + panic("Fixture initialization error:" + err.Error()) + } + + procAttr := new(os.ProcAttr) + procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr} + + args := []string{"etcd", fmt.Sprintf("-d=%s", nodepath)} + args = append(args, "-c", "127.0.0.1:4001") + args = append(args, "-s", "127.0.0.1:7001") + process, err := os.StartProcess(EtcdBinPath, args, procAttr) + if err != nil { + t.Fatal("start process failed:" + err.Error()) + return + } + defer process.Kill() + time.Sleep(time.Second) + + time.Sleep(120 * time.Second) + + // Ensure deleted message is removed. + resp, err := tests.Get("http://localhost:4001/v2/keys/message") + tests.ReadBody(resp) + assert.Nil(t, err, "") + assert.Equal(t, resp.StatusCode, 404, "") + + // Ensure TTL'd message is removed. + resp, err = tests.Get("http://localhost:4001/v2/keys/foo") + tests.ReadBody(resp) + assert.Nil(t, err, "") + assert.Equal(t, resp.StatusCode, 404, "") +} + +// Ensure that we can start a v2 cluster from the logs of a v1 cluster. +func TestV1ClusterMigration(t *testing.T) { path, _ := ioutil.TempDir("", "etcd-") os.RemoveAll(path) defer os.RemoveAll(path) @@ -22,7 +68,7 @@ func TestV1Migration(t *testing.T) { nodes := []string{"node0", "node2"} for i, node := range nodes { nodepath := filepath.Join(path, node) - fixturepath, _ := filepath.Abs(filepath.Join("../fixtures/v1/", node)) + fixturepath, _ := filepath.Abs(filepath.Join("../fixtures/v1.cluster/", node)) fmt.Println("FIXPATH =", fixturepath) fmt.Println("NODEPATH =", nodepath) os.MkdirAll(filepath.Dir(nodepath), 0777) From 8c6606ed121beef4fb81b5ace71cd7aa1f190dc5 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Tue, 5 Nov 2013 15:57:53 -0700 Subject: [PATCH 8/9] Fix TTL migration issue. --- store/store.go | 13 +++++++++++++ tests/functional/v1_migration_test.go | 12 ++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/store/store.go b/store/store.go index 22d1e9017..4e5ea79fa 100644 --- a/store/store.go +++ b/store/store.go @@ -16,6 +16,12 @@ import ( // The default version to set when the store is first initialized. const defaultVersion = 2 +var minExpireTime time.Time + +func init() { + minExpireTime, _ = time.Parse(time.RFC3339, "2000-01-01T00:00:00Z") +} + type Store interface { Version() int CommandFactory() CommandFactory @@ -344,6 +350,13 @@ func (s *store) internalCreate(nodePath string, value string, unique bool, repla nodePath = path.Clean(path.Join("/", nodePath)) + // Assume expire times that are way in the past are not valid. + // This can occur when the time is serialized to JSON and read back in. + if expireTime.Before(minExpireTime) { + expireTime = Permanent + } + + dir, newNodeName := path.Split(nodePath) // walk through the nodePath, create dirs and get the last directory node diff --git a/tests/functional/v1_migration_test.go b/tests/functional/v1_migration_test.go index a01d00c20..c99f7711a 100644 --- a/tests/functional/v1_migration_test.go +++ b/tests/functional/v1_migration_test.go @@ -21,7 +21,7 @@ func TestV1SoloMigration(t *testing.T) { nodepath := filepath.Join(path, "node0") fixturepath, _ := filepath.Abs("../fixtures/v1.solo/node0") - + fmt.Println("DATA_DIR =", nodepath) // Copy over fixture files. c := exec.Command("cp", "-rf", fixturepath, nodepath) @@ -44,19 +44,11 @@ func TestV1SoloMigration(t *testing.T) { defer process.Kill() time.Sleep(time.Second) - time.Sleep(120 * time.Second) - // Ensure deleted message is removed. resp, err := tests.Get("http://localhost:4001/v2/keys/message") tests.ReadBody(resp) assert.Nil(t, err, "") - assert.Equal(t, resp.StatusCode, 404, "") - - // Ensure TTL'd message is removed. - resp, err = tests.Get("http://localhost:4001/v2/keys/foo") - tests.ReadBody(resp) - assert.Nil(t, err, "") - assert.Equal(t, resp.StatusCode, 404, "") + assert.Equal(t, resp.StatusCode, 200, "") } // Ensure that we can start a v2 cluster from the logs of a v1 cluster. From 954217fb739ad5ef9f5c5e00047bafc20288ca4b Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Tue, 12 Nov 2013 19:22:09 -0500 Subject: [PATCH 9/9] Fix v1 cluster migration test. --- server/v1/delete_key_handler.go | 2 +- server/v1/get_key_handler.go | 2 +- server/v1/set_key_handler.go | 2 +- server/v1/watch_key_handler.go | 2 +- server/v2/delete_handler.go | 2 +- server/v2/get_handler.go | 2 +- server/v2/post_handler.go | 2 +- server/v2/put_handler.go | 2 +- tests/functional/v1_migration_test.go | 12 ++++++------ 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/server/v1/delete_key_handler.go b/server/v1/delete_key_handler.go index 561196b95..44fe459e4 100644 --- a/server/v1/delete_key_handler.go +++ b/server/v1/delete_key_handler.go @@ -8,7 +8,7 @@ import ( // Removes a key from the store. func DeleteKeyHandler(w http.ResponseWriter, req *http.Request, s Server) error { vars := mux.Vars(req) - key := vars["key"] + key := "/" + vars["key"] c := s.Store().CommandFactory().CreateDeleteCommand(key, false) return s.Dispatch(c, w, req) } diff --git a/server/v1/get_key_handler.go b/server/v1/get_key_handler.go index 8664a56ae..880bf289e 100644 --- a/server/v1/get_key_handler.go +++ b/server/v1/get_key_handler.go @@ -10,7 +10,7 @@ import ( // Retrieves the value for a given key. func GetKeyHandler(w http.ResponseWriter, req *http.Request, s Server) error { vars := mux.Vars(req) - key := vars["key"] + key := "/" + vars["key"] // Retrieve the key from the store. event, err := s.Store().Get(key, false, false) diff --git a/server/v1/set_key_handler.go b/server/v1/set_key_handler.go index b3ec7d68b..b1b4390a2 100644 --- a/server/v1/set_key_handler.go +++ b/server/v1/set_key_handler.go @@ -12,7 +12,7 @@ import ( // Sets the value for a given key. func SetKeyHandler(w http.ResponseWriter, req *http.Request, s Server) error { vars := mux.Vars(req) - key := vars["key"] + key := "/" + vars["key"] req.ParseForm() diff --git a/server/v1/watch_key_handler.go b/server/v1/watch_key_handler.go index 5943924cc..de5ed0656 100644 --- a/server/v1/watch_key_handler.go +++ b/server/v1/watch_key_handler.go @@ -13,7 +13,7 @@ import ( func WatchKeyHandler(w http.ResponseWriter, req *http.Request, s Server) error { var err error vars := mux.Vars(req) - key := vars["key"] + key := "/" + vars["key"] // Create a command to watch from a given index (default 0). var sinceIndex uint64 = 0 diff --git a/server/v2/delete_handler.go b/server/v2/delete_handler.go index 17030c757..7afc02f04 100644 --- a/server/v2/delete_handler.go +++ b/server/v2/delete_handler.go @@ -8,7 +8,7 @@ import ( func DeleteHandler(w http.ResponseWriter, req *http.Request, s Server) error { vars := mux.Vars(req) - key := vars["key"] + key := "/" + vars["key"] recursive := (req.FormValue("recursive") == "true") c := s.Store().CommandFactory().CreateDeleteCommand(key, recursive) diff --git a/server/v2/get_handler.go b/server/v2/get_handler.go index 26128fc95..3e8ddee64 100644 --- a/server/v2/get_handler.go +++ b/server/v2/get_handler.go @@ -18,7 +18,7 @@ func GetHandler(w http.ResponseWriter, req *http.Request, s Server) error { var event *store.Event vars := mux.Vars(req) - key := vars["key"] + key := "/" + vars["key"] // Help client to redirect the request to the current leader if req.FormValue("consistent") == "true" && s.State() != raft.Leader { diff --git a/server/v2/post_handler.go b/server/v2/post_handler.go index 59c119476..2338d0250 100644 --- a/server/v2/post_handler.go +++ b/server/v2/post_handler.go @@ -10,7 +10,7 @@ import ( func PostHandler(w http.ResponseWriter, req *http.Request, s Server) error { vars := mux.Vars(req) - key := vars["key"] + key := "/" + vars["key"] value := req.FormValue("value") expireTime, err := store.TTL(req.FormValue("ttl")) diff --git a/server/v2/put_handler.go b/server/v2/put_handler.go index 19a55de05..5b61e58b3 100644 --- a/server/v2/put_handler.go +++ b/server/v2/put_handler.go @@ -15,7 +15,7 @@ func PutHandler(w http.ResponseWriter, req *http.Request, s Server) error { var c raft.Command vars := mux.Vars(req) - key := vars["key"] + key := "/" + vars["key"] req.ParseForm() diff --git a/tests/functional/v1_migration_test.go b/tests/functional/v1_migration_test.go index c99f7711a..415ff6ded 100644 --- a/tests/functional/v1_migration_test.go +++ b/tests/functional/v1_migration_test.go @@ -87,17 +87,17 @@ func TestV1ClusterMigration(t *testing.T) { time.Sleep(time.Second) } - time.Sleep(120 * time.Second) - // Ensure deleted message is removed. resp, err := tests.Get("http://localhost:4001/v2/keys/message") - tests.ReadBody(resp) + body := tests.ReadBody(resp) assert.Nil(t, err, "") - assert.Equal(t, resp.StatusCode, 404, "") + assert.Equal(t, resp.StatusCode, 400, ) + assert.Equal(t, string(body), `{"errorCode":100,"message":"Key Not Found","cause":"/message","index":11}`+"\n") // Ensure TTL'd message is removed. resp, err = tests.Get("http://localhost:4001/v2/keys/foo") - tests.ReadBody(resp) + body = tests.ReadBody(resp) assert.Nil(t, err, "") - assert.Equal(t, resp.StatusCode, 404, "") + assert.Equal(t, resp.StatusCode, 200, "") + assert.Equal(t, string(body), `{"action":"get","key":"/foo","value":"one","modifiedIndex":9}`) }