ndbServer.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. conf := networkdb.DefaultConfig()
  48. conf.Hostname = localNodeName
  49. conf.AdvertiseAddr = ipAddr
  50. conf.BindAddr = ipAddr
  51. nDB, err = networkdb.New(conf)
  52. if err != nil {
  53. log.G(context.TODO()).Infof("%s error in the DB init %s\n", localNodeName, err)
  54. return
  55. }
  56. // Register network db handlers
  57. server.RegisterHandler(nDB, networkdb.NetDbPaths2Func)
  58. server.RegisterHandler(nil, testerPaths2Func)
  59. server.RegisterHandler(nDB, dummyclient.DummyClientPaths2Func)
  60. server.EnableDiagnostic("", port)
  61. // block here
  62. select {}
  63. }
  64. func getIPInterface(name string) (string, error) {
  65. ifaces, err := net.Interfaces()
  66. if err != nil {
  67. return "", err
  68. }
  69. for _, iface := range ifaces {
  70. if iface.Name != name {
  71. continue // not the name specified
  72. }
  73. if iface.Flags&net.FlagUp == 0 {
  74. return "", errors.New("Interfaces is down")
  75. }
  76. addrs, err := iface.Addrs()
  77. if err != nil {
  78. return "", err
  79. }
  80. for _, addr := range addrs {
  81. var ip net.IP
  82. switch v := addr.(type) {
  83. case *net.IPNet:
  84. ip = v.IP
  85. case *net.IPAddr:
  86. ip = v.IP
  87. }
  88. if ip == nil || ip.IsLoopback() {
  89. continue
  90. }
  91. ip = ip.To4()
  92. if ip == nil {
  93. continue
  94. }
  95. return ip.String(), nil
  96. }
  97. return "", errors.New("Interfaces does not have a valid IPv4")
  98. }
  99. return "", errors.New("Interface not found")
  100. }