mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
585964bf32
- Diagnose framework that exposes REST API for db interaction - Dockerfile to build the test image - Periodic print of stats regarding queue size - Client and server side for integration with testkit - Added write-delete-leave-join - Added test write-delete-wait-leave-join - Added write-wait-leave-join Signed-off-by: Flavio Crisciani <flavio.crisciani@docker.com>
133 lines
2.9 KiB
Go
133 lines
2.9 KiB
Go
package diagnose
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"net/http"
|
|
"sync"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
)
|
|
|
|
// HTTPHandlerFunc TODO
|
|
type HTTPHandlerFunc func(interface{}, http.ResponseWriter, *http.Request)
|
|
|
|
type httpHandlerCustom struct {
|
|
ctx interface{}
|
|
F func(interface{}, http.ResponseWriter, *http.Request)
|
|
}
|
|
|
|
// ServeHTTP TODO
|
|
func (h httpHandlerCustom) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
h.F(h.ctx, w, r)
|
|
}
|
|
|
|
var diagPaths2Func = map[string]HTTPHandlerFunc{
|
|
"/": notImplemented,
|
|
"/help": help,
|
|
"/ready": ready,
|
|
}
|
|
|
|
// Server when the debug is enabled exposes a
|
|
// This data structure is protected by the Agent mutex so does not require and additional mutex here
|
|
type Server struct {
|
|
sk net.Listener
|
|
port int
|
|
mux *http.ServeMux
|
|
registeredHanders []string
|
|
sync.Mutex
|
|
}
|
|
|
|
// Init TODO
|
|
func (n *Server) Init() {
|
|
n.mux = http.NewServeMux()
|
|
|
|
// Register local handlers
|
|
n.RegisterHandler(n, diagPaths2Func)
|
|
}
|
|
|
|
// RegisterHandler TODO
|
|
func (n *Server) RegisterHandler(ctx interface{}, hdlrs map[string]HTTPHandlerFunc) {
|
|
n.Lock()
|
|
defer n.Unlock()
|
|
for path, fun := range hdlrs {
|
|
n.mux.Handle(path, httpHandlerCustom{ctx, fun})
|
|
n.registeredHanders = append(n.registeredHanders, path)
|
|
}
|
|
}
|
|
|
|
// EnableDebug opens a TCP socket to debug the passed network DB
|
|
func (n *Server) EnableDebug(ip string, port int) {
|
|
n.Lock()
|
|
defer n.Unlock()
|
|
|
|
n.port = port
|
|
logrus.SetLevel(logrus.DebugLevel)
|
|
|
|
if n.sk != nil {
|
|
logrus.Infof("The server is already up and running")
|
|
return
|
|
}
|
|
|
|
logrus.Infof("Starting the server listening on %d for commands", port)
|
|
|
|
// // Create the socket
|
|
// var err error
|
|
// n.sk, err = net.Listen("tcp", listeningAddr)
|
|
// if err != nil {
|
|
// log.Fatal(err)
|
|
// }
|
|
//
|
|
// go func() {
|
|
// http.Serve(n.sk, n.mux)
|
|
// }()
|
|
http.ListenAndServe(":8000", n.mux)
|
|
}
|
|
|
|
// DisableDebug stop the dubug and closes the tcp socket
|
|
func (n *Server) DisableDebug() {
|
|
n.Lock()
|
|
defer n.Unlock()
|
|
n.sk.Close()
|
|
n.sk = nil
|
|
}
|
|
|
|
// IsDebugEnable returns true when the debug is enabled
|
|
func (n *Server) IsDebugEnable() bool {
|
|
n.Lock()
|
|
defer n.Unlock()
|
|
return n.sk != nil
|
|
}
|
|
|
|
func notImplemented(ctx interface{}, w http.ResponseWriter, r *http.Request) {
|
|
fmt.Fprintf(w, "URL path: %s no method implemented check /help\n", r.URL.Path)
|
|
}
|
|
|
|
func help(ctx interface{}, w http.ResponseWriter, r *http.Request) {
|
|
n, ok := ctx.(*Server)
|
|
if ok {
|
|
for _, path := range n.registeredHanders {
|
|
fmt.Fprintf(w, "%s\n", path)
|
|
}
|
|
}
|
|
}
|
|
|
|
func ready(ctx interface{}, w http.ResponseWriter, r *http.Request) {
|
|
fmt.Fprintf(w, "OK\n")
|
|
}
|
|
|
|
// DebugHTTPForm TODO
|
|
func DebugHTTPForm(r *http.Request) {
|
|
r.ParseForm()
|
|
for k, v := range r.Form {
|
|
logrus.Debugf("Form[%q] = %q\n", k, v)
|
|
}
|
|
}
|
|
|
|
// HTTPReplyError TODO
|
|
func HTTPReplyError(w http.ResponseWriter, message, usage string) {
|
|
fmt.Fprintf(w, "%s\n", message)
|
|
if usage != "" {
|
|
fmt.Fprintf(w, "Usage: %s\n", usage)
|
|
}
|
|
}
|