diff --git a/docs/release-control/v6/internal/subsystems/agent-lifecycle.md b/docs/release-control/v6/internal/subsystems/agent-lifecycle.md index 0ff100620..3100b90e2 100644 --- a/docs/release-control/v6/internal/subsystems/agent-lifecycle.md +++ b/docs/release-control/v6/internal/subsystems/agent-lifecycle.md @@ -176,6 +176,10 @@ inventory export route for reporting. Fleet and install surfaces may coexist with that export, but `internal/api/reporting_inventory_handlers.go` and `internal/api/router_routes_licensing.go` remain API-owned reporting transport, not lifecycle-owned inventory or install behavior. +That adjacent reporting transport now also includes a VM inventory definition +route that owns export title, column schema, and filename prefix. Lifecycle- +adjacent install and fleet surfaces may read those facts, but they must not +redefine inventory schema locally. That adjacent export contract now also carries canonical Proxmox pool membership for each VM row. Lifecycle-adjacent install and fleet surfaces may reuse those current-state facts, but they must still treat the pool column as diff --git a/docs/release-control/v6/internal/subsystems/api-contracts.md b/docs/release-control/v6/internal/subsystems/api-contracts.md index dea54bc72..25eae9ec6 100644 --- a/docs/release-control/v6/internal/subsystems/api-contracts.md +++ b/docs/release-control/v6/internal/subsystems/api-contracts.md @@ -217,8 +217,11 @@ The reporting API contract now also treats current-state fleet inventory as a first-class surface separate from historical metrics reports. `internal/api/reporting_inventory_handlers.go`, `internal/api/router_routes_licensing.go`, and the settings reporting shell now -own `/api/admin/reports/inventory/vms/export` as the canonical VM inventory CSV -contract. That export is intentionally spreadsheet-shaped rather than comment- +own `/api/admin/reports/inventory/vms/definition` plus +`/api/admin/reports/inventory/vms/export` as the canonical VM inventory +contract. The definition endpoint owns the operator-facing title, description, +filename prefix, and stable column schema, while the export endpoint remains +the spreadsheet-shaped CSV transport. That export is intentionally not comment- prefixed like the legacy metrics CSV, and it now carries Proxmox pool membership from the canonical unified VM runtime model instead of inferring or reconstructing that field locally inside the frontend or handler. diff --git a/docs/release-control/v6/internal/subsystems/frontend-primitives.md b/docs/release-control/v6/internal/subsystems/frontend-primitives.md index 5aaa2c2b4..2d2856b85 100644 --- a/docs/release-control/v6/internal/subsystems/frontend-primitives.md +++ b/docs/release-control/v6/internal/subsystems/frontend-primitives.md @@ -174,6 +174,11 @@ historical performance reports and current-state VM inventory export. keep those as separate operator jobs with separate request builders and success copy, rather than collapsing inventory export back into the metrics-report controls. +That same settings shell must now also render VM inventory export schema from +the backend-owned definition contract rather than hardcoding column copy in the +panel. The frontend model may validate and present the definition, but the +canonical title, description, filename prefix, and column list belong to the +API reporting contract. The shared updates settings owner also defines the user-facing framing for rc-tagged builds. `frontend-modern/src/components/Settings/updatesSettingsModel.ts` and `frontend-modern/src/utils/updatesPresentation.ts` must present that diff --git a/docs/release-control/v6/internal/subsystems/storage-recovery.md b/docs/release-control/v6/internal/subsystems/storage-recovery.md index 0fcc53952..500c869cc 100644 --- a/docs/release-control/v6/internal/subsystems/storage-recovery.md +++ b/docs/release-control/v6/internal/subsystems/storage-recovery.md @@ -222,6 +222,10 @@ reporting surface. Storage and recovery workflows may consume similar current- state VM facts, but `internal/api/reporting_inventory_handlers.go` and `internal/api/router_routes_licensing.go` remain API/reporting transport ownership rather than storage/recovery contract ownership. +That adjacent reporting transport now also includes a VM inventory definition +route that owns export title, stable column schema, and filename prefix. +Storage and recovery flows may read those facts when they need fleet context, +but they must not fork their own inventory column contract. That adjacent export contract now also includes canonical Proxmox pool membership for each VM row. Storage and recovery flows may use those current- state facts when they need fleet context, but they must consume the API-owned diff --git a/frontend-modern/src/components/Settings/ReportingPanel.tsx b/frontend-modern/src/components/Settings/ReportingPanel.tsx index a031e15a6..e5e6e990b 100644 --- a/frontend-modern/src/components/Settings/ReportingPanel.tsx +++ b/frontend-modern/src/components/Settings/ReportingPanel.tsx @@ -1,4 +1,4 @@ -import { Show, JSX } from 'solid-js'; +import { For, Show, JSX } from 'solid-js'; import FileText from 'lucide-solid/icons/file-text'; import Download from 'lucide-solid/icons/download'; import BarChart from 'lucide-solid/icons/bar-chart'; @@ -55,6 +55,9 @@ export function ReportingPanel() { generating, handleGenerate, handleStartTrial, + inventoryDefinition, + inventoryDefinitionError, + inventoryDefinitionLoading, isLocked, isReportingEnabled, metricType, @@ -210,12 +213,34 @@ export function ReportingPanel() {

VM Inventory Export

- Export the current fleet-wide VM inventory as CSV using the canonical runtime - model. Includes VM identity, placement, CPU, memory allocation, disk allocation, - and disk usage columns. + {inventoryDefinition()?.description ?? + 'Export the current fleet-wide VM inventory as CSV using the canonical runtime model.'}

+ +

Loading export column definition...

+
+ + +

{inventoryDefinitionError()}

+
+ + +
+ + {(column) => ( +
+
+ {column.label} +
+

{column.description}

+
+ )} +
+
+
+