From 02be882c8f94990337c520f47f1463165da595cc Mon Sep 17 00:00:00 2001 From: Yicheng Qin Date: Fri, 20 Mar 2015 10:51:42 -0700 Subject: [PATCH] migrate: remove starter code It has been moved to github.com/coreos/etcd-starter. --- main.go | 21 +- migrate/functional/README.md | 27 -- migrate/functional/fixtures/ca.crt | 30 -- migrate/functional/fixtures/ca.key | 54 --- migrate/functional/fixtures/server.crt | 31 -- .../functional/fixtures/server.key.insecure | 51 --- migrate/functional/member.go | 278 ------------ migrate/functional/upgrade_test.go | 414 ------------------ migrate/starter/starter.go | 403 ----------------- migrate/starter/starter_test.go | 70 --- migrate/starter/tls_info.go | 120 ----- 11 files changed, 1 insertion(+), 1498 deletions(-) delete mode 100644 migrate/functional/README.md delete mode 100644 migrate/functional/fixtures/ca.crt delete mode 100644 migrate/functional/fixtures/ca.key delete mode 100644 migrate/functional/fixtures/server.crt delete mode 100644 migrate/functional/fixtures/server.key.insecure delete mode 100644 migrate/functional/member.go delete mode 100644 migrate/functional/upgrade_test.go delete mode 100644 migrate/starter/starter.go delete mode 100644 migrate/starter/starter_test.go delete mode 100644 migrate/starter/tls_info.go diff --git a/main.go b/main.go index 3c3f47e42..d627fb080 100644 --- a/main.go +++ b/main.go @@ -23,27 +23,8 @@ package main -import ( - "log" - "os" - "strconv" - - "github.com/coreos/etcd/etcdmain" - "github.com/coreos/etcd/migrate/starter" - "github.com/coreos/etcd/pkg/coreos" -) +import "github.com/coreos/etcd/etcdmain" func main() { - if str := os.Getenv("ETCD_ALLOW_LEGACY_MODE"); str != "" { - v, err := strconv.ParseBool(str) - if err != nil { - log.Fatalf("failed to parse ETCD_ALLOW_LEGACY_MODE=%s as bool", str) - } - if v { - starter.StartDesiredVersion(os.Args[1:]) - } - } else if coreos.IsCoreOS() { - starter.StartDesiredVersion(os.Args[1:]) - } etcdmain.Main() } diff --git a/migrate/functional/README.md b/migrate/functional/README.md deleted file mode 100644 index 1b0c5b013..000000000 --- a/migrate/functional/README.md +++ /dev/null @@ -1,27 +0,0 @@ - -etcd migration functional tests -===== - -This functional test suite deploys a etcd cluster using processes, and asserts etcd is functioning properly. - -Dependencies ------------- - -The test suite can only be run in CoreOS system. It's recommended to run this in a virtual machine environment on CoreOS (e.g. using coreos-vagrant). The only dependency for the tests not provided on the CoreOS image is go. - -Usage ------ - -Set environment variables point to the respective binaries that are used to drive the actual tests: - -``` -$ export ETCD_V1_BIN=/path/to/v1_etcd -$ export ETCD_V2_BIN=/path/to/v2_etcd -$ export ETCDCTL_BIN=/path/to/etcdctl -``` - -Then the tests can be run: - -``` -$ go test github.com/coreos/etcd/migrate/functional -``` diff --git a/migrate/functional/fixtures/ca.crt b/migrate/functional/fixtures/ca.crt deleted file mode 100644 index dd64b2d34..000000000 --- a/migrate/functional/fixtures/ca.crt +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFNDCCAx6gAwIBAgIBATALBgkqhkiG9w0BAQUwLTEMMAoGA1UEBhMDVVNBMRAw -DgYDVQQKEwdldGNkLWNhMQswCQYDVQQLEwJDQTAeFw0xNDAzMTMwMjA5MDlaFw0y -NDAzMTMwMjA5MDlaMC0xDDAKBgNVBAYTA1VTQTEQMA4GA1UEChMHZXRjZC1jYTEL -MAkGA1UECxMCQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDdlBlw -Jiakc4C1UpMUvQ+2fttyBMfMLivQgj51atpKd8qIBvpZwz1wtpzdRG0hSYMF0IUk -MfBqyg+T5tt2Lfs3Gx3cYKS7G0HTfmABC7GdG8gNvEVNl/efxqvhis7p7hur765e -J+N2GR4oOOP5Wa8O5flv10cp3ZJLhAguc2CONLzfh/iAYAItFgktGHXJ/AnUhhaj -KWdKlK9Cv71YsRPOiB1hCV+LKfNSqrXPMvQ4sarz3yECIBhpV/KfskJoDyeNMaJd -gabX/S7gUCd2FvuOpGWdSIsDwyJf0tnYmQX5XIQwBZJib/IFMmmoVNYc1bFtYvRH -j0g0Ax4tHeXU/0mglqEcaTuMejnx8jlxZAM8Z94wHLfKbtaP0zFwMXkaM4nmfZqh -vLZwowDGMv9M0VRFEhLGYIc3xQ8G2u8cFAGw1UqTxKhwAdRmrcFaQ38sk4kziy0u -AkpGavS7PKcFjjB/fdDFO/kwGQOthX/oTn9nP3BT+IK2h1A6ATMPI4lVnhb5/KBt -9M/fGgbiU+I9QT0Ilz/LlrcCuzyRXREvIZvoUL77Id+JT3qQxqPn/XMKLN4WEFII -112MFGqCD85JZzNoC4RkZd8kFlR4YJWsS4WqJlWprESr5cCDuLviK+31cnIRF4fJ -mz0gPsVgY7GFEan3JJnL8oRUVzdTPKfPt0atsQIDAQABo2MwYTAOBgNVHQ8BAf8E -BAMCAAQwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUnVlVvktY+zlLpG43nTpG -AWmUkrYwHwYDVR0jBBgwFoAUnVlVvktY+zlLpG43nTpGAWmUkrYwCwYJKoZIhvcN -AQEFA4ICAQAqIcPFux3V4h1N0aGM4fCS/iT50TzDnRb5hwILKbmyA6LFnH4YF7PZ -aA0utDNo1XSRDMpR38HWk0weh5Sfx6f2danaKZHAsea8oVEtdrz16ZMOvoh0CPIM -/hn0CGQOoXDADDNFASuExhhpoyYkDqTVTCQ/zbhZg1mjBljJ+BBzlSgeoE4rUDpn -nuDcmD9LtjpsVQL+J662rd51xV4Z6a7aZLvN9GfO8tYkfCGCD9+fGh1Cpz0IL7qw -VRie+p/XpjoHemswnRhYJ4wn10a1UkVSR++wld6Gvjb9ikyr9xVyU5yrRM55pP2J -VguhzjhTIDE1eDfIMMxv3Qj8+BdVQwtKFD+zQYQcbcjsvjTErlS7oCbM2DVlPnRT -QaCM0q0yorfzc4hmml5P95ngz2xlohavgNMhsYIlcWyq3NVbm7mIXz2pjqa16Iit -vL7WX6OVupv/EOMRx5cVcLqqEaYJmAlNd/CCD8ihDQCwoJ6DJhczPRexrVp+iZHK -SnIUONdXb/g8ungXUGL1jGNQrWuq49clpI5sLWNjMDMFAQo0qu5bLkOIMlK/evCt -gctOjXDvGXCk5h6Adf14q9zDGFdLoxw0/aciUSn9IekdzYPmkYUTifuzkVRsPKzS -nmI4dQvz0rHIh4FBUKWWrJhRWhrv9ty/YFuJXVUHeAwr5nz6RFZ4wQ== ------END CERTIFICATE----- diff --git a/migrate/functional/fixtures/ca.key b/migrate/functional/fixtures/ca.key deleted file mode 100644 index 09e39b7f3..000000000 --- a/migrate/functional/fixtures/ca.key +++ /dev/null @@ -1,54 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,d2e70acc12a86116 - -uAmKZ41MiYTa7CappCFEcLL/kWRX4rE8DJG3sL59lv3j/6bYFkdczy3kgrEWm4Pn -+pveJEssQkszXHkjA3vHx8nlTvfQOwa7ggcc76LNYj1sPHawVRNA0pb6WvjDzN7D -JMgAnptVuZGP8N6ZIzFvr5Rf58ar5Y2aI7Ti6KxLZvqYojgvz5dzGimC3+SwDlFy -Q2kwBA/HT4X9w2qSxpQ7WGPw2pkYILZ4Nxfqh9PWHd0Pk1d9KoLhbU5LEtGSy/y9 -9jqKsUqBzp9905t7d2KmFDF9Nd7XvHrDZDPILlKcQYnBxg6c1ChH1NkIqdAW7lQ6 -dAKAFZlMpVb/ArFBjhioljBIO+gLcWxYseHXbteOgbC1cw5xcBTHqH+7RotFH1VO -ya0DFeW2CyPj4mp7vORD+IOVQaG4H5j1vJXqA9OPBziZR+lHvD0gVJqZIquXIQlW -MBpX5CfV/3xITb6o0wA2OG2qlNM+VbKzg/cqh/kkusAqcfXIByh16K85k4jwPrBG -wsYWABgw1vLlrCJ7ug6P2rb6VmzTbMqe4gpqUROgCS36ARjs5eDBDYZsX6NaGSh6 -twAUfzpwoGNuHwUpIYf5BjH1me+tnM0S8tAEtCFf9hy88nCg6v22cWQuAD6+6P6B -Skl/UYT4sxeeETFv7Vf70wLnBMA3/uymBM75FhPyD5Vvg9fxz7aAJbfB2ovUVZ/v -l3HCsCo8y7DtEXoiBmPCH28JWVhIZbmP3dYnU8c86SubhNWm0yjJIIwoghyFmCcO -Wjs0XkVUUa9fGrl6Mc6XQIGsS6UdQkFoIcO+dtIFPg5C5GWnPnF53ro0J4pGcyR0 -zgt9ubCcFKNz5Cbcfw7fKJwswMt6zXtFxE/tVvOq2EPAPrmYYwPrnvbSNbuVL+as -OT5ukITR9MDsYR/19jFUsdRDjSvUQVwqH7PiKwTnZouuJUhYHfj3Bjhz6cWzadcd -pNdxqSgEeSzvaz390p1dOpN/0d1ItXlp3za6JZUarVkx8yH9UCFfpEEisPYgTASf -F2xIrWHgZY+87OjPluU+Gym12ldcs0dbySgsxhKZMyAUd0DB2Knnmug+cqVvN+xo -rJ2pD7J08zmQSRGyAUsbeUnuGb6fGNxaD5QpEN7nK4x3K1Q5N9QQ3RwL4Ik6jV0N -eO0LzXF/BZbOAvl/OXAse1f5c7FO21oUw6u6iI0xvTJAcnaH/0eE2N6Y9Lwt507K -HxhuN5j58/sOeb6kfkX563SoKSdYSrBqIaogDZFCtKpEBevsRM+QRdzAc//Fm67U -Zs2K/ADM8+IaQN7uhm8IAPtWEnJ5+9rM2PCF0NX+7qa9HtZxTd0cqbeL8Ayx4i/T -dHvN8k3kPuC+6He7+eZR6EQpN5GPt5SX3QGgKOQbbwBgF8mS/R0zaZpHvaqTY4Bi -RfsLbRBGoTvR8YjqaQW91tExe5FghH7k02slSGzEzgs/ZhqPMCLNC7uFcSKcx9jA -Bj+GmrYOMrUOYLQPT1iRtBFjLEUGPlvUGlaJS/JcvBN6DPW375tQHk7kbpVcudPh -6vVXftuDiYEJk1TIQLt3QdC9s6ieVuAds4KDjYaTZz4s5W2Lkwo5AZzwLeMRank1 -96okoO1qRaDgagHsG8yPIwq+8/b/8dNl7E+wsbAWwLXLhYZGqDmHm/16pv/Ck59W -LXLoJfrOdKBoxTTZulIsTISZ14Bj87QWPW26kI6So9V5vN60rb2MWrd+HU46Qapi -JCsfCVsi715GUh4IkqAnec26TuXW2THcOp3p19SyubuJ33XqUR9H7BOZuBsIFeZV -8sihbgjJ/zb7fZ7AGT3VmAxEtgFi8u2NOBN/WqYb++khtXgnIbOhBx9PuhOBofrO -4M0R5s6F2SpbX2LEBJFN48wIlRmSMTsKdmZmA7f0IuxjYIcotBdRCGoXRlJJnZeH -7WriXQJsq0517GlrqgYMDx26xHJy/ao+zcDxsCtftzAQvENuGr1lzsCdIcGXs+FU -7C8qdmqSXgZgltFQpyR7+PMikXcdYdzkT3BjFh+VKJNiAeGXNnVXQH7L/V49zaij -BRYWWtHwEDz50vSzZz3fnrFl6Pk8tny4bKoLjB4vBjMlb4yte7LcK+vbfDdreISD -cDqfpzjAmIpv1GoQFKWGLQjagvwiAfOA8GUivEG9SQSAAImkV9qkr5qYzM7Jn2WU -icA8D0YfuILpGxTOQc1SgDMOiGboCB+f7cxPsjXHbVahNyxxAbDbTjbc6v7q1oiy -PESoLaBR0Bi0tdKivvbB63ok2Kq9XneFrQeCIyrhkXIvYDEwdcoCBpL1DEotbU+D -YjZTLr4UW92xi1M4d94zmG6pyJsfC4sHGflY5paml9dLiEy78rCPfrJkrSSUplf+ -8CjfUoZsbq3haE0N4TbqV0I0W2Fm/a6U113CTRYxj9DeA3m/HFU3TLzk9Vg/vGxP -/xltsu/wd/GoyoD9OhWhW1Ck9dtQ0G64hQjeXVd/pzsDCMT8hrtKSlX1Q7vK96ml -OJ9Ju/CdhX2lJA8BrGVh4HS1fsuNFjr5KqZAY6MwFpjAPqvqD7WFE3Yflk5/7VtX -bsvBZoN2vp9hprXsgm8/KmSNnWxzQY1Nps4XjRJVYeTmND5EyQClGJyCYKg0QVDo -7L/2GAhnOrSLkAHOcYAlrNhZ85yBiLhjJcvWyT6DDcMpCusgictI2Qv2ZjMmz46v -62PzHm0/Z3yQMcJnpRO79OdodbY22Eg9xZGGhBp1Xbm/OXYLaEpGW9S7DqPvlD5v -O+VxENxJNwDELK9H2auGJAQdORwgF0VfvZxN6tGRyb7eI6aJj04YYMBkg5Nds+AR -sNEdGNzqKm8sWvINSoX+BCOyjElOSRW0glK+ala5Y7/mM3+KOWgMas2LZBcLZfBr -1/Z0DPIA2CkFtT1VsBKa+fSkEN0s+PRLRV/QWrcMbkSvIaKcswMwoyvI6OcddUEz -YgjAOZ3TdnRm1DMqZHIsPOj+3xQv6nETqSwhvLJT1wJwnJQVbxjZwoUmJKSsZDEB -2xL9OWlhFNY2qS7F77vv2ZUJYLYniiTGrC09AAQ4ti8zWnY1gqtaCp+1wynt/Abs -9gGcbEIaQGWhpVjPtlKjNm86jGP0IXPaAgaOViIuBH+0GeVOLuUMLvb0nL0NWMJa ------END RSA PRIVATE KEY----- diff --git a/migrate/functional/fixtures/server.crt b/migrate/functional/fixtures/server.crt deleted file mode 100644 index ec2ccd6ce..000000000 --- a/migrate/functional/fixtures/server.crt +++ /dev/null @@ -1,31 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFWzCCA0WgAwIBAgIBAjALBgkqhkiG9w0BAQUwLTEMMAoGA1UEBhMDVVNBMRAw -DgYDVQQKEwdldGNkLWNhMQswCQYDVQQLEwJDQTAeFw0xNDAzMTMwMjA5MjJaFw0y -NDAzMTMwMjA5MjJaMEUxDDAKBgNVBAYTA1VTQTEQMA4GA1UEChMHZXRjZC1jYTEP -MA0GA1UECxMGc2VydmVyMRIwEAYDVQQDEwkxMjcuMC4wLjEwggIiMA0GCSqGSIb3 -DQEBAQUAA4ICDwAwggIKAoICAQDI3EvqJrLWsnPbjAT8ENiMRyBINhhafubi5Nb+ -glEzkbC2kv2zXkVkpkBubDRwyh3eomSbdwKYk3yz+IopT753teJueRpMPq9Ayr/+ -PZl4Y1tG04KcjfOvOls6zPsDfHzluR8TE705If5wwZu3Bdwxzdtx9T0ROzIEgRt0 -Axuce5qkg93IWNxOrIr+4LCxYfTpvpTXO20lz0IuQNm1Opo9PVoWn7PXdOmuCzSG -2hW1DcKqSyQP7IkplBJS0EhoovIsXavSkPKJssvQj73ZFIBVgKhXuHmPNdrypaQk -CtxsqbVdOOlojItqYTTDAiadwRQWkYgDOSQCGJiPqYVJx+rH4MlzxQ6n9x2qIcne -lfMr+VFDEc1YvHu1XLMg5b1ImD6ChutYW0RhFJ3CQVdQR2i4kJ8T1DSJYLISMODZ -ux1cZaUoSL/EkrC5/8POWZmP8nJXO6A4wrZDHF30/qWpo+T5PvsA6cABfX1jkcTx -PBXGK1qOZ8rToTxprJ2zc3zuZNxSgM32nzjcPUgn559Mgdl0HR4c4JeTZGsebWmx -MWmkz//BV4eUaGHqCpzRQHf3YIxysvDC2Xf4z2Alk8AlLRXp7/ksatdxAtyc+y8+ -MWCc6N0YbI9zjv+ezCBqR+mu1P5Tb0HebPFz3dOdIpiC3kU8QyMEagw8u5xliZs4 -AxwdNwIDAQABo3IwcDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYD -VR0OBBYEFD6UrVN8uolWz6et79jVeZetjd4XMB8GA1UdIwQYMBaAFJ1ZVb5LWPs5 -S6RuN506RgFplJK2MA8GA1UdEQQIMAaHBH8AAAEwCwYJKoZIhvcNAQEFA4ICAQCo -sKn1Rjx0tIVWAZAZB4lCWvkQDp/txnb5zzQUlKhIW2o98IklASmOYYyZbE2PXlda -/n8TwKIzWgIoNh5AcgLWhtASrnZdGFXY88n5jGk6CVZ1+Dl+IX99h+r+YHQzf1jU -BjGrZHGv3pPjwhFGDS99lM/TEBk/eLI2Kx5laL+nWMTwa8M1OwSIh6ZxYPVlWUqb -rurk5l/YqW+UkYIXIQhe6LwtB7tBjr6nDIWBfHQ7uN8IdB8VIAF6lejr22VmERTW -j+zJ5eTzuQN1f0s930mEm8pW7KgGxlEqrUlSJtxlMFCv6ZHZk1Y4yEiOCBKlPNme -X3B+lhj//PH3gLNm3+ZRr5ena3k+wL9Dd3d3GDCIx0ERQyrGS/rJpqNPI+8ZQlG0 -nrFlm7aP6UznESQnJoSFbydiD0EZ4hXSdmDdXQkTklRpeXfMcrYBGN7JrGZOZ2T2 -WtXBMx2bgPeEH50KRrwUMFe122bchh0Fr+hGvNK2Q9/gRyQPiYHq6vSF4GzorzLb -aDuWA9JRH8/c0z8tMvJ7KjmmmIxd39WWGZqiBrGQR7utOJjpQl+HCsDIQM6yZ/Bu -RpwKj2yBz0OQg4tWbtqUuFkRMTkCR6vo3PadgO1VWokM7UFUXlScnYswcM5EwnzJ -/IsYJ2s1V706QVUzAGIbi3+wYi3enk7JfYoGIqa2oA== ------END CERTIFICATE----- diff --git a/migrate/functional/fixtures/server.key.insecure b/migrate/functional/fixtures/server.key.insecure deleted file mode 100644 index 5d356b5b3..000000000 --- a/migrate/functional/fixtures/server.key.insecure +++ /dev/null @@ -1,51 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIJKAIBAAKCAgEAyNxL6iay1rJz24wE/BDYjEcgSDYYWn7m4uTW/oJRM5GwtpL9 -s15FZKZAbmw0cMod3qJkm3cCmJN8s/iKKU++d7XibnkaTD6vQMq//j2ZeGNbRtOC -nI3zrzpbOsz7A3x85bkfExO9OSH+cMGbtwXcMc3bcfU9ETsyBIEbdAMbnHuapIPd -yFjcTqyK/uCwsWH06b6U1zttJc9CLkDZtTqaPT1aFp+z13Tprgs0htoVtQ3Cqksk -D+yJKZQSUtBIaKLyLF2r0pDyibLL0I+92RSAVYCoV7h5jzXa8qWkJArcbKm1XTjp -aIyLamE0wwImncEUFpGIAzkkAhiYj6mFScfqx+DJc8UOp/cdqiHJ3pXzK/lRQxHN -WLx7tVyzIOW9SJg+gobrWFtEYRSdwkFXUEdouJCfE9Q0iWCyEjDg2bsdXGWlKEi/ -xJKwuf/DzlmZj/JyVzugOMK2Qxxd9P6lqaPk+T77AOnAAX19Y5HE8TwVxitajmfK -06E8aayds3N87mTcUoDN9p843D1IJ+efTIHZdB0eHOCXk2RrHm1psTFppM//wVeH -lGhh6gqc0UB392CMcrLwwtl3+M9gJZPAJS0V6e/5LGrXcQLcnPsvPjFgnOjdGGyP -c47/nswgakfprtT+U29B3mzxc93TnSKYgt5FPEMjBGoMPLucZYmbOAMcHTcCAwEA -AQKCAgBS1vCESKOXgo/f61ae8v+skyUQQyc2I4Jr739wBiUhRKQCGIuDr4ylHyAR -qpTSM7mv+X/O0n2CmcljnEy3Dwl568zQTSf4bB3xde1LGPKzwR6DDnaexLjM+x9n -F+UqoewM/pV/U7PF3WxH6sGi8UrIS6OG02L1OVm+m9TLuwBnQF8eHLiaiXOLCwRk -bBzTe5f70zslrX+tiVY9J0fiw6GbQjNmg0UzxicePcbTGxy6yEsR2t2rp51GRahs -+TPz28hPXe6gcGFnQxNmF/JvllH7cY18aDvSQZ7kVkZlCwmv0ypWoUM6eESDgkW1 -a6yrgVccm7bhxW5BYw2AqqSrMkV0oMcCUjh2rYvex7w6dM374Ok3DD/dXjTHLNV5 -+0tHMxXUiCKwe7hVEg+iGD4E1jap5n5c4RzpEtAXsGEK5WUBksHi9qOBv+lubjZn -Kcfbos+BbnmUCU3MmU48EZwyFQIu9djkLXfJV2Cbbg9HmkrIOYgi4tFjoBKeQLE4 -6GCucMWnNfMO7Kq/z7c+7sfWOAA55pu0Ojel8VH6US+Y/1mEuSUhQudrJn8GxAmc -4t+C2Ie1Q1bK3iJbd0NUqtlwd9xI9wQgCbaxfQceUmBBjuTUu3YFctZ7Jia7h18I -gZ3wsKfySDhW29XTFvnT3FUpc+AN9Pv4sB7uobm6qOBV8/AdKQKCAQEA1zwIuJki -bSgXxsD4cfKgQsyIk0eMj8bDOlf/A8AFursXliH3rRASoixXNgzWrMhaEIE2BeeT -InE13YCUjNCKoz8oZJqKYpjh3o/diZf1vCo6m/YUSR+4amynWE4FEAa58Og2WCJ3 -Nx8/IMpmch2VZ+hSQuNr5uvpH84+eZADQ1GB6ypzqxb5HjIEeryLJecDQGe4ophd -JCo3loezq/K0XJQI8GTBe2GQPjXSmLMZKksyZoWEXAaC1Q+sdJWZvBpm3GfVQbXu -q7wyqTMknVIlEOy0sHxstsbayysSFFQ/fcgKjyQb8f4efOkyQg8mH5vQOZghbHJ+ -7I8wVSSBt+bE2wKCAQEA7udRoo2NIoIpJH+2+SPqJJVq1gw/FHMM4oXNZp+AAjR1 -hTWcIzIXleMyDATl5ZFzZIY1U2JMifS5u2R7fDZEu9vfZk4e6BJUJn+5/ahjYFU8 -m8WV4rFWR6XN0SZxPb43Mn6OO7EoMqr8InRufiN4LwIqnPqDm2D9Fdijb9QFJ2UG -QLKNnIkLTcUfx1RYP4T48CHkeZdxV8Cp49SzSSV8PbhIVBx32bm/yO6nLHoro7Wl -YqXGW0wItf2BUA5a5eYNO0ezVkOkTp2aj/p9i+0rqbsYa480hzlnOzYI5F72Z8V2 -iPltUAeQn53Vg1azySa1x8/0Xp5nVsgQSh18CH3p1QKCAQBxZv4pVPXgkXlFjTLZ -xr5Ns7pZ7x7OOiluuiJw9WGPazgYMDlxA8DtlXM11Tneu4lInOu73LGXOhLpa+/Y -6Z/CN2qu5wX2wRpwy1gsQNaGl7FdryAtDvt5h1n8ms7sDL83gQHxGee6MUpvmnSz -t4aawrtk5rJZbv7bdS1Rm2E8vNs47psXD/mdwTi++kxOYhNCgeO0N5cLkPrM4x71 -f+ErzguPrWaL/XGkdXNKZULjF8+sWLjOS9fvLlzs6E2h4D9F7addAeCIt5XxtDKc -eUVyT2U8f7I/8zIgTccu0tzJBvcZSCs5K20g3zVNvPGXQd9KGS+zFfht51vN4HhA -TuR1AoIBAGuQBKZeexP1bJa9VeF4dRxBldeHrgMEBeIbgi5ZU+YqPltaltEV5Z6b -q1XUArpIsZ6p+mpvkKxwXgtsI1j6ihnW1g+Wzr2IOxEWYuQ9I3klB2PPIzvswj8B -/NfVKhk1gl6esmVXzxR4/Yp5x6HNUHhBznPdKtITaf+jCXr5B9UD3DvW6IF5Bnje -bv9tD0qSEQ71A4xnTiXHXfZxNsOROA4F4bLVGnUR97J9GRGic/GCgFMY9mT2p9lg -qQ8lV3G5EW4GS01kqR6oQQXgLxSIFSeXUFhlIq5bfwoeuwQvaVuxgTwMqVXmAgyL -oK1ApTPE1QWAsLLFORvOed8UxVqBbn0CggEBALfr/wheXCKLdzFzm03sO1i9qVz2 -vnpxzexXW3V/TtM6Dff2ojgkDC+CVximtAiLA/Wj60hXnQxw53g5VVT5rESx0J3c -pq+azbi1eWzFeOrqJvKQhMfYc0nli7YuGnPkKzeepJJtWZHYkAjL4QZAn1jt0RqV -DQmlGPGiOuGP8uh59c23pbjgh4eSJnvhOT2BFKhKZpBdTBYeiQiZBqIyme8rNTFr -NmpBxtUr77tccVTrcWWhhViG36UNpetAP7b5QCHScIXZJXrEqyK5HaePqi5UMH8o -alSz6s2REG/xP7x54574TvRG/3cIamv1AfZAOjin7BwhlSLhPl2eeh4Cgas= ------END RSA PRIVATE KEY----- diff --git a/migrate/functional/member.go b/migrate/functional/member.go deleted file mode 100644 index 50695effb..000000000 --- a/migrate/functional/member.go +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright 2015 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package functional - -import ( - "fmt" - "io" - "io/ioutil" - "log" - "net/http" - "net/url" - "os" - "os/exec" - "strconv" - "strings" - "time" -) - -var binDir = ".versions" - -type Proc struct { - *exec.Cmd - Name string - DataDir string - URL string - PeerURL string - - stderr io.ReadCloser -} - -func NewProcWithDefaultFlags(path string) *Proc { - var args []string - dir, err := ioutil.TempDir(os.TempDir(), "etcd") - if err != nil { - fmt.Printf("unexpected TempDir error: %v", err) - os.Exit(1) - } - args = append(args, "--data-dir="+dir) - args = append(args, "--name=default") - p := &Proc{ - Cmd: exec.Command(path, args...), - Name: "default", - DataDir: dir, - URL: "http://127.0.0.1:4001", - PeerURL: "http://127.0.0.1:7001", - } - // always expect to use start_desired_verson mode - p.Env = append(p.Env, - "ETCD_BINARY_DIR="+binDir, - ) - return p -} - -func NewProcWithV1Flags(path string) *Proc { - p := NewProcWithDefaultFlags(path) - p.SetV1PeerAddr("127.0.0.1:7001") - return p -} - -func NewProcWithV2Flags(path string) *Proc { - p := NewProcWithDefaultFlags(path) - p.SetV2PeerURL("http://127.0.0.1:7001") - return p -} - -func (p *Proc) SetV2PeerURL(url string) { - p.Args = append(p.Args, - "-listen-peer-urls="+url, - "-initial-advertise-peer-urls="+url, - "-initial-cluster", - p.Name+"="+url, - ) - p.PeerURL = url -} - -func (p *Proc) SetV1PeerAddr(addr string) { - p.Args = append(p.Args, - "-peer-addr="+addr, - ) - p.PeerURL = "http://" + addr -} - -func (p *Proc) SetV1Addr(addr string) { - p.Args = append(p.Args, - "-addr="+addr, - ) - p.URL = "http://" + addr -} - -func (p *Proc) SetV1Peers(peers []string) { - p.Args = append(p.Args, - "-peers="+strings.Join(peers, ","), - ) -} - -func (p *Proc) SetName(name string) { - p.Args = append(p.Args, - "-name="+name, - ) - p.Name = name -} - -func (p *Proc) SetDataDir(dataDir string) { - p.Args = append(p.Args, - "-data-dir="+dataDir, - ) - p.DataDir = dataDir -} - -func (p *Proc) SetSnapCount(cnt int) { - p.Args = append(p.Args, - "-snapshot-count="+strconv.Itoa(cnt), - ) -} - -func (p *Proc) SetDiscovery(url string) { - p.Args = append(p.Args, - "-discovery="+url, - ) -} - -func (p *Proc) SetPeerTLS(certFile, keyFile, caFile string) { - p.Args = append(p.Args, - "-peer-cert-file="+certFile, - "-peer-key-file="+keyFile, - "-peer-ca-file="+caFile, - ) - u, err := url.Parse(p.PeerURL) - if err != nil { - log.Panicf("unexpected parse error: %v", err) - } - u.Scheme = "https" - p.PeerURL = u.String() -} - -func (p *Proc) CleanUnsuppportedV1Flags() { - var args []string - for _, arg := range p.Args { - if !strings.HasPrefix(arg, "-peers=") { - args = append(args, arg) - } - } - p.Args = args -} - -func (p *Proc) Start() error { - if err := p.Cmd.Start(); err != nil { - return err - } - for k := 0; k < 50; k++ { - _, err := http.Get(p.URL) - if err == nil { - return nil - } - time.Sleep(100 * time.Millisecond) - } - return fmt.Errorf("instance %s failed to be available after a long time", p.Name) -} - -func (p *Proc) Stop() { - if err := p.Cmd.Process.Kill(); err != nil { - fmt.Printf("Process Kill error: %v", err) - return - } - p.Cmd.Wait() -} - -func (p *Proc) Restart() error { - p.Stop() - return p.Start() -} - -func (p *Proc) Terminate() { - p.Stop() - os.RemoveAll(p.DataDir) -} - -type ProcGroup []*Proc - -func NewProcInProcGroupWithV1Flags(path string, num int, idx int) *Proc { - pg := NewProcGroupWithV1Flags(path, num) - return pg[idx] -} - -func NewProcGroupWithV1Flags(path string, num int) ProcGroup { - pg := make([]*Proc, num) - for i := 0; i < num; i++ { - pg[i] = NewProcWithDefaultFlags(path) - pg[i].SetName(fmt.Sprintf("etcd%d", i)) - pg[i].SetV1PeerAddr(fmt.Sprintf("127.0.0.1:%d", 7001+i)) - pg[i].SetV1Addr(fmt.Sprintf("127.0.0.1:%d", 4001+i)) - if i > 0 { - pg[i].SetV1Peers([]string{"127.0.0.1:7001"}) - } - } - return pg -} - -func NewProcGroupViaDiscoveryWithV1Flags(path string, num int, url string) ProcGroup { - pg := make([]*Proc, num) - for i := range pg { - pg[i] = NewProcWithDefaultFlags(path) - pg[i].SetName(fmt.Sprintf("etcd%d", i)) - pg[i].SetDiscovery(url) - pg[i].SetV1PeerAddr(fmt.Sprintf("127.0.0.1:%d", 7001+i)) - pg[i].SetV1Addr(fmt.Sprintf("127.0.0.1:%d", 4001+i)) - } - return pg -} - -func (pg ProcGroup) SetPeerTLS(certFile, keyFile, caFile string) { - for i := range pg { - pg[i].SetPeerTLS(certFile, keyFile, caFile) - } -} - -func (pg ProcGroup) InheritDataDir(opg ProcGroup) { - for i := range pg { - pg[i].SetDataDir(opg[i].DataDir) - } -} - -func (pg ProcGroup) SetSnapCount(count int) { - for i := range pg { - pg[i].SetSnapCount(count) - } -} - -func (pg ProcGroup) CleanUnsuppportedV1Flags() { - for _, p := range pg { - p.CleanUnsuppportedV1Flags() - } -} - -func (pg ProcGroup) Start() error { - for _, p := range pg { - if err := p.Start(); err != nil { - return err - } - } - // leave time for instances to sync and write some entries into disk - // TODO: use more reliable method - time.Sleep(time.Second) - return nil -} - -func (pg ProcGroup) Wait() error { - for _, p := range pg { - if err := p.Wait(); err != nil { - return err - } - } - return nil -} - -func (pg ProcGroup) Stop() { - for _, p := range pg { - p.Stop() - } -} - -func (pg ProcGroup) Terminate() { - for _, p := range pg { - p.Terminate() - } -} diff --git a/migrate/functional/upgrade_test.go b/migrate/functional/upgrade_test.go deleted file mode 100644 index a6b112245..000000000 --- a/migrate/functional/upgrade_test.go +++ /dev/null @@ -1,414 +0,0 @@ -package functional - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "os" - "os/exec" - "path" - "path/filepath" - "testing" -) - -var ( - v1BinPath = path.Join(binDir, "1") - v2BinPath = path.Join(binDir, "2") - etcdctlBinPath string -) - -func init() { - os.RemoveAll(binDir) - if err := os.Mkdir(binDir, 0700); err != nil { - fmt.Printf("unexpected Mkdir error: %v\n", err) - os.Exit(1) - } - if err := os.Symlink(absPathFromEnv("ETCD_V1_BIN"), v1BinPath); err != nil { - fmt.Printf("unexpected Symlink error: %v\n", err) - os.Exit(1) - } - if err := os.Symlink(absPathFromEnv("ETCD_V2_BIN"), v2BinPath); err != nil { - fmt.Printf("unexpected Symlink error: %v\n", err) - os.Exit(1) - } - etcdctlBinPath = os.Getenv("ETCDCTL_BIN") - - mustExist(v1BinPath) - mustExist(v2BinPath) - mustExist(etcdctlBinPath) -} - -func TestStartNewMember(t *testing.T) { - tests := []*Proc{ - NewProcWithDefaultFlags(v2BinPath), - NewProcWithV1Flags(v2BinPath), - NewProcWithV2Flags(v2BinPath), - } - for i, tt := range tests { - if err := tt.Start(); err != nil { - t.Fatalf("#%d: Start error: %v", i, err) - } - defer tt.Terminate() - - ver, err := checkInternalVersion(tt.URL) - if err != nil { - t.Fatalf("#%d: checkVersion error: %v", i, err) - } - if ver != "2" { - t.Errorf("#%d: internal version = %s, want %s", i, ver, "2") - } - } -} - -func TestStartV2Member(t *testing.T) { - tests := []*Proc{ - NewProcWithDefaultFlags(v2BinPath), - NewProcWithV1Flags(v2BinPath), - NewProcWithV2Flags(v2BinPath), - } - for i, tt := range tests { - // get v2 data dir - p := NewProcWithDefaultFlags(v2BinPath) - if err := p.Start(); err != nil { - t.Fatalf("#%d: Start error: %v", i, err) - } - p.Stop() - tt.SetDataDir(p.DataDir) - if err := tt.Start(); err != nil { - t.Fatalf("#%d: Start error: %v", i, err) - } - defer tt.Terminate() - - ver, err := checkInternalVersion(tt.URL) - if err != nil { - t.Fatalf("#%d: checkVersion error: %v", i, err) - } - if ver != "2" { - t.Errorf("#%d: internal version = %s, want %s", i, ver, "2") - } - } -} - -func TestStartV1Member(t *testing.T) { - tests := []*Proc{ - NewProcWithDefaultFlags(v2BinPath), - NewProcWithV1Flags(v2BinPath), - NewProcWithV2Flags(v2BinPath), - } - for i, tt := range tests { - // get v1 data dir - p := NewProcWithDefaultFlags(v1BinPath) - if err := p.Start(); err != nil { - t.Fatalf("#%d: Start error: %v", i, err) - } - p.Stop() - tt.SetDataDir(p.DataDir) - if err := tt.Start(); err != nil { - t.Fatalf("#%d: Start error: %v", i, err) - } - defer tt.Terminate() - - ver, err := checkInternalVersion(tt.URL) - if err != nil { - t.Fatalf("#%d: checkVersion error: %v", i, err) - } - if ver != "1" { - t.Errorf("#%d: internal version = %s, want %s", i, ver, "1") - } - } -} - -func TestUpgradeV1Cluster(t *testing.T) { - // get v2-desired v1 data dir - pg := NewProcGroupWithV1Flags(v1BinPath, 3) - if err := pg.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - cmd := exec.Command(etcdctlBinPath, "upgrade", "--peer-url", pg[1].PeerURL) - if err := cmd.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - if err := cmd.Wait(); err != nil { - t.Fatalf("Wait error: %v", err) - } - t.Logf("wait until etcd exits...") - if err := pg.Wait(); err != nil { - t.Fatalf("Wait error: %v", err) - } - - npg := NewProcGroupWithV1Flags(v2BinPath, 3) - npg.InheritDataDir(pg) - npg.CleanUnsuppportedV1Flags() - if err := npg.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - defer npg.Terminate() - - for _, p := range npg { - ver, err := checkInternalVersion(p.URL) - if err != nil { - t.Fatalf("checkVersion error: %v", err) - } - if ver != "2" { - t.Errorf("internal version = %s, want %s", ver, "2") - } - } -} - -func TestUpgradeV1SnapshotedCluster(t *testing.T) { - // get v2-desired v1 data dir - pg := NewProcGroupWithV1Flags(v1BinPath, 3) - pg.SetSnapCount(10) - if err := pg.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - cmd := exec.Command(etcdctlBinPath, "upgrade", "--peer-url", pg[1].PeerURL) - if err := cmd.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - if err := cmd.Wait(); err != nil { - t.Fatalf("Wait error: %v", err) - } - t.Logf("wait until etcd exits...") - if err := pg.Wait(); err != nil { - t.Fatalf("Wait error: %v", err) - } - for _, p := range pg { - // check it has taken snapshot - fis, err := ioutil.ReadDir(path.Join(p.DataDir, "snapshot")) - if err != nil { - t.Fatalf("unexpected ReadDir error: %v", err) - } - if len(fis) == 0 { - t.Fatalf("unexpected no-snapshot data dir") - } - } - - npg := NewProcGroupWithV1Flags(v2BinPath, 3) - npg.InheritDataDir(pg) - npg.CleanUnsuppportedV1Flags() - if err := npg.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - defer npg.Terminate() - - for _, p := range npg { - ver, err := checkInternalVersion(p.URL) - if err != nil { - t.Fatalf("checkVersion error: %v", err) - } - if ver != "2" { - t.Errorf("internal version = %s, want %s", ver, "2") - } - } -} - -func TestJoinV1Cluster(t *testing.T) { - pg := NewProcGroupWithV1Flags(v1BinPath, 1) - if err := pg.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - pg.Stop() - npg := NewProcGroupWithV1Flags(v2BinPath, 3) - npg[0].SetDataDir(pg[0].DataDir) - if err := npg.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - defer npg.Terminate() - - for _, p := range npg { - ver, err := checkInternalVersion(p.URL) - if err != nil { - t.Fatalf("checkVersion error: %v", err) - } - if ver != "1" { - t.Errorf("internal version = %s, want %s", ver, "1") - } - } -} - -func TestJoinV1ClusterViaDiscovery(t *testing.T) { - dp := NewProcWithDefaultFlags(v1BinPath) - dp.SetV1Addr("127.0.0.1:5001") - dp.SetV1PeerAddr("127.0.0.1:8001") - if err := dp.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - defer dp.Terminate() - - durl := "http://127.0.0.1:5001/v2/keys/cluster/" - pg := NewProcGroupViaDiscoveryWithV1Flags(v1BinPath, 1, durl) - if err := pg.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - pg.Stop() - npg := NewProcGroupViaDiscoveryWithV1Flags(v2BinPath, 3, durl) - npg[0].SetDataDir(pg[0].DataDir) - if err := npg.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - defer npg.Terminate() - - for _, p := range npg { - ver, err := checkInternalVersion(p.URL) - if err != nil { - t.Fatalf("checkVersion error: %v", err) - } - if ver != "1" { - t.Errorf("internal version = %s, want %s", ver, "1") - } - } -} - -func TestUpgradeV1Standby(t *testing.T) { - // get v1 standby data dir - pg := NewProcGroupWithV1Flags(v1BinPath, 3) - if err := pg.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - req, err := http.NewRequest("PUT", pg[0].PeerURL+"/v2/admin/config", bytes.NewBufferString(`{"activeSize":3,"removeDelay":1800,"syncInterval":5}`)) - if err != nil { - t.Fatalf("NewRequest error: %v", err) - } - resp, err := http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("http Do error: %v", err) - } - if resp.StatusCode != http.StatusOK { - t.Fatalf("status = %d, want %d", resp.StatusCode, http.StatusOK) - } - - p := NewProcInProcGroupWithV1Flags(v2BinPath, 4, 3) - if err := p.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - fmt.Println("checking new member is in standby mode...") - mustExist(path.Join(p.DataDir, "standby_info")) - ver, err := checkInternalVersion(p.URL) - if err != nil { - t.Fatalf("checkVersion error: %v", err) - } - if ver != "1" { - t.Errorf("internal version = %s, want %s", ver, "1") - } - - fmt.Println("upgrading the whole cluster...") - cmd := exec.Command(etcdctlBinPath, "upgrade", "--peer-url", pg[0].PeerURL) - if err := cmd.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - if err := cmd.Wait(); err != nil { - t.Fatalf("Wait error: %v", err) - } - fmt.Println("waiting until peer-mode etcd exits...") - if err := pg.Wait(); err != nil { - t.Fatalf("Wait error: %v", err) - } - fmt.Println("restarting the peer-mode etcd...") - npg := NewProcGroupWithV1Flags(v2BinPath, 3) - npg.InheritDataDir(pg) - npg.CleanUnsuppportedV1Flags() - if err := npg.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - defer npg.Terminate() - fmt.Println("waiting until standby-mode etcd exits...") - if err := p.Wait(); err != nil { - t.Fatalf("Wait error: %v", err) - } - fmt.Println("restarting the standby-mode etcd...") - np := NewProcInProcGroupWithV1Flags(v2BinPath, 4, 3) - np.SetDataDir(p.DataDir) - np.CleanUnsuppportedV1Flags() - if err := np.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - defer np.Terminate() - - fmt.Println("checking the new member is in v2 proxy mode...") - ver, err = checkInternalVersion(np.URL) - if err != nil { - t.Fatalf("checkVersion error: %v", err) - } - if ver != "2" { - t.Errorf("internal version = %s, want %s", ver, "1") - } - if _, err := os.Stat(path.Join(np.DataDir, "proxy")); err != nil { - t.Errorf("stat proxy dir error = %v, want nil", err) - } -} - -func TestUpgradeV1TLSCluster(t *testing.T) { - // get v2-desired v1 data dir - pg := NewProcGroupWithV1Flags(v1BinPath, 3) - pg.SetPeerTLS("./fixtures/server.crt", "./fixtures/server.key.insecure", "./fixtures/ca.crt") - if err := pg.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - cmd := exec.Command(etcdctlBinPath, - "upgrade", "--peer-url", pg[1].PeerURL, - "--peer-cert-file", "./fixtures/server.crt", - "--peer-key-file", "./fixtures/server.key.insecure", - "--peer-ca-file", "./fixtures/ca.crt", - ) - if err := cmd.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - if err := cmd.Wait(); err != nil { - t.Fatalf("Wait error: %v", err) - } - t.Logf("wait until etcd exits...") - if err := pg.Wait(); err != nil { - t.Fatalf("Wait error: %v", err) - } - - npg := NewProcGroupWithV1Flags(v2BinPath, 3) - npg.SetPeerTLS("./fixtures/server.crt", "./fixtures/server.key.insecure", "./fixtures/ca.crt") - npg.InheritDataDir(pg) - npg.CleanUnsuppportedV1Flags() - if err := npg.Start(); err != nil { - t.Fatalf("Start error: %v", err) - } - defer npg.Terminate() - - for _, p := range npg { - ver, err := checkInternalVersion(p.URL) - if err != nil { - t.Fatalf("checkVersion error: %v", err) - } - if ver != "2" { - t.Errorf("internal version = %s, want %s", ver, "2") - } - } -} - -func absPathFromEnv(name string) string { - path, err := filepath.Abs(os.Getenv(name)) - if err != nil { - fmt.Printf("unexpected Abs error: %v\n", err) - } - return path -} - -func mustExist(path string) { - if _, err := os.Stat(path); err != nil { - fmt.Printf("%v\n", err) - os.Exit(1) - } -} - -func checkInternalVersion(url string) (string, error) { - resp, err := http.Get(url + "/version") - if err != nil { - return "", err - } - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - return "", err - } - var m map[string]string - err = json.Unmarshal(b, &m) - return m["internalVersion"], err -} diff --git a/migrate/starter/starter.go b/migrate/starter/starter.go deleted file mode 100644 index fa383646c..000000000 --- a/migrate/starter/starter.go +++ /dev/null @@ -1,403 +0,0 @@ -// Copyright 2015 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package starter - -import ( - "encoding/json" - "flag" - "fmt" - "io/ioutil" - "log" - "net/http" - "net/url" - "os" - "path" - "strings" - "syscall" - - "github.com/coreos/etcd/client" - "github.com/coreos/etcd/etcdmain" - "github.com/coreos/etcd/migrate" - "github.com/coreos/etcd/pkg/flags" - "github.com/coreos/etcd/pkg/osutil" - etcdversion "github.com/coreos/etcd/version" - "github.com/coreos/etcd/wal" - - "github.com/coreos/etcd/Godeps/_workspace/src/golang.org/x/net/context" -) - -type version string - -const ( - internalV1 version = "1" - internalV2 version = "2" - internalV2Proxy version = "2.proxy" - internalUnknown version = "unknown" - - v0_4 version = "v0.4" - v2_0 version = "v2.0" - v2_0Proxy version = "v2.0 proxy" - empty version = "empty" - unknown version = "unknown" - - defaultInternalV1etcdBinaryDir = "/usr/libexec/etcd/internal_versions/" -) - -var ( - v2SpecialFlags = []string{ - "initial-cluster", - "listen-peer-urls", - "listen-client-urls", - "proxy", - } -) - -func StartDesiredVersion(args []string) { - fs, err := parseConfig(args) - if err != nil { - return - } - if fs.Lookup("version").Value.String() == "true" { - fmt.Println("etcd version", etcdversion.Version) - os.Exit(0) - } - - ver := checkInternalVersion(fs) - log.Printf("starter: start etcd version %s", ver) - switch ver { - case internalV1: - startInternalV1() - case internalV2: - case internalV2Proxy: - if _, err := os.Stat(standbyInfo4(fs.Lookup("data-dir").Value.String())); err != nil { - log.Printf("starter: Detect standby_info file exists, and add --proxy=on flag to ensure it runs in v2.0 proxy mode.") - log.Printf("starter: Before removing v0.4 data, --proxy=on flag MUST be added.") - } - // append proxy flag to args to trigger proxy mode - os.Args = append(os.Args, "-proxy=on") - default: - log.Panicf("starter: unhandled start version") - } -} - -func checkInternalVersion(fs *flag.FlagSet) version { - // If it uses 2.0 env var explicitly, start 2.0 - for _, name := range v2SpecialFlags { - if fs.Lookup(name).Value.String() != "" { - return internalV2 - } - } - - dataDir := fs.Lookup("data-dir").Value.String() - if dataDir == "" { - log.Fatalf("starter: please set --data-dir or ETCD_DATA_DIR for etcd") - } - // check the data directory - dataver, err := wal.DetectVersion(dataDir) - if err != nil { - log.Fatalf("starter: failed to detect etcd version in %v: %v", dataDir, err) - } - log.Printf("starter: detect etcd version %s in %s", dataver, dataDir) - switch dataver { - case wal.WALv2_0: - return internalV2 - case wal.WALv2_0_1: - return internalV2 - case wal.WALv2_0Proxy: - return internalV2Proxy - case wal.WALv0_4: - standbyInfo, err := migrate.DecodeStandbyInfo4FromFile(standbyInfo4(dataDir)) - if err != nil && !os.IsNotExist(err) { - log.Fatalf("starter: failed to decode standbyInfo in %v: %v", dataDir, err) - } - inStandbyMode := standbyInfo != nil && standbyInfo.Running - if inStandbyMode { - ver, err := checkInternalVersionByClientURLs(standbyInfo.ClientURLs(), clientTLSInfo(fs)) - if err != nil { - log.Printf("starter: failed to check start version through peers: %v", err) - return internalV1 - } - if ver == internalV2 { - osutil.Unsetenv("ETCD_DISCOVERY") - os.Args = append(os.Args, "-initial-cluster", standbyInfo.InitialCluster()) - return internalV2Proxy - } - return ver - } - ver, err := checkInternalVersionByDataDir4(dataDir) - if err != nil { - log.Fatalf("starter: failed to check start version in %v: %v", dataDir, err) - } - return ver - case wal.WALNotExist: - discovery := fs.Lookup("discovery").Value.String() - dpeers, err := getPeersFromDiscoveryURL(discovery) - if err != nil { - log.Printf("starter: failed to get peers from discovery %s: %v", discovery, err) - } - peerStr := fs.Lookup("peers").Value.String() - ppeers := getPeersFromPeersFlag(peerStr, peerTLSInfo(fs)) - - urls := getClientURLsByPeerURLs(append(dpeers, ppeers...), peerTLSInfo(fs)) - ver, err := checkInternalVersionByClientURLs(urls, clientTLSInfo(fs)) - if err != nil { - log.Printf("starter: failed to check start version through peers: %v", err) - return internalV2 - } - return ver - } - // never reach here - log.Panicf("starter: unhandled etcd version in %v", dataDir) - return internalUnknown -} - -func checkInternalVersionByDataDir4(dataDir string) (version, error) { - // check v0.4 snapshot - snap4, err := migrate.DecodeLatestSnapshot4FromDir(snapDir4(dataDir)) - if err != nil { - return internalUnknown, err - } - if snap4 != nil { - st := &migrate.Store4{} - if err := json.Unmarshal(snap4.State, st); err != nil { - return internalUnknown, err - } - dir := st.Root.Children["_etcd"] - n, ok := dir.Children["next-internal-version"] - if ok && n.Value == "2" { - return internalV2, nil - } - } - - // check v0.4 log - ents4, err := migrate.DecodeLog4FromFile(logFile4(dataDir)) - if err != nil { - return internalUnknown, err - } - for _, e := range ents4 { - cmd, err := migrate.NewCommand4(e.GetCommandName(), e.GetCommand(), nil) - if err != nil { - return internalUnknown, err - } - setcmd, ok := cmd.(*migrate.SetCommand) - if !ok { - continue - } - if setcmd.Key == "/_etcd/next-internal-version" && setcmd.Value == "2" { - return internalV2, nil - } - } - return internalV1, nil -} - -func getClientURLsByPeerURLs(peers []string, tls *TLSInfo) []string { - c, err := newDefaultClient(tls) - if err != nil { - log.Printf("starter: new client error: %v", err) - return nil - } - var urls []string - for _, u := range peers { - resp, err := c.Get(u + "/etcdURL") - if err != nil { - log.Printf("starter: failed to get /etcdURL from %s", u) - continue - } - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Printf("starter: failed to read body from %s", u) - continue - } - urls = append(urls, string(b)) - } - return urls -} - -func checkInternalVersionByClientURLs(urls []string, tls *TLSInfo) (version, error) { - c, err := newDefaultClient(tls) - if err != nil { - return internalUnknown, err - } - for _, u := range urls { - resp, err := c.Get(u + "/version") - if err != nil { - log.Printf("starter: failed to get /version from %s", u) - continue - } - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Printf("starter: failed to read body from %s", u) - continue - } - - var m map[string]string - err = json.Unmarshal(b, &m) - if err != nil { - log.Printf("starter: failed to unmarshal body %s from %s", b, u) - continue - } - switch m["internalVersion"] { - case "1": - return internalV1, nil - case "2": - return internalV2, nil - default: - log.Printf("starter: unrecognized internal version %s from %s", m["internalVersion"], u) - } - } - return internalUnknown, fmt.Errorf("failed to get version from urls %v", urls) -} - -func getPeersFromDiscoveryURL(discoverURL string) ([]string, error) { - if discoverURL == "" { - return nil, nil - } - - u, err := url.Parse(discoverURL) - if err != nil { - return nil, err - } - token := u.Path - u.Path = "" - cfg := client.Config{ - Transport: &http.Transport{}, - Endpoints: []string{u.String()}, - } - c, err := client.New(cfg) - if err != nil { - return nil, err - } - dc := client.NewKeysAPIWithPrefix(c, "") - - ctx, cancel := context.WithTimeout(context.Background(), client.DefaultRequestTimeout) - resp, err := dc.Get(ctx, token, nil) - cancel() - if err != nil { - return nil, err - } - peers := make([]string, 0) - // append non-config keys to peers - for _, n := range resp.Node.Nodes { - if g := path.Base(n.Key); g == "_config" || g == "_state" { - continue - } - peers = append(peers, n.Value) - } - return peers, nil -} - -func getPeersFromPeersFlag(str string, tls *TLSInfo) []string { - peers := trimSplit(str, ",") - for i, p := range peers { - peers[i] = tls.Scheme() + "://" + p - } - return peers -} - -func startInternalV1() { - p := os.Getenv("ETCD_BINARY_DIR") - if p == "" { - p = defaultInternalV1etcdBinaryDir - } - p = path.Join(p, "1") - err := syscall.Exec(p, os.Args, syscall.Environ()) - if err != nil { - log.Fatalf("starter: failed to execute internal v1 etcd: %v", err) - } -} - -func newDefaultClient(tls *TLSInfo) (*http.Client, error) { - tr := &http.Transport{} - if tls.Scheme() == "https" { - tlsConfig, err := tls.ClientConfig() - if err != nil { - return nil, err - } - tr.TLSClientConfig = tlsConfig - } - return &http.Client{Transport: tr}, nil -} - -type value struct { - isBoolFlag bool - s string -} - -func (v *value) String() string { return v.s } - -func (v *value) Set(s string) error { - v.s = s - return nil -} - -func (v *value) IsBoolFlag() bool { return v.isBoolFlag } - -type boolFlag interface { - flag.Value - IsBoolFlag() bool -} - -// parseConfig parses out the input config from cmdline arguments and -// environment variables. -func parseConfig(args []string) (*flag.FlagSet, error) { - fs := flag.NewFlagSet("full flagset", flag.ContinueOnError) - etcdmain.NewConfig().VisitAll(func(f *flag.Flag) { - _, isBoolFlag := f.Value.(boolFlag) - fs.Var(&value{isBoolFlag: isBoolFlag}, f.Name, "") - }) - if err := fs.Parse(args); err != nil { - return nil, err - } - if err := flags.SetFlagsFromEnv(fs); err != nil { - return nil, err - } - return fs, nil -} - -func clientTLSInfo(fs *flag.FlagSet) *TLSInfo { - return &TLSInfo{ - CAFile: fs.Lookup("ca-file").Value.String(), - CertFile: fs.Lookup("cert-file").Value.String(), - KeyFile: fs.Lookup("key-file").Value.String(), - } -} - -func peerTLSInfo(fs *flag.FlagSet) *TLSInfo { - return &TLSInfo{ - CAFile: fs.Lookup("peer-ca-file").Value.String(), - CertFile: fs.Lookup("peer-cert-file").Value.String(), - KeyFile: fs.Lookup("peer-key-file").Value.String(), - } -} - -func snapDir4(dataDir string) string { - return path.Join(dataDir, "snapshot") -} - -func logFile4(dataDir string) string { - return path.Join(dataDir, "log") -} - -func standbyInfo4(dataDir string) string { - return path.Join(dataDir, "standby_info") -} - -func trimSplit(s, sep string) []string { - trimmed := strings.Split(s, sep) - for i := range trimmed { - trimmed[i] = strings.TrimSpace(trimmed[i]) - } - return trimmed -} diff --git a/migrate/starter/starter_test.go b/migrate/starter/starter_test.go deleted file mode 100644 index 10817a530..000000000 --- a/migrate/starter/starter_test.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2015 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package starter - -import ( - "flag" - "reflect" - "testing" -) - -func TestParseConfig(t *testing.T) { - tests := []struct { - args []string - wvals map[string]string - }{ - { - []string{"--name", "etcd", "--data-dir", "dir"}, - map[string]string{ - "name": "etcd", - "data-dir": "dir", - }, - }, - { - []string{"--name=etcd", "--data-dir=dir"}, - map[string]string{ - "name": "etcd", - "data-dir": "dir", - }, - }, - { - []string{"--version", "--name", "etcd"}, - map[string]string{ - "version": "true", - "name": "etcd", - }, - }, - { - []string{"--version=true", "--name", "etcd"}, - map[string]string{ - "version": "true", - "name": "etcd", - }, - }, - } - for i, tt := range tests { - fs, err := parseConfig(tt.args) - if err != nil { - t.Fatalf("#%d: unexpected parseConfig error: %v", i, err) - } - vals := make(map[string]string) - fs.Visit(func(f *flag.Flag) { - vals[f.Name] = f.Value.String() - }) - if !reflect.DeepEqual(vals, tt.wvals) { - t.Errorf("#%d: vals = %+v, want %+v", i, vals, tt.wvals) - } - } -} diff --git a/migrate/starter/tls_info.go b/migrate/starter/tls_info.go deleted file mode 100644 index 6c2525400..000000000 --- a/migrate/starter/tls_info.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2015 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package starter - -import ( - "crypto/tls" - "crypto/x509" - "encoding/pem" - "fmt" - "io/ioutil" -) - -// TLSInfo holds the SSL certificates paths. -type TLSInfo struct { - CertFile string `json:"CertFile"` - KeyFile string `json:"KeyFile"` - CAFile string `json:"CAFile"` -} - -func (info TLSInfo) Scheme() string { - if info.KeyFile != "" && info.CertFile != "" { - return "https" - } else { - return "http" - } -} - -// Generates a tls.Config object for a server from the given files. -func (info TLSInfo) ServerConfig() (*tls.Config, error) { - // Both the key and cert must be present. - if info.KeyFile == "" || info.CertFile == "" { - return nil, fmt.Errorf("KeyFile and CertFile must both be present[key: %v, cert: %v]", info.KeyFile, info.CertFile) - } - - var cfg tls.Config - - tlsCert, err := tls.LoadX509KeyPair(info.CertFile, info.KeyFile) - if err != nil { - return nil, err - } - - cfg.Certificates = []tls.Certificate{tlsCert} - - if info.CAFile != "" { - cfg.ClientAuth = tls.RequireAndVerifyClientCert - cp, err := newCertPool(info.CAFile) - if err != nil { - return nil, err - } - - cfg.RootCAs = cp - cfg.ClientCAs = cp - } else { - cfg.ClientAuth = tls.NoClientCert - } - - return &cfg, nil -} - -// Generates a tls.Config object for a client from the given files. -func (info TLSInfo) ClientConfig() (*tls.Config, error) { - var cfg tls.Config - - if info.KeyFile == "" || info.CertFile == "" { - return &cfg, nil - } - - tlsCert, err := tls.LoadX509KeyPair(info.CertFile, info.KeyFile) - if err != nil { - return nil, err - } - - cfg.Certificates = []tls.Certificate{tlsCert} - - if info.CAFile != "" { - cp, err := newCertPool(info.CAFile) - if err != nil { - return nil, err - } - - cfg.RootCAs = cp - } - - return &cfg, nil -} - -// newCertPool creates x509 certPool with provided CA file -func newCertPool(CAFile string) (*x509.CertPool, error) { - certPool := x509.NewCertPool() - pemByte, err := ioutil.ReadFile(CAFile) - if err != nil { - return nil, err - } - - for { - var block *pem.Block - block, pemByte = pem.Decode(pemByte) - if block == nil { - return certPool, nil - } - cert, err := x509.ParseCertificate(block.Bytes) - if err != nil { - return nil, err - } - certPool.AddCert(cert) - } - -}