Files
2026-09-03 08:36:04 +05:30

91 lines
2.4 KiB
Go

package api
import (
"net/http"
"github.com/go-chi/chi/v5"
"ferrum/internal/pve"
)
func rrdTimeframe(r *http.Request) pve.RRDTimeframe {
switch r.URL.Query().Get("timeframe") {
case "day":
return pve.RRDDay
case "week":
return pve.RRDWeek
case "month":
return pve.RRDMonth
case "year":
return pve.RRDYear
default:
return pve.RRDHour
}
}
// rrdCF picks the consolidation function: AVERAGE (default) or MAX, which
// the UI overlays as a "peak envelope" band on top of the average series.
func rrdCF(r *http.Request) pve.RRDCF {
if r.URL.Query().Get("cf") == "MAX" {
return pve.RRDMax
}
return pve.RRDAverage
}
func (s *Server) nodeRRDData(w http.ResponseWriter, r *http.Request) {
client, err := s.clientFor(r.Context(), chi.URLParam(r, "id"))
if err != nil {
s.writeError(w, http.StatusBadGateway, err)
return
}
points, err := client.NodeRRDData(r.Context(), chi.URLParam(r, "node"), rrdTimeframe(r), rrdCF(r))
if err != nil {
s.writeError(w, http.StatusBadGateway, err)
return
}
writeJSON(w, http.StatusOK, points)
}
func (s *Server) guestRRDData(w http.ResponseWriter, r *http.Request) {
connID, guestType, node := chi.URLParam(r, "id"), chi.URLParam(r, "type"), chi.URLParam(r, "node")
vmid, err := vmidParam(r)
if err != nil {
s.writeError(w, http.StatusBadRequest, err)
return
}
client, err := s.clientFor(r.Context(), connID)
if err != nil {
s.writeError(w, http.StatusBadGateway, err)
return
}
points, err := client.GuestRRDData(r.Context(), guestType, node, vmid, rrdTimeframe(r), rrdCF(r))
if err != nil {
s.writeError(w, http.StatusBadGateway, err)
return
}
writeJSON(w, http.StatusOK, points)
}
// guestLiveStatus exposes /nodes/{node}/{type}/{vmid}/status/current — live
// network/disk counters (cumulative since guest start; the UI derives rates),
// ballooning detail, and HA state that the cluster overview lacks.
func (s *Server) guestLiveStatus(w http.ResponseWriter, r *http.Request) {
connID, guestType, node := chi.URLParam(r, "id"), chi.URLParam(r, "type"), chi.URLParam(r, "node")
vmid, err := vmidParam(r)
if err != nil {
s.writeError(w, http.StatusBadRequest, err)
return
}
client, err := s.clientFor(r.Context(), connID)
if err != nil {
s.writeError(w, http.StatusBadGateway, err)
return
}
status, err := client.GuestLiveStatus(r.Context(), guestType, node, vmid)
if err != nil {
s.writeError(w, http.StatusBadGateway, err)
return
}
writeJSON(w, http.StatusOK, status)
}