ndbServer.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package dbserver
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "net"
  7. "net/http"
  8. "os"
  9. "strconv"
  10. "github.com/containerd/log"
  11. "github.com/docker/docker/libnetwork/cmd/networkdb-test/dummyclient"
  12. "github.com/docker/docker/libnetwork/diagnostic"
  13. "github.com/docker/docker/libnetwork/networkdb"
  14. )
  15. var (
  16. nDB *networkdb.NetworkDB
  17. server *diagnostic.Server
  18. ipAddr string
  19. )
  20. var testerPaths2Func = map[string]diagnostic.HTTPHandlerFunc{
  21. "/myip": ipaddress,
  22. }
  23. func ipaddress(ctx interface{}, w http.ResponseWriter, r *http.Request) {
  24. fmt.Fprintf(w, "%s\n", ipAddr)
  25. }
  26. // Server starts the server
  27. func Server(args []string) {
  28. log.G(context.TODO()).Infof("[SERVER] Starting with arguments %v", args)
  29. if len(args) < 1 {
  30. log.G(context.TODO()).Fatal("Port number is a mandatory argument, aborting...")
  31. }
  32. port, _ := strconv.Atoi(args[0])
  33. var localNodeName string
  34. var ok bool
  35. if localNodeName, ok = os.LookupEnv("TASK_ID"); !ok {
  36. log.G(context.TODO()).Fatal("TASK_ID environment variable not set, aborting...")
  37. }
  38. log.G(context.TODO()).Infof("[SERVER] Starting node %s on port %d", localNodeName, port)
  39. ip, err := getIPInterface("eth0")
  40. if err != nil {
  41. log.G(context.TODO()).Errorf("%s There was a problem with the IP %s\n", localNodeName, err)
  42. return
  43. }
  44. ipAddr = ip
  45. log.G(context.TODO()).Infof("%s uses IP %s\n", localNodeName, ipAddr)
  46. server = diagnostic.New()
  47. server.Init()
  48. conf := networkdb.DefaultConfig()
  49. conf.Hostname = localNodeName
  50. conf.AdvertiseAddr = ipAddr
  51. conf.BindAddr = ipAddr
  52. nDB, err = networkdb.New(conf)
  53. if err != nil {
  54. log.G(context.TODO()).Infof("%s error in the DB init %s\n", localNodeName, err)
  55. return
  56. }
  57. // Register network db handlers
  58. server.RegisterHandler(nDB, networkdb.NetDbPaths2Func)
  59. server.RegisterHandler(nil, testerPaths2Func)
  60. server.RegisterHandler(nDB, dummyclient.DummyClientPaths2Func)
  61. server.EnableDiagnostic("", port)
  62. // block here
  63. select {}
  64. }
  65. func getIPInterface(name string) (string, error) {
  66. ifaces, err := net.Interfaces()
  67. if err != nil {
  68. return "", err
  69. }
  70. for _, iface := range ifaces {
  71. if iface.Name != name {
  72. continue // not the name specified
  73. }
  74. if iface.Flags&net.FlagUp == 0 {
  75. return "", errors.New("Interfaces is down")
  76. }
  77. addrs, err := iface.Addrs()
  78. if err != nil {
  79. return "", err
  80. }
  81. for _, addr := range addrs {
  82. var ip net.IP
  83. switch v := addr.(type) {
  84. case *net.IPNet:
  85. ip = v.IP
  86. case *net.IPAddr:
  87. ip = v.IP
  88. }
  89. if ip == nil || ip.IsLoopback() {
  90. continue
  91. }
  92. ip = ip.To4()
  93. if ip == nil {
  94. continue
  95. }
  96. return ip.String(), nil
  97. }
  98. return "", errors.New("Interfaces does not have a valid IPv4")
  99. }
  100. return "", errors.New("Interface not found")
  101. }