From c8f04efd516fc55cc2da37b3c22532de0ea3edcd Mon Sep 17 00:00:00 2001 From: Nathan Coad Date: Thu, 22 Jan 2026 20:30:02 +1100 Subject: [PATCH] add more documentation --- README.md | 21 ++- components/views/index.templ | 28 ++++ components/views/index_templ.go | 2 +- dist/assets/css/web3.css | 20 +++ server/router/docs/docs.go | 276 ++++++++++++++++++-------------- server/router/docs/swagger.json | 276 ++++++++++++++++++-------------- server/router/docs/swagger.yaml | 202 +++++++++++++---------- 7 files changed, 500 insertions(+), 325 deletions(-) diff --git a/README.md b/README.md index 81dee66..b440990 100644 --- a/README.md +++ b/README.md @@ -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` - 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) 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` @@ -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`) - 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 `/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 ``` -### Database Configuration +## Database Configuration By default the app uses SQLite and creates/opens `db.sqlite3`. You can opt into PostgreSQL by updating the settings file: @@ -55,13 +68,13 @@ settings: PostgreSQL migrations live in `db/migrations_postgres`, while SQLite migrations remain in `db/migrations`. -### Snapshot Retention +## Snapshot Retention Hourly and daily snapshot table retention can be configured in the settings file: - `settings.hourly_snapshot_max_age_days` (default: 60) - `settings.daily_snapshot_max_age_months` (default: 12) -### Settings Reference +## Settings Reference All configuration lives under the top-level `settings:` key in `vctp.yml`. General: diff --git a/components/views/index.templ b/components/views/index.templ index 65261bf..16d418e 100644 --- a/components/views/index.templ +++ b/components/views/index.templ @@ -48,6 +48,34 @@ templ Index(info BuildInfo) {

{info.GoVersion}

+ +
+
+

Overview

+

+ vCTP is a vSphere Chargeback Tracking Platform. +

+
+
+

Snapshots and Reports

+
    +
  • Hourly snapshots capture inventory per vCenter (concurrency via `hourly_snapshot_concurrency`).
  • +
  • Daily summaries aggregate the hourly snapshots for the day; monthly summaries aggregate daily summaries for the month (or hourly snapshots if configured).
  • +
  • Snapshots are registered in `snapshot_registry` so regeneration via `/api/snapshots/aggregate` can locate the correct tables (fallback scanning is also supported).
  • +
  • Reports (XLSX with totals/charts) are generated automatically after hourly, daily, and monthly jobs and written to a reports directory.
  • +
+
+
+

Prorating and Aggregation

+
    +
  • SamplesPresent is the count of snapshots in which the VM appears; TotalSamples is the count of unique snapshot times for the vCenter.
  • +
  • AvgIsPresent = SamplesPresent / TotalSamples (0 when TotalSamples is 0).
  • +
  • Daily AvgVcpuCount/AvgRamGB/AvgProvisionedDisk = AvgIsPresent * last observed value for the day.
  • +
  • Daily pool percentages use pool hits divided by SamplesPresent, so they reflect only the time the VM existed.
  • +
  • Monthly aggregation weights daily averages by daily total samples, then divides by monthly total samples.
  • +
+
+
@core.Footer() diff --git a/components/views/index_templ.go b/components/views/index_templ.go index d1d1ec7..741a120 100644 --- a/components/views/index_templ.go +++ b/components/views/index_templ.go @@ -86,7 +86,7 @@ func Index(info BuildInfo) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "

Overview

vCTP is a vSphere Chargeback Tracking Platform.

Snapshots and Reports

  • Hourly snapshots capture inventory per vCenter (concurrency via `hourly_snapshot_concurrency`).
  • Daily summaries aggregate the hourly snapshots for the day; monthly summaries aggregate daily summaries for the month (or hourly snapshots if configured).
  • Snapshots are registered in `snapshot_registry` so regeneration via `/api/snapshots/aggregate` can locate the correct tables (fallback scanning is also supported).
  • Reports (XLSX with totals/charts) are generated automatically after hourly, daily, and monthly jobs and written to a reports directory.

Prorating and Aggregation

  • SamplesPresent is the count of snapshots in which the VM appears; TotalSamples is the count of unique snapshot times for the vCenter.
  • AvgIsPresent = SamplesPresent / TotalSamples (0 when TotalSamples is 0).
  • Daily AvgVcpuCount/AvgRamGB/AvgProvisionedDisk = AvgIsPresent * last observed value for the day.
  • Daily pool percentages use pool hits divided by SamplesPresent, so they reflect only the time the VM existed.
  • Monthly aggregation weights daily averages by daily total samples, then divides by monthly total samples.
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/dist/assets/css/web3.css b/dist/assets/css/web3.css index f6d106d..e0a8388 100644 --- a/dist/assets/css/web3.css +++ b/dist/assets/css/web3.css @@ -29,6 +29,26 @@ body { border-radius: 4px; 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 { display: inline-flex; align-items: center; diff --git a/server/router/docs/docs.go b/server/router/docs/docs.go index c33dc02..b159efd 100644 --- a/server/router/docs/docs.go +++ b/server/router/docs/docs.go @@ -92,19 +92,13 @@ const docTemplate = `{ "200": { "description": "Cleanup completed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "400": { "description": "Invalid request", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -141,19 +135,13 @@ const docTemplate = `{ "200": { "description": "Ciphertext response", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -282,28 +270,19 @@ const docTemplate = `{ "200": { "description": "Modify event processed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "202": { "description": "No relevant changes", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -338,28 +317,19 @@ const docTemplate = `{ "200": { "description": "Move event processed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "400": { "description": "Invalid request", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -393,19 +363,13 @@ const docTemplate = `{ "200": { "description": "Import processed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -441,19 +405,13 @@ const docTemplate = `{ "200": { "description": "Cleanup completed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "400": { "description": "Invalid request", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -505,10 +463,7 @@ const docTemplate = `{ "500": { "description": "Report generation failed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -543,19 +498,13 @@ const docTemplate = `{ "400": { "description": "Invalid request", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -581,10 +530,7 @@ const docTemplate = `{ "500": { "description": "Report generation failed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -614,34 +560,31 @@ const docTemplate = `{ "name": "date", "in": "query", "required": true + }, + { + "type": "string", + "description": "Monthly aggregation granularity: hourly or daily", + "name": "granularity", + "in": "query" } ], "responses": { "200": { "description": "Aggregation complete", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusResponse" } }, "400": { "description": "Invalid request", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -673,28 +616,19 @@ const docTemplate = `{ "200": { "description": "Snapshot started", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusResponse" } }, "400": { "description": "Invalid request", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -714,17 +648,13 @@ const docTemplate = `{ "200": { "description": "Migration results", "schema": { - "type": "object", - "additionalProperties": true + "$ref": "#/definitions/models.SnapshotMigrationResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.SnapshotMigrationResponse" } } } @@ -744,17 +674,13 @@ const docTemplate = `{ "200": { "description": "Regeneration summary", "schema": { - "type": "object", - "additionalProperties": true + "$ref": "#/definitions/models.SnapshotRegenerateReportsResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -774,10 +700,7 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.SnapshotRepairResponse" } } } @@ -797,10 +720,7 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.SnapshotRepairSuiteResponse" } } } @@ -1214,6 +1134,17 @@ const docTemplate = `{ } } }, + "models.ErrorResponse": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, "models.ImportReceived": { "type": "object", "properties": { @@ -1254,6 +1185,119 @@ const docTemplate = `{ "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" + } + } } } }` diff --git a/server/router/docs/swagger.json b/server/router/docs/swagger.json index 8bb1145..44ab259 100644 --- a/server/router/docs/swagger.json +++ b/server/router/docs/swagger.json @@ -81,19 +81,13 @@ "200": { "description": "Cleanup completed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "400": { "description": "Invalid request", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -130,19 +124,13 @@ "200": { "description": "Ciphertext response", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -271,28 +259,19 @@ "200": { "description": "Modify event processed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "202": { "description": "No relevant changes", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -327,28 +306,19 @@ "200": { "description": "Move event processed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "400": { "description": "Invalid request", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -382,19 +352,13 @@ "200": { "description": "Import processed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -430,19 +394,13 @@ "200": { "description": "Cleanup completed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusMessageResponse" } }, "400": { "description": "Invalid request", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -494,10 +452,7 @@ "500": { "description": "Report generation failed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -532,19 +487,13 @@ "400": { "description": "Invalid request", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -570,10 +519,7 @@ "500": { "description": "Report generation failed", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -603,34 +549,31 @@ "name": "date", "in": "query", "required": true + }, + { + "type": "string", + "description": "Monthly aggregation granularity: hourly or daily", + "name": "granularity", + "in": "query" } ], "responses": { "200": { "description": "Aggregation complete", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusResponse" } }, "400": { "description": "Invalid request", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -662,28 +605,19 @@ "200": { "description": "Snapshot started", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.StatusResponse" } }, "400": { "description": "Invalid request", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -703,17 +637,13 @@ "200": { "description": "Migration results", "schema": { - "type": "object", - "additionalProperties": true + "$ref": "#/definitions/models.SnapshotMigrationResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.SnapshotMigrationResponse" } } } @@ -733,17 +663,13 @@ "200": { "description": "Regeneration summary", "schema": { - "type": "object", - "additionalProperties": true + "$ref": "#/definitions/models.SnapshotRegenerateReportsResponse" } }, "500": { "description": "Server error", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.ErrorResponse" } } } @@ -763,10 +689,7 @@ "200": { "description": "OK", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.SnapshotRepairResponse" } } } @@ -786,10 +709,7 @@ "200": { "description": "OK", "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "$ref": "#/definitions/models.SnapshotRepairSuiteResponse" } } } @@ -1203,6 +1123,17 @@ } } }, + "models.ErrorResponse": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, "models.ImportReceived": { "type": "object", "properties": { @@ -1243,6 +1174,119 @@ "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" + } + } } } } \ No newline at end of file diff --git a/server/router/docs/swagger.yaml b/server/router/docs/swagger.yaml index 5f29a38..948e5c4 100644 --- a/server/router/docs/swagger.yaml +++ b/server/router/docs/swagger.yaml @@ -126,6 +126,13 @@ definitions: modified: type: string type: object + models.ErrorResponse: + properties: + message: + type: string + status: + type: string + type: object models.ImportReceived: properties: Cluster: @@ -153,6 +160,79 @@ definitions: VmId: type: string 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: contact: {} paths: @@ -209,15 +289,11 @@ paths: "200": description: Cleanup completed schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.StatusMessageResponse' "400": description: Invalid request schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' summary: Cleanup vCenter inventory (deprecated) tags: - maintenance @@ -241,15 +317,11 @@ paths: "200": description: Ciphertext response schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.StatusMessageResponse' "500": description: Server error schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' summary: Encrypt data tags: - crypto @@ -337,21 +409,15 @@ paths: "200": description: Modify event processed schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.StatusMessageResponse' "202": description: No relevant changes schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.StatusMessageResponse' "500": description: Server error schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' summary: Record VM modify event (deprecated) tags: - events @@ -375,21 +441,15 @@ paths: "200": description: Move event processed schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.StatusMessageResponse' "400": description: Invalid request schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' "500": description: Server error schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' summary: Record VM move event (deprecated) tags: - events @@ -411,15 +471,11 @@ paths: "200": description: Import processed schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.StatusMessageResponse' "500": description: Server error schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' summary: Import VMs tags: - inventory @@ -443,15 +499,11 @@ paths: "200": description: Cleanup completed schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.StatusMessageResponse' "400": description: Invalid request schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' summary: Cleanup VM inventory entry tags: - inventory @@ -485,9 +537,7 @@ paths: "500": description: Report generation failed schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' summary: Download inventory report tags: - reports @@ -510,15 +560,11 @@ paths: "400": description: Invalid request schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' "500": description: Server error schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' summary: Download snapshot report tags: - snapshots @@ -535,9 +581,7 @@ paths: "500": description: Report generation failed schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' summary: Download updates report tags: - reports @@ -556,27 +600,25 @@ paths: name: date required: true type: string + - description: 'Monthly aggregation granularity: hourly or daily' + in: query + name: granularity + type: string produces: - application/json responses: "200": description: Aggregation complete schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.StatusResponse' "400": description: Invalid request schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' "500": description: Server error schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' summary: Force snapshot aggregation tags: - snapshots @@ -598,21 +640,15 @@ paths: "200": description: Snapshot started schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.StatusResponse' "400": description: Invalid request schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' "500": description: Server error schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' summary: Trigger hourly snapshot (manual) tags: - snapshots @@ -626,14 +662,11 @@ paths: "200": description: Migration results schema: - additionalProperties: true - type: object + $ref: '#/definitions/models.SnapshotMigrationResponse' "500": description: Server error schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.SnapshotMigrationResponse' summary: Migrate snapshot registry tags: - snapshots @@ -647,14 +680,11 @@ paths: "200": description: Regeneration summary schema: - additionalProperties: true - type: object + $ref: '#/definitions/models.SnapshotRegenerateReportsResponse' "500": description: Server error schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.ErrorResponse' summary: Regenerate hourly snapshot reports tags: - snapshots @@ -668,9 +698,7 @@ paths: "200": description: OK schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.SnapshotRepairResponse' summary: Repair daily summaries tags: - snapshots @@ -684,9 +712,7 @@ paths: "200": description: OK schema: - additionalProperties: - type: string - type: object + $ref: '#/definitions/models.SnapshotRepairSuiteResponse' summary: Run full snapshot repair suite tags: - snapshots