ndbServer.go 2.5 KB

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