@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,381 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import Model from "../../Models/DatabaseModels/DockerSwarmResource";
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
+ * DockerSwarmResourceService
12
+ *
13
+ * Writes and reads the Docker Swarm inventory table populated by the
14
+ * telemetry ingest path. Callers are either:
15
+ * - OtelLogsIngestService (bulkUpsert, from the inventory JSON-line
16
+ * snapshot scan — `docker node/service/task/stack/... ls` shipped
17
+ * by the agent's inventory poller)
18
+ * - OtelMetricsIngestService (bulkUpdateLatestMetrics, from the
19
+ * docker_stats receiver per-task CPU/memory mirror)
20
+ * - CleanupStaleResources worker (deleteStaleForCluster)
21
+ * - DockerSwarmResourceAPI / the dashboard pages (reads via the
22
+ * inherited DatabaseService CRUD)
23
+ *
24
+ * Identity/status arrives on the inventory snapshot stream; the
25
+ * latest-metric mirror arrives on the metrics stream, so the two
26
+ * writes happen on different flushes (unlike Proxmox, where both ride
27
+ * the same scrape). Both COALESCE against the existing row so a stream
28
+ * that lacks a field never blanks one another stream already filled.
29
+ *
30
+ * ------------------------------------------------------------------
31
+ */
32
+
33
+ export interface ParsedDockerSwarmResource {
34
+ kind: string; // Node | Service | Task | Stack | Network | Secret | Config | Volume
35
+ externalId: string; // node/<id>, service/<id>, task/<id>, stack/<name>, ...
36
+ name: string | null;
37
+ state: string | null;
38
+ role: string | null; // Node: manager | worker
39
+ serviceMode: string | null; // Service: replicated | global
40
+ desiredReplicas: number | null;
41
+ runningReplicas: number | null;
42
+ image: string | null;
43
+ stackName: string | null;
44
+ serviceName: string | null;
45
+ nodeHostname: string | null;
46
+ driver: string | null;
47
+ isReady: boolean | null;
48
+ attributes: JSONObject | null;
49
+ lastSeenAt: Date;
50
+ }
51
+
52
+ export interface DockerSwarmResourceLatestMetric {
53
+ kind: string;
54
+ externalId: string;
55
+ cpuPercent: number | null;
56
+ memoryBytes: number | null;
57
+ maxMemoryBytes: number | null;
58
+ memoryPercent: number | null;
59
+ observedAt: Date;
60
+ }
61
+
62
+ export interface DockerSwarmInventorySummary {
63
+ countsByKind: Record<string, number>;
64
+ nodeReadyCount: number;
65
+ taskRunningCount: number;
66
+ }
67
+
68
+ const UPSERT_BATCH_SIZE: number = 500;
69
+ const STALE_DELETE_WARN_THRESHOLD: number = 100;
70
+
71
+ /*
72
+ * Column order used by bulkUpsert() and its generated parameter tuples.
73
+ * Keep this and the INSERT column list in perfect sync. The `attributes`
74
+ * column is jsonb (ColumnType.JSON) — its placeholder is cast ::jsonb.
75
+ */
76
+ const UPSERT_COLUMNS: Array<string> = [
77
+ "projectId",
78
+ "dockerSwarmClusterId",
79
+ "kind",
80
+ "externalId",
81
+ "name",
82
+ "state",
83
+ "role",
84
+ "serviceMode",
85
+ "desiredReplicas",
86
+ "runningReplicas",
87
+ "image",
88
+ "stackName",
89
+ "serviceName",
90
+ "nodeHostname",
91
+ "driver",
92
+ "isReady",
93
+ "attributes",
94
+ "lastSeenAt",
95
+ "version",
96
+ ];
97
+
98
+ export class Service extends DatabaseService<Model> {
99
+ public constructor() {
100
+ super(Model);
101
+ }
102
+
103
+ /**
104
+ * Upsert a batch of parsed resources for a single (project, cluster)
105
+ * pair. Uses ON CONFLICT on the UNIQUE (projectId, dockerSwarmClusterId,
106
+ * kind, externalId) index with a dominance guard on lastSeenAt so
107
+ * out-of-order ingest never regresses a newer snapshot.
108
+ *
109
+ * Identity columns COALESCE against the existing row: a snapshot is
110
+ * usually complete, but a partial batch must not blank a field an
111
+ * earlier batch already filled.
112
+ */
113
+ @CaptureSpan()
114
+ public async bulkUpsert(data: {
115
+ projectId: ObjectID;
116
+ dockerSwarmClusterId: ObjectID;
117
+ resources: Array<ParsedDockerSwarmResource>;
118
+ }): Promise<void> {
119
+ if (data.resources.length === 0) {
120
+ return;
121
+ }
122
+
123
+ for (let i: number = 0; i < data.resources.length; i += UPSERT_BATCH_SIZE) {
124
+ const chunk: Array<ParsedDockerSwarmResource> = data.resources.slice(
125
+ i,
126
+ i + UPSERT_BATCH_SIZE,
127
+ );
128
+
129
+ const valueFragments: Array<string> = [];
130
+ const params: Array<unknown> = [];
131
+ let paramIndex: number = 1;
132
+
133
+ for (const r of chunk) {
134
+ const placeholders: Array<string> = [];
135
+ for (const col of UPSERT_COLUMNS) {
136
+ if (col === "attributes") {
137
+ placeholders.push(`$${paramIndex++}::jsonb`);
138
+ } else {
139
+ placeholders.push(`$${paramIndex++}`);
140
+ }
141
+ }
142
+ valueFragments.push(`(${placeholders.join(", ")})`);
143
+
144
+ params.push(
145
+ data.projectId.toString(),
146
+ data.dockerSwarmClusterId.toString(),
147
+ r.kind,
148
+ r.externalId,
149
+ r.name,
150
+ r.state,
151
+ r.role,
152
+ r.serviceMode,
153
+ r.desiredReplicas !== null ? Math.trunc(r.desiredReplicas) : null,
154
+ r.runningReplicas !== null ? Math.trunc(r.runningReplicas) : null,
155
+ r.image,
156
+ r.stackName,
157
+ r.serviceName,
158
+ r.nodeHostname,
159
+ r.driver,
160
+ r.isReady,
161
+ r.attributes ? JSON.stringify(r.attributes) : null,
162
+ r.lastSeenAt,
163
+ 0, // version (BaseModel @VersionColumn)
164
+ );
165
+ }
166
+
167
+ const sql: string = `
168
+ INSERT INTO "DockerSwarmResource" (
169
+ "projectId", "dockerSwarmClusterId", "kind", "externalId",
170
+ "name", "state", "role", "serviceMode",
171
+ "desiredReplicas", "runningReplicas", "image", "stackName",
172
+ "serviceName", "nodeHostname", "driver", "isReady",
173
+ "attributes", "lastSeenAt", "version"
174
+ )
175
+ VALUES ${valueFragments.join(", ")}
176
+ ON CONFLICT ("projectId", "dockerSwarmClusterId", "kind", "externalId")
177
+ DO UPDATE SET
178
+ "name" = COALESCE(EXCLUDED."name", "DockerSwarmResource"."name"),
179
+ "state" = COALESCE(EXCLUDED."state", "DockerSwarmResource"."state"),
180
+ "role" = COALESCE(EXCLUDED."role", "DockerSwarmResource"."role"),
181
+ "serviceMode" = COALESCE(EXCLUDED."serviceMode", "DockerSwarmResource"."serviceMode"),
182
+ "desiredReplicas" = COALESCE(EXCLUDED."desiredReplicas", "DockerSwarmResource"."desiredReplicas"),
183
+ "runningReplicas" = COALESCE(EXCLUDED."runningReplicas", "DockerSwarmResource"."runningReplicas"),
184
+ "image" = COALESCE(EXCLUDED."image", "DockerSwarmResource"."image"),
185
+ "stackName" = COALESCE(EXCLUDED."stackName", "DockerSwarmResource"."stackName"),
186
+ "serviceName" = COALESCE(EXCLUDED."serviceName", "DockerSwarmResource"."serviceName"),
187
+ "nodeHostname" = COALESCE(EXCLUDED."nodeHostname", "DockerSwarmResource"."nodeHostname"),
188
+ "driver" = COALESCE(EXCLUDED."driver", "DockerSwarmResource"."driver"),
189
+ "isReady" = COALESCE(EXCLUDED."isReady", "DockerSwarmResource"."isReady"),
190
+ "attributes" = COALESCE(EXCLUDED."attributes", "DockerSwarmResource"."attributes"),
191
+ "lastSeenAt" = EXCLUDED."lastSeenAt",
192
+ "updatedAt" = now()
193
+ WHERE EXCLUDED."lastSeenAt" >= "DockerSwarmResource"."lastSeenAt"
194
+ `;
195
+
196
+ await this.getRepository().manager.query(sql, params);
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Update the latest-metric mirror columns for a batch of resources
202
+ * (Tasks and Services — the kinds that map to running containers).
203
+ * Plain UPDATE guarded by metricsUpdatedAt so out-of-order points
204
+ * don't regress a newer observation. COALESCE keeps the existing
205
+ * value when a batch lacks a series.
206
+ */
207
+ @CaptureSpan()
208
+ public async bulkUpdateLatestMetrics(data: {
209
+ projectId: ObjectID;
210
+ dockerSwarmClusterId: ObjectID;
211
+ metrics: Array<DockerSwarmResourceLatestMetric>;
212
+ }): Promise<void> {
213
+ if (data.metrics.length === 0) {
214
+ return;
215
+ }
216
+
217
+ for (let i: number = 0; i < data.metrics.length; i += UPSERT_BATCH_SIZE) {
218
+ const chunk: Array<DockerSwarmResourceLatestMetric> = data.metrics.slice(
219
+ i,
220
+ i + UPSERT_BATCH_SIZE,
221
+ );
222
+
223
+ const valueFragments: Array<string> = [];
224
+ const params: Array<unknown> = [
225
+ data.projectId.toString(),
226
+ data.dockerSwarmClusterId.toString(),
227
+ ];
228
+ let paramIndex: number = 3;
229
+
230
+ for (const m of chunk) {
231
+ valueFragments.push(
232
+ `($${paramIndex++}, $${paramIndex++}, $${paramIndex++}::numeric, $${paramIndex++}::bigint, $${paramIndex++}::bigint, $${paramIndex++}::numeric, $${paramIndex++}::timestamptz)`,
233
+ );
234
+ params.push(
235
+ m.kind,
236
+ m.externalId,
237
+ m.cpuPercent !== null && m.cpuPercent !== undefined
238
+ ? m.cpuPercent
239
+ : null,
240
+ m.memoryBytes !== null && m.memoryBytes !== undefined
241
+ ? Math.trunc(m.memoryBytes).toString()
242
+ : null,
243
+ m.maxMemoryBytes !== null && m.maxMemoryBytes !== undefined
244
+ ? Math.trunc(m.maxMemoryBytes).toString()
245
+ : null,
246
+ m.memoryPercent !== null && m.memoryPercent !== undefined
247
+ ? m.memoryPercent
248
+ : null,
249
+ m.observedAt,
250
+ );
251
+ }
252
+
253
+ const sql: string = `
254
+ UPDATE "DockerSwarmResource" AS p
255
+ SET
256
+ "latestCpuPercent" = COALESCE(v."cpu", p."latestCpuPercent"),
257
+ "latestMemoryBytes" = COALESCE(v."mem", p."latestMemoryBytes"),
258
+ "maxMemoryBytes" = COALESCE(v."maxMem", p."maxMemoryBytes"),
259
+ "latestMemoryPercent" = COALESCE(v."memPct", p."latestMemoryPercent"),
260
+ "metricsUpdatedAt" = v."observedAt",
261
+ "updatedAt" = now()
262
+ FROM (VALUES ${valueFragments.join(", ")})
263
+ AS v("kind", "externalId", "cpu", "mem", "maxMem", "memPct", "observedAt")
264
+ WHERE
265
+ p."projectId" = $1
266
+ AND p."dockerSwarmClusterId" = $2
267
+ AND p."kind" = v."kind"
268
+ AND p."externalId" = v."externalId"
269
+ AND (p."metricsUpdatedAt" IS NULL OR v."observedAt" >= p."metricsUpdatedAt")
270
+ `;
271
+
272
+ await this.getRepository().manager.query(sql, params);
273
+ }
274
+ }
275
+
276
+ /**
277
+ * Hard-delete all resources in a cluster whose last snapshot is older
278
+ * than olderThan. Returns the number of deleted rows. Only called by
279
+ * the cleanup worker for clusters that are still connected — a
280
+ * disconnected cluster keeps its last-known inventory.
281
+ */
282
+ @CaptureSpan()
283
+ public async deleteStaleForCluster(data: {
284
+ dockerSwarmClusterId: ObjectID;
285
+ olderThan: Date;
286
+ }): Promise<number> {
287
+ const result: Array<{ affected?: number }> | { affected?: number } =
288
+ await this.getRepository().manager.query(
289
+ `DELETE FROM "DockerSwarmResource" WHERE "dockerSwarmClusterId" = $1 AND "lastSeenAt" < $2`,
290
+ [data.dockerSwarmClusterId.toString(), data.olderThan],
291
+ );
292
+
293
+ // Postgres driver returns [rows, affected] for DELETE — normalize.
294
+ let affected: number = 0;
295
+ if (Array.isArray(result) && result.length >= 2) {
296
+ const second: unknown = (result as Array<unknown>)[1];
297
+ if (typeof second === "number") {
298
+ affected = second;
299
+ }
300
+ }
301
+
302
+ if (affected > STALE_DELETE_WARN_THRESHOLD) {
303
+ logger.warn(
304
+ `DockerSwarmResource cleanup deleted ${affected} stale rows for cluster ${data.dockerSwarmClusterId.toString()} — larger than expected; investigate agent health.`,
305
+ );
306
+ }
307
+
308
+ return affected;
309
+ }
310
+
311
+ /**
312
+ * Compute the sidebar/overview summary in Postgres: counts per kind
313
+ * plus the node-ready and task-running breakdowns, in a single
314
+ * round-trip.
315
+ */
316
+ @CaptureSpan()
317
+ public async getInventorySummary(data: {
318
+ projectId: ObjectID;
319
+ dockerSwarmClusterId: ObjectID;
320
+ }): Promise<DockerSwarmInventorySummary> {
321
+ const rows: Array<{
322
+ kind: string;
323
+ count: string;
324
+ readyCount: string;
325
+ }> = await this.getRepository().manager.query(
326
+ `SELECT "kind",
327
+ COUNT(*)::text AS count,
328
+ COUNT(*) FILTER (WHERE "isReady" IS TRUE)::text AS "readyCount"
329
+ FROM "DockerSwarmResource"
330
+ WHERE "projectId" = $1 AND "dockerSwarmClusterId" = $2 AND "deletedAt" IS NULL
331
+ GROUP BY "kind"`,
332
+ [data.projectId.toString(), data.dockerSwarmClusterId.toString()],
333
+ );
334
+
335
+ const countsByKind: Record<string, number> = {};
336
+ let nodeReadyCount: number = 0;
337
+ let taskRunningCount: number = 0;
338
+ for (const row of rows) {
339
+ countsByKind[row.kind] = parseInt(row.count, 10) || 0;
340
+ if (row.kind === "Node") {
341
+ nodeReadyCount = parseInt(row.readyCount, 10) || 0;
342
+ }
343
+ if (row.kind === "Task") {
344
+ taskRunningCount = parseInt(row.readyCount, 10) || 0;
345
+ }
346
+ }
347
+
348
+ return {
349
+ countsByKind,
350
+ nodeReadyCount,
351
+ taskRunningCount,
352
+ };
353
+ }
354
+
355
+ /**
356
+ * Helper for the cleanup worker: snapshot-interval aware cutoff.
357
+ * 3× the 5-minute snapshot interval by default. Tune via
358
+ * DOCKER_SWARM_INVENTORY_STALE_MINUTES (min 5).
359
+ */
360
+ public getStaleThresholdDate(nowOverride?: Date): Date {
361
+ const minutes: number = this.getStaleThresholdMinutes();
362
+ return OneUptimeDate.addRemoveMinutes(
363
+ nowOverride || OneUptimeDate.getCurrentDate(),
364
+ -minutes,
365
+ );
366
+ }
367
+
368
+ public getStaleThresholdMinutes(): number {
369
+ const raw: string | undefined =
370
+ process.env["DOCKER_SWARM_INVENTORY_STALE_MINUTES"];
371
+ if (raw) {
372
+ const parsed: number = parseInt(raw, 10);
373
+ if (!isNaN(parsed) && parsed >= 5) {
374
+ return parsed;
375
+ }
376
+ }
377
+ return 15;
378
+ }
379
+ }
380
+
381
+ export default new Service();
@@ -72,6 +72,7 @@ export class ExceptionAggregationService {
72
72
  new Map([
73
73
  ["hostId", ServiceType.Host],
74
74
  ["dockerHostId", ServiceType.DockerHost],
75
+ ["podmanHostId", ServiceType.PodmanHost],
75
76
  ["kubernetesClusterId", ServiceType.KubernetesCluster],
76
77
  ["proxmoxClusterId", ServiceType.ProxmoxCluster],
77
78
  ["cephClusterId", ServiceType.CephCluster],
@@ -1,10 +1,60 @@
1
1
  import DatabaseService from "./DatabaseService";
2
2
  import Model from "../../Models/DatabaseModels/GlobalConfig";
3
+ import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
4
+ import ObjectID from "../../Types/ObjectID";
5
+ import { OnUpdate } from "../Types/Database/Hooks";
6
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
3
7
 
4
8
  export class Service extends DatabaseService<Model> {
9
+ /*
10
+ * Caches the instance-wide "Require SSO for Login" flag. This is read on the
11
+ * authenticated request path (per project), so it must not hit Postgres every
12
+ * time. Refreshed at most once per 60s and invalidated on update below.
13
+ */
14
+ private requireSsoForLoginCache: InMemoryTTLCache<boolean> =
15
+ new InMemoryTTLCache(10_000);
16
+
5
17
  public constructor() {
6
18
  super(Model);
7
19
  }
20
+
21
+ /*
22
+ * Instance-wide: must every user sign in with SSO to access projects?
23
+ * (Master admins are exempted by the enforcement layer, not here.)
24
+ */
25
+ @CaptureSpan()
26
+ public async getRequireSsoForLogin(): Promise<boolean> {
27
+ const key: string = "global";
28
+ const cached: boolean | undefined = this.requireSsoForLoginCache.get(key);
29
+ if (cached !== undefined) {
30
+ return cached;
31
+ }
32
+
33
+ const config: Model | null = await this.findOneBy({
34
+ query: {},
35
+ select: { requireSsoForLogin: true },
36
+ props: { isRoot: true },
37
+ });
38
+
39
+ const value: boolean = Boolean(config?.requireSsoForLogin);
40
+ this.requireSsoForLoginCache.set(key, value, 60_000);
41
+ return value;
42
+ }
43
+
44
+ @CaptureSpan()
45
+ protected override async onUpdateSuccess(
46
+ onUpdate: OnUpdate<Model>,
47
+ _updatedItemIds: Array<ObjectID>,
48
+ ): Promise<OnUpdate<Model>> {
49
+ if (
50
+ (onUpdate.updateBy.data as { requireSsoForLogin?: unknown })
51
+ .requireSsoForLogin !== undefined
52
+ ) {
53
+ this.requireSsoForLoginCache.clear();
54
+ }
55
+
56
+ return onUpdate;
57
+ }
8
58
  }
9
59
 
10
60
  export default new Service();
@@ -0,0 +1,85 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import Model from "../../Models/DatabaseModels/GlobalOidcProject";
3
+ import Team from "../../Models/DatabaseModels/Team";
4
+ import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
5
+ import ObjectID from "../../Types/ObjectID";
6
+ import CreateBy from "../Types/Database/CreateBy";
7
+ import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
8
+ import UpdateBy from "../Types/Database/UpdateBy";
9
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
10
+ import validateGlobalProviderProjectTeams, {
11
+ resolveAttachmentProjectId,
12
+ } from "../Utils/ValidateGlobalProviderProjectTeams";
13
+
14
+ export class Service extends DatabaseService<Model> {
15
+ public constructor() {
16
+ super(Model);
17
+ }
18
+
19
+ @CaptureSpan()
20
+ protected override async onBeforeCreate(
21
+ createBy: CreateBy<Model>,
22
+ ): Promise<OnCreate<Model>> {
23
+ /*
24
+ * The attach form submits the project via the `project` relation, so the
25
+ * `projectId` FK is not set yet. Resolve it and persist it (the column is
26
+ * required / NOT NULL) before validating the default teams against it.
27
+ */
28
+ const projectId: ObjectID | undefined = resolveAttachmentProjectId(
29
+ createBy.data,
30
+ );
31
+
32
+ if (projectId) {
33
+ createBy.data.projectId = projectId;
34
+ }
35
+
36
+ await validateGlobalProviderProjectTeams({
37
+ teams: createBy.data.teams,
38
+ projectId,
39
+ });
40
+
41
+ return { createBy, carryForward: null };
42
+ }
43
+
44
+ @CaptureSpan()
45
+ protected override async onBeforeUpdate(
46
+ updateBy: UpdateBy<Model>,
47
+ ): Promise<OnUpdate<Model>> {
48
+ // `updateBy.data` is a partial-entity shape; narrow the relation/id here.
49
+ const teams: Array<Team> | undefined = updateBy.data.teams as unknown as
50
+ | Array<Team>
51
+ | undefined;
52
+
53
+ if (teams && teams.length > 0) {
54
+ const explicitProjectId: ObjectID | undefined = updateBy.data
55
+ .projectId as unknown as ObjectID | undefined;
56
+
57
+ if (explicitProjectId) {
58
+ await validateGlobalProviderProjectTeams({
59
+ teams,
60
+ projectId: explicitProjectId,
61
+ });
62
+ } else {
63
+ // projectId is immutable here; resolve it from the row(s) being updated.
64
+ const rows: Array<Model> = await this.findBy({
65
+ query: updateBy.query,
66
+ select: { _id: true, projectId: true },
67
+ limit: LIMIT_PER_PROJECT,
68
+ skip: 0,
69
+ props: { isRoot: true },
70
+ });
71
+
72
+ for (const row of rows) {
73
+ await validateGlobalProviderProjectTeams({
74
+ teams,
75
+ projectId: row.projectId,
76
+ });
77
+ }
78
+ }
79
+ }
80
+
81
+ return { updateBy, carryForward: null };
82
+ }
83
+ }
84
+
85
+ export default new Service();
@@ -0,0 +1,10 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import Model from "../../Models/DatabaseModels/GlobalOidc";
3
+
4
+ export class Service extends DatabaseService<Model> {
5
+ public constructor() {
6
+ super(Model);
7
+ }
8
+ }
9
+
10
+ export default new Service();
@@ -0,0 +1,85 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import Model from "../../Models/DatabaseModels/GlobalSsoProject";
3
+ import Team from "../../Models/DatabaseModels/Team";
4
+ import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
5
+ import ObjectID from "../../Types/ObjectID";
6
+ import CreateBy from "../Types/Database/CreateBy";
7
+ import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
8
+ import UpdateBy from "../Types/Database/UpdateBy";
9
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
10
+ import validateGlobalProviderProjectTeams, {
11
+ resolveAttachmentProjectId,
12
+ } from "../Utils/ValidateGlobalProviderProjectTeams";
13
+
14
+ export class Service extends DatabaseService<Model> {
15
+ public constructor() {
16
+ super(Model);
17
+ }
18
+
19
+ @CaptureSpan()
20
+ protected override async onBeforeCreate(
21
+ createBy: CreateBy<Model>,
22
+ ): Promise<OnCreate<Model>> {
23
+ /*
24
+ * The attach form submits the project via the `project` relation, so the
25
+ * `projectId` FK is not set yet. Resolve it and persist it (the column is
26
+ * required / NOT NULL) before validating the default teams against it.
27
+ */
28
+ const projectId: ObjectID | undefined = resolveAttachmentProjectId(
29
+ createBy.data,
30
+ );
31
+
32
+ if (projectId) {
33
+ createBy.data.projectId = projectId;
34
+ }
35
+
36
+ await validateGlobalProviderProjectTeams({
37
+ teams: createBy.data.teams,
38
+ projectId,
39
+ });
40
+
41
+ return { createBy, carryForward: null };
42
+ }
43
+
44
+ @CaptureSpan()
45
+ protected override async onBeforeUpdate(
46
+ updateBy: UpdateBy<Model>,
47
+ ): Promise<OnUpdate<Model>> {
48
+ // `updateBy.data` is a partial-entity shape; narrow the relation/id here.
49
+ const teams: Array<Team> | undefined = updateBy.data.teams as unknown as
50
+ | Array<Team>
51
+ | undefined;
52
+
53
+ if (teams && teams.length > 0) {
54
+ const explicitProjectId: ObjectID | undefined = updateBy.data
55
+ .projectId as unknown as ObjectID | undefined;
56
+
57
+ if (explicitProjectId) {
58
+ await validateGlobalProviderProjectTeams({
59
+ teams,
60
+ projectId: explicitProjectId,
61
+ });
62
+ } else {
63
+ // projectId is immutable here; resolve it from the row(s) being updated.
64
+ const rows: Array<Model> = await this.findBy({
65
+ query: updateBy.query,
66
+ select: { _id: true, projectId: true },
67
+ limit: LIMIT_PER_PROJECT,
68
+ skip: 0,
69
+ props: { isRoot: true },
70
+ });
71
+
72
+ for (const row of rows) {
73
+ await validateGlobalProviderProjectTeams({
74
+ teams,
75
+ projectId: row.projectId,
76
+ });
77
+ }
78
+ }
79
+ }
80
+
81
+ return { updateBy, carryForward: null };
82
+ }
83
+ }
84
+
85
+ export default new Service();
@@ -0,0 +1,10 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import Model from "../../Models/DatabaseModels/GlobalSso";
3
+
4
+ export class Service extends DatabaseService<Model> {
5
+ public constructor() {
6
+ super(Model);
7
+ }
8
+ }
9
+
10
+ export default new Service();