updated docs
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-02-06 16:01:01 +11:00
parent 0e3cf5aae9
commit 9677d083a8
6 changed files with 96 additions and 55 deletions

View File

@@ -26,6 +26,29 @@ Monthly aggregation builds on daily summaries (or the daily rollup cache):
- Monthly averages are `sum(weighted_sums) / monthly_total_samples` (per vCenter). - Monthly averages are `sum(weighted_sums) / monthly_total_samples` (per vCenter).
- Pool percentages are weighted the same way: `(daily_pool_pct / 100) * daily_total_samples`, summed, then divided by `monthly_total_samples` and multiplied by 100. - Pool percentages are weighted the same way: `(daily_pool_pct / 100) * daily_total_samples`, summed, then divided by `monthly_total_samples` and multiplied by 100.
### Hourly Snapshot Fields
Each hourly snapshot row tracks:
- Identity: `InventoryId`, `Name`, `Vcenter`, `VmId`, `VmUuid`, `EventKey`, `CloudId`
- Lifecycle/timing: `CreationTime`, `DeletionTime`, `SnapshotTime`
- Placement: `ResourcePool`, `Datacenter`, `Cluster`, `Folder`
- Sizing/state: `ProvisionedDisk`, `VcpuCount`, `RamGB`, `IsTemplate`, `PoweredOn`, `SrmPlaceholder`
### Daily Aggregate Fields
Daily summary rows retain identity/placement/sizing fields and add:
- Sample coverage: `SamplesPresent`, `TotalSamples`, `AvgIsPresent`
- Time-weighted sizing: `AvgVcpuCount`, `AvgRamGB`, `AvgProvisionedDisk`
- Pool distribution percentages: `PoolTinPct`, `PoolBronzePct`, `PoolSilverPct`, `PoolGoldPct`
- Chargeback totals columns: `Tin`, `Bronze`, `Silver`, `Gold`
- Lifecycle carry-forward used by reports and trace: `CreationTime`, `DeletionTime`, `SnapshotTime`
### Monthly Aggregate Fields
Monthly summary rows keep the same aggregate fields as daily summaries and recompute them over the month:
- `SamplesPresent` is summed across days.
- Monthly averages (`AvgVcpuCount`, `AvgRamGB`, `AvgProvisionedDisk`) are weighted by each day's sample volume.
- Monthly presence (`AvgIsPresent`) is normalized by monthly total samples.
- Monthly pool percentages (`PoolTinPct`, `PoolBronzePct`, `PoolSilverPct`, `PoolGoldPct`) are weighted by each days sample volume before normalization.
- `Tin`, `Bronze`, `Silver`, `Gold` totals remain available for reporting output.
## RPM Layout (summary) ## RPM Layout (summary)
The RPM installs the service and defaults under `/usr/bin`, config under `/etc/dtms`, and data under `/var/lib/vctp`: The RPM installs the service and defaults under `/usr/bin`, config under `/etc/dtms`, and data under `/var/lib/vctp`:
- Binary: `/usr/bin/vctp-linux-amd64` - Binary: `/usr/bin/vctp-linux-amd64`

View File

@@ -59,8 +59,10 @@ templ Index(info BuildInfo) {
<div class="web2-card"> <div class="web2-card">
<h2 class="text-lg font-semibold mb-2">Snapshots and Reports</h2> <h2 class="text-lg font-semibold mb-2">Snapshots and Reports</h2>
<div class="mt-3 text-sm text-slate-600 web2-paragraphs"> <div class="mt-3 text-sm text-slate-600 web2-paragraphs">
<p>Hourly snapshots capture inventory per vCenter (concurrency via <code class="web2-code">hourly_snapshot_concurrency</code>).</p> <p>Hourly snapshots capture inventory per vCenter (concurrency via <code class="web2-code">hourly_snapshot_concurrency</code>), then daily and monthly summaries are derived from those snapshots.</p>
<p>Daily summaries aggregate the hourly snapshots for the day; monthly summaries aggregate daily summaries for the month (or hourly snapshots if configured).</p> <p><strong>Hourly tracks:</strong> VM identity (<code class="web2-code">InventoryId</code>, <code class="web2-code">Name</code>, <code class="web2-code">VmId</code>, <code class="web2-code">VmUuid</code>, <code class="web2-code">Vcenter</code>, <code class="web2-code">EventKey</code>, <code class="web2-code">CloudId</code>), lifecycle (<code class="web2-code">CreationTime</code>, <code class="web2-code">DeletionTime</code>, <code class="web2-code">SnapshotTime</code>), placement (<code class="web2-code">Datacenter</code>, <code class="web2-code">Cluster</code>, <code class="web2-code">Folder</code>, <code class="web2-code">ResourcePool</code>), and sizing/state (<code class="web2-code">VcpuCount</code>, <code class="web2-code">RamGB</code>, <code class="web2-code">ProvisionedDisk</code>, <code class="web2-code">PoweredOn</code>, <code class="web2-code">IsTemplate</code>, <code class="web2-code">SrmPlaceholder</code>).</p>
<p><strong>Daily tracks:</strong> <code class="web2-code">SamplesPresent</code>, <code class="web2-code">TotalSamples</code>, <code class="web2-code">AvgIsPresent</code>, <code class="web2-code">AvgVcpuCount</code>, <code class="web2-code">AvgRamGB</code>, <code class="web2-code">AvgProvisionedDisk</code>, <code class="web2-code">PoolTinPct</code>, <code class="web2-code">PoolBronzePct</code>, <code class="web2-code">PoolSilverPct</code>, <code class="web2-code">PoolGoldPct</code>, plus chargeback totals columns <code class="web2-code">Tin</code>, <code class="web2-code">Bronze</code>, <code class="web2-code">Silver</code>, <code class="web2-code">Gold</code>.</p>
<p><strong>Monthly tracks:</strong> the same daily aggregate fields, with monthly values weighted by per-day sample volume so partial-day VMs and config changes stay proportional.</p>
<p>Snapshots are registered in <code class="web2-code">snapshot_registry</code> so regeneration via <code class="web2-code">/api/snapshots/aggregate</code> can locate the correct tables (fallback scanning is also supported).</p> <p>Snapshots are registered in <code class="web2-code">snapshot_registry</code> so regeneration via <code class="web2-code">/api/snapshots/aggregate</code> can locate the correct tables (fallback scanning is also supported).</p>
<p>Reports (XLSX with totals/charts) are generated automatically after hourly, daily, and monthly jobs and written to a reports directory.</p> <p>Reports (XLSX with totals/charts) are generated automatically after hourly, daily, and monthly jobs and written to a reports directory.</p>
<p>Hourly totals are interval-based: each row represents <code class="web2-code">[HH:00, HH+1:00)</code> and uses the first snapshot at or after the hour end (including cross-day snapshots) to prorate VM presence.</p> <p>Hourly totals are interval-based: each row represents <code class="web2-code">[HH:00, HH+1:00)</code> and uses the first snapshot at or after the hour end (including cross-day snapshots) to prorate VM presence.</p>
@@ -70,11 +72,11 @@ templ Index(info BuildInfo) {
<div class="web2-card"> <div class="web2-card">
<h2 class="text-lg font-semibold mb-2">Prorating and Aggregation</h2> <h2 class="text-lg font-semibold mb-2">Prorating and Aggregation</h2>
<div class="mt-3 space-y-2 text-sm text-slate-600 web2-paragraphs"> <div class="mt-3 space-y-2 text-sm text-slate-600 web2-paragraphs">
<p>SamplesPresent is the count of snapshots in which the VM appears; TotalSamples is the count of unique snapshot times for the vCenter.</p> <p><code class="web2-code">SamplesPresent</code> is the count of snapshots in which the VM appears; <code class="web2-code">TotalSamples</code> is the count of unique snapshot times for that vCenter/day.</p>
<p>AvgIsPresent = SamplesPresent / TotalSamples (0 when TotalSamples is 0).</p> <p><code class="web2-code">AvgIsPresent = SamplesPresent / TotalSamples</code> (0 when <code class="web2-code">TotalSamples</code> is 0).</p>
<p>Daily AvgVcpuCount/AvgRamGB/AvgProvisionedDisk = sum of per-sample values divided by TotalSamples (time-weighted).</p> <p>Daily <code class="web2-code">AvgVcpuCount</code>, <code class="web2-code">AvgRamGB</code>, and <code class="web2-code">AvgProvisionedDisk</code> are per-sample sums divided by <code class="web2-code">TotalSamples</code> (time-weighted).</p>
<p>Daily pool percentages use pool hits divided by SamplesPresent, so they reflect only the time the VM existed.</p> <p>Daily pool percentages (<code class="web2-code">PoolTinPct</code>/<code class="web2-code">PoolBronzePct</code>/<code class="web2-code">PoolSilverPct</code>/<code class="web2-code">PoolGoldPct</code>) use pool-hit counts divided by <code class="web2-code">SamplesPresent</code>.</p>
<p>Monthly aggregation weights daily averages by daily total samples, then divides by monthly total samples.</p> <p>Monthly aggregation converts each day into weighted sums using sample volume, then recomputes monthly averages and pool percentages from those weighted totals.</p>
<p>CreationTime is only set when vCenter provides it; otherwise it remains 0.</p> <p>CreationTime is only set when vCenter provides it; otherwise it remains 0.</p>
</div> </div>
</div> </div>

View File

@@ -86,7 +86,7 @@ func Index(info BuildInfo) templ.Component {
if templ_7745c5c3_Err != nil { if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err return templ_7745c5c3_Err
} }
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "</p></div></section><section class=\"grid gap-6 lg:grid-cols-3\"><div class=\"web2-card\"><h2 class=\"text-lg font-semibold mb-2\">Overview</h2><p class=\"mt-2 text-sm text-slate-600\">vCTP is a vSphere Chargeback Tracking Platform.</p></div><div class=\"web2-card\"><h2 class=\"text-lg font-semibold mb-2\">Snapshots and Reports</h2><div class=\"mt-3 text-sm text-slate-600 web2-paragraphs\"><p>Hourly snapshots capture inventory per vCenter (concurrency via <code class=\"web2-code\">hourly_snapshot_concurrency</code>).</p><p>Daily summaries aggregate the hourly snapshots for the day; monthly summaries aggregate daily summaries for the month (or hourly snapshots if configured).</p><p>Snapshots are registered in <code class=\"web2-code\">snapshot_registry</code> so regeneration via <code class=\"web2-code\">/api/snapshots/aggregate</code> can locate the correct tables (fallback scanning is also supported).</p><p>Reports (XLSX with totals/charts) are generated automatically after hourly, daily, and monthly jobs and written to a reports directory.</p><p>Hourly totals are interval-based: each row represents <code class=\"web2-code\">[HH:00, HH+1:00)</code> and uses the first snapshot at or after the hour end (including cross-day snapshots) to prorate VM presence.</p><p>Monthly aggregation reports include a Daily Totals sheet with full-day interval labels (YYYY-MM-DD to YYYY-MM-DD) and prorated totals.</p></div></div><div class=\"web2-card\"><h2 class=\"text-lg font-semibold mb-2\">Prorating and Aggregation</h2><div class=\"mt-3 space-y-2 text-sm text-slate-600 web2-paragraphs\"><p>SamplesPresent is the count of snapshots in which the VM appears; TotalSamples is the count of unique snapshot times for the vCenter.</p><p>AvgIsPresent = SamplesPresent / TotalSamples (0 when TotalSamples is 0).</p><p>Daily AvgVcpuCount/AvgRamGB/AvgProvisionedDisk = sum of per-sample values divided by TotalSamples (time-weighted).</p><p>Daily pool percentages use pool hits divided by SamplesPresent, so they reflect only the time the VM existed.</p><p>Monthly aggregation weights daily averages by daily total samples, then divides by monthly total samples.</p><p>CreationTime is only set when vCenter provides it; otherwise it remains 0.</p></div></div></section></main></body>") templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "</p></div></section><section class=\"grid gap-6 lg:grid-cols-3\"><div class=\"web2-card\"><h2 class=\"text-lg font-semibold mb-2\">Overview</h2><p class=\"mt-2 text-sm text-slate-600\">vCTP is a vSphere Chargeback Tracking Platform.</p></div><div class=\"web2-card\"><h2 class=\"text-lg font-semibold mb-2\">Snapshots and Reports</h2><div class=\"mt-3 text-sm text-slate-600 web2-paragraphs\"><p>Hourly snapshots capture inventory per vCenter (concurrency via <code class=\"web2-code\">hourly_snapshot_concurrency</code>), then daily and monthly summaries are derived from those snapshots.</p><p><strong>Hourly tracks:</strong> VM identity (<code class=\"web2-code\">InventoryId</code>, <code class=\"web2-code\">Name</code>, <code class=\"web2-code\">VmId</code>, <code class=\"web2-code\">VmUuid</code>, <code class=\"web2-code\">Vcenter</code>, <code class=\"web2-code\">EventKey</code>, <code class=\"web2-code\">CloudId</code>), lifecycle (<code class=\"web2-code\">CreationTime</code>, <code class=\"web2-code\">DeletionTime</code>, <code class=\"web2-code\">SnapshotTime</code>), placement (<code class=\"web2-code\">Datacenter</code>, <code class=\"web2-code\">Cluster</code>, <code class=\"web2-code\">Folder</code>, <code class=\"web2-code\">ResourcePool</code>), and sizing/state (<code class=\"web2-code\">VcpuCount</code>, <code class=\"web2-code\">RamGB</code>, <code class=\"web2-code\">ProvisionedDisk</code>, <code class=\"web2-code\">PoweredOn</code>, <code class=\"web2-code\">IsTemplate</code>, <code class=\"web2-code\">SrmPlaceholder</code>).</p><p><strong>Daily tracks:</strong> <code class=\"web2-code\">SamplesPresent</code>, <code class=\"web2-code\">TotalSamples</code>, <code class=\"web2-code\">AvgIsPresent</code>, <code class=\"web2-code\">AvgVcpuCount</code>, <code class=\"web2-code\">AvgRamGB</code>, <code class=\"web2-code\">AvgProvisionedDisk</code>, <code class=\"web2-code\">PoolTinPct</code>, <code class=\"web2-code\">PoolBronzePct</code>, <code class=\"web2-code\">PoolSilverPct</code>, <code class=\"web2-code\">PoolGoldPct</code>, plus chargeback totals columns <code class=\"web2-code\">Tin</code>, <code class=\"web2-code\">Bronze</code>, <code class=\"web2-code\">Silver</code>, <code class=\"web2-code\">Gold</code>.</p><p><strong>Monthly tracks:</strong> the same daily aggregate fields, with monthly values weighted by per-day sample volume so partial-day VMs and config changes stay proportional.</p><p>Snapshots are registered in <code class=\"web2-code\">snapshot_registry</code> so regeneration via <code class=\"web2-code\">/api/snapshots/aggregate</code> can locate the correct tables (fallback scanning is also supported).</p><p>Reports (XLSX with totals/charts) are generated automatically after hourly, daily, and monthly jobs and written to a reports directory.</p><p>Hourly totals are interval-based: each row represents <code class=\"web2-code\">[HH:00, HH+1:00)</code> and uses the first snapshot at or after the hour end (including cross-day snapshots) to prorate VM presence.</p><p>Monthly aggregation reports include a Daily Totals sheet with full-day interval labels (YYYY-MM-DD to YYYY-MM-DD) and prorated totals.</p></div></div><div class=\"web2-card\"><h2 class=\"text-lg font-semibold mb-2\">Prorating and Aggregation</h2><div class=\"mt-3 space-y-2 text-sm text-slate-600 web2-paragraphs\"><p><code class=\"web2-code\">SamplesPresent</code> is the count of snapshots in which the VM appears; <code class=\"web2-code\">TotalSamples</code> is the count of unique snapshot times for that vCenter/day.</p><p><code class=\"web2-code\">AvgIsPresent = SamplesPresent / TotalSamples</code> (0 when <code class=\"web2-code\">TotalSamples</code> is 0).</p><p>Daily <code class=\"web2-code\">AvgVcpuCount</code>, <code class=\"web2-code\">AvgRamGB</code>, and <code class=\"web2-code\">AvgProvisionedDisk</code> are per-sample sums divided by <code class=\"web2-code\">TotalSamples</code> (time-weighted).</p><p>Daily pool percentages (<code class=\"web2-code\">PoolTinPct</code>/<code class=\"web2-code\">PoolBronzePct</code>/<code class=\"web2-code\">PoolSilverPct</code>/<code class=\"web2-code\">PoolGoldPct</code>) use pool-hit counts divided by <code class=\"web2-code\">SamplesPresent</code>.</p><p>Monthly aggregation converts each day into weighted sums using sample volume, then recomputes monthly averages and pool percentages from those weighted totals.</p><p>CreationTime is only set when vCenter provides it; otherwise it remains 0.</p></div></div></section></main></body>")
if templ_7745c5c3_Err != nil { if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err return templ_7745c5c3_Err
} }

View File

@@ -185,6 +185,12 @@ const docTemplate = `{
"$ref": "#/definitions/models.StatusMessageResponse" "$ref": "#/definitions/models.StatusMessageResponse"
} }
}, },
"400": {
"description": "Invalid request",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
@@ -201,7 +207,7 @@ const docTemplate = `{
"application/json" "application/json"
], ],
"produces": [ "produces": [
"text/plain" "application/json"
], ],
"tags": [ "tags": [
"events" "events"
@@ -223,19 +229,19 @@ const docTemplate = `{
"200": { "200": {
"description": "Create event processed", "description": "Create event processed",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.StatusMessageResponse"
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.ErrorResponse"
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.ErrorResponse"
} }
} }
} }
@@ -248,7 +254,7 @@ const docTemplate = `{
"application/json" "application/json"
], ],
"produces": [ "produces": [
"text/plain" "application/json"
], ],
"tags": [ "tags": [
"events" "events"
@@ -270,19 +276,19 @@ const docTemplate = `{
"200": { "200": {
"description": "Delete event processed", "description": "Delete event processed",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.StatusMessageResponse"
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.ErrorResponse"
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.ErrorResponse"
} }
} }
} }
@@ -468,7 +474,7 @@ const docTemplate = `{
"post": { "post": {
"description": "Queries vCenter and updates inventory records with missing details.", "description": "Queries vCenter and updates inventory records with missing details.",
"produces": [ "produces": [
"text/plain" "application/json"
], ],
"tags": [ "tags": [
"inventory" "inventory"
@@ -478,13 +484,13 @@ const docTemplate = `{
"200": { "200": {
"description": "Update completed", "description": "Update completed",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.StatusMessageResponse"
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.ErrorResponse"
} }
} }
} }

View File

@@ -174,6 +174,12 @@
"$ref": "#/definitions/models.StatusMessageResponse" "$ref": "#/definitions/models.StatusMessageResponse"
} }
}, },
"400": {
"description": "Invalid request",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
@@ -190,7 +196,7 @@
"application/json" "application/json"
], ],
"produces": [ "produces": [
"text/plain" "application/json"
], ],
"tags": [ "tags": [
"events" "events"
@@ -212,19 +218,19 @@
"200": { "200": {
"description": "Create event processed", "description": "Create event processed",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.StatusMessageResponse"
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.ErrorResponse"
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.ErrorResponse"
} }
} }
} }
@@ -237,7 +243,7 @@
"application/json" "application/json"
], ],
"produces": [ "produces": [
"text/plain" "application/json"
], ],
"tags": [ "tags": [
"events" "events"
@@ -259,19 +265,19 @@
"200": { "200": {
"description": "Delete event processed", "description": "Delete event processed",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.StatusMessageResponse"
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.ErrorResponse"
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.ErrorResponse"
} }
} }
} }
@@ -457,7 +463,7 @@
"post": { "post": {
"description": "Queries vCenter and updates inventory records with missing details.", "description": "Queries vCenter and updates inventory records with missing details.",
"produces": [ "produces": [
"text/plain" "application/json"
], ],
"tags": [ "tags": [
"inventory" "inventory"
@@ -467,13 +473,13 @@
"200": { "200": {
"description": "Update completed", "description": "Update completed",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.StatusMessageResponse"
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "string" "$ref": "#/definitions/models.ErrorResponse"
} }
} }
} }

View File

@@ -405,6 +405,10 @@ paths:
description: Ciphertext response description: Ciphertext response
schema: schema:
$ref: '#/definitions/models.StatusMessageResponse' $ref: '#/definitions/models.StatusMessageResponse'
"400":
description: Invalid request
schema:
$ref: '#/definitions/models.ErrorResponse'
"500": "500":
description: Server error description: Server error
schema: schema:
@@ -427,20 +431,20 @@ paths:
schema: schema:
$ref: '#/definitions/models.CloudEventReceived' $ref: '#/definitions/models.CloudEventReceived'
produces: produces:
- text/plain - application/json
responses: responses:
"200": "200":
description: Create event processed description: Create event processed
schema: schema:
type: string $ref: '#/definitions/models.StatusMessageResponse'
"400": "400":
description: Invalid request description: Invalid request
schema: schema:
type: string $ref: '#/definitions/models.ErrorResponse'
"500": "500":
description: Server error description: Server error
schema: schema:
type: string $ref: '#/definitions/models.ErrorResponse'
summary: Record VM create event (deprecated) summary: Record VM create event (deprecated)
tags: tags:
- events - events
@@ -459,20 +463,20 @@ paths:
schema: schema:
$ref: '#/definitions/models.CloudEventReceived' $ref: '#/definitions/models.CloudEventReceived'
produces: produces:
- text/plain - application/json
responses: responses:
"200": "200":
description: Delete event processed description: Delete event processed
schema: schema:
type: string $ref: '#/definitions/models.StatusMessageResponse'
"400": "400":
description: Invalid request description: Invalid request
schema: schema:
type: string $ref: '#/definitions/models.ErrorResponse'
"500": "500":
description: Server error description: Server error
schema: schema:
type: string $ref: '#/definitions/models.ErrorResponse'
summary: Record VM delete event (deprecated) summary: Record VM delete event (deprecated)
tags: tags:
- events - events
@@ -598,16 +602,16 @@ paths:
post: post:
description: Queries vCenter and updates inventory records with missing details. description: Queries vCenter and updates inventory records with missing details.
produces: produces:
- text/plain - application/json
responses: responses:
"200": "200":
description: Update completed description: Update completed
schema: schema:
type: string $ref: '#/definitions/models.StatusMessageResponse'
"500": "500":
description: Server error description: Server error
schema: schema:
type: string $ref: '#/definitions/models.ErrorResponse'
summary: Refresh VM details summary: Refresh VM details
tags: tags:
- inventory - inventory