add node overlay buildtime

Signed-off-by: jason yang <jasonyangshadow@gmail.com>
This commit is contained in:
jason yang
2025-07-10 03:26:13 +00:00
committed by Jonathon Anderson
parent 6de1b8f843
commit a3dbf6aeee
3 changed files with 61 additions and 0 deletions

View File

@@ -3,8 +3,10 @@ package api
import (
"context"
"fmt"
"os"
"runtime"
"sort"
"time"
"dario.cat/mergo"
"github.com/swaggest/usecase"
@@ -40,6 +42,60 @@ func getNodes() usecase.Interactor {
return u
}
func getNodeOverlays() usecase.Interactor {
type getOverlaysInput struct {
ID string `path:"id" description:"ID of node to retrieve overlays for"`
}
type buildEntry struct {
MTime string `json:"mtime,omitempty" yaml:"mtime,omitempty"`
}
type overlayEntry struct {
Overlays []string `json:"overlays,omitempty" yaml:"overlays,omitempty"`
Build *buildEntry `json:"build,omitempty" yaml:"build,omitempty"`
}
type getOverlaysOutput struct {
SystemOverlay *overlayEntry `json:"system overlay,omitempty" yaml:"system overlay,omitempty"`
RuntimeOverlay *overlayEntry `json:"runtime overlay,omitempty" yaml:"runtime overlay,omitempty"`
}
u := usecase.NewInteractor(func(ctx context.Context, input *getOverlaysInput, output *getOverlaysOutput) error {
wwlog.Debug("api.getNodeOverlays()")
if registry, err := node.New(); err != nil {
return err
} else {
if node_, err := registry.GetNode(input.ID); err != nil {
return status.Wrap(err, status.NotFound)
} else {
out := getOverlaysOutput{
SystemOverlay: &overlayEntry{
Overlays: node_.SystemOverlay,
Build: &buildEntry{},
},
RuntimeOverlay: &overlayEntry{
Overlays: node_.RuntimeOverlay,
Build: &buildEntry{},
},
}
sysImagePath := overlay.OverlayImage(input.ID, "system", node_.SystemOverlay)
if sysImageStat, err := os.Stat(sysImagePath); err == nil {
out.SystemOverlay.Build.MTime = sysImageStat.ModTime().Format(time.RFC3339)
}
runtimeImagePath := overlay.OverlayImage(input.ID, "runtime", node_.RuntimeOverlay)
if runtimeImageStat, err := os.Stat(runtimeImagePath); err == nil {
out.RuntimeOverlay.Build.MTime = runtimeImageStat.ModTime().Format(time.RFC3339)
}
*output = out
return nil
}
}
})
u.SetTitle("Get overlay info for a node")
u.SetDescription("Get system and runtime overlay info for a node.")
u.SetTags("Node")
return u
}
func getNodeByID() usecase.Interactor {
type getNodeByIDInput struct {
ID string `path:"id" required:"true" description:"ID of node to get"`