dummyClient.go 3.1 KB

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