|
|
|
package routes
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (r *Service) Api(api fiber.Router) {
|
|
|
|
api.Get("/status", func(c *fiber.Ctx) error {
|
|
|
|
return c.JSON("ok")
|
|
|
|
})
|
|
|
|
|
|
|
|
// GetNodeStatus
|
|
|
|
api.Get("/node/:hostname", func(c *fiber.Ctx) error {
|
|
|
|
hostname := c.Params("hostname")
|
|
|
|
if hostname == "" {
|
|
|
|
return fmt.Errorf(`must provide hostname`)
|
|
|
|
}
|
|
|
|
|
|
|
|
node, err := r.Database.GetNode(hostname)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return c.JSON(node)
|
|
|
|
})
|
|
|
|
|
|
|
|
// GetJobStatus
|
|
|
|
api.Get("/job/:id", func(c *fiber.Ctx) error {
|
|
|
|
id := c.Params("id")
|
|
|
|
if id == "" {
|
|
|
|
return fmt.Errorf(`must provide id`)
|
|
|
|
}
|
|
|
|
|
|
|
|
job, err := r.Database.GetJob(id)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return c.JSON(job)
|
|
|
|
})
|
|
|
|
|
|
|
|
// AllNodes
|
|
|
|
api.Get("/nodes", func(c *fiber.Ctx) error {
|
|
|
|
nodes, err := r.Database.AllNodes()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return c.JSON(nodes)
|
|
|
|
})
|
|
|
|
|
|
|
|
// AllJobs
|
|
|
|
api.Get("/jobs", func(c *fiber.Ctx) error {
|
|
|
|
jobs, err := r.Database.AllJobs()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return c.JSON(jobs)
|
|
|
|
})
|
|
|
|
|
|
|
|
// QueryTemperatureSamples
|
|
|
|
api.Get("/stats/temperature", QueryTimeRangeMiddleware(func(c *fiber.Ctx, from, to time.Time) error {
|
|
|
|
samples, err := r.Database.QueryTemperatureSamples(from, to)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return c.JSON(samples)
|
|
|
|
}))
|
|
|
|
|
|
|
|
// QueryMemorySamples
|
|
|
|
api.Get("/stats/memory", QueryTimeRangeMiddleware(func(c *fiber.Ctx, from, to time.Time) error {
|
|
|
|
samples, err := r.Database.QueryMemorySamples(from, to)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return c.JSON(samples)
|
|
|
|
}))
|
|
|
|
|
|
|
|
// QueryStorageSamples
|
|
|
|
api.Get("/stats/storage", QueryTimeRangeMiddleware(func(c *fiber.Ctx, from, to time.Time) error {
|
|
|
|
samples, err := r.Database.QueryStorageSamples(from, to)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return c.JSON(samples)
|
|
|
|
}))
|
|
|
|
|
|
|
|
// QueryNetworkUploadSamples
|
|
|
|
api.Get("/stats/network-upload", QueryTimeRangeMiddleware(func(c *fiber.Ctx, from, to time.Time) error {
|
|
|
|
samples, err := r.Database.QueryNetworkUploadSamples(from, to)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return c.JSON(samples)
|
|
|
|
}))
|
|
|
|
|
|
|
|
// QueryNetworkDownloadSamples
|
|
|
|
api.Get("/stats/network-download", QueryTimeRangeMiddleware(func(c *fiber.Ctx, from, to time.Time) error {
|
|
|
|
samples, err := r.Database.QueryNetworkDownloadSamples(from, to)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return c.JSON(samples)
|
|
|
|
}))
|
|
|
|
}
|
|
|
|
|
|
|
|
func QueryTimeRangeMiddleware(queryHandler func(c *fiber.Ctx, from, to time.Time) error) func(c *fiber.Ctx) error {
|
|
|
|
return func(c *fiber.Ctx) error {
|
|
|
|
// by default just show 1 day of data
|
|
|
|
from, err := parseTimeParam(c.Query("from"), time.Now().Add(-24*time.Hour))
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
to, err := parseTimeParam(c.Query("to"), time.Now())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return queryHandler(c, from, to)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func parseTimeParam(s string, defaultValue time.Time) (time.Time, error) {
|
|
|
|
if s == "" {
|
|
|
|
return defaultValue, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return time.Parse(time.RFC3339, s)
|
|
|
|
}
|