@oneuptime/common 11.0.0 → 11.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. package/Models/DatabaseModels/Alert.ts +110 -0
  2. package/Models/DatabaseModels/CephCluster.ts +964 -0
  3. package/Models/DatabaseModels/CephClusterLabelRule.ts +514 -0
  4. package/Models/DatabaseModels/CephClusterOwnerRule.ts +596 -0
  5. package/Models/DatabaseModels/CephClusterOwnerTeam.ts +487 -0
  6. package/Models/DatabaseModels/CephClusterOwnerUser.ts +486 -0
  7. package/Models/DatabaseModels/CephResource.ts +809 -0
  8. package/Models/DatabaseModels/Host.ts +64 -0
  9. package/Models/DatabaseModels/Incident.ts +110 -0
  10. package/Models/DatabaseModels/Index.ts +24 -0
  11. package/Models/DatabaseModels/ProxmoxCluster.ts +943 -0
  12. package/Models/DatabaseModels/ProxmoxClusterLabelRule.ts +514 -0
  13. package/Models/DatabaseModels/ProxmoxClusterOwnerRule.ts +596 -0
  14. package/Models/DatabaseModels/ProxmoxClusterOwnerTeam.ts +487 -0
  15. package/Models/DatabaseModels/ProxmoxClusterOwnerUser.ts +486 -0
  16. package/Models/DatabaseModels/ProxmoxResource.ts +726 -0
  17. package/Models/DatabaseModels/ScheduledMaintenance.ts +110 -0
  18. package/Server/API/BillingInvoiceAPI.ts +47 -7
  19. package/Server/API/CephResourceAPI.ts +134 -0
  20. package/Server/API/DashboardAPI.ts +46 -0
  21. package/Server/API/ProjectAPI.ts +15 -0
  22. package/Server/API/ProxmoxResourceAPI.ts +132 -0
  23. package/Server/API/ResellerPlanAPI.ts +17 -0
  24. package/Server/Infrastructure/GlobalCache.ts +8 -2
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.ts +163 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1781600000000-AddProxmoxCephV2Columns.ts +211 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1781600000001-AddProxmoxCephActivityAndRules.ts +590 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1781700000000-AddProxmoxCephV3Columns.ts +64 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  30. package/Server/Infrastructure/Redis.ts +40 -12
  31. package/Server/Services/AnalyticsDatabaseService.ts +1 -1
  32. package/Server/Services/BillingService.ts +109 -21
  33. package/Server/Services/CephClusterLabelRuleEngineService.ts +200 -0
  34. package/Server/Services/CephClusterLabelRuleService.ts +14 -0
  35. package/Server/Services/CephClusterOwnerRuleEngineService.ts +218 -0
  36. package/Server/Services/CephClusterOwnerRuleService.ts +14 -0
  37. package/Server/Services/CephClusterOwnerTeamService.ts +10 -0
  38. package/Server/Services/CephClusterOwnerUserService.ts +10 -0
  39. package/Server/Services/CephClusterService.ts +401 -0
  40. package/Server/Services/CephResourceService.ts +383 -0
  41. package/Server/Services/CloudResourceService.ts +11 -3
  42. package/Server/Services/DockerHostService.ts +11 -3
  43. package/Server/Services/ExceptionAggregationService.ts +2 -0
  44. package/Server/Services/HostService.ts +11 -3
  45. package/Server/Services/Index.ts +24 -0
  46. package/Server/Services/KubernetesClusterService.ts +11 -3
  47. package/Server/Services/LogAggregationService.ts +2 -0
  48. package/Server/Services/MetricAggregationService.ts +2 -0
  49. package/Server/Services/OpenTelemetryIngestService.ts +36 -0
  50. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +204 -0
  51. package/Server/Services/ProxmoxClusterLabelRuleService.ts +14 -0
  52. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +222 -0
  53. package/Server/Services/ProxmoxClusterOwnerRuleService.ts +14 -0
  54. package/Server/Services/ProxmoxClusterOwnerTeamService.ts +10 -0
  55. package/Server/Services/ProxmoxClusterOwnerUserService.ts +10 -0
  56. package/Server/Services/ProxmoxClusterService.ts +382 -0
  57. package/Server/Services/ProxmoxResourceService.ts +404 -0
  58. package/Server/Services/RumApplicationService.ts +11 -3
  59. package/Server/Services/ServerlessFunctionService.ts +11 -3
  60. package/Server/Services/TelemetryUsageBillingService.ts +41 -3
  61. package/Server/Services/TraceAggregationService.ts +2 -0
  62. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +8 -23
  63. package/Server/Utils/Monitor/MonitorAlert.ts +45 -0
  64. package/Server/Utils/Monitor/MonitorClusterContext.ts +129 -0
  65. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +344 -4
  66. package/Server/Utils/Monitor/MonitorIncident.ts +130 -7
  67. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +39 -6
  68. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +3 -1
  69. package/Server/Utils/Monitor/SeriesResourceLabels.ts +33 -0
  70. package/Server/Utils/Profiling.ts +37 -2
  71. package/Server/Utils/Telemetry/EntityRegistry.ts +4 -0
  72. package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +1096 -0
  73. package/Server/Utils/Telemetry/TelemetryEntity.ts +85 -0
  74. package/Server/Utils/Telemetry.ts +8 -19
  75. package/Tests/Server/API/BillingInvoiceAPI.test.ts +194 -0
  76. package/Tests/Server/API/ProjectAPI.test.ts +91 -0
  77. package/Tests/Server/API/ResellerPlanAPI.test.ts +207 -0
  78. package/Tests/Server/Infrastructure/GlobalCache.test.ts +100 -0
  79. package/Tests/Server/Services/BillingService.test.ts +323 -0
  80. package/Tests/Server/Services/CephResourceService.test.ts +264 -0
  81. package/Tests/Server/Services/ProxmoxResourceService.test.ts +326 -0
  82. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +322 -0
  83. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +13 -0
  84. package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +879 -0
  85. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +196 -0
  86. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +1231 -0
  87. package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +732 -0
  88. package/Tests/Utils/ModelImportExport.test.ts +366 -0
  89. package/Tests/Utils/Telemetry/EntityRelationship.test.ts +49 -0
  90. package/Tests/Utils/Telemetry/HeartbeatAvailability.test.ts +423 -0
  91. package/Types/BaseDatabase/AggregationIntervalUtil.ts +74 -0
  92. package/Types/Dashboard/DashboardComponentType.ts +4 -0
  93. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
  94. package/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.ts +15 -0
  95. package/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.ts +14 -0
  96. package/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.ts +17 -0
  97. package/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.ts +16 -0
  98. package/Types/Dashboard/DashboardTemplates.ts +446 -0
  99. package/Types/Icon/IconProp.ts +2 -0
  100. package/Types/Monitor/CephAlertTemplates.ts +1647 -0
  101. package/Types/Monitor/CephMetricCatalog.ts +409 -0
  102. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +44 -0
  103. package/Types/Monitor/MonitorStep.ts +64 -0
  104. package/Types/Monitor/MonitorStepCephMonitor.ts +57 -0
  105. package/Types/Monitor/MonitorStepProxmoxMonitor.ts +81 -0
  106. package/Types/Monitor/MonitorType.ts +29 -1
  107. package/Types/Monitor/ProxmoxAlertTemplates.ts +899 -0
  108. package/Types/Monitor/ProxmoxMetricCatalog.ts +382 -0
  109. package/Types/Permission.ts +464 -0
  110. package/Types/Telemetry/EntityType.ts +11 -0
  111. package/Types/Telemetry/ServiceType.ts +2 -0
  112. package/UI/Components/Icon/Icon.tsx +84 -0
  113. package/UI/Components/ImportExport/ExportModelCard.tsx +90 -0
  114. package/UI/Components/ImportExport/ImportModelsModal.tsx +239 -0
  115. package/UI/Components/ModelTable/ModelTable.tsx +294 -143
  116. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +9 -5
  117. package/UI/Utils/ModelImportExport.ts +207 -0
  118. package/UI/Utils/Telemetry/Telemetry.ts +16 -21
  119. package/UI/Utils/TelemetryService.ts +7 -3
  120. package/Utils/Dashboard/Components/DashboardCephOsdListComponent.ts +63 -0
  121. package/Utils/Dashboard/Components/DashboardCephPoolListComponent.ts +32 -0
  122. package/Utils/Dashboard/Components/DashboardCephResourceListShared.ts +61 -0
  123. package/Utils/Dashboard/Components/DashboardProxmoxGuestListComponent.ts +69 -0
  124. package/Utils/Dashboard/Components/DashboardProxmoxNodeListComponent.ts +55 -0
  125. package/Utils/Dashboard/Components/DashboardProxmoxResourceListShared.ts +61 -0
  126. package/Utils/Dashboard/Components/Index.ts +28 -0
  127. package/Utils/ModelImportExport.ts +369 -0
  128. package/Utils/Telemetry/EntityKey.ts +35 -0
  129. package/Utils/Telemetry/EntityRelationship.ts +6 -0
  130. package/Utils/Telemetry/HeartbeatAvailability.ts +262 -0
  131. package/build/dist/Models/DatabaseModels/Alert.js +108 -0
  132. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  133. package/build/dist/Models/DatabaseModels/CephCluster.js +992 -0
  134. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -0
  135. package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js +522 -0
  136. package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js.map +1 -0
  137. package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js +603 -0
  138. package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js.map +1 -0
  139. package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js +503 -0
  140. package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js.map +1 -0
  141. package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js +502 -0
  142. package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js.map +1 -0
  143. package/build/dist/Models/DatabaseModels/CephResource.js +846 -0
  144. package/build/dist/Models/DatabaseModels/CephResource.js.map +1 -0
  145. package/build/dist/Models/DatabaseModels/Host.js +63 -0
  146. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  147. package/build/dist/Models/DatabaseModels/Incident.js +108 -0
  148. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  149. package/build/dist/Models/DatabaseModels/Index.js +24 -0
  150. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  151. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +967 -0
  152. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -0
  153. package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js +522 -0
  154. package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js.map +1 -0
  155. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js +603 -0
  156. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js.map +1 -0
  157. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js +503 -0
  158. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js.map +1 -0
  159. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js +502 -0
  160. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js.map +1 -0
  161. package/build/dist/Models/DatabaseModels/ProxmoxResource.js +761 -0
  162. package/build/dist/Models/DatabaseModels/ProxmoxResource.js.map +1 -0
  163. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +108 -0
  164. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  165. package/build/dist/Server/API/BillingInvoiceAPI.js +35 -5
  166. package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
  167. package/build/dist/Server/API/CephResourceAPI.js +98 -0
  168. package/build/dist/Server/API/CephResourceAPI.js.map +1 -0
  169. package/build/dist/Server/API/DashboardAPI.js +46 -0
  170. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  171. package/build/dist/Server/API/ProjectAPI.js +11 -0
  172. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  173. package/build/dist/Server/API/ProxmoxResourceAPI.js +95 -0
  174. package/build/dist/Server/API/ProxmoxResourceAPI.js.map +1 -0
  175. package/build/dist/Server/API/ResellerPlanAPI.js +17 -3
  176. package/build/dist/Server/API/ResellerPlanAPI.js.map +1 -1
  177. package/build/dist/Server/Infrastructure/GlobalCache.js +7 -2
  178. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  179. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.js +76 -0
  180. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.js.map +1 -0
  181. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000000-AddProxmoxCephV2Columns.js +108 -0
  182. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000000-AddProxmoxCephV2Columns.js.map +1 -0
  183. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000001-AddProxmoxCephActivityAndRules.js +253 -0
  184. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000001-AddProxmoxCephActivityAndRules.js.map +1 -0
  185. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781700000000-AddProxmoxCephV3Columns.js +43 -0
  186. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781700000000-AddProxmoxCephV3Columns.js.map +1 -0
  187. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  188. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  189. package/build/dist/Server/Infrastructure/Redis.js +31 -8
  190. package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
  191. package/build/dist/Server/Services/AnalyticsDatabaseService.js +1 -1
  192. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  193. package/build/dist/Server/Services/BillingService.js +85 -23
  194. package/build/dist/Server/Services/BillingService.js.map +1 -1
  195. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +166 -0
  196. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -0
  197. package/build/dist/Server/Services/CephClusterLabelRuleService.js +13 -0
  198. package/build/dist/Server/Services/CephClusterLabelRuleService.js.map +1 -0
  199. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +186 -0
  200. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -0
  201. package/build/dist/Server/Services/CephClusterOwnerRuleService.js +13 -0
  202. package/build/dist/Server/Services/CephClusterOwnerRuleService.js.map +1 -0
  203. package/build/dist/Server/Services/CephClusterOwnerTeamService.js +9 -0
  204. package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -0
  205. package/build/dist/Server/Services/CephClusterOwnerUserService.js +9 -0
  206. package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -0
  207. package/build/dist/Server/Services/CephClusterService.js +353 -0
  208. package/build/dist/Server/Services/CephClusterService.js.map +1 -0
  209. package/build/dist/Server/Services/CephResourceService.js +257 -0
  210. package/build/dist/Server/Services/CephResourceService.js.map +1 -0
  211. package/build/dist/Server/Services/CloudResourceService.js +10 -2
  212. package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
  213. package/build/dist/Server/Services/DockerHostService.js +10 -2
  214. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  215. package/build/dist/Server/Services/ExceptionAggregationService.js +2 -0
  216. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  217. package/build/dist/Server/Services/HostService.js +10 -2
  218. package/build/dist/Server/Services/HostService.js.map +1 -1
  219. package/build/dist/Server/Services/Index.js +24 -0
  220. package/build/dist/Server/Services/Index.js.map +1 -1
  221. package/build/dist/Server/Services/KubernetesClusterService.js +10 -2
  222. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  223. package/build/dist/Server/Services/LogAggregationService.js +2 -0
  224. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  225. package/build/dist/Server/Services/MetricAggregationService.js +2 -0
  226. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  227. package/build/dist/Server/Services/OpenTelemetryIngestService.js +37 -7
  228. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  229. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +166 -0
  230. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -0
  231. package/build/dist/Server/Services/ProxmoxClusterLabelRuleService.js +13 -0
  232. package/build/dist/Server/Services/ProxmoxClusterLabelRuleService.js.map +1 -0
  233. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +186 -0
  234. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -0
  235. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleService.js +13 -0
  236. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleService.js.map +1 -0
  237. package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +9 -0
  238. package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -0
  239. package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +9 -0
  240. package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -0
  241. package/build/dist/Server/Services/ProxmoxClusterService.js +337 -0
  242. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -0
  243. package/build/dist/Server/Services/ProxmoxResourceService.js +285 -0
  244. package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -0
  245. package/build/dist/Server/Services/RumApplicationService.js +10 -2
  246. package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
  247. package/build/dist/Server/Services/ServerlessFunctionService.js +10 -2
  248. package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
  249. package/build/dist/Server/Services/TelemetryUsageBillingService.js +30 -3
  250. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  251. package/build/dist/Server/Services/TraceAggregationService.js +2 -0
  252. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  253. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +8 -25
  254. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  255. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +36 -0
  256. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  257. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +90 -0
  258. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +1 -0
  259. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +228 -4
  260. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  261. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +103 -8
  262. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  263. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +23 -6
  264. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  265. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +3 -1
  266. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  267. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +23 -0
  268. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  269. package/build/dist/Server/Utils/Profiling.js +24 -3
  270. package/build/dist/Server/Utils/Profiling.js.map +1 -1
  271. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -0
  272. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  273. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +854 -0
  274. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -0
  275. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +62 -0
  276. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  277. package/build/dist/Server/Utils/Telemetry.js +8 -10
  278. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  279. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +69 -0
  280. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -0
  281. package/build/dist/Types/Dashboard/DashboardComponentType.js +4 -0
  282. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  283. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
  284. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  285. package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.js +2 -0
  286. package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.js.map +1 -0
  287. package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.js +2 -0
  288. package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.js.map +1 -0
  289. package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.js +2 -0
  290. package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.js.map +1 -0
  291. package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.js +2 -0
  292. package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.js.map +1 -0
  293. package/build/dist/Types/Dashboard/DashboardTemplates.js +394 -0
  294. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  295. package/build/dist/Types/Icon/IconProp.js +2 -0
  296. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  297. package/build/dist/Types/Monitor/CephAlertTemplates.js +1379 -0
  298. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -0
  299. package/build/dist/Types/Monitor/CephMetricCatalog.js +353 -0
  300. package/build/dist/Types/Monitor/CephMetricCatalog.js.map +1 -0
  301. package/build/dist/Types/Monitor/MonitorStep.js +46 -0
  302. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  303. package/build/dist/Types/Monitor/MonitorStepCephMonitor.js +34 -0
  304. package/build/dist/Types/Monitor/MonitorStepCephMonitor.js.map +1 -0
  305. package/build/dist/Types/Monitor/MonitorStepProxmoxMonitor.js +36 -0
  306. package/build/dist/Types/Monitor/MonitorStepProxmoxMonitor.js.map +1 -0
  307. package/build/dist/Types/Monitor/MonitorType.js +27 -1
  308. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  309. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +743 -0
  310. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -0
  311. package/build/dist/Types/Monitor/ProxmoxMetricCatalog.js +320 -0
  312. package/build/dist/Types/Monitor/ProxmoxMetricCatalog.js.map +1 -0
  313. package/build/dist/Types/Permission.js +408 -0
  314. package/build/dist/Types/Permission.js.map +1 -1
  315. package/build/dist/Types/Telemetry/EntityType.js +11 -0
  316. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  317. package/build/dist/Types/Telemetry/ServiceType.js +2 -0
  318. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  319. package/build/dist/UI/Components/Icon/Icon.js +33 -0
  320. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  321. package/build/dist/UI/Components/ImportExport/ExportModelCard.js +50 -0
  322. package/build/dist/UI/Components/ImportExport/ExportModelCard.js.map +1 -0
  323. package/build/dist/UI/Components/ImportExport/ImportModelsModal.js +115 -0
  324. package/build/dist/UI/Components/ImportExport/ImportModelsModal.js.map +1 -0
  325. package/build/dist/UI/Components/ModelTable/ModelTable.js +166 -74
  326. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  327. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +5 -1
  328. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  329. package/build/dist/UI/Utils/ModelImportExport.js +142 -0
  330. package/build/dist/UI/Utils/ModelImportExport.js.map +1 -0
  331. package/build/dist/UI/Utils/Telemetry/Telemetry.js +11 -10
  332. package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
  333. package/build/dist/UI/Utils/TelemetryService.js +5 -2
  334. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  335. package/build/dist/Utils/Dashboard/Components/DashboardCephOsdListComponent.js +50 -0
  336. package/build/dist/Utils/Dashboard/Components/DashboardCephOsdListComponent.js.map +1 -0
  337. package/build/dist/Utils/Dashboard/Components/DashboardCephPoolListComponent.js +27 -0
  338. package/build/dist/Utils/Dashboard/Components/DashboardCephPoolListComponent.js.map +1 -0
  339. package/build/dist/Utils/Dashboard/Components/DashboardCephResourceListShared.js +46 -0
  340. package/build/dist/Utils/Dashboard/Components/DashboardCephResourceListShared.js.map +1 -0
  341. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxGuestListComponent.js +55 -0
  342. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxGuestListComponent.js.map +1 -0
  343. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxNodeListComponent.js +42 -0
  344. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxNodeListComponent.js.map +1 -0
  345. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxResourceListShared.js +46 -0
  346. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxResourceListShared.js.map +1 -0
  347. package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
  348. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  349. package/build/dist/Utils/ModelImportExport.js +257 -0
  350. package/build/dist/Utils/ModelImportExport.js.map +1 -0
  351. package/build/dist/Utils/Telemetry/EntityKey.js +27 -0
  352. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  353. package/build/dist/Utils/Telemetry/EntityRelationship.js +3 -0
  354. package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
  355. package/build/dist/Utils/Telemetry/HeartbeatAvailability.js +174 -0
  356. package/build/dist/Utils/Telemetry/HeartbeatAvailability.js.map +1 -0
  357. package/package.json +29 -21
@@ -0,0 +1,726 @@
1
+ import ProxmoxCluster from "./ProxmoxCluster";
2
+ import Project from "./Project";
3
+ import User from "./User";
4
+ import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
5
+ import Route from "../../Types/API/Route";
6
+ import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
7
+ import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
8
+ import ColumnLength from "../../Types/Database/ColumnLength";
9
+ import ColumnType from "../../Types/Database/ColumnType";
10
+ import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
11
+ import TableColumn from "../../Types/Database/TableColumn";
12
+ import TableColumnType from "../../Types/Database/TableColumnType";
13
+ import TableMetadata from "../../Types/Database/TableMetadata";
14
+ import TenantColumn from "../../Types/Database/TenantColumn";
15
+ import IconProp from "../../Types/Icon/IconProp";
16
+ import ObjectID from "../../Types/ObjectID";
17
+ import Permission from "../../Types/Permission";
18
+ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
19
+
20
+ /*
21
+ * ------------------------------------------------------------------
22
+ * ProxmoxResource
23
+ * ------------------------------------------------------------------
24
+ *
25
+ * Inventory snapshot of a single Proxmox VE object (Node, Guest or
26
+ * Storage) in a single cluster. Populated by the OTel metrics ingest
27
+ * path from the pve-exporter scrape stream — identity and status
28
+ * already arrive in every metric batch, so no separate object stream
29
+ * (à la k8sobjects) is needed.
30
+ *
31
+ * `externalId` is the pve-exporter `id` datapoint label verbatim
32
+ * (`node/pve1`, `qemu/100`, `lxc/101`, `storage/local`) — immutable
33
+ * and collision-free within a cluster.
34
+ *
35
+ * Latest-metric delta vs KubernetesResource: pve_cpu_usage_ratio is
36
+ * already a true 0..1 ratio, so latestCpuPercent is just ratio * 100 —
37
+ * no allocatable-denominator cache is needed (unlike K8s
38
+ * cpuCoresToPercent).
39
+ *
40
+ * The list/detail pages read this table instead of groupBy-ing over
41
+ * 24h of ClickHouse metric data. Rows are upserted per scrape and
42
+ * hard-deleted once lastSeenAt falls behind "now - 15min" for clusters
43
+ * that remain connected.
44
+ *
45
+ * Writes go through ProxmoxResourceService under isRoot; users never
46
+ * create/update/delete rows directly.
47
+ *
48
+ * ------------------------------------------------------------------
49
+ */
50
+
51
+ const READ_PERMISSIONS: Array<Permission> = [
52
+ Permission.ProjectOwner,
53
+ Permission.ProjectAdmin,
54
+ Permission.ProjectMember,
55
+ Permission.Viewer,
56
+ Permission.SettingsAdmin,
57
+ Permission.SettingsMember,
58
+ Permission.SettingsViewer,
59
+ Permission.ReadProxmoxCluster,
60
+ ];
61
+
62
+ @TenantColumn("projectId")
63
+ @TableAccessControl({
64
+ create: [],
65
+ read: READ_PERMISSIONS,
66
+ update: [],
67
+ delete: [],
68
+ })
69
+ @CrudApiEndpoint(new Route("/proxmox-resource"))
70
+ @TableMetadata({
71
+ tableName: "ProxmoxResource",
72
+ singularName: "Proxmox Resource",
73
+ pluralName: "Proxmox Resources",
74
+ icon: IconProp.Cube,
75
+ tableDescription:
76
+ "Snapshot of a Proxmox VE object (node, guest or storage) as last reported by the Proxmox agent. Populated by the telemetry ingest pipeline; not user-editable.",
77
+ })
78
+ @Index(["projectId", "proxmoxClusterId", "kind", "externalId"], {
79
+ unique: true,
80
+ })
81
+ @Entity({
82
+ name: "ProxmoxResource",
83
+ })
84
+ export default class ProxmoxResource extends BaseModel {
85
+ @ColumnAccessControl({
86
+ create: [],
87
+ read: READ_PERMISSIONS,
88
+ update: [],
89
+ })
90
+ @TableColumn({
91
+ manyToOneRelationColumn: "projectId",
92
+ type: TableColumnType.Entity,
93
+ modelType: Project,
94
+ title: "Project",
95
+ description: "Relation to Project this resource belongs to.",
96
+ })
97
+ @ManyToOne(
98
+ () => {
99
+ return Project;
100
+ },
101
+ {
102
+ eager: false,
103
+ nullable: true,
104
+ onDelete: "CASCADE",
105
+ orphanedRowAction: "nullify",
106
+ },
107
+ )
108
+ @JoinColumn({ name: "projectId" })
109
+ public project?: Project = undefined;
110
+
111
+ @ColumnAccessControl({
112
+ create: [],
113
+ read: READ_PERMISSIONS,
114
+ update: [],
115
+ })
116
+ @Index()
117
+ @TableColumn({
118
+ type: TableColumnType.ObjectID,
119
+ required: true,
120
+ canReadOnRelationQuery: true,
121
+ title: "Project ID",
122
+ description: "ID of the Project this resource belongs to.",
123
+ })
124
+ @Column({
125
+ type: ColumnType.ObjectID,
126
+ nullable: false,
127
+ transformer: ObjectID.getDatabaseTransformer(),
128
+ })
129
+ public projectId?: ObjectID = undefined;
130
+
131
+ @ColumnAccessControl({
132
+ create: [],
133
+ read: READ_PERMISSIONS,
134
+ update: [],
135
+ })
136
+ @TableColumn({
137
+ manyToOneRelationColumn: "proxmoxClusterId",
138
+ type: TableColumnType.Entity,
139
+ modelType: ProxmoxCluster,
140
+ title: "Proxmox Cluster",
141
+ description: "Cluster this resource lives in.",
142
+ })
143
+ @ManyToOne(
144
+ () => {
145
+ return ProxmoxCluster;
146
+ },
147
+ {
148
+ eager: false,
149
+ nullable: true,
150
+ onDelete: "CASCADE",
151
+ orphanedRowAction: "nullify",
152
+ },
153
+ )
154
+ @JoinColumn({ name: "proxmoxClusterId" })
155
+ public proxmoxCluster?: ProxmoxCluster = undefined;
156
+
157
+ @ColumnAccessControl({
158
+ create: [],
159
+ read: READ_PERMISSIONS,
160
+ update: [],
161
+ })
162
+ @Index()
163
+ @TableColumn({
164
+ type: TableColumnType.ObjectID,
165
+ required: true,
166
+ canReadOnRelationQuery: true,
167
+ title: "Proxmox Cluster ID",
168
+ description: "ID of the Proxmox Cluster this resource lives in.",
169
+ })
170
+ @Column({
171
+ type: ColumnType.ObjectID,
172
+ nullable: false,
173
+ transformer: ObjectID.getDatabaseTransformer(),
174
+ })
175
+ public proxmoxClusterId?: ObjectID = undefined;
176
+
177
+ @ColumnAccessControl({
178
+ create: [],
179
+ read: READ_PERMISSIONS,
180
+ update: [],
181
+ })
182
+ @TableColumn({
183
+ required: true,
184
+ type: TableColumnType.ShortText,
185
+ canReadOnRelationQuery: true,
186
+ title: "Kind",
187
+ description:
188
+ "Proxmox resource kind in singular PascalCase: Node, Guest or Storage.",
189
+ })
190
+ @Column({
191
+ nullable: false,
192
+ type: ColumnType.ShortText,
193
+ length: ColumnLength.ShortText,
194
+ })
195
+ public kind?: string = undefined;
196
+
197
+ @ColumnAccessControl({
198
+ create: [],
199
+ read: READ_PERMISSIONS,
200
+ update: [],
201
+ })
202
+ @TableColumn({
203
+ required: true,
204
+ type: TableColumnType.ShortText,
205
+ canReadOnRelationQuery: true,
206
+ title: "External ID",
207
+ description:
208
+ "The pve-exporter `id` datapoint label verbatim (e.g. node/pve1, qemu/100, lxc/101, storage/local). Immutable and collision-free within a cluster; also the detail-route param.",
209
+ })
210
+ @Column({
211
+ nullable: false,
212
+ type: ColumnType.ShortText,
213
+ length: ColumnLength.ShortText,
214
+ })
215
+ public externalId?: string = undefined;
216
+
217
+ @ColumnAccessControl({
218
+ create: [],
219
+ read: READ_PERMISSIONS,
220
+ update: [],
221
+ })
222
+ @TableColumn({
223
+ required: false,
224
+ type: TableColumnType.ShortText,
225
+ canReadOnRelationQuery: true,
226
+ title: "Name",
227
+ description:
228
+ "Human-friendly name from the pve_node_info / pve_guest_info `name` label or the pve_storage_info `storage` label. Null until the matching info series is scraped.",
229
+ })
230
+ @Column({
231
+ nullable: true,
232
+ type: ColumnType.ShortText,
233
+ length: ColumnLength.ShortText,
234
+ })
235
+ public name?: string = undefined;
236
+
237
+ @ColumnAccessControl({
238
+ create: [],
239
+ read: READ_PERMISSIONS,
240
+ update: [],
241
+ })
242
+ @TableColumn({
243
+ required: false,
244
+ type: TableColumnType.Number,
245
+ canReadOnRelationQuery: true,
246
+ title: "VMID",
247
+ description:
248
+ "Proxmox VMID for Guest kinds (the numeric part of qemu/100). Null for Node and Storage kinds.",
249
+ })
250
+ @Column({
251
+ nullable: true,
252
+ type: ColumnType.Number,
253
+ })
254
+ public vmid?: number = undefined;
255
+
256
+ @ColumnAccessControl({
257
+ create: [],
258
+ read: READ_PERMISSIONS,
259
+ update: [],
260
+ })
261
+ @TableColumn({
262
+ required: false,
263
+ type: TableColumnType.ShortText,
264
+ canReadOnRelationQuery: true,
265
+ title: "Guest Type",
266
+ description:
267
+ "Guest virtualization type: qemu or lxc. Null for non-Guest kinds.",
268
+ })
269
+ @Column({
270
+ nullable: true,
271
+ type: ColumnType.ShortText,
272
+ length: ColumnLength.ShortText,
273
+ })
274
+ public guestType?: string = undefined;
275
+
276
+ @ColumnAccessControl({
277
+ create: [],
278
+ read: READ_PERMISSIONS,
279
+ update: [],
280
+ })
281
+ @TableColumn({
282
+ required: false,
283
+ type: TableColumnType.ShortText,
284
+ canReadOnRelationQuery: true,
285
+ title: "Parent Node Name",
286
+ description:
287
+ "The `node` label — the cluster node this guest or storage belongs to. Null for Node kinds.",
288
+ })
289
+ @Column({
290
+ nullable: true,
291
+ type: ColumnType.ShortText,
292
+ length: ColumnLength.ShortText,
293
+ })
294
+ public parentNodeName?: string = undefined;
295
+
296
+ @ColumnAccessControl({
297
+ create: [],
298
+ read: READ_PERMISSIONS,
299
+ update: [],
300
+ })
301
+ @TableColumn({
302
+ required: false,
303
+ type: TableColumnType.Boolean,
304
+ canReadOnRelationQuery: true,
305
+ title: "Is Up",
306
+ description:
307
+ "True when the latest pve_up value for this resource is 1 (node online / guest running / storage available).",
308
+ })
309
+ @Column({
310
+ nullable: true,
311
+ type: ColumnType.Boolean,
312
+ })
313
+ public isUp?: boolean = undefined;
314
+
315
+ @ColumnAccessControl({
316
+ create: [],
317
+ read: READ_PERMISSIONS,
318
+ update: [],
319
+ })
320
+ @TableColumn({
321
+ required: false,
322
+ type: TableColumnType.ShortText,
323
+ canReadOnRelationQuery: true,
324
+ title: "HA State",
325
+ description:
326
+ "Current HA state — the `state` label of the pve_ha_state enum-series whose value is 1 (e.g. started, stopped, error, fence). Null when the resource is not HA-managed.",
327
+ })
328
+ @Column({
329
+ nullable: true,
330
+ type: ColumnType.ShortText,
331
+ length: ColumnLength.ShortText,
332
+ })
333
+ public haState?: string = undefined;
334
+
335
+ @ColumnAccessControl({
336
+ create: [],
337
+ read: READ_PERMISSIONS,
338
+ update: [],
339
+ })
340
+ @TableColumn({
341
+ required: false,
342
+ type: TableColumnType.Boolean,
343
+ canReadOnRelationQuery: true,
344
+ title: "On Boot",
345
+ description:
346
+ "True when pve_onboot_status == 1 (guest configured to start on node boot). Null for non-Guest kinds.",
347
+ })
348
+ @Column({
349
+ nullable: true,
350
+ type: ColumnType.Boolean,
351
+ })
352
+ public onboot?: boolean = undefined;
353
+
354
+ @ColumnAccessControl({
355
+ create: [],
356
+ read: READ_PERMISSIONS,
357
+ update: [],
358
+ })
359
+ @TableColumn({
360
+ required: false,
361
+ type: TableColumnType.Boolean,
362
+ canReadOnRelationQuery: true,
363
+ title: "Backed Up",
364
+ description:
365
+ "True when this guest is covered by at least one backup job. Derived from the cluster-level backup-info collector: a pve_not_backed_up_info series carrying this guest's id means NOT covered. NULL for non-Guest kinds and until the collector reports. Coverage by a job is NOT the same as recent/successful backups.",
366
+ })
367
+ @Column({
368
+ nullable: true,
369
+ type: ColumnType.Boolean,
370
+ })
371
+ public isBackedUp?: boolean = undefined;
372
+
373
+ @ColumnAccessControl({
374
+ create: [],
375
+ read: READ_PERMISSIONS,
376
+ update: [],
377
+ })
378
+ @TableColumn({
379
+ required: false,
380
+ type: TableColumnType.Number,
381
+ canReadOnRelationQuery: true,
382
+ title: "Uptime Seconds",
383
+ description:
384
+ "Latest pve_uptime_seconds value for this node or guest. Null for Storage kinds.",
385
+ })
386
+ @Column({
387
+ nullable: true,
388
+ type: ColumnType.Number,
389
+ })
390
+ public uptimeSeconds?: number = undefined;
391
+
392
+ @ColumnAccessControl({
393
+ create: [],
394
+ read: READ_PERMISSIONS,
395
+ update: [],
396
+ })
397
+ @TableColumn({
398
+ required: false,
399
+ type: TableColumnType.Number,
400
+ canReadOnRelationQuery: true,
401
+ title: "Latest CPU Percent",
402
+ description:
403
+ "Most recent CPU utilization percent (pve_cpu_usage_ratio * 100 — already a true ratio; no allocatable-denominator cache needed, unlike K8s). Stored as decimal so sub-percent precision survives the round trip. Null until the first metric arrives.",
404
+ })
405
+ @Column({
406
+ nullable: true,
407
+ type: ColumnType.Decimal,
408
+ transformer: {
409
+ to: (value: number | null | undefined): number | null => {
410
+ if (value === null || value === undefined) {
411
+ return null;
412
+ }
413
+ return value;
414
+ },
415
+ from: (value: string | number | null | undefined): number | null => {
416
+ if (value === null || value === undefined) {
417
+ return null;
418
+ }
419
+ if (typeof value === "number") {
420
+ return value;
421
+ }
422
+ const parsed: number = parseFloat(value);
423
+ return isNaN(parsed) ? null : parsed;
424
+ },
425
+ },
426
+ })
427
+ public latestCpuPercent?: number = undefined;
428
+
429
+ @ColumnAccessControl({
430
+ create: [],
431
+ read: READ_PERMISSIONS,
432
+ update: [],
433
+ })
434
+ @TableColumn({
435
+ required: false,
436
+ type: TableColumnType.BigPositiveNumber,
437
+ canReadOnRelationQuery: true,
438
+ title: "Latest Memory Bytes",
439
+ description:
440
+ "Most recent memory usage (pve_memory_usage_bytes). Stored as bigint so values past 2 GiB don't overflow.",
441
+ })
442
+ @Column({
443
+ nullable: true,
444
+ type: ColumnType.BigPositiveNumber,
445
+ transformer: {
446
+ to: (value: number | null | undefined): string | null => {
447
+ if (value === null || value === undefined) {
448
+ return null;
449
+ }
450
+ return Math.trunc(value).toString();
451
+ },
452
+ from: (value: string | null | undefined): number | null => {
453
+ if (value === null || value === undefined) {
454
+ return null;
455
+ }
456
+ const parsed: number = parseInt(value, 10);
457
+ return isNaN(parsed) ? null : parsed;
458
+ },
459
+ },
460
+ })
461
+ public latestMemoryBytes?: number = undefined;
462
+
463
+ @ColumnAccessControl({
464
+ create: [],
465
+ read: READ_PERMISSIONS,
466
+ update: [],
467
+ })
468
+ @TableColumn({
469
+ required: false,
470
+ type: TableColumnType.BigPositiveNumber,
471
+ canReadOnRelationQuery: true,
472
+ title: "Max Memory Bytes",
473
+ description:
474
+ "Total memory available to this node or guest (pve_memory_size_bytes). The denominator for the memory usage bar.",
475
+ })
476
+ @Column({
477
+ nullable: true,
478
+ type: ColumnType.BigPositiveNumber,
479
+ transformer: {
480
+ to: (value: number | null | undefined): string | null => {
481
+ if (value === null || value === undefined) {
482
+ return null;
483
+ }
484
+ return Math.trunc(value).toString();
485
+ },
486
+ from: (value: string | null | undefined): number | null => {
487
+ if (value === null || value === undefined) {
488
+ return null;
489
+ }
490
+ const parsed: number = parseInt(value, 10);
491
+ return isNaN(parsed) ? null : parsed;
492
+ },
493
+ },
494
+ })
495
+ public maxMemoryBytes?: number = undefined;
496
+
497
+ @ColumnAccessControl({
498
+ create: [],
499
+ read: READ_PERMISSIONS,
500
+ update: [],
501
+ })
502
+ @TableColumn({
503
+ required: false,
504
+ type: TableColumnType.Number,
505
+ canReadOnRelationQuery: true,
506
+ title: "Latest Memory Percent",
507
+ description:
508
+ "Most recent memory usage as a percent of maxMemoryBytes. Stored as decimal — mirrors latestCpuPercent — so list views can sort/filter without dividing bigints client-side.",
509
+ })
510
+ @Column({
511
+ nullable: true,
512
+ type: ColumnType.Decimal,
513
+ transformer: {
514
+ to: (value: number | null | undefined): number | null => {
515
+ if (value === null || value === undefined) {
516
+ return null;
517
+ }
518
+ return value;
519
+ },
520
+ from: (value: string | number | null | undefined): number | null => {
521
+ if (value === null || value === undefined) {
522
+ return null;
523
+ }
524
+ if (typeof value === "number") {
525
+ return value;
526
+ }
527
+ const parsed: number = parseFloat(value);
528
+ return isNaN(parsed) ? null : parsed;
529
+ },
530
+ },
531
+ })
532
+ public latestMemoryPercent?: number = undefined;
533
+
534
+ @ColumnAccessControl({
535
+ create: [],
536
+ read: READ_PERMISSIONS,
537
+ update: [],
538
+ })
539
+ @TableColumn({
540
+ required: false,
541
+ type: TableColumnType.BigPositiveNumber,
542
+ canReadOnRelationQuery: true,
543
+ title: "Latest Disk Bytes",
544
+ description:
545
+ "Most recent disk usage (pve_disk_usage_bytes). NULL for qemu guests without the QEMU guest agent — render N/A, never 0.",
546
+ })
547
+ @Column({
548
+ nullable: true,
549
+ type: ColumnType.BigPositiveNumber,
550
+ transformer: {
551
+ to: (value: number | null | undefined): string | null => {
552
+ if (value === null || value === undefined) {
553
+ return null;
554
+ }
555
+ return Math.trunc(value).toString();
556
+ },
557
+ from: (value: string | null | undefined): number | null => {
558
+ if (value === null || value === undefined) {
559
+ return null;
560
+ }
561
+ const parsed: number = parseInt(value, 10);
562
+ return isNaN(parsed) ? null : parsed;
563
+ },
564
+ },
565
+ })
566
+ public latestDiskBytes?: number = undefined;
567
+
568
+ @ColumnAccessControl({
569
+ create: [],
570
+ read: READ_PERMISSIONS,
571
+ update: [],
572
+ })
573
+ @TableColumn({
574
+ required: false,
575
+ type: TableColumnType.BigPositiveNumber,
576
+ canReadOnRelationQuery: true,
577
+ title: "Max Disk Bytes",
578
+ description:
579
+ "Total disk size (pve_disk_size_bytes). The denominator for the disk/storage usage bar. NULL for qemu guests without the QEMU guest agent.",
580
+ })
581
+ @Column({
582
+ nullable: true,
583
+ type: ColumnType.BigPositiveNumber,
584
+ transformer: {
585
+ to: (value: number | null | undefined): string | null => {
586
+ if (value === null || value === undefined) {
587
+ return null;
588
+ }
589
+ return Math.trunc(value).toString();
590
+ },
591
+ from: (value: string | null | undefined): number | null => {
592
+ if (value === null || value === undefined) {
593
+ return null;
594
+ }
595
+ const parsed: number = parseInt(value, 10);
596
+ return isNaN(parsed) ? null : parsed;
597
+ },
598
+ },
599
+ })
600
+ public maxDiskBytes?: number = undefined;
601
+
602
+ @ColumnAccessControl({
603
+ create: [],
604
+ read: READ_PERMISSIONS,
605
+ update: [],
606
+ })
607
+ @TableColumn({
608
+ required: false,
609
+ type: TableColumnType.Date,
610
+ canReadOnRelationQuery: true,
611
+ title: "Metrics Updated At",
612
+ description:
613
+ "Observed timestamp of the latest metric point. Acts as the monotonic guard for metric updates and the cutoff for staleness rendering.",
614
+ })
615
+ @Column({
616
+ nullable: true,
617
+ type: ColumnType.Date,
618
+ })
619
+ public metricsUpdatedAt?: Date = undefined;
620
+
621
+ @ColumnAccessControl({
622
+ create: [],
623
+ read: READ_PERMISSIONS,
624
+ update: [],
625
+ })
626
+ @TableColumn({
627
+ required: true,
628
+ type: TableColumnType.Date,
629
+ canReadOnRelationQuery: true,
630
+ title: "Last Seen At",
631
+ description:
632
+ "Agent-observed timestamp of the most recent scrape containing this resource. Also acts as the monotonic guard for upserts.",
633
+ })
634
+ @Column({
635
+ nullable: false,
636
+ type: ColumnType.Date,
637
+ })
638
+ public lastSeenAt?: Date = undefined;
639
+
640
+ @ColumnAccessControl({
641
+ create: [],
642
+ read: READ_PERMISSIONS,
643
+ update: [],
644
+ })
645
+ @TableColumn({
646
+ manyToOneRelationColumn: "createdByUserId",
647
+ type: TableColumnType.Entity,
648
+ modelType: User,
649
+ title: "Created By User",
650
+ description:
651
+ "Not user-facing; ingest writes as isRoot so this stays null in practice.",
652
+ })
653
+ @ManyToOne(
654
+ () => {
655
+ return User;
656
+ },
657
+ {
658
+ eager: false,
659
+ nullable: true,
660
+ onDelete: "SET NULL",
661
+ orphanedRowAction: "nullify",
662
+ },
663
+ )
664
+ @JoinColumn({ name: "createdByUserId" })
665
+ public createdByUser?: User = undefined;
666
+
667
+ @ColumnAccessControl({
668
+ create: [],
669
+ read: READ_PERMISSIONS,
670
+ update: [],
671
+ })
672
+ @TableColumn({
673
+ type: TableColumnType.ObjectID,
674
+ title: "Created By User ID",
675
+ description: "ID of the user who created this row.",
676
+ })
677
+ @Column({
678
+ type: ColumnType.ObjectID,
679
+ nullable: true,
680
+ transformer: ObjectID.getDatabaseTransformer(),
681
+ })
682
+ public createdByUserId?: ObjectID = undefined;
683
+
684
+ @ColumnAccessControl({
685
+ create: [],
686
+ read: READ_PERMISSIONS,
687
+ update: [],
688
+ })
689
+ @TableColumn({
690
+ manyToOneRelationColumn: "deletedByUserId",
691
+ type: TableColumnType.Entity,
692
+ modelType: User,
693
+ title: "Deleted By User",
694
+ description: "Relation to the user who deleted this row.",
695
+ })
696
+ @ManyToOne(
697
+ () => {
698
+ return User;
699
+ },
700
+ {
701
+ eager: false,
702
+ nullable: true,
703
+ onDelete: "SET NULL",
704
+ orphanedRowAction: "nullify",
705
+ },
706
+ )
707
+ @JoinColumn({ name: "deletedByUserId" })
708
+ public deletedByUser?: User = undefined;
709
+
710
+ @ColumnAccessControl({
711
+ create: [],
712
+ read: READ_PERMISSIONS,
713
+ update: [],
714
+ })
715
+ @TableColumn({
716
+ type: TableColumnType.ObjectID,
717
+ title: "Deleted By User ID",
718
+ description: "ID of the user who deleted this row.",
719
+ })
720
+ @Column({
721
+ type: ColumnType.ObjectID,
722
+ nullable: true,
723
+ transformer: ObjectID.getDatabaseTransformer(),
724
+ })
725
+ public deletedByUserId?: ObjectID = undefined;
726
+ }