server_utils.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package tests
  2. import (
  3. "io/ioutil"
  4. "net/http"
  5. "os"
  6. "time"
  7. "github.com/coreos/raft"
  8. "github.com/coreos/etcd/server"
  9. "github.com/coreos/etcd/store"
  10. )
  11. const (
  12. testName = "ETCDTEST"
  13. testClientURL = "localhost:4401"
  14. testRaftURL = "localhost:7701"
  15. testSnapshotCount = 10000
  16. testHeartbeatTimeout = time.Duration(50) * time.Millisecond
  17. testElectionTimeout = time.Duration(200) * time.Millisecond
  18. )
  19. // Starts a server in a temporary directory.
  20. func RunServer(f func(*server.Server)) {
  21. path, _ := ioutil.TempDir("", "etcd-")
  22. defer os.RemoveAll(path)
  23. store := store.New()
  24. registry := server.NewRegistry(store)
  25. serverStats := server.NewRaftServerStats(testName)
  26. followersStats := server.NewRaftFollowersStats(testName)
  27. psConfig := server.PeerServerConfig{
  28. Name: testName,
  29. URL: "http://"+testRaftURL,
  30. Scheme: "http",
  31. SnapshotCount: testSnapshotCount,
  32. MaxClusterSize: 9,
  33. }
  34. ps := server.NewPeerServer(psConfig, registry, store, nil, followersStats, serverStats)
  35. psListener, err := server.NewListener(testRaftURL)
  36. if err != nil {
  37. panic(err)
  38. }
  39. // Create Raft transporter and server
  40. dialTimeout := (3 * testHeartbeatTimeout) + testElectionTimeout
  41. responseHeaderTimeout := (3 * testHeartbeatTimeout) + testElectionTimeout
  42. raftTransporter := server.NewTransporter(followersStats, serverStats, registry, testHeartbeatTimeout, dialTimeout, responseHeaderTimeout)
  43. raftServer, err := raft.NewServer(testName, path, raftTransporter, store, ps, "")
  44. if err != nil {
  45. panic(err)
  46. }
  47. raftServer.SetElectionTimeout(testElectionTimeout)
  48. raftServer.SetHeartbeatTimeout(testHeartbeatTimeout)
  49. ps.SetRaftServer(raftServer)
  50. s := server.New(testName, "http://"+testClientURL, ps, registry, store, nil)
  51. sListener, err := server.NewListener(testClientURL)
  52. if err != nil {
  53. panic(err)
  54. }
  55. ps.SetServer(s)
  56. // Start up peer server.
  57. c := make(chan bool)
  58. go func() {
  59. c <- true
  60. ps.Start(false, []string{})
  61. http.Serve(psListener, ps.HTTPHandler())
  62. }()
  63. <-c
  64. // Start up etcd server.
  65. go func() {
  66. c <- true
  67. http.Serve(sListener, s.HTTPHandler())
  68. }()
  69. <-c
  70. // Wait to make sure servers have started.
  71. time.Sleep(50 * time.Millisecond)
  72. // Execute the function passed in.
  73. f(s)
  74. // Clean up servers.
  75. ps.Stop()
  76. psListener.Close()
  77. sListener.Close()
  78. }