@oneuptime/common 11.0.2 → 11.0.4

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 (498) hide show
  1. package/Models/DatabaseModels/Alert.ts +166 -0
  2. package/Models/DatabaseModels/AlertLabelRule.ts +38 -0
  3. package/Models/DatabaseModels/AlertOwnerRule.ts +38 -0
  4. package/Models/DatabaseModels/DockerSwarmCluster.ts +989 -0
  5. package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +514 -0
  6. package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +596 -0
  7. package/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.ts +487 -0
  8. package/Models/DatabaseModels/DockerSwarmClusterOwnerUser.ts +486 -0
  9. package/Models/DatabaseModels/DockerSwarmResource.ts +750 -0
  10. package/Models/DatabaseModels/GlobalConfig.ts +19 -0
  11. package/Models/DatabaseModels/GlobalOidc.ts +351 -0
  12. package/Models/DatabaseModels/GlobalOidcProject.ts +265 -0
  13. package/Models/DatabaseModels/GlobalSso.ts +312 -0
  14. package/Models/DatabaseModels/GlobalSsoProject.ts +268 -0
  15. package/Models/DatabaseModels/Incident.ts +166 -0
  16. package/Models/DatabaseModels/IncidentLabelRule.ts +38 -0
  17. package/Models/DatabaseModels/IncidentOwnerRule.ts +38 -0
  18. package/Models/DatabaseModels/IncidentTemplate.ts +56 -0
  19. package/Models/DatabaseModels/Index.ts +32 -0
  20. package/Models/DatabaseModels/PodmanHost.ts +859 -0
  21. package/Models/DatabaseModels/PodmanHostLabelRule.ts +514 -0
  22. package/Models/DatabaseModels/PodmanHostOwnerRule.ts +596 -0
  23. package/Models/DatabaseModels/PodmanHostOwnerTeam.ts +487 -0
  24. package/Models/DatabaseModels/PodmanHostOwnerUser.ts +486 -0
  25. package/Models/DatabaseModels/PodmanResource.ts +498 -0
  26. package/Models/DatabaseModels/Project.ts +31 -0
  27. package/Models/DatabaseModels/ScheduledMaintenance.ts +110 -0
  28. package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +38 -0
  29. package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +38 -0
  30. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +56 -0
  31. package/Models/DatabaseModels/StatusPage.ts +82 -0
  32. package/Models/DatabaseModels/TelemetryException.ts +2 -0
  33. package/Server/API/DashboardAPI.ts +89 -0
  34. package/Server/API/DockerSwarmResourceAPI.ts +137 -0
  35. package/Server/API/StatusPageAPI.ts +2 -0
  36. package/Server/API/TelemetryAPI.ts +8 -1
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/1781750000000-MigrationName.ts +3199 -0
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/1782000000000-AddGlobalSsoAndOidc.ts +176 -0
  39. package/Server/Infrastructure/Postgres/SchemaMigrations/1782100000000-AddStatusPageImageAltText.ts +25 -0
  40. package/Server/Infrastructure/Postgres/SchemaMigrations/1782200000000-AddRequireSsoForLoginToGlobalProviders.ts +25 -0
  41. package/Server/Infrastructure/Postgres/SchemaMigrations/1782300000000-MoveRequireSsoForLoginToGlobalConfig.ts +38 -0
  42. package/Server/Infrastructure/Postgres/SchemaMigrations/1782310000000-MigrationName.ts +299 -0
  43. package/Server/Infrastructure/Postgres/SchemaMigrations/1782400000000-RemoveIsTestedFromGlobalSsoAndOidc.ts +21 -0
  44. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  45. package/Server/Middleware/UserAuthorization.ts +113 -42
  46. package/Server/Services/AlertLabelRuleEngineService.ts +29 -0
  47. package/Server/Services/AlertOwnerRuleEngineService.ts +67 -0
  48. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +214 -0
  49. package/Server/Services/DockerSwarmClusterLabelRuleService.ts +14 -0
  50. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +232 -0
  51. package/Server/Services/DockerSwarmClusterOwnerRuleService.ts +14 -0
  52. package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +10 -0
  53. package/Server/Services/DockerSwarmClusterOwnerUserService.ts +10 -0
  54. package/Server/Services/DockerSwarmClusterService.ts +404 -0
  55. package/Server/Services/DockerSwarmResourceService.ts +381 -0
  56. package/Server/Services/ExceptionAggregationService.ts +1 -0
  57. package/Server/Services/GlobalConfigService.ts +50 -0
  58. package/Server/Services/GlobalOidcProjectService.ts +85 -0
  59. package/Server/Services/GlobalOidcService.ts +10 -0
  60. package/Server/Services/GlobalSsoProjectService.ts +85 -0
  61. package/Server/Services/GlobalSsoService.ts +10 -0
  62. package/Server/Services/IncidentLabelRuleEngineService.ts +27 -0
  63. package/Server/Services/IncidentOwnerRuleEngineService.ts +67 -0
  64. package/Server/Services/IncidentService.ts +11 -0
  65. package/Server/Services/Index.ts +22 -0
  66. package/Server/Services/LogAggregationService.ts +1 -0
  67. package/Server/Services/MetricAggregationService.ts +1 -0
  68. package/Server/Services/OpenTelemetryIngestService.ts +37 -0
  69. package/Server/Services/PodmanHostLabelRuleEngineService.ts +198 -0
  70. package/Server/Services/PodmanHostLabelRuleService.ts +14 -0
  71. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +216 -0
  72. package/Server/Services/PodmanHostOwnerRuleService.ts +14 -0
  73. package/Server/Services/PodmanHostOwnerTeamService.ts +10 -0
  74. package/Server/Services/PodmanHostOwnerUserService.ts +10 -0
  75. package/Server/Services/PodmanHostService.ts +368 -0
  76. package/Server/Services/PodmanResourceService.ts +310 -0
  77. package/Server/Services/ProjectService.ts +44 -1
  78. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +29 -0
  79. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +67 -0
  80. package/Server/Services/TelemetryUsageBillingService.ts +18 -0
  81. package/Server/Services/TraceAggregationService.ts +1 -0
  82. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +13 -0
  83. package/Server/Utils/Cookie.ts +39 -5
  84. package/Server/Utils/JsonWebToken.ts +7 -0
  85. package/Server/Utils/Monitor/MonitorAlert.ts +10 -0
  86. package/Server/Utils/Monitor/MonitorClusterContext.ts +35 -6
  87. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +306 -0
  88. package/Server/Utils/Monitor/MonitorIncident.ts +45 -0
  89. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +17 -0
  90. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +3 -0
  91. package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
  92. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +49 -0
  93. package/Server/Utils/Telemetry/Telemetry.ts +10 -0
  94. package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -0
  95. package/Server/Utils/ValidateGlobalProviderProjectTeams.ts +119 -0
  96. package/Tests/Server/Middleware/UserAuthorization.test.ts +51 -13
  97. package/Tests/Server/Middleware/UserAuthorizationSSOProvider.test.ts +163 -0
  98. package/Tests/Server/Utils/CookieSSOToken.test.ts +130 -0
  99. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +1 -0
  100. package/Tests/Types/DockerSwarm/DockerSwarmInventoryExtractor.test.ts +667 -0
  101. package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +528 -0
  102. package/Types/Dashboard/DashboardComponentType.ts +7 -0
  103. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
  104. package/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.ts +17 -0
  105. package/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.ts +17 -0
  106. package/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.ts +16 -0
  107. package/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.ts +15 -0
  108. package/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.ts +16 -0
  109. package/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.ts +15 -0
  110. package/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.ts +15 -0
  111. package/Types/Dashboard/DashboardTemplates.ts +194 -0
  112. package/Types/DockerSwarm/DockerSwarmInventoryExtractor.ts +452 -0
  113. package/Types/Icon/IconProp.ts +1 -0
  114. package/Types/JsonWebTokenData.ts +3 -0
  115. package/Types/Monitor/DockerSwarmAlertTemplates.ts +461 -0
  116. package/Types/Monitor/DockerSwarmMetricCatalog.ts +139 -0
  117. package/Types/Monitor/HostAlertTemplates.ts +455 -0
  118. package/Types/Monitor/HostMetricCatalog.ts +177 -0
  119. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +21 -0
  120. package/Types/Monitor/MonitorStep.ts +99 -0
  121. package/Types/Monitor/MonitorStepDockerSwarmMonitor.ts +74 -0
  122. package/Types/Monitor/MonitorStepHostMonitor.ts +30 -0
  123. package/Types/Monitor/MonitorStepPodmanMonitor.ts +38 -0
  124. package/Types/Monitor/MonitorType.ts +42 -0
  125. package/Types/Monitor/PodmanAlertTemplates.ts +507 -0
  126. package/Types/Monitor/PodmanMetricCatalog.ts +226 -0
  127. package/Types/Permission.ts +465 -4
  128. package/Types/Podman/PodmanInventoryExtractor.ts +343 -0
  129. package/Types/SSO/SsoProviderType.ts +8 -0
  130. package/Types/Telemetry/EntityType.ts +12 -0
  131. package/Types/Telemetry/ServiceType.ts +2 -0
  132. package/UI/Components/Accordion/Accordion.tsx +5 -1
  133. package/UI/Components/CardSelect/CardSelect.tsx +6 -1
  134. package/UI/Components/CategoryCheckbox/Index.tsx +2 -1
  135. package/UI/Components/CodeEditor/CodeEditor.tsx +2 -0
  136. package/UI/Components/CollapsibleSection/CollapsibleSection.tsx +8 -1
  137. package/UI/Components/Dropdown/Dropdown.tsx +2 -0
  138. package/UI/Components/EntityDropdown/EntityDropdown.tsx +3 -0
  139. package/UI/Components/FilePicker/FilePicker.tsx +2 -0
  140. package/UI/Components/Forms/Fields/ColorPicker.tsx +2 -0
  141. package/UI/Components/Forms/Fields/FieldLabel.tsx +4 -0
  142. package/UI/Components/Forms/Fields/FormField.tsx +72 -15
  143. package/UI/Components/Forms/Fields/IconPicker.tsx +2 -0
  144. package/UI/Components/Forms/Validation.ts +107 -23
  145. package/UI/Components/Icon/Icon.tsx +57 -0
  146. package/UI/Components/Input/Input.tsx +4 -0
  147. package/UI/Components/Link/Link.tsx +23 -0
  148. package/UI/Components/LogsViewer/LogsViewer.tsx +44 -1
  149. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +28 -0
  150. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  151. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +3 -0
  152. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +63 -2
  153. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +6 -0
  154. package/UI/Components/Radio/Radio.tsx +2 -0
  155. package/UI/Components/RadioButtons/GroupRadioButtons.tsx +6 -1
  156. package/UI/Components/Tabs/Tabs.tsx +63 -0
  157. package/UI/Components/TextArea/TextArea.tsx +2 -0
  158. package/UI/Components/TimePicker/TimePicker.tsx +2 -0
  159. package/UI/Components/Toggle/Toggle.tsx +2 -1
  160. package/UI/Components/Tooltip/Tooltip.tsx +6 -1
  161. package/UI/Utils/TelemetryService.ts +1 -0
  162. package/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.ts +70 -0
  163. package/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.ts +61 -0
  164. package/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.ts +71 -0
  165. package/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.ts +100 -0
  166. package/Utils/Dashboard/Components/DashboardPodmanHostListComponent.ts +88 -0
  167. package/Utils/Dashboard/Components/DashboardPodmanImageListComponent.ts +97 -0
  168. package/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.ts +87 -0
  169. package/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.ts +87 -0
  170. package/Utils/Dashboard/Components/Index.ts +51 -0
  171. package/Utils/Telemetry/EntityKey.ts +18 -0
  172. package/build/dist/Models/DatabaseModels/Alert.js +162 -0
  173. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  174. package/build/dist/Models/DatabaseModels/AlertLabelRule.js +39 -0
  175. package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
  176. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +39 -0
  177. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
  178. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +1018 -0
  179. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -0
  180. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +522 -0
  181. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -0
  182. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +603 -0
  183. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -0
  184. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js +503 -0
  185. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js.map +1 -0
  186. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js +502 -0
  187. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js.map +1 -0
  188. package/build/dist/Models/DatabaseModels/DockerSwarmResource.js +787 -0
  189. package/build/dist/Models/DatabaseModels/DockerSwarmResource.js.map +1 -0
  190. package/build/dist/Models/DatabaseModels/GlobalConfig.js +20 -0
  191. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/GlobalOidc.js +379 -0
  193. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -0
  194. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +276 -0
  195. package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -0
  196. package/build/dist/Models/DatabaseModels/GlobalSso.js +341 -0
  197. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -0
  198. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +279 -0
  199. package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -0
  200. package/build/dist/Models/DatabaseModels/Incident.js +162 -0
  201. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  202. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +39 -0
  203. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +39 -0
  205. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +54 -0
  207. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/Index.js +32 -0
  209. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/PodmanHost.js +885 -0
  211. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -0
  212. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +522 -0
  213. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -0
  214. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +603 -0
  215. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -0
  216. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js +503 -0
  217. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js.map +1 -0
  218. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js +502 -0
  219. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js.map +1 -0
  220. package/build/dist/Models/DatabaseModels/PodmanResource.js +526 -0
  221. package/build/dist/Models/DatabaseModels/PodmanResource.js.map +1 -0
  222. package/build/dist/Models/DatabaseModels/Project.js +32 -0
  223. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  224. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +108 -0
  225. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  226. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +39 -0
  227. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
  228. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +39 -0
  229. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
  230. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +54 -0
  231. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  232. package/build/dist/Models/DatabaseModels/StatusPage.js +84 -0
  233. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  234. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  235. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  236. package/build/dist/Server/API/DashboardAPI.js +89 -0
  237. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  238. package/build/dist/Server/API/DockerSwarmResourceAPI.js +100 -0
  239. package/build/dist/Server/API/DockerSwarmResourceAPI.js.map +1 -0
  240. package/build/dist/Server/API/StatusPageAPI.js +2 -0
  241. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  242. package/build/dist/Server/API/TelemetryAPI.js +8 -1
  243. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781750000000-MigrationName.js +1100 -0
  245. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781750000000-MigrationName.js.map +1 -0
  246. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782000000000-AddGlobalSsoAndOidc.js +73 -0
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782000000000-AddGlobalSsoAndOidc.js.map +1 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782100000000-AddStatusPageImageAltText.js +14 -0
  249. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782100000000-AddStatusPageImageAltText.js.map +1 -0
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782200000000-AddRequireSsoForLoginToGlobalProviders.js +14 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782200000000-AddRequireSsoForLoginToGlobalProviders.js.map +1 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782300000000-MoveRequireSsoForLoginToGlobalConfig.js +23 -0
  253. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782300000000-MoveRequireSsoForLoginToGlobalConfig.js.map +1 -0
  254. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782310000000-MigrationName.js +106 -0
  255. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782310000000-MigrationName.js.map +1 -0
  256. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782400000000-RemoveIsTestedFromGlobalSsoAndOidc.js +14 -0
  257. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782400000000-RemoveIsTestedFromGlobalSsoAndOidc.js.map +1 -0
  258. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  259. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  260. package/build/dist/Server/Middleware/UserAuthorization.js +77 -34
  261. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  262. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +30 -4
  263. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  264. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +62 -5
  265. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  266. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +168 -0
  267. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -0
  268. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleService.js +13 -0
  269. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleService.js.map +1 -0
  270. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +188 -0
  271. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -0
  272. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleService.js +13 -0
  273. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleService.js.map +1 -0
  274. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +9 -0
  275. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -0
  276. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +9 -0
  277. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -0
  278. package/build/dist/Server/Services/DockerSwarmClusterService.js +353 -0
  279. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -0
  280. package/build/dist/Server/Services/DockerSwarmResourceService.js +258 -0
  281. package/build/dist/Server/Services/DockerSwarmResourceService.js.map +1 -0
  282. package/build/dist/Server/Services/ExceptionAggregationService.js +1 -0
  283. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  284. package/build/dist/Server/Services/GlobalConfigService.js +55 -0
  285. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  286. package/build/dist/Server/Services/GlobalOidcProjectService.js +80 -0
  287. package/build/dist/Server/Services/GlobalOidcProjectService.js.map +1 -0
  288. package/build/dist/Server/Services/GlobalOidcService.js +9 -0
  289. package/build/dist/Server/Services/GlobalOidcService.js.map +1 -0
  290. package/build/dist/Server/Services/GlobalSsoProjectService.js +80 -0
  291. package/build/dist/Server/Services/GlobalSsoProjectService.js.map +1 -0
  292. package/build/dist/Server/Services/GlobalSsoService.js +9 -0
  293. package/build/dist/Server/Services/GlobalSsoService.js.map +1 -0
  294. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +28 -4
  295. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  296. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +62 -5
  297. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  298. package/build/dist/Server/Services/IncidentService.js +8 -0
  299. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  300. package/build/dist/Server/Services/Index.js +22 -0
  301. package/build/dist/Server/Services/Index.js.map +1 -1
  302. package/build/dist/Server/Services/LogAggregationService.js +1 -0
  303. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  304. package/build/dist/Server/Services/MetricAggregationService.js +1 -0
  305. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  306. package/build/dist/Server/Services/OpenTelemetryIngestService.js +43 -13
  307. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  308. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +166 -0
  309. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -0
  310. package/build/dist/Server/Services/PodmanHostLabelRuleService.js +13 -0
  311. package/build/dist/Server/Services/PodmanHostLabelRuleService.js.map +1 -0
  312. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +186 -0
  313. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -0
  314. package/build/dist/Server/Services/PodmanHostOwnerRuleService.js +13 -0
  315. package/build/dist/Server/Services/PodmanHostOwnerRuleService.js.map +1 -0
  316. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +9 -0
  317. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -0
  318. package/build/dist/Server/Services/PodmanHostOwnerUserService.js +9 -0
  319. package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -0
  320. package/build/dist/Server/Services/PodmanHostService.js +319 -0
  321. package/build/dist/Server/Services/PodmanHostService.js.map +1 -0
  322. package/build/dist/Server/Services/PodmanResourceService.js +196 -0
  323. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -0
  324. package/build/dist/Server/Services/ProjectService.js +36 -1
  325. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  326. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +30 -4
  327. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  328. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +62 -5
  329. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  330. package/build/dist/Server/Services/TelemetryUsageBillingService.js +13 -0
  331. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  332. package/build/dist/Server/Services/TraceAggregationService.js +1 -0
  333. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  334. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +13 -0
  335. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  336. package/build/dist/Server/Utils/Cookie.js +32 -3
  337. package/build/dist/Server/Utils/Cookie.js.map +1 -1
  338. package/build/dist/Server/Utils/JsonWebToken.js +6 -0
  339. package/build/dist/Server/Utils/JsonWebToken.js.map +1 -1
  340. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +8 -0
  341. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  342. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +35 -7
  343. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +1 -1
  344. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +194 -0
  345. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  346. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +35 -1
  347. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  348. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +9 -0
  349. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  350. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +3 -0
  351. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  352. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +16 -0
  353. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  354. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +30 -0
  355. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  356. package/build/dist/Server/Utils/Telemetry/Telemetry.js +6 -0
  357. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  358. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +18 -0
  359. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  360. package/build/dist/Server/Utils/ValidateGlobalProviderProjectTeams.js +66 -0
  361. package/build/dist/Server/Utils/ValidateGlobalProviderProjectTeams.js.map +1 -0
  362. package/build/dist/Types/Dashboard/DashboardComponentType.js +7 -0
  363. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  364. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
  365. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  366. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.js +2 -0
  367. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.js.map +1 -0
  368. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.js +2 -0
  369. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.js.map +1 -0
  370. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.js +2 -0
  371. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.js.map +1 -0
  372. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.js +2 -0
  373. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.js.map +1 -0
  374. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.js +2 -0
  375. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.js.map +1 -0
  376. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.js +2 -0
  377. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.js.map +1 -0
  378. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.js +2 -0
  379. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.js.map +1 -0
  380. package/build/dist/Types/Dashboard/DashboardTemplates.js +168 -0
  381. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  382. package/build/dist/Types/DockerSwarm/DockerSwarmInventoryExtractor.js +359 -0
  383. package/build/dist/Types/DockerSwarm/DockerSwarmInventoryExtractor.js.map +1 -0
  384. package/build/dist/Types/Icon/IconProp.js +1 -0
  385. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  386. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +358 -0
  387. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -0
  388. package/build/dist/Types/Monitor/DockerSwarmMetricCatalog.js +103 -0
  389. package/build/dist/Types/Monitor/DockerSwarmMetricCatalog.js.map +1 -0
  390. package/build/dist/Types/Monitor/HostAlertTemplates.js +365 -0
  391. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -0
  392. package/build/dist/Types/Monitor/HostMetricCatalog.js +138 -0
  393. package/build/dist/Types/Monitor/HostMetricCatalog.js.map +1 -0
  394. package/build/dist/Types/Monitor/MonitorStep.js +69 -0
  395. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  396. package/build/dist/Types/Monitor/MonitorStepDockerSwarmMonitor.js +21 -0
  397. package/build/dist/Types/Monitor/MonitorStepDockerSwarmMonitor.js.map +1 -0
  398. package/build/dist/Types/Monitor/MonitorStepHostMonitor.js +20 -0
  399. package/build/dist/Types/Monitor/MonitorStepHostMonitor.js.map +1 -0
  400. package/build/dist/Types/Monitor/MonitorStepPodmanMonitor.js +21 -0
  401. package/build/dist/Types/Monitor/MonitorStepPodmanMonitor.js.map +1 -0
  402. package/build/dist/Types/Monitor/MonitorType.js +39 -0
  403. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  404. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +410 -0
  405. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -0
  406. package/build/dist/Types/Monitor/PodmanMetricCatalog.js +192 -0
  407. package/build/dist/Types/Monitor/PodmanMetricCatalog.js.map +1 -0
  408. package/build/dist/Types/Permission.js +420 -4
  409. package/build/dist/Types/Permission.js.map +1 -1
  410. package/build/dist/Types/Podman/PodmanInventoryExtractor.js +293 -0
  411. package/build/dist/Types/Podman/PodmanInventoryExtractor.js.map +1 -0
  412. package/build/dist/Types/SSO/SsoProviderType.js +9 -0
  413. package/build/dist/Types/SSO/SsoProviderType.js.map +1 -0
  414. package/build/dist/Types/Telemetry/EntityType.js +12 -0
  415. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  416. package/build/dist/Types/Telemetry/ServiceType.js +2 -0
  417. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  418. package/build/dist/UI/Components/Accordion/Accordion.js +5 -3
  419. package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
  420. package/build/dist/UI/Components/CardSelect/CardSelect.js +1 -1
  421. package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
  422. package/build/dist/UI/Components/CategoryCheckbox/Index.js +1 -1
  423. package/build/dist/UI/Components/CategoryCheckbox/Index.js.map +1 -1
  424. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +1 -1
  425. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  426. package/build/dist/UI/Components/CollapsibleSection/CollapsibleSection.js +4 -2
  427. package/build/dist/UI/Components/CollapsibleSection/CollapsibleSection.js.map +1 -1
  428. package/build/dist/UI/Components/Dropdown/Dropdown.js +1 -1
  429. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  430. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +2 -2
  431. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  432. package/build/dist/UI/Components/FilePicker/FilePicker.js +1 -1
  433. package/build/dist/UI/Components/FilePicker/FilePicker.js.map +1 -1
  434. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +1 -1
  435. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
  436. package/build/dist/UI/Components/Forms/Fields/FieldLabel.js +1 -1
  437. package/build/dist/UI/Components/Forms/Fields/FieldLabel.js.map +1 -1
  438. package/build/dist/UI/Components/Forms/Fields/FormField.js +58 -22
  439. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  440. package/build/dist/UI/Components/Forms/Fields/IconPicker.js +1 -1
  441. package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
  442. package/build/dist/UI/Components/Forms/Validation.js +64 -15
  443. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  444. package/build/dist/UI/Components/Icon/Icon.js +16 -0
  445. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  446. package/build/dist/UI/Components/Input/Input.js +1 -1
  447. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  448. package/build/dist/UI/Components/Link/Link.js +22 -1
  449. package/build/dist/UI/Components/Link/Link.js.map +1 -1
  450. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +30 -2
  451. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  452. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +22 -0
  453. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  454. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  455. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  456. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +2 -2
  457. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  458. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +46 -2
  459. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  460. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +6 -0
  461. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  462. package/build/dist/UI/Components/Radio/Radio.js +1 -1
  463. package/build/dist/UI/Components/Radio/Radio.js.map +1 -1
  464. package/build/dist/UI/Components/RadioButtons/GroupRadioButtons.js +1 -1
  465. package/build/dist/UI/Components/RadioButtons/GroupRadioButtons.js.map +1 -1
  466. package/build/dist/UI/Components/Tabs/Tabs.js +50 -1
  467. package/build/dist/UI/Components/Tabs/Tabs.js.map +1 -1
  468. package/build/dist/UI/Components/TextArea/TextArea.js +1 -1
  469. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  470. package/build/dist/UI/Components/TimePicker/TimePicker.js +1 -1
  471. package/build/dist/UI/Components/TimePicker/TimePicker.js.map +1 -1
  472. package/build/dist/UI/Components/Toggle/Toggle.js +1 -1
  473. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  474. package/build/dist/UI/Components/Tooltip/Tooltip.js +6 -1
  475. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  476. package/build/dist/UI/Utils/TelemetryService.js +1 -0
  477. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  478. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.js +55 -0
  479. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.js.map +1 -0
  480. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.js +46 -0
  481. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.js.map +1 -0
  482. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.js +55 -0
  483. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.js.map +1 -0
  484. package/build/dist/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.js +77 -0
  485. package/build/dist/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.js.map +1 -0
  486. package/build/dist/Utils/Dashboard/Components/DashboardPodmanHostListComponent.js +71 -0
  487. package/build/dist/Utils/Dashboard/Components/DashboardPodmanHostListComponent.js.map +1 -0
  488. package/build/dist/Utils/Dashboard/Components/DashboardPodmanImageListComponent.js +77 -0
  489. package/build/dist/Utils/Dashboard/Components/DashboardPodmanImageListComponent.js.map +1 -0
  490. package/build/dist/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.js +68 -0
  491. package/build/dist/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.js.map +1 -0
  492. package/build/dist/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.js +68 -0
  493. package/build/dist/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.js.map +1 -0
  494. package/build/dist/Utils/Dashboard/Components/Index.js +28 -0
  495. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  496. package/build/dist/Utils/Telemetry/EntityKey.js +14 -0
  497. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  498. package/package.json +1 -1
@@ -0,0 +1,310 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import Model from "../../Models/DatabaseModels/PodmanResource";
3
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
4
+ import ObjectID from "../../Types/ObjectID";
5
+ import OneUptimeDate from "../../Types/Date";
6
+ import { JSONObject } from "../../Types/JSON";
7
+ import logger from "../Utils/Logger";
8
+
9
+ /*
10
+ * ------------------------------------------------------------------
11
+ * PodmanResourceService
12
+ *
13
+ * Writes and reads the Podman inventory table populated by the
14
+ * telemetry ingest path. Container rows are upserted from the
15
+ * docker_stats receiver metric stream — every container.* metric
16
+ * carries container.id / container.name / container.image.name
17
+ * resource attributes, which is enough to maintain a live inventory
18
+ * of running containers per host without any agent-side change.
19
+ *
20
+ * Image / Network / Volume kinds are reserved for a follow-up agent
21
+ * change that adds a snapshot poller; the schema is ready for them.
22
+ *
23
+ * Rows are hard-deleted once lastSeenAt falls behind the staleness
24
+ * threshold (default: 15 min) so containers that stopped emitting
25
+ * metrics fall off the list automatically.
26
+ * ------------------------------------------------------------------
27
+ */
28
+
29
+ export interface ParsedPodmanContainer {
30
+ containerName: string;
31
+ containerId: string | null;
32
+ imageName: string | null;
33
+ state: string;
34
+ cpuPercent: number | null;
35
+ memoryBytes: number | null;
36
+ observedAt: Date;
37
+ }
38
+
39
+ export interface ParsedPodmanResource {
40
+ kind: string;
41
+ name: string;
42
+ containerId: string | null;
43
+ imageName: string | null;
44
+ state: string | null;
45
+ labels: JSONObject | null;
46
+ resourceCreationTimestamp: Date | null;
47
+ lastSeenAt: Date;
48
+ }
49
+
50
+ export interface PodmanHostInventoryCounts {
51
+ containersRunning: number;
52
+ containersStopped: number;
53
+ containersPaused: number;
54
+ }
55
+
56
+ const UPSERT_BATCH_SIZE: number = 500;
57
+ const STALE_DELETE_WARN_THRESHOLD: number = 100;
58
+
59
+ export class Service extends DatabaseService<Model> {
60
+ public constructor() {
61
+ super(Model);
62
+ }
63
+
64
+ /**
65
+ * Upsert a batch of Container rows for a single (project, host)
66
+ * pair. Uses ON CONFLICT on the UNIQUE (projectId, podmanHostId,
67
+ * kind, name) index with a dominance guard on lastSeenAt so
68
+ * out-of-order ingest never regresses a newer observation.
69
+ *
70
+ * Containers are upserted from metric snapshots (no separate
71
+ * inventory snapshot path), so this also writes
72
+ * latestCpuPercent / latestMemoryBytes / metricsUpdatedAt in the
73
+ * same statement — saves a round trip vs. the K8s pattern of
74
+ * upsert-then-update.
75
+ */
76
+ @CaptureSpan()
77
+ public async bulkUpsertContainers(data: {
78
+ projectId: ObjectID;
79
+ podmanHostId: ObjectID;
80
+ containers: Array<ParsedPodmanContainer>;
81
+ }): Promise<void> {
82
+ if (data.containers.length === 0) {
83
+ return;
84
+ }
85
+
86
+ for (
87
+ let i: number = 0;
88
+ i < data.containers.length;
89
+ i += UPSERT_BATCH_SIZE
90
+ ) {
91
+ const chunk: Array<ParsedPodmanContainer> = data.containers.slice(
92
+ i,
93
+ i + UPSERT_BATCH_SIZE,
94
+ );
95
+
96
+ const valueFragments: Array<string> = [];
97
+ const params: Array<unknown> = [];
98
+ let p: number = 1;
99
+
100
+ for (const c of chunk) {
101
+ valueFragments.push(
102
+ `($${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}::numeric, $${p++}::bigint, $${p++}::timestamptz, $${p++}::timestamptz, $${p++})`,
103
+ );
104
+ params.push(
105
+ data.projectId.toString(),
106
+ data.podmanHostId.toString(),
107
+ "Container",
108
+ c.containerName,
109
+ c.containerId,
110
+ c.imageName,
111
+ c.state,
112
+ c.cpuPercent !== null && c.cpuPercent !== undefined
113
+ ? c.cpuPercent
114
+ : null,
115
+ c.memoryBytes !== null && c.memoryBytes !== undefined
116
+ ? Math.trunc(c.memoryBytes).toString()
117
+ : null,
118
+ c.observedAt,
119
+ c.observedAt,
120
+ 0, // version (BaseModel @VersionColumn)
121
+ );
122
+ }
123
+
124
+ const sql: string = `
125
+ INSERT INTO "PodmanResource" (
126
+ "projectId", "podmanHostId", "kind", "name",
127
+ "containerId", "imageName", "state",
128
+ "latestCpuPercent", "latestMemoryBytes",
129
+ "metricsUpdatedAt", "lastSeenAt", "version"
130
+ )
131
+ VALUES ${valueFragments.join(", ")}
132
+ ON CONFLICT ("projectId", "podmanHostId", "kind", "name")
133
+ DO UPDATE SET
134
+ "containerId" = COALESCE(EXCLUDED."containerId", "PodmanResource"."containerId"),
135
+ "imageName" = COALESCE(EXCLUDED."imageName", "PodmanResource"."imageName"),
136
+ "state" = EXCLUDED."state",
137
+ "latestCpuPercent" = COALESCE(EXCLUDED."latestCpuPercent", "PodmanResource"."latestCpuPercent"),
138
+ "latestMemoryBytes" = COALESCE(EXCLUDED."latestMemoryBytes", "PodmanResource"."latestMemoryBytes"),
139
+ "metricsUpdatedAt" = EXCLUDED."metricsUpdatedAt",
140
+ "lastSeenAt" = EXCLUDED."lastSeenAt",
141
+ "updatedAt" = now()
142
+ WHERE EXCLUDED."lastSeenAt" >= "PodmanResource"."lastSeenAt"
143
+ `;
144
+
145
+ await this.getRepository().manager.query(sql, params);
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Upsert a batch of resources for any kind. Used by the snapshot
151
+ * ingest path (Container / Image / Network / Volume rows from the
152
+ * Podman agent's inventory poller). Container rows from this path
153
+ * carry full state (running / exited / paused / restarting / dead /
154
+ * created), unlike the metric-derived path which only sees running
155
+ * containers.
156
+ */
157
+ @CaptureSpan()
158
+ public async bulkUpsert(data: {
159
+ projectId: ObjectID;
160
+ podmanHostId: ObjectID;
161
+ resources: Array<ParsedPodmanResource>;
162
+ }): Promise<void> {
163
+ if (data.resources.length === 0) {
164
+ return;
165
+ }
166
+
167
+ for (let i: number = 0; i < data.resources.length; i += UPSERT_BATCH_SIZE) {
168
+ const chunk: Array<ParsedPodmanResource> = data.resources.slice(
169
+ i,
170
+ i + UPSERT_BATCH_SIZE,
171
+ );
172
+
173
+ const valueFragments: Array<string> = [];
174
+ const params: Array<unknown> = [];
175
+ let p: number = 1;
176
+
177
+ for (const r of chunk) {
178
+ valueFragments.push(
179
+ `($${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}::timestamptz, $${p++}::timestamptz, $${p++})`,
180
+ );
181
+ params.push(
182
+ data.projectId.toString(),
183
+ data.podmanHostId.toString(),
184
+ r.kind,
185
+ r.name,
186
+ r.containerId,
187
+ r.imageName,
188
+ r.state,
189
+ r.labels ? JSON.stringify(r.labels) : null,
190
+ r.resourceCreationTimestamp,
191
+ r.lastSeenAt,
192
+ 0, // version
193
+ );
194
+ }
195
+
196
+ const sql: string = `
197
+ INSERT INTO "PodmanResource" (
198
+ "projectId", "podmanHostId", "kind", "name",
199
+ "containerId", "imageName", "state", "labels",
200
+ "resourceCreationTimestamp", "lastSeenAt", "version"
201
+ )
202
+ VALUES ${valueFragments.join(", ")}
203
+ ON CONFLICT ("projectId", "podmanHostId", "kind", "name")
204
+ DO UPDATE SET
205
+ "containerId" = COALESCE(EXCLUDED."containerId", "PodmanResource"."containerId"),
206
+ "imageName" = COALESCE(EXCLUDED."imageName", "PodmanResource"."imageName"),
207
+ "state" = COALESCE(EXCLUDED."state", "PodmanResource"."state"),
208
+ "labels" = COALESCE(EXCLUDED."labels", "PodmanResource"."labels"),
209
+ "resourceCreationTimestamp" = COALESCE(EXCLUDED."resourceCreationTimestamp", "PodmanResource"."resourceCreationTimestamp"),
210
+ "lastSeenAt" = EXCLUDED."lastSeenAt",
211
+ "updatedAt" = now()
212
+ WHERE EXCLUDED."lastSeenAt" >= "PodmanResource"."lastSeenAt"
213
+ `;
214
+
215
+ await this.getRepository().manager.query(sql, params);
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Hard-delete all resources on a host whose last observation is
221
+ * older than olderThan. Returns the number of deleted rows.
222
+ */
223
+ @CaptureSpan()
224
+ public async deleteStaleForHost(data: {
225
+ podmanHostId: ObjectID;
226
+ olderThan: Date;
227
+ }): Promise<number> {
228
+ const result: Array<{ affected?: number }> | { affected?: number } =
229
+ await this.getRepository().manager.query(
230
+ `DELETE FROM "PodmanResource" WHERE "podmanHostId" = $1 AND "lastSeenAt" < $2`,
231
+ [data.podmanHostId.toString(), data.olderThan],
232
+ );
233
+
234
+ let affected: number = 0;
235
+ if (Array.isArray(result) && result.length >= 2) {
236
+ const second: unknown = (result as Array<unknown>)[1];
237
+ if (typeof second === "number") {
238
+ affected = second;
239
+ }
240
+ }
241
+
242
+ if (affected > STALE_DELETE_WARN_THRESHOLD) {
243
+ logger.warn(
244
+ `PodmanResource cleanup deleted ${affected} stale rows for host ${data.podmanHostId.toString()} — larger than expected; investigate agent health.`,
245
+ );
246
+ }
247
+
248
+ return affected;
249
+ }
250
+
251
+ /**
252
+ * Compute container state breakdowns for a single host from the
253
+ * inventory table. Used by the cleanup worker to refresh the cached
254
+ * counts on PodmanHost so the Hosts page / dashboard widget shows
255
+ * accurate numbers without needing a SQL aggregation per render.
256
+ */
257
+ @CaptureSpan()
258
+ public async getContainerCountsForHost(data: {
259
+ projectId: ObjectID;
260
+ podmanHostId: ObjectID;
261
+ }): Promise<PodmanHostInventoryCounts> {
262
+ const rows: Array<{
263
+ running: string;
264
+ stopped: string;
265
+ paused: string;
266
+ }> = await this.getRepository().manager.query(
267
+ `SELECT
268
+ COUNT(*) FILTER (WHERE LOWER("state") = 'running')::text AS "running",
269
+ COUNT(*) FILTER (WHERE LOWER("state") IN ('exited', 'dead', 'created'))::text AS "stopped",
270
+ COUNT(*) FILTER (WHERE LOWER("state") = 'paused')::text AS "paused"
271
+ FROM "PodmanResource"
272
+ WHERE "projectId" = $1
273
+ AND "podmanHostId" = $2
274
+ AND "kind" = 'Container'
275
+ AND "deletedAt" IS NULL`,
276
+ [data.projectId.toString(), data.podmanHostId.toString()],
277
+ );
278
+
279
+ const row:
280
+ | { running: string; stopped: string; paused: string }
281
+ | undefined = rows[0];
282
+ return {
283
+ containersRunning: row ? parseInt(row.running, 10) || 0 : 0,
284
+ containersStopped: row ? parseInt(row.stopped, 10) || 0 : 0,
285
+ containersPaused: row ? parseInt(row.paused, 10) || 0 : 0,
286
+ };
287
+ }
288
+
289
+ public getStaleThresholdDate(nowOverride?: Date): Date {
290
+ const minutes: number = this.getStaleThresholdMinutes();
291
+ return OneUptimeDate.addRemoveMinutes(
292
+ nowOverride || OneUptimeDate.getCurrentDate(),
293
+ -minutes,
294
+ );
295
+ }
296
+
297
+ public getStaleThresholdMinutes(): number {
298
+ const raw: string | undefined =
299
+ process.env["PODMAN_INVENTORY_STALE_MINUTES"];
300
+ if (raw) {
301
+ const parsed: number = parseInt(raw, 10);
302
+ if (!isNaN(parsed) && parsed >= 5) {
303
+ return parsed;
304
+ }
305
+ }
306
+ return 15;
307
+ }
308
+ }
309
+
310
+ export default new Service();
@@ -103,6 +103,14 @@ export class ProjectService extends DatabaseService<Model> {
103
103
  */
104
104
  private requireSsoForLoginCache: InMemoryTTLCache<boolean> =
105
105
  new InMemoryTTLCache(10_000);
106
+ /*
107
+ * Caches the `requireSsoWithSsoProviderId` discriminator per project so the
108
+ * enforce-SSO middleware can require that the SSO token was issued by a
109
+ * specific provider. Stored as a string id (or null when unset). Populated
110
+ * alongside `getRequireSsoForLogin` so the common path stays a single query.
111
+ */
112
+ private requireSsoWithSsoProviderIdCache: InMemoryTTLCache<string | null> =
113
+ new InMemoryTTLCache(10_000);
106
114
  /*
107
115
  * Caches the current billing plan per project. `getCurrentPlan` is hit
108
116
  * by `CommonAPI.getDatabaseCommonInteractionProps` on every
@@ -351,6 +359,10 @@ export class ProjectService extends DatabaseService<Model> {
351
359
  this.requireSsoForLoginCache.clear();
352
360
  }
353
361
 
362
+ if (updateBy.data.requireSsoWithSsoProviderId !== undefined) {
363
+ this.requireSsoWithSsoProviderIdCache.clear();
364
+ }
365
+
354
366
  if (IsBillingEnabled) {
355
367
  if (
356
368
  updateBy.data.businessDetails ||
@@ -1338,7 +1350,7 @@ export class ProjectService extends DatabaseService<Model> {
1338
1350
 
1339
1351
  const project: Model | null = await this.findOneById({
1340
1352
  id: projectId,
1341
- select: { requireSsoForLogin: true },
1353
+ select: { requireSsoForLogin: true, requireSsoWithSsoProviderId: true },
1342
1354
  props: { isRoot: true },
1343
1355
  });
1344
1356
 
@@ -1349,9 +1361,40 @@ export class ProjectService extends DatabaseService<Model> {
1349
1361
 
1350
1362
  const value: boolean = Boolean(project.requireSsoForLogin);
1351
1363
  this.requireSsoForLoginCache.set(key, value, 60_000);
1364
+ this.requireSsoWithSsoProviderIdCache.set(
1365
+ key,
1366
+ project.requireSsoWithSsoProviderId
1367
+ ? project.requireSsoWithSsoProviderId.toString()
1368
+ : null,
1369
+ 60_000,
1370
+ );
1352
1371
  return value;
1353
1372
  }
1354
1373
 
1374
+ /**
1375
+ * Returns the specific SSO provider id a project requires for SSO-enforced
1376
+ * login, or null when any trusted provider is acceptable. Cached for 60s and
1377
+ * populated by `getRequireSsoForLogin`, so the enforce path stays one query.
1378
+ */
1379
+ @CaptureSpan()
1380
+ public async getRequireSsoWithSsoProviderId(
1381
+ projectId: ObjectID,
1382
+ ): Promise<ObjectID | null> {
1383
+ const key: string = projectId.toString();
1384
+ const cached: string | null | undefined =
1385
+ this.requireSsoWithSsoProviderIdCache.get(key);
1386
+ if (cached !== undefined) {
1387
+ return cached ? new ObjectID(cached) : null;
1388
+ }
1389
+
1390
+ // Populate both caches via the existing single-query path.
1391
+ await this.getRequireSsoForLogin(projectId);
1392
+
1393
+ const populated: string | null | undefined =
1394
+ this.requireSsoWithSsoProviderIdCache.get(key);
1395
+ return populated ? new ObjectID(populated) : null;
1396
+ }
1397
+
1355
1398
  @CaptureSpan()
1356
1399
  public async getOwners(projectId: ObjectID): Promise<Array<User>> {
1357
1400
  if (!projectId) {
@@ -3,10 +3,12 @@ import Host from "../../Models/DatabaseModels/Host";
3
3
  import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
4
4
  import Label from "../../Models/DatabaseModels/Label";
5
5
  import Monitor from "../../Models/DatabaseModels/Monitor";
6
+ import PodmanHost from "../../Models/DatabaseModels/PodmanHost";
6
7
  import ScheduledMaintenance from "../../Models/DatabaseModels/ScheduledMaintenance";
7
8
  import ScheduledMaintenanceLabelRule from "../../Models/DatabaseModels/ScheduledMaintenanceLabelRule";
8
9
  import Service from "../../Models/DatabaseModels/Service";
9
10
  import DockerHostService from "./DockerHostService";
11
+ import PodmanHostService from "./PodmanHostService";
10
12
  import HostService from "./HostService";
11
13
  import KubernetesClusterService from "./KubernetesClusterService";
12
14
  import LabelService from "./LabelService";
@@ -32,6 +34,7 @@ class ScheduledMaintenanceLabelRuleEngineServiceClass {
32
34
  * - all labels of the event's hosts when `inheritLabelsFromHosts`
33
35
  * - all labels of the event's Kubernetes clusters when `inheritLabelsFromKubernetesClusters`
34
36
  * - all labels of the event's Docker hosts when `inheritLabelsFromDockerHosts`
37
+ * - all labels of the event's Podman hosts when `inheritLabelsFromPodmanHosts`
35
38
  * - all labels of the event's services when `inheritLabelsFromServices`
36
39
  * The union is deduped against labels already on the event before insert
37
40
  * to avoid PK conflicts on the ScheduledMaintenanceLabel join table.
@@ -67,6 +70,7 @@ class ScheduledMaintenanceLabelRuleEngineServiceClass {
67
70
  inheritLabelsFromHosts: true,
68
71
  inheritLabelsFromKubernetesClusters: true,
69
72
  inheritLabelsFromDockerHosts: true,
73
+ inheritLabelsFromPodmanHosts: true,
70
74
  inheritLabelsFromServices: true,
71
75
  },
72
76
  limit: 100,
@@ -82,6 +86,7 @@ class ScheduledMaintenanceLabelRuleEngineServiceClass {
82
86
  let inheritFromHosts: boolean = false;
83
87
  let inheritFromKubernetesClusters: boolean = false;
84
88
  let inheritFromDockerHosts: boolean = false;
89
+ let inheritFromPodmanHosts: boolean = false;
85
90
  let inheritFromServices: boolean = false;
86
91
  const matchedRules: Array<ScheduledMaintenanceLabelRule> = [];
87
92
 
@@ -111,6 +116,9 @@ class ScheduledMaintenanceLabelRuleEngineServiceClass {
111
116
  if (rule.inheritLabelsFromDockerHosts) {
112
117
  inheritFromDockerHosts = true;
113
118
  }
119
+ if (rule.inheritLabelsFromPodmanHosts) {
120
+ inheritFromPodmanHosts = true;
121
+ }
114
122
  if (rule.inheritLabelsFromServices) {
115
123
  inheritFromServices = true;
116
124
  }
@@ -120,6 +128,7 @@ class ScheduledMaintenanceLabelRuleEngineServiceClass {
120
128
  inheritFromHosts ||
121
129
  inheritFromKubernetesClusters ||
122
130
  inheritFromDockerHosts ||
131
+ inheritFromPodmanHosts ||
123
132
  inheritFromServices;
124
133
 
125
134
  let eventWithResources: ScheduledMaintenance | null = null;
@@ -130,6 +139,7 @@ class ScheduledMaintenanceLabelRuleEngineServiceClass {
130
139
  hosts: { _id: true },
131
140
  kubernetesClusters: { _id: true },
132
141
  dockerHosts: { _id: true },
142
+ podmanHosts: { _id: true },
133
143
  services: { _id: true },
134
144
  },
135
145
  props: { isRoot: true },
@@ -213,6 +223,25 @@ class ScheduledMaintenanceLabelRuleEngineServiceClass {
213
223
  }
214
224
  }
215
225
 
226
+ if (inheritFromPodmanHosts && eventWithResources?.podmanHosts?.length) {
227
+ for (const eventPodmanHost of eventWithResources.podmanHosts) {
228
+ if (!eventPodmanHost.id) {
229
+ continue;
230
+ }
231
+ const podmanHost: PodmanHost | null =
232
+ await PodmanHostService.findOneById({
233
+ id: eventPodmanHost.id,
234
+ select: { labels: { _id: true } },
235
+ props: { isRoot: true },
236
+ });
237
+ for (const label of podmanHost?.labels || []) {
238
+ if (label.id) {
239
+ labelIdsToAdd.add(label.id.toString());
240
+ }
241
+ }
242
+ }
243
+ }
244
+
216
245
  if (inheritFromServices && eventWithResources?.services?.length) {
217
246
  for (const eventService of eventWithResources.services) {
218
247
  if (!eventService.id) {
@@ -11,6 +11,9 @@ import Label from "../../Models/DatabaseModels/Label";
11
11
  import Monitor from "../../Models/DatabaseModels/Monitor";
12
12
  import MonitorOwnerTeam from "../../Models/DatabaseModels/MonitorOwnerTeam";
13
13
  import MonitorOwnerUser from "../../Models/DatabaseModels/MonitorOwnerUser";
14
+ import PodmanHost from "../../Models/DatabaseModels/PodmanHost";
15
+ import PodmanHostOwnerTeam from "../../Models/DatabaseModels/PodmanHostOwnerTeam";
16
+ import PodmanHostOwnerUser from "../../Models/DatabaseModels/PodmanHostOwnerUser";
14
17
  import ScheduledMaintenance from "../../Models/DatabaseModels/ScheduledMaintenance";
15
18
  import ScheduledMaintenanceOwnerRule from "../../Models/DatabaseModels/ScheduledMaintenanceOwnerRule";
16
19
  import Service from "../../Models/DatabaseModels/Service";
@@ -27,6 +30,8 @@ import KubernetesClusterOwnerUserService from "./KubernetesClusterOwnerUserServi
27
30
  import MonitorOwnerTeamService from "./MonitorOwnerTeamService";
28
31
  import MonitorOwnerUserService from "./MonitorOwnerUserService";
29
32
  import MonitorService from "./MonitorService";
33
+ import PodmanHostOwnerTeamService from "./PodmanHostOwnerTeamService";
34
+ import PodmanHostOwnerUserService from "./PodmanHostOwnerUserService";
30
35
  import ScheduledMaintenanceFeedService from "./ScheduledMaintenanceFeedService";
31
36
  import ScheduledMaintenanceOwnerRuleService from "./ScheduledMaintenanceOwnerRuleService";
32
37
  import ScheduledMaintenanceService from "./ScheduledMaintenanceService";
@@ -82,6 +87,7 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
82
87
  inheritOwnersFromHosts: true,
83
88
  inheritOwnersFromKubernetesClusters: true,
84
89
  inheritOwnersFromDockerHosts: true,
90
+ inheritOwnersFromPodmanHosts: true,
85
91
  inheritOwnersFromServices: true,
86
92
  },
87
93
  limit: 100,
@@ -108,6 +114,7 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
108
114
  let inheritFromHosts: boolean = false;
109
115
  let inheritFromKubernetesClusters: boolean = false;
110
116
  let inheritFromDockerHosts: boolean = false;
117
+ let inheritFromPodmanHosts: boolean = false;
111
118
  let inheritFromServices: boolean = false;
112
119
  const inheritNotifyMode: { value: boolean | null } = { value: null };
113
120
 
@@ -159,6 +166,12 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
159
166
  inheritNotifyMode.value =
160
167
  inheritNotifyMode.value === true ? true : notify;
161
168
  }
169
+ if (rule.inheritOwnersFromPodmanHosts) {
170
+ inheritFromPodmanHosts = true;
171
+ ruleAddedAny = true;
172
+ inheritNotifyMode.value =
173
+ inheritNotifyMode.value === true ? true : notify;
174
+ }
162
175
  if (rule.inheritOwnersFromServices) {
163
176
  inheritFromServices = true;
164
177
  ruleAddedAny = true;
@@ -178,6 +191,8 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
178
191
  const inheritedFromKubernetesClusterTeamIds: Set<string> = new Set();
179
192
  const inheritedFromDockerHostUserIds: Set<string> = new Set();
180
193
  const inheritedFromDockerHostTeamIds: Set<string> = new Set();
194
+ const inheritedFromPodmanHostUserIds: Set<string> = new Set();
195
+ const inheritedFromPodmanHostTeamIds: Set<string> = new Set();
181
196
  const inheritedFromServiceUserIds: Set<string> = new Set();
182
197
  const inheritedFromServiceTeamIds: Set<string> = new Set();
183
198
 
@@ -353,6 +368,47 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
353
368
  }
354
369
  }
355
370
 
371
+ if (inheritFromPodmanHosts && scheduledMaintenance.podmanHosts?.length) {
372
+ const podmanHostIds: Array<ObjectID> = scheduledMaintenance.podmanHosts
373
+ .map((p: PodmanHost) => {
374
+ return p.id;
375
+ })
376
+ .filter((id: ObjectID | null | undefined): id is ObjectID => {
377
+ return Boolean(id);
378
+ });
379
+ if (podmanHostIds.length > 0) {
380
+ const [podmanHostOwnerUsers, podmanHostOwnerTeams]: [
381
+ Array<PodmanHostOwnerUser>,
382
+ Array<PodmanHostOwnerTeam>,
383
+ ] = await Promise.all([
384
+ PodmanHostOwnerUserService.findBy({
385
+ query: { podmanHostId: QueryHelper.any(podmanHostIds) },
386
+ select: { userId: true },
387
+ props: { isRoot: true },
388
+ limit: LIMIT_MAX,
389
+ skip: 0,
390
+ }),
391
+ PodmanHostOwnerTeamService.findBy({
392
+ query: { podmanHostId: QueryHelper.any(podmanHostIds) },
393
+ select: { teamId: true },
394
+ props: { isRoot: true },
395
+ limit: LIMIT_MAX,
396
+ skip: 0,
397
+ }),
398
+ ]);
399
+ for (const ownerUser of podmanHostOwnerUsers) {
400
+ if (ownerUser.userId) {
401
+ inheritedFromPodmanHostUserIds.add(ownerUser.userId.toString());
402
+ }
403
+ }
404
+ for (const ownerTeam of podmanHostOwnerTeams) {
405
+ if (ownerTeam.teamId) {
406
+ inheritedFromPodmanHostTeamIds.add(ownerTeam.teamId.toString());
407
+ }
408
+ }
409
+ }
410
+ }
411
+
356
412
  if (inheritFromServices && scheduledMaintenance.services?.length) {
357
413
  const serviceIds: Array<ObjectID> = scheduledMaintenance.services
358
414
  .map((s: Service) => {
@@ -399,6 +455,7 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
399
455
  ...inheritedFromHostUserIds,
400
456
  ...inheritedFromKubernetesClusterUserIds,
401
457
  ...inheritedFromDockerHostUserIds,
458
+ ...inheritedFromPodmanHostUserIds,
402
459
  ...inheritedFromServiceUserIds,
403
460
  ]);
404
461
  const inheritedTeamIds: Set<string> = new Set([
@@ -406,6 +463,7 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
406
463
  ...inheritedFromHostTeamIds,
407
464
  ...inheritedFromKubernetesClusterTeamIds,
408
465
  ...inheritedFromDockerHostTeamIds,
466
+ ...inheritedFromPodmanHostTeamIds,
409
467
  ...inheritedFromServiceTeamIds,
410
468
  ]);
411
469
 
@@ -480,6 +538,10 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
480
538
  inheritedFromDockerHostUserIds.size +
481
539
  inheritedFromDockerHostTeamIds.size >
482
540
  0,
541
+ inheritedFromPodmanHosts:
542
+ inheritedFromPodmanHostUserIds.size +
543
+ inheritedFromPodmanHostTeamIds.size >
544
+ 0,
483
545
  inheritedFromServices:
484
546
  inheritedFromServiceUserIds.size + inheritedFromServiceTeamIds.size >
485
547
  0,
@@ -505,6 +567,7 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
505
567
  inheritedFromHosts: boolean;
506
568
  inheritedFromKubernetesClusters: boolean;
507
569
  inheritedFromDockerHosts: boolean;
570
+ inheritedFromPodmanHosts: boolean;
508
571
  inheritedFromServices: boolean;
509
572
  }): Promise<void> {
510
573
  const {
@@ -516,6 +579,7 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
516
579
  inheritedFromHosts,
517
580
  inheritedFromKubernetesClusters,
518
581
  inheritedFromDockerHosts,
582
+ inheritedFromPodmanHosts,
519
583
  inheritedFromServices,
520
584
  } = data;
521
585
  if (
@@ -600,6 +664,9 @@ class ScheduledMaintenanceOwnerRuleEngineServiceClass {
600
664
  if (inheritedFromDockerHosts) {
601
665
  inheritedSources.push("Docker hosts");
602
666
  }
667
+ if (inheritedFromPodmanHosts) {
668
+ inheritedSources.push("Podman hosts");
669
+ }
603
670
  if (inheritedFromServices) {
604
671
  inheritedSources.push("services");
605
672
  }
@@ -25,11 +25,13 @@ import logger from "../Utils/Logger";
25
25
  import ServiceModel from "../../Models/DatabaseModels/Service";
26
26
  import HostService from "./HostService";
27
27
  import DockerHostService from "./DockerHostService";
28
+ import PodmanHostService from "./PodmanHostService";
28
29
  import KubernetesClusterService from "./KubernetesClusterService";
29
30
  import ProxmoxClusterService from "./ProxmoxClusterService";
30
31
  import CephClusterService from "./CephClusterService";
31
32
  import Host from "../../Models/DatabaseModels/Host";
32
33
  import DockerHost from "../../Models/DatabaseModels/DockerHost";
34
+ import PodmanHost from "../../Models/DatabaseModels/PodmanHost";
33
35
  import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
34
36
  import ProxmoxCluster from "../../Models/DatabaseModels/ProxmoxCluster";
35
37
  import CephCluster from "../../Models/DatabaseModels/CephCluster";
@@ -410,6 +412,22 @@ export class Service extends DatabaseService<Model> {
410
412
  }
411
413
  }
412
414
 
415
+ const podmanHosts: Array<PodmanHost> = await PodmanHostService.findBy({
416
+ query: { projectId: projectId },
417
+ select: { _id: true, retainTelemetryDataForDays: true },
418
+ skip: 0,
419
+ limit: LIMIT_MAX,
420
+ props: { isRoot: true },
421
+ });
422
+ for (const podmanHost of podmanHosts) {
423
+ if (podmanHost.id && podmanHost.retainTelemetryDataForDays) {
424
+ retentionByServiceId.set(
425
+ podmanHost.id.toString(),
426
+ podmanHost.retainTelemetryDataForDays,
427
+ );
428
+ }
429
+ }
430
+
413
431
  const clusters: Array<KubernetesCluster> =
414
432
  await KubernetesClusterService.findBy({
415
433
  query: { projectId: projectId },
@@ -158,6 +158,7 @@ export class TraceAggregationService {
158
158
  new Map([
159
159
  ["hostId", ServiceType.Host],
160
160
  ["dockerHostId", ServiceType.DockerHost],
161
+ ["podmanHostId", ServiceType.PodmanHost],
161
162
  ["kubernetesClusterId", ServiceType.KubernetesCluster],
162
163
  ["proxmoxClusterId", ServiceType.ProxmoxCluster],
163
164
  ["cephClusterId", ServiceType.CephCluster],