server_utils.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. tls := &server.TLSConfig{Scheme: "http"}
  41. dialTimeout := (3 * testHeartbeatTimeout) + testElectionTimeout
  42. responseHeaderTimeout := (3 * testHeartbeatTimeout) + testElectionTimeout
  43. raftTransporter := server.NewTransporter(tls.Scheme, tls.Client, followersStats, serverStats, registry, testHeartbeatTimeout, dialTimeout, responseHeaderTimeout)
  44. raftServer, err := raft.NewServer(testName, path, raftTransporter, store, ps, "")
  45. if err != nil {
  46. panic(err)
  47. }
  48. raftServer.SetElectionTimeout(testElectionTimeout)
  49. raftServer.SetHeartbeatTimeout(testHeartbeatTimeout)
  50. ps.SetRaftServer(raftServer)
  51. s := server.New(testName, "http://"+testClientURL, ps, registry, store, nil)
  52. sListener, err := server.NewListener(testClientURL)
  53. if err != nil {
  54. panic(err)
  55. }
  56. ps.SetServer(s)
  57. // Start up peer server.
  58. c := make(chan bool)
  59. go func() {
  60. c <- true
  61. ps.Start(false, []string{})
  62. http.Serve(psListener, ps)
  63. }()
  64. <-c
  65. // Start up etcd server.
  66. go func() {
  67. c <- true
  68. http.Serve(sListener, s)
  69. }()
  70. <-c
  71. // Wait to make sure servers have started.
  72. time.Sleep(50 * time.Millisecond)
  73. // Execute the function passed in.
  74. f(s)
  75. // Clean up servers.
  76. ps.Stop()
  77. psListener.Close()
  78. sListener.Close()
  79. }