ndbServer.go 2.5 KB

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