v0.5.0-rc1: slice 5 Phase A — storage observe/report + watchdog (read-only, live)
Fill the slice-3 storage_targets stub and add the fast-poll storage watchdog. Read-only this phase; the host-root surface (mounts/SMART/grow/destructive gate) is Phase B. Hub-owned desired manifest is slice 10, so reconcile against it is built-but-unfed. - internal/storage: StorageTarget wire contract, durable_id derivation per type, HostReader seam (procfs/sysfs, root-free), Observer (storage_targets from ListStorage/NodeStorage + host reads, lvmthin thin-pool fill), and the watchdog (third daemon goroutine; debounced out-of-band report on a known target's attach/disconnect transition). - proxmox.Storage: additive parse-only config fields (durable_id sources). - collector StorageObserver seam; Loop.SetTrigger out-of-band report; daemon runs the watchdog as a third goroutine; StorageConfig knobs. - cross-repo golden kept byte-identical with felhom.eu/hub; bidirectional key-set test. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -138,6 +138,12 @@ func (g *GuestConfig) prefixed(prefix string) map[string]string {
|
||||
|
||||
// Storage is one entry of GET /storage (cluster) and GET /nodes/{node}/storage
|
||||
// (the latter adds usage fields). Unused fields stay zero.
|
||||
//
|
||||
// The lower block (Server/Export/Share/Datastore/Fingerprint/VGName/ThinPool) are the
|
||||
// type-specific config fields the cluster /storage definition carries; they are the
|
||||
// source for slice-5's deterministic durable_id derivation (server:export for NFS/CIFS,
|
||||
// repo+fingerprint for PBS, vg/pool for lvmthin). Additive parse-only fields — decoding
|
||||
// ignores unknown keys, so a storage type that lacks one simply leaves it zero.
|
||||
type Storage struct {
|
||||
Storage string `json:"storage"`
|
||||
Type string `json:"type"` // "dir" | "lvmthin" | "nfs" | "cifs" | "pbs"
|
||||
@@ -150,6 +156,15 @@ type Storage struct {
|
||||
Enabled int `json:"enabled,omitempty"`
|
||||
Shared int `json:"shared,omitempty"`
|
||||
UsedFraction float64 `json:"used_fraction,omitempty"`
|
||||
|
||||
// Type-specific config (durable_id sources).
|
||||
Server string `json:"server,omitempty"` // nfs/cifs/pbs server host
|
||||
Export string `json:"export,omitempty"` // nfs export path
|
||||
Share string `json:"share,omitempty"` // cifs share name
|
||||
Datastore string `json:"datastore,omitempty"` // pbs datastore name
|
||||
Fingerprint string `json:"fingerprint,omitempty"` // pbs server cert fingerprint
|
||||
VGName string `json:"vgname,omitempty"` // lvm/lvmthin volume group
|
||||
ThinPool string `json:"thinpool,omitempty"` // lvmthin pool LV name
|
||||
}
|
||||
|
||||
// StorageContent is one entry of GET /nodes/{node}/storage/{store}/content
|
||||
|
||||
Reference in New Issue
Block a user