dummyClient.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package dummyclient
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "github.com/Sirupsen/logrus"
  7. events "github.com/docker/go-events"
  8. "github.com/docker/libnetwork/diagnose"
  9. "github.com/docker/libnetwork/networkdb"
  10. )
  11. // DummyClientPaths2Func exported paths for the client
  12. var DummyClientPaths2Func = map[string]diagnose.HTTPHandlerFunc{
  13. "/watchtable": watchTable,
  14. "/watchedtableentries": watchTableEntries,
  15. }
  16. const (
  17. missingParameter = "missing parameter"
  18. )
  19. type tableHandler struct {
  20. cancelWatch func()
  21. entries map[string]string
  22. }
  23. var clientWatchTable = map[string]tableHandler{}
  24. func watchTable(ctx interface{}, w http.ResponseWriter, r *http.Request) {
  25. r.ParseForm()
  26. diagnose.DebugHTTPForm(r)
  27. if len(r.Form["tname"]) < 1 {
  28. diagnose.HTTPReplyError(w, missingParameter, fmt.Sprintf("%s?tname=table_name", r.URL.Path))
  29. return
  30. }
  31. tableName := r.Form["tname"][0]
  32. if _, ok := clientWatchTable[tableName]; ok {
  33. fmt.Fprintf(w, "OK\n")
  34. return
  35. }
  36. nDB, ok := ctx.(*networkdb.NetworkDB)
  37. if ok {
  38. ch, cancel := nDB.Watch(tableName, "", "")
  39. clientWatchTable[tableName] = tableHandler{cancelWatch: cancel, entries: make(map[string]string)}
  40. go handleTableEvents(tableName, ch)
  41. fmt.Fprintf(w, "OK\n")
  42. }
  43. }
  44. func watchTableEntries(ctx interface{}, w http.ResponseWriter, r *http.Request) {
  45. r.ParseForm()
  46. diagnose.DebugHTTPForm(r)
  47. if len(r.Form["tname"]) < 1 {
  48. diagnose.HTTPReplyError(w, missingParameter, fmt.Sprintf("%s?tname=table_name", r.URL.Path))
  49. return
  50. }
  51. tableName := r.Form["tname"][0]
  52. table, ok := clientWatchTable[tableName]
  53. if !ok {
  54. fmt.Fprintf(w, "Table %s not watched\n", tableName)
  55. return
  56. }
  57. fmt.Fprintf(w, "total elements: %d\n", len(table.entries))
  58. i := 0
  59. for k, v := range table.entries {
  60. fmt.Fprintf(w, "%d) k:`%s` -> v:`%s`\n", i, k, v)
  61. i++
  62. }
  63. }
  64. func handleTableEvents(tableName string, ch *events.Channel) {
  65. var (
  66. // nid string
  67. eid string
  68. value []byte
  69. isAdd bool
  70. )
  71. logrus.Infof("Started watching table:%s", tableName)
  72. for {
  73. select {
  74. case <-ch.Done():
  75. logrus.Infof("End watching %s", tableName)
  76. return
  77. case evt := <-ch.C:
  78. logrus.Infof("Recevied new event on:%s", tableName)
  79. switch event := evt.(type) {
  80. case networkdb.CreateEvent:
  81. // nid = event.NetworkID
  82. eid = event.Key
  83. value = event.Value
  84. isAdd = true
  85. case networkdb.DeleteEvent:
  86. // nid = event.NetworkID
  87. eid = event.Key
  88. value = event.Value
  89. isAdd = false
  90. default:
  91. log.Fatalf("Unexpected table event = %#v", event)
  92. }
  93. if isAdd {
  94. // logrus.Infof("Add %s %s", tableName, eid)
  95. clientWatchTable[tableName].entries[eid] = string(value)
  96. } else {
  97. // logrus.Infof("Del %s %s", tableName, eid)
  98. delete(clientWatchTable[tableName].entries, eid)
  99. }
  100. }
  101. }
  102. }