add more documentation
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-01-22 20:30:02 +11:00
parent 68ee2838e4
commit c8f04efd51
7 changed files with 500 additions and 325 deletions

View File

@@ -10,6 +10,19 @@ vCTP is a vSphere Chargeback Tracking Platform, designed for a specific customer
- Snapshots/aggregations: `vctp_hourly_snapshots_total`, `vctp_hourly_snapshots_failed_total`, `vctp_hourly_snapshot_last_unix`, `vctp_hourly_snapshot_last_rows`, `vctp_daily_aggregations_total`, `vctp_daily_aggregations_failed_total`, `vctp_daily_aggregation_duration_seconds`, `vctp_monthly_aggregations_total`, `vctp_monthly_aggregations_failed_total`, `vctp_monthly_aggregation_duration_seconds`, `vctp_reports_available` - Snapshots/aggregations: `vctp_hourly_snapshots_total`, `vctp_hourly_snapshots_failed_total`, `vctp_hourly_snapshot_last_unix`, `vctp_hourly_snapshot_last_rows`, `vctp_daily_aggregations_total`, `vctp_daily_aggregations_failed_total`, `vctp_daily_aggregation_duration_seconds`, `vctp_monthly_aggregations_total`, `vctp_monthly_aggregations_failed_total`, `vctp_monthly_aggregation_duration_seconds`, `vctp_reports_available`
- vCenter health/perf: `vctp_vcenter_connect_failures_total{vcenter}`, `vctp_vcenter_snapshot_duration_seconds{vcenter}`, `vctp_vcenter_inventory_size{vcenter}` - vCenter health/perf: `vctp_vcenter_connect_failures_total{vcenter}`, `vctp_vcenter_snapshot_duration_seconds{vcenter}`, `vctp_vcenter_inventory_size{vcenter}`
## Prorating and Aggregation Logic
Daily aggregation runs per VM using sample counts for the day:
- `SamplesPresent`: count of snapshot samples in which the VM appears.
- `TotalSamples`: count of unique snapshot timestamps for the vCenter in the day.
- `AvgIsPresent`: `SamplesPresent / TotalSamples` (0 when `TotalSamples` is 0).
- `AvgVcpuCount`, `AvgRamGB`, `AvgProvisionedDisk` (daily): `AvgIsPresent * last_observed_value` for the VM that day. This prorates partial-day VMs by presence ratio.
- `PoolTinPct`, `PoolBronzePct`, `PoolSilverPct`, `PoolGoldPct` (daily): `(pool_hits / SamplesPresent) * 100`, so pool percentages reflect only the time the VM existed.
Monthly aggregation builds on daily summaries (or the daily rollup cache):
- For each VM, daily averages are converted to weighted sums: `daily_avg * daily_total_samples`.
- 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.
## 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`
@@ -19,7 +32,7 @@ The RPM installs the service and defaults under `/usr/bin`, config under `/etc/d
- Data: SQLite DB and reports default to `/var/lib/vctp` (reports under `/var/lib/vctp/reports`) - Data: SQLite DB and reports default to `/var/lib/vctp` (reports under `/var/lib/vctp/reports`)
- Scripts: preinstall/postinstall handle directory creation and permissions. - Scripts: preinstall/postinstall handle directory creation and permissions.
## Settings File # Settings File
Configuration now lives in the YAML settings file. By default the service reads Configuration now lives in the YAML settings file. By default the service reads
`/etc/dtms/vctp.yml`, or you can override it with the `-settings` flag. `/etc/dtms/vctp.yml`, or you can override it with the `-settings` flag.
@@ -34,7 +47,7 @@ exit (no scheduler/server), use:
vctp -settings /path/to/vctp.yml -run-inventory vctp -settings /path/to/vctp.yml -run-inventory
``` ```
### Database Configuration ## Database Configuration
By default the app uses SQLite and creates/opens `db.sqlite3`. You can opt into PostgreSQL By default the app uses SQLite and creates/opens `db.sqlite3`. You can opt into PostgreSQL
by updating the settings file: by updating the settings file:
@@ -55,13 +68,13 @@ settings:
PostgreSQL migrations live in `db/migrations_postgres`, while SQLite migrations remain in PostgreSQL migrations live in `db/migrations_postgres`, while SQLite migrations remain in
`db/migrations`. `db/migrations`.
### Snapshot Retention ## Snapshot Retention
Hourly and daily snapshot table retention can be configured in the settings file: Hourly and daily snapshot table retention can be configured in the settings file:
- `settings.hourly_snapshot_max_age_days` (default: 60) - `settings.hourly_snapshot_max_age_days` (default: 60)
- `settings.daily_snapshot_max_age_months` (default: 12) - `settings.daily_snapshot_max_age_months` (default: 12)
### Settings Reference ## Settings Reference
All configuration lives under the top-level `settings:` key in `vctp.yml`. All configuration lives under the top-level `settings:` key in `vctp.yml`.
General: General:

View File

@@ -48,6 +48,34 @@ templ Index(info BuildInfo) {
<p class="mt-3 text-xl font-semibold">{info.GoVersion}</p> <p class="mt-3 text-xl font-semibold">{info.GoVersion}</p>
</div> </div>
</section> </section>
<section class="grid gap-6 lg:grid-cols-3">
<div class="web2-card">
<h2 class="text-lg font-semibold">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">Snapshots and Reports</h2>
<ul class="mt-3 space-y-2 text-sm text-slate-600 list-disc pl-5">
<li>Hourly snapshots capture inventory per vCenter (concurrency via `hourly_snapshot_concurrency`).</li>
<li>Daily summaries aggregate the hourly snapshots for the day; monthly summaries aggregate daily summaries for the month (or hourly snapshots if configured).</li>
<li>Snapshots are registered in `snapshot_registry` so regeneration via `/api/snapshots/aggregate` can locate the correct tables (fallback scanning is also supported).</li>
<li>Reports (XLSX with totals/charts) are generated automatically after hourly, daily, and monthly jobs and written to a reports directory.</li>
</ul>
</div>
<div class="web2-card">
<h2 class="text-lg font-semibold">Prorating and Aggregation</h2>
<ul class="mt-3 space-y-2 text-sm text-slate-600 list-disc pl-5">
<li>SamplesPresent is the count of snapshots in which the VM appears; TotalSamples is the count of unique snapshot times for the vCenter.</li>
<li>AvgIsPresent = SamplesPresent / TotalSamples (0 when TotalSamples is 0).</li>
<li>Daily AvgVcpuCount/AvgRamGB/AvgProvisionedDisk = AvgIsPresent * last observed value for the day.</li>
<li>Daily pool percentages use pool hits divided by SamplesPresent, so they reflect only the time the VM existed.</li>
<li>Monthly aggregation weights daily averages by daily total samples, then divides by monthly total samples.</li>
</ul>
</div>
</section>
</main> </main>
</body> </body>
@core.Footer() @core.Footer()

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></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\">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\">Snapshots and Reports</h2><ul class=\"mt-3 space-y-2 text-sm text-slate-600 list-disc pl-5\"><li>Hourly snapshots capture inventory per vCenter (concurrency via `hourly_snapshot_concurrency`).</li><li>Daily summaries aggregate the hourly snapshots for the day; monthly summaries aggregate daily summaries for the month (or hourly snapshots if configured).</li><li>Snapshots are registered in `snapshot_registry` so regeneration via `/api/snapshots/aggregate` can locate the correct tables (fallback scanning is also supported).</li><li>Reports (XLSX with totals/charts) are generated automatically after hourly, daily, and monthly jobs and written to a reports directory.</li></ul></div><div class=\"web2-card\"><h2 class=\"text-lg font-semibold\">Prorating and Aggregation</h2><ul class=\"mt-3 space-y-2 text-sm text-slate-600 list-disc pl-5\"><li>SamplesPresent is the count of snapshots in which the VM appears; TotalSamples is the count of unique snapshot times for the vCenter.</li><li>AvgIsPresent = SamplesPresent / TotalSamples (0 when TotalSamples is 0).</li><li>Daily AvgVcpuCount/AvgRamGB/AvgProvisionedDisk = AvgIsPresent * last observed value for the day.</li><li>Daily pool percentages use pool hits divided by SamplesPresent, so they reflect only the time the VM existed.</li><li>Monthly aggregation weights daily averages by daily total samples, then divides by monthly total samples.</li></ul></div></section></main></body>")
if templ_7745c5c3_Err != nil { if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err return templ_7745c5c3_Err
} }

View File

@@ -29,6 +29,26 @@ body {
border-radius: 4px; border-radius: 4px;
padding: 1.5rem 1.75rem; padding: 1.5rem 1.75rem;
} }
.web2-card h2 {
position: relative;
padding-left: 0.75rem;
font-size: 1.05rem;
font-weight: 700;
letter-spacing: 0.02em;
color: #0b1220;
}
.web2-card h2::before {
content: "";
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 4px;
height: 70%;
background: var(--web2-blue);
border-radius: 2px;
box-shadow: 0 0 0 1px rgba(29, 155, 240, 0.18);
}
.web2-pill { .web2-pill {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;

View File

@@ -92,19 +92,13 @@ const docTemplate = `{
"200": { "200": {
"description": "Cleanup completed", "description": "Cleanup completed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -141,19 +135,13 @@ const docTemplate = `{
"200": { "200": {
"description": "Ciphertext response", "description": "Ciphertext response",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -282,28 +270,19 @@ const docTemplate = `{
"200": { "200": {
"description": "Modify event processed", "description": "Modify event processed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"202": { "202": {
"description": "No relevant changes", "description": "No relevant changes",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -338,28 +317,19 @@ const docTemplate = `{
"200": { "200": {
"description": "Move event processed", "description": "Move event processed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -393,19 +363,13 @@ const docTemplate = `{
"200": { "200": {
"description": "Import processed", "description": "Import processed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -441,19 +405,13 @@ const docTemplate = `{
"200": { "200": {
"description": "Cleanup completed", "description": "Cleanup completed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -505,10 +463,7 @@ const docTemplate = `{
"500": { "500": {
"description": "Report generation failed", "description": "Report generation failed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -543,19 +498,13 @@ const docTemplate = `{
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -581,10 +530,7 @@ const docTemplate = `{
"500": { "500": {
"description": "Report generation failed", "description": "Report generation failed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -614,34 +560,31 @@ const docTemplate = `{
"name": "date", "name": "date",
"in": "query", "in": "query",
"required": true "required": true
},
{
"type": "string",
"description": "Monthly aggregation granularity: hourly or daily",
"name": "granularity",
"in": "query"
} }
], ],
"responses": { "responses": {
"200": { "200": {
"description": "Aggregation complete", "description": "Aggregation complete",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -673,28 +616,19 @@ const docTemplate = `{
"200": { "200": {
"description": "Snapshot started", "description": "Snapshot started",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -714,17 +648,13 @@ const docTemplate = `{
"200": { "200": {
"description": "Migration results", "description": "Migration results",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.SnapshotMigrationResponse"
"additionalProperties": true
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.SnapshotMigrationResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -744,17 +674,13 @@ const docTemplate = `{
"200": { "200": {
"description": "Regeneration summary", "description": "Regeneration summary",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.SnapshotRegenerateReportsResponse"
"additionalProperties": true
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -774,10 +700,7 @@ const docTemplate = `{
"200": { "200": {
"description": "OK", "description": "OK",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.SnapshotRepairResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -797,10 +720,7 @@ const docTemplate = `{
"200": { "200": {
"description": "OK", "description": "OK",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.SnapshotRepairSuiteResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -1214,6 +1134,17 @@ const docTemplate = `{
} }
} }
}, },
"models.ErrorResponse": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"status": {
"type": "string"
}
}
},
"models.ImportReceived": { "models.ImportReceived": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -1254,6 +1185,119 @@ const docTemplate = `{
"type": "string" "type": "string"
} }
} }
},
"models.SnapshotMigrationResponse": {
"type": "object",
"properties": {
"error": {
"type": "string"
},
"stats": {
"$ref": "#/definitions/models.SnapshotMigrationStats"
},
"status": {
"type": "string"
}
}
},
"models.SnapshotMigrationStats": {
"type": "object",
"properties": {
"DailyRegistered": {
"type": "integer"
},
"Errors": {
"type": "integer"
},
"HourlyRegistered": {
"type": "integer"
},
"HourlyRenamed": {
"type": "integer"
},
"MonthlyRegistered": {
"type": "integer"
}
}
},
"models.SnapshotRegenerateReportsResponse": {
"type": "object",
"properties": {
"errors": {
"type": "integer"
},
"regenerated": {
"type": "integer"
},
"reports_dir": {
"type": "string"
},
"skipped": {
"type": "integer"
},
"snapshotType": {
"type": "string"
},
"status": {
"type": "string"
},
"total": {
"type": "integer"
}
}
},
"models.SnapshotRepairResponse": {
"type": "object",
"properties": {
"failed": {
"type": "string"
},
"repaired": {
"type": "string"
},
"status": {
"type": "string"
}
}
},
"models.SnapshotRepairSuiteResponse": {
"type": "object",
"properties": {
"daily_failed": {
"type": "string"
},
"daily_repaired": {
"type": "string"
},
"monthly_failed": {
"type": "string"
},
"monthly_refined": {
"type": "string"
},
"status": {
"type": "string"
}
}
},
"models.StatusMessageResponse": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"status": {
"type": "string"
}
}
},
"models.StatusResponse": {
"type": "object",
"properties": {
"status": {
"type": "string"
}
}
} }
} }
}` }`

View File

@@ -81,19 +81,13 @@
"200": { "200": {
"description": "Cleanup completed", "description": "Cleanup completed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -130,19 +124,13 @@
"200": { "200": {
"description": "Ciphertext response", "description": "Ciphertext response",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -271,28 +259,19 @@
"200": { "200": {
"description": "Modify event processed", "description": "Modify event processed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"202": { "202": {
"description": "No relevant changes", "description": "No relevant changes",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -327,28 +306,19 @@
"200": { "200": {
"description": "Move event processed", "description": "Move event processed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -382,19 +352,13 @@
"200": { "200": {
"description": "Import processed", "description": "Import processed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -430,19 +394,13 @@
"200": { "200": {
"description": "Cleanup completed", "description": "Cleanup completed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusMessageResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -494,10 +452,7 @@
"500": { "500": {
"description": "Report generation failed", "description": "Report generation failed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -532,19 +487,13 @@
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -570,10 +519,7 @@
"500": { "500": {
"description": "Report generation failed", "description": "Report generation failed",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -603,34 +549,31 @@
"name": "date", "name": "date",
"in": "query", "in": "query",
"required": true "required": true
},
{
"type": "string",
"description": "Monthly aggregation granularity: hourly or daily",
"name": "granularity",
"in": "query"
} }
], ],
"responses": { "responses": {
"200": { "200": {
"description": "Aggregation complete", "description": "Aggregation complete",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -662,28 +605,19 @@
"200": { "200": {
"description": "Snapshot started", "description": "Snapshot started",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.StatusResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"400": { "400": {
"description": "Invalid request", "description": "Invalid request",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -703,17 +637,13 @@
"200": { "200": {
"description": "Migration results", "description": "Migration results",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.SnapshotMigrationResponse"
"additionalProperties": true
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.SnapshotMigrationResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -733,17 +663,13 @@
"200": { "200": {
"description": "Regeneration summary", "description": "Regeneration summary",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.SnapshotRegenerateReportsResponse"
"additionalProperties": true
} }
}, },
"500": { "500": {
"description": "Server error", "description": "Server error",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.ErrorResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -763,10 +689,7 @@
"200": { "200": {
"description": "OK", "description": "OK",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.SnapshotRepairResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -786,10 +709,7 @@
"200": { "200": {
"description": "OK", "description": "OK",
"schema": { "schema": {
"type": "object", "$ref": "#/definitions/models.SnapshotRepairSuiteResponse"
"additionalProperties": {
"type": "string"
}
} }
} }
} }
@@ -1203,6 +1123,17 @@
} }
} }
}, },
"models.ErrorResponse": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"status": {
"type": "string"
}
}
},
"models.ImportReceived": { "models.ImportReceived": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -1243,6 +1174,119 @@
"type": "string" "type": "string"
} }
} }
},
"models.SnapshotMigrationResponse": {
"type": "object",
"properties": {
"error": {
"type": "string"
},
"stats": {
"$ref": "#/definitions/models.SnapshotMigrationStats"
},
"status": {
"type": "string"
}
}
},
"models.SnapshotMigrationStats": {
"type": "object",
"properties": {
"DailyRegistered": {
"type": "integer"
},
"Errors": {
"type": "integer"
},
"HourlyRegistered": {
"type": "integer"
},
"HourlyRenamed": {
"type": "integer"
},
"MonthlyRegistered": {
"type": "integer"
}
}
},
"models.SnapshotRegenerateReportsResponse": {
"type": "object",
"properties": {
"errors": {
"type": "integer"
},
"regenerated": {
"type": "integer"
},
"reports_dir": {
"type": "string"
},
"skipped": {
"type": "integer"
},
"snapshotType": {
"type": "string"
},
"status": {
"type": "string"
},
"total": {
"type": "integer"
}
}
},
"models.SnapshotRepairResponse": {
"type": "object",
"properties": {
"failed": {
"type": "string"
},
"repaired": {
"type": "string"
},
"status": {
"type": "string"
}
}
},
"models.SnapshotRepairSuiteResponse": {
"type": "object",
"properties": {
"daily_failed": {
"type": "string"
},
"daily_repaired": {
"type": "string"
},
"monthly_failed": {
"type": "string"
},
"monthly_refined": {
"type": "string"
},
"status": {
"type": "string"
}
}
},
"models.StatusMessageResponse": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"status": {
"type": "string"
}
}
},
"models.StatusResponse": {
"type": "object",
"properties": {
"status": {
"type": "string"
}
}
} }
} }
} }

View File

@@ -126,6 +126,13 @@ definitions:
modified: modified:
type: string type: string
type: object type: object
models.ErrorResponse:
properties:
message:
type: string
status:
type: string
type: object
models.ImportReceived: models.ImportReceived:
properties: properties:
Cluster: Cluster:
@@ -153,6 +160,79 @@ definitions:
VmId: VmId:
type: string type: string
type: object type: object
models.SnapshotMigrationResponse:
properties:
error:
type: string
stats:
$ref: '#/definitions/models.SnapshotMigrationStats'
status:
type: string
type: object
models.SnapshotMigrationStats:
properties:
DailyRegistered:
type: integer
Errors:
type: integer
HourlyRegistered:
type: integer
HourlyRenamed:
type: integer
MonthlyRegistered:
type: integer
type: object
models.SnapshotRegenerateReportsResponse:
properties:
errors:
type: integer
regenerated:
type: integer
reports_dir:
type: string
skipped:
type: integer
snapshotType:
type: string
status:
type: string
total:
type: integer
type: object
models.SnapshotRepairResponse:
properties:
failed:
type: string
repaired:
type: string
status:
type: string
type: object
models.SnapshotRepairSuiteResponse:
properties:
daily_failed:
type: string
daily_repaired:
type: string
monthly_failed:
type: string
monthly_refined:
type: string
status:
type: string
type: object
models.StatusMessageResponse:
properties:
message:
type: string
status:
type: string
type: object
models.StatusResponse:
properties:
status:
type: string
type: object
info: info:
contact: {} contact: {}
paths: paths:
@@ -209,15 +289,11 @@ paths:
"200": "200":
description: Cleanup completed description: Cleanup completed
schema: schema:
additionalProperties: $ref: '#/definitions/models.StatusMessageResponse'
type: string
type: object
"400": "400":
description: Invalid request description: Invalid request
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
summary: Cleanup vCenter inventory (deprecated) summary: Cleanup vCenter inventory (deprecated)
tags: tags:
- maintenance - maintenance
@@ -241,15 +317,11 @@ paths:
"200": "200":
description: Ciphertext response description: Ciphertext response
schema: schema:
additionalProperties: $ref: '#/definitions/models.StatusMessageResponse'
type: string
type: object
"500": "500":
description: Server error description: Server error
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
summary: Encrypt data summary: Encrypt data
tags: tags:
- crypto - crypto
@@ -337,21 +409,15 @@ paths:
"200": "200":
description: Modify event processed description: Modify event processed
schema: schema:
additionalProperties: $ref: '#/definitions/models.StatusMessageResponse'
type: string
type: object
"202": "202":
description: No relevant changes description: No relevant changes
schema: schema:
additionalProperties: $ref: '#/definitions/models.StatusMessageResponse'
type: string
type: object
"500": "500":
description: Server error description: Server error
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
summary: Record VM modify event (deprecated) summary: Record VM modify event (deprecated)
tags: tags:
- events - events
@@ -375,21 +441,15 @@ paths:
"200": "200":
description: Move event processed description: Move event processed
schema: schema:
additionalProperties: $ref: '#/definitions/models.StatusMessageResponse'
type: string
type: object
"400": "400":
description: Invalid request description: Invalid request
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
"500": "500":
description: Server error description: Server error
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
summary: Record VM move event (deprecated) summary: Record VM move event (deprecated)
tags: tags:
- events - events
@@ -411,15 +471,11 @@ paths:
"200": "200":
description: Import processed description: Import processed
schema: schema:
additionalProperties: $ref: '#/definitions/models.StatusMessageResponse'
type: string
type: object
"500": "500":
description: Server error description: Server error
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
summary: Import VMs summary: Import VMs
tags: tags:
- inventory - inventory
@@ -443,15 +499,11 @@ paths:
"200": "200":
description: Cleanup completed description: Cleanup completed
schema: schema:
additionalProperties: $ref: '#/definitions/models.StatusMessageResponse'
type: string
type: object
"400": "400":
description: Invalid request description: Invalid request
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
summary: Cleanup VM inventory entry summary: Cleanup VM inventory entry
tags: tags:
- inventory - inventory
@@ -485,9 +537,7 @@ paths:
"500": "500":
description: Report generation failed description: Report generation failed
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
summary: Download inventory report summary: Download inventory report
tags: tags:
- reports - reports
@@ -510,15 +560,11 @@ paths:
"400": "400":
description: Invalid request description: Invalid request
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
"500": "500":
description: Server error description: Server error
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
summary: Download snapshot report summary: Download snapshot report
tags: tags:
- snapshots - snapshots
@@ -535,9 +581,7 @@ paths:
"500": "500":
description: Report generation failed description: Report generation failed
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
summary: Download updates report summary: Download updates report
tags: tags:
- reports - reports
@@ -556,27 +600,25 @@ paths:
name: date name: date
required: true required: true
type: string type: string
- description: 'Monthly aggregation granularity: hourly or daily'
in: query
name: granularity
type: string
produces: produces:
- application/json - application/json
responses: responses:
"200": "200":
description: Aggregation complete description: Aggregation complete
schema: schema:
additionalProperties: $ref: '#/definitions/models.StatusResponse'
type: string
type: object
"400": "400":
description: Invalid request description: Invalid request
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
"500": "500":
description: Server error description: Server error
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
summary: Force snapshot aggregation summary: Force snapshot aggregation
tags: tags:
- snapshots - snapshots
@@ -598,21 +640,15 @@ paths:
"200": "200":
description: Snapshot started description: Snapshot started
schema: schema:
additionalProperties: $ref: '#/definitions/models.StatusResponse'
type: string
type: object
"400": "400":
description: Invalid request description: Invalid request
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
"500": "500":
description: Server error description: Server error
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
summary: Trigger hourly snapshot (manual) summary: Trigger hourly snapshot (manual)
tags: tags:
- snapshots - snapshots
@@ -626,14 +662,11 @@ paths:
"200": "200":
description: Migration results description: Migration results
schema: schema:
additionalProperties: true $ref: '#/definitions/models.SnapshotMigrationResponse'
type: object
"500": "500":
description: Server error description: Server error
schema: schema:
additionalProperties: $ref: '#/definitions/models.SnapshotMigrationResponse'
type: string
type: object
summary: Migrate snapshot registry summary: Migrate snapshot registry
tags: tags:
- snapshots - snapshots
@@ -647,14 +680,11 @@ paths:
"200": "200":
description: Regeneration summary description: Regeneration summary
schema: schema:
additionalProperties: true $ref: '#/definitions/models.SnapshotRegenerateReportsResponse'
type: object
"500": "500":
description: Server error description: Server error
schema: schema:
additionalProperties: $ref: '#/definitions/models.ErrorResponse'
type: string
type: object
summary: Regenerate hourly snapshot reports summary: Regenerate hourly snapshot reports
tags: tags:
- snapshots - snapshots
@@ -668,9 +698,7 @@ paths:
"200": "200":
description: OK description: OK
schema: schema:
additionalProperties: $ref: '#/definitions/models.SnapshotRepairResponse'
type: string
type: object
summary: Repair daily summaries summary: Repair daily summaries
tags: tags:
- snapshots - snapshots
@@ -684,9 +712,7 @@ paths:
"200": "200":
description: OK description: OK
schema: schema:
additionalProperties: $ref: '#/definitions/models.SnapshotRepairSuiteResponse'
type: string
type: object
summary: Run full snapshot repair suite summary: Run full snapshot repair suite
tags: tags:
- snapshots - snapshots