server_utils.go 2.4 KB

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