package networkdb import ( "fmt" "net/http" "strings" stackdump "github.com/docker/docker/pkg/signal" "github.com/docker/libnetwork/diagnose" "github.com/sirupsen/logrus" ) const ( missingParameter = "missing parameter" ) // NetDbPaths2Func TODO var NetDbPaths2Func = map[string]diagnose.HTTPHandlerFunc{ "/join": dbJoin, "/networkpeers": dbPeers, "/clusterpeers": dbClusterPeers, "/joinnetwork": dbJoinNetwork, "/leavenetwork": dbLeaveNetwork, "/createentry": dbCreateEntry, "/updateentry": dbUpdateEntry, "/deleteentry": dbDeleteEntry, "/getentry": dbGetEntry, "/gettable": dbGetTable, "/dump": dbStackTrace, } func dbJoin(ctx interface{}, w http.ResponseWriter, r *http.Request) { r.ParseForm() diagnose.DebugHTTPForm(r) if len(r.Form["members"]) < 1 { diagnose.HTTPReplyError(w, missingParameter, fmt.Sprintf("%s?members=ip1,ip2,...", r.URL.Path)) return } nDB, ok := ctx.(*NetworkDB) if ok { err := nDB.Join(strings.Split(r.Form["members"][0], ",")) if err != nil { fmt.Fprintf(w, "%s error in the DB join %s\n", r.URL.Path, err) return } fmt.Fprintf(w, "OK\n") } } func dbPeers(ctx interface{}, w http.ResponseWriter, r *http.Request) { r.ParseForm() diagnose.DebugHTTPForm(r) if len(r.Form["nid"]) < 1 { diagnose.HTTPReplyError(w, missingParameter, fmt.Sprintf("%s?nid=test", r.URL.Path)) return } nDB, ok := ctx.(*NetworkDB) if ok { peers := nDB.Peers(r.Form["nid"][0]) fmt.Fprintf(w, "Network:%s Total peers: %d\n", r.Form["nid"], len(peers)) for i, peerInfo := range peers { fmt.Fprintf(w, "%d) %s -> %s\n", i, peerInfo.Name, peerInfo.IP) } } } func dbClusterPeers(ctx interface{}, w http.ResponseWriter, r *http.Request) { nDB, ok := ctx.(*NetworkDB) if ok { peers := nDB.ClusterPeers() fmt.Fprintf(w, "Total peers: %d\n", len(peers)) for i, peerInfo := range peers { fmt.Fprintf(w, "%d) %s -> %s\n", i, peerInfo.Name, peerInfo.IP) } } } func dbCreateEntry(ctx interface{}, w http.ResponseWriter, r *http.Request) { r.ParseForm() diagnose.DebugHTTPForm(r) if len(r.Form["tname"]) < 1 || len(r.Form["nid"]) < 1 || len(r.Form["key"]) < 1 || len(r.Form["value"]) < 1 { diagnose.HTTPReplyError(w, missingParameter, fmt.Sprintf("%s?tname=table_name&nid=network_id&key=k&value=v", r.URL.Path)) return } tname := r.Form["tname"][0] nid := r.Form["nid"][0] key := r.Form["key"][0] value := r.Form["value"][0] nDB, ok := ctx.(*NetworkDB) if ok { if err := nDB.CreateEntry(tname, nid, key, []byte(value)); err != nil { diagnose.HTTPReplyError(w, err.Error(), "") return } fmt.Fprintf(w, "OK\n") } } func dbUpdateEntry(ctx interface{}, w http.ResponseWriter, r *http.Request) { r.ParseForm() diagnose.DebugHTTPForm(r) if len(r.Form["tname"]) < 1 || len(r.Form["nid"]) < 1 || len(r.Form["key"]) < 1 || len(r.Form["value"]) < 1 { diagnose.HTTPReplyError(w, missingParameter, fmt.Sprintf("%s?tname=table_name&nid=network_id&key=k&value=v", r.URL.Path)) return } tname := r.Form["tname"][0] nid := r.Form["nid"][0] key := r.Form["key"][0] value := r.Form["value"][0] nDB, ok := ctx.(*NetworkDB) if ok { if err := nDB.UpdateEntry(tname, nid, key, []byte(value)); err != nil { diagnose.HTTPReplyError(w, err.Error(), "") return } fmt.Fprintf(w, "OK\n") } } func dbDeleteEntry(ctx interface{}, w http.ResponseWriter, r *http.Request) { r.ParseForm() diagnose.DebugHTTPForm(r) if len(r.Form["tname"]) < 1 || len(r.Form["nid"]) < 1 || len(r.Form["key"]) < 1 { diagnose.HTTPReplyError(w, missingParameter, fmt.Sprintf("%s?tname=table_name&nid=network_id&key=k", r.URL.Path)) return } tname := r.Form["tname"][0] nid := r.Form["nid"][0] key := r.Form["key"][0] nDB, ok := ctx.(*NetworkDB) if ok { err := nDB.DeleteEntry(tname, nid, key) if err != nil { diagnose.HTTPReplyError(w, err.Error(), "") return } fmt.Fprintf(w, "OK\n") } } func dbGetEntry(ctx interface{}, w http.ResponseWriter, r *http.Request) { r.ParseForm() diagnose.DebugHTTPForm(r) if len(r.Form["tname"]) < 1 || len(r.Form["nid"]) < 1 || len(r.Form["key"]) < 1 { diagnose.HTTPReplyError(w, missingParameter, fmt.Sprintf("%s?tname=table_name&nid=network_id&key=k", r.URL.Path)) return } tname := r.Form["tname"][0] nid := r.Form["nid"][0] key := r.Form["key"][0] nDB, ok := ctx.(*NetworkDB) if ok { value, err := nDB.GetEntry(tname, nid, key) if err != nil { diagnose.HTTPReplyError(w, err.Error(), "") return } fmt.Fprintf(w, "key:`%s` value:`%s`\n", key, string(value)) } } func dbJoinNetwork(ctx interface{}, w http.ResponseWriter, r *http.Request) { r.ParseForm() diagnose.DebugHTTPForm(r) if len(r.Form["nid"]) < 1 { diagnose.HTTPReplyError(w, missingParameter, fmt.Sprintf("%s?nid=network_id", r.URL.Path)) return } nid := r.Form["nid"][0] nDB, ok := ctx.(*NetworkDB) if ok { if err := nDB.JoinNetwork(nid); err != nil { diagnose.HTTPReplyError(w, err.Error(), "") return } fmt.Fprintf(w, "OK\n") } } func dbLeaveNetwork(ctx interface{}, w http.ResponseWriter, r *http.Request) { r.ParseForm() diagnose.DebugHTTPForm(r) if len(r.Form["nid"]) < 1 { diagnose.HTTPReplyError(w, missingParameter, fmt.Sprintf("%s?nid=network_id", r.URL.Path)) return } nid := r.Form["nid"][0] nDB, ok := ctx.(*NetworkDB) if ok { if err := nDB.LeaveNetwork(nid); err != nil { diagnose.HTTPReplyError(w, err.Error(), "") return } fmt.Fprintf(w, "OK\n") } } func dbGetTable(ctx interface{}, w http.ResponseWriter, r *http.Request) { r.ParseForm() diagnose.DebugHTTPForm(r) if len(r.Form["tname"]) < 1 || len(r.Form["nid"]) < 1 { diagnose.HTTPReplyError(w, missingParameter, fmt.Sprintf("%s?tname=table_name&nid=network_id", r.URL.Path)) return } tname := r.Form["tname"][0] nid := r.Form["nid"][0] nDB, ok := ctx.(*NetworkDB) if ok { table := nDB.GetTableByNetwork(tname, nid) fmt.Fprintf(w, "total elements: %d\n", len(table)) i := 0 for k, v := range table { fmt.Fprintf(w, "%d) k:`%s` -> v:`%s`\n", i, k, string(v.([]byte))) i++ } } } func dbStackTrace(ctx interface{}, w http.ResponseWriter, r *http.Request) { path, err := stackdump.DumpStacks("/tmp/") if err != nil { logrus.WithError(err).Error("failed to write goroutines dump") } else { fmt.Fprintf(w, "goroutine stacks written to %s", path) } }