WIP: prep for 1.0 #1

Draft
sneak wants to merge 9 commits from next into master
Showing only changes of commit ebe241ac3e - Show all commits

View File

@ -9,7 +9,6 @@ import (
u "git.eeqj.de/sneak/goutil" u "git.eeqj.de/sneak/goutil"
"github.com/flosch/pongo2" "github.com/flosch/pongo2"
"github.com/gin-gonic/gin"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/labstack/echo" "github.com/labstack/echo"
) )
@ -23,7 +22,12 @@ func (a *Server) instances() []hash {
i := make(hash) i := make(hash)
// TODO move this locking onto a method on Instance that just // TODO move this locking onto a method on Instance that just
// returns a new hash // returns a new hash
// FIXME figure out why a very short lock here deadlocks
//this only locks the FSM, not the whole instance struct
i["status"] = v.Status()
// now do a quick lock of the whole instance just to copy out the
// attrs
v.Lock() v.Lock()
i["hostname"] = v.Hostname i["hostname"] = v.Hostname
i["uuid"] = v.UUID.String() i["uuid"] = v.UUID.String()
@ -31,9 +35,8 @@ func (a *Server) instances() []hash {
i["nextCheckAfter"] = (-1 * now.Sub(v.NextFetch)).String() i["nextCheckAfter"] = (-1 * now.Sub(v.NextFetch)).String()
i["successCount"] = v.SuccessCount i["successCount"] = v.SuccessCount
i["errorCount"] = v.ErrorCount i["errorCount"] = v.ErrorCount
i["consecutiveErrorCount"] = v.ConsecutiveErrorCount
i["identified"] = v.Identified i["identified"] = v.Identified
//this only locks the FSM, not the whole instance struct
i["status"] = v.Status()
i["software"] = "unknown" i["software"] = "unknown"
i["version"] = "unknown" i["version"] = "unknown"
if v.Identified { if v.Identified {
@ -41,6 +44,7 @@ func (a *Server) instances() []hash {
i["version"] = v.ServerVersionString i["version"] = v.ServerVersionString
} }
v.Unlock() v.Unlock()
resp = append(resp, i) resp = append(resp, i)
} }
@ -54,7 +58,7 @@ func (a *Server) instances() []hash {
return resp return resp
} }
func (a *Server) instanceSummary() map[string]int { func (a *Server) instanceStatusSummary() map[string]int {
resp := make(map[string]int) resp := make(map[string]int)
for _, v := range a.feta.manager.ListInstances() { for _, v := range a.feta.manager.ListInstances() {
v.Lock() v.Lock()
@ -68,26 +72,6 @@ func (a *Server) instanceSummary() map[string]int {
return resp return resp
} }
/*
func (a *Server) getInstanceListHandler() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
result := &gin.H{
"instances": a.instances(),
}
json, err := json.Marshal(result)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.Write(json)
}
}
*/
func (a *Server) notFoundHandler(c echo.Context) error { func (a *Server) notFoundHandler(c echo.Context) error {
return c.String(http.StatusNotFound, "404 not found") return c.String(http.StatusNotFound, "404 not found")
} }
@ -117,17 +101,33 @@ func (a *Server) instanceHandler(c echo.Context) error {
} }
func (a *Server) indexHandler(c echo.Context) error { func (a *Server) indexHandler(c echo.Context) error {
count, err := a.feta.dbm.TotalTootCount()
if err != nil {
count = 0
}
tc := pongo2.Context{ tc := pongo2.Context{
"time": time.Now().UTC().Format(time.RFC3339Nano), "time": time.Now().UTC().Format(time.RFC3339Nano),
"gitrev": a.feta.version, "gitrev": a.feta.version,
"tootCount": count,
"instances": a.instances(), "instances": a.instances(),
"instanceStatusSummary": a.instanceStatusSummary(),
} }
return c.Render(http.StatusOK, "index.html", tc) return c.Render(http.StatusOK, "index.html", tc)
} }
func (a *Server) instanceListHandler(c echo.Context) error {
il := a.instances()
tc := pongo2.Context{
"time": time.Now().UTC().Format(time.RFC3339Nano),
"gitrev": a.feta.version,
"instances": il,
}
return c.Render(http.StatusOK, "instancelist.html", tc)
}
func (a *Server) statsHandler(c echo.Context) error { func (a *Server) statsHandler(c echo.Context) error {
index := &gin.H{ index := &hash{
"server": &gin.H{ "server": &hash{
"now": time.Now().UTC().Format(time.RFC3339), "now": time.Now().UTC().Format(time.RFC3339),
"uptime": a.feta.uptime().String(), "uptime": a.feta.uptime().String(),
"goroutines": runtime.NumGoroutine(), "goroutines": runtime.NumGoroutine(),
@ -135,14 +135,14 @@ func (a *Server) statsHandler(c echo.Context) error {
"version": a.feta.version, "version": a.feta.version,
"buildarch": a.feta.buildarch, "buildarch": a.feta.buildarch,
}, },
"instanceSummary": a.instanceSummary(), "instanceStatusSummary": a.instanceStatusSummary(),
} }
return c.JSONPretty(http.StatusOK, index, " ") return c.JSONPretty(http.StatusOK, index, " ")
} }
func (a *Server) healthCheckHandler(c echo.Context) error { func (a *Server) healthCheckHandler(c echo.Context) error {
resp := &gin.H{ resp := &hash{
"status": "ok", "status": "ok",
"now": time.Now().UTC().Format(time.RFC3339), "now": time.Now().UTC().Format(time.RFC3339),
"uptime": a.feta.uptime().String(), "uptime": a.feta.uptime().String(),