@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
@@ -1,8 +1,8 @@
1
1
  import AccessTokenService from "../Services/AccessTokenService";
2
+ import GlobalConfigService from "../Services/GlobalConfigService";
2
3
  import ProjectService from "../Services/ProjectService";
3
4
  import TeamMemberService from "../Services/TeamMemberService";
4
5
  import UserService from "../Services/UserService";
5
- import QueryHelper from "../Types/Database/QueryHelper";
6
6
  import CookieUtil from "../Utils/Cookie";
7
7
  import {
8
8
  ExpressRequest,
@@ -16,7 +16,6 @@ import logger, { getLogAttributesFromRequest } from "../Utils/Logger";
16
16
  import Response from "../Utils/Response";
17
17
  import ProjectMiddleware from "./ProjectAuthorization";
18
18
  import SpanUtil from "../Utils/Telemetry/SpanUtil";
19
- import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
20
19
  import Dictionary from "../../Types/Dictionary";
21
20
  import Exception from "../../Types/Exception/Exception";
22
21
  import NotAuthenticatedException from "../../Types/Exception/NotAuthenticatedException";
@@ -35,7 +34,6 @@ import Permission, {
35
34
  UserTenantAccessPermission,
36
35
  } from "../../Types/Permission";
37
36
  import UserType from "../../Types/UserType";
38
- import Project from "../../Models/DatabaseModels/Project";
39
37
  import UserPermissionUtil from "../Utils/UserPermission/UserPermission";
40
38
 
41
39
  export default class UserMiddleware {
@@ -170,6 +168,7 @@ export default class UserMiddleware {
170
168
  req: ExpressRequest,
171
169
  projectId: ObjectID,
172
170
  userId: ObjectID,
171
+ requiredSsoProviderId?: ObjectID | undefined,
173
172
  ): boolean {
174
173
  const ssoTokens: Dictionary<string> = this.getSsoTokens(req);
175
174
 
@@ -181,6 +180,25 @@ export default class UserMiddleware {
181
180
  decodedData.projectId?.toString() === projectId.toString() &&
182
181
  decodedData.userId.toString() === userId.toString()
183
182
  ) {
183
+ /*
184
+ * Specific-IdP enforcement: when the project requires a specific SSO
185
+ * provider, the token must carry a matching `ssoProviderId`
186
+ * discriminator. Tokens issued before this field existed (no
187
+ * discriminator) do not satisfy a specific-provider requirement.
188
+ */
189
+ if (requiredSsoProviderId) {
190
+ const tokenProviderId: string | undefined = decodedData.ssoProviderId
191
+ ? decodedData.ssoProviderId.toString()
192
+ : undefined;
193
+
194
+ if (
195
+ !tokenProviderId ||
196
+ tokenProviderId !== requiredSsoProviderId.toString()
197
+ ) {
198
+ return false;
199
+ }
200
+ }
201
+
184
202
  return true;
185
203
  }
186
204
  }
@@ -493,12 +511,15 @@ export default class UserMiddleware {
493
511
  }): Promise<UserTenantAccessPermission | null> {
494
512
  const { req, tenantId, userId } = data;
495
513
 
514
+ const isMasterAdmin: boolean =
515
+ (req as OneUptimeRequest).userAuthorization?.isMasterAdmin === true;
516
+
496
517
  /*
497
518
  * Resolve the SSO requirement and the tenant permission in parallel.
498
519
  * `getRequireSsoForLogin` is cached in-process for 60s, so this is
499
520
  * usually free; the tenant permission lookup is the expensive call.
500
521
  */
501
- const [requireSsoForLogin, tenantPermission]: [
522
+ const [projectRequireSsoForLogin, tenantPermission]: [
502
523
  boolean,
503
524
  UserTenantAccessPermission | null,
504
525
  ] = await Promise.all([
@@ -515,11 +536,42 @@ export default class UserMiddleware {
515
536
  AccessTokenService.getUserTenantAccessPermission(userId, tenantId),
516
537
  ]);
517
538
 
518
- if (
519
- requireSsoForLogin &&
520
- !UserMiddleware.doesSsoTokenForProjectExist(req, tenantId, userId)
521
- ) {
522
- throw new SsoAuthorizationException();
539
+ /*
540
+ * The instance-wide "Require SSO for Login" flag (GlobalConfig) forces SSO
541
+ * on every project. Master admins are exempt so a misconfigured global SSO
542
+ * can't lock them out — a project's own requireSsoForLogin still applies to
543
+ * them. Only checked when the project doesn't already enforce SSO.
544
+ */
545
+ let requireSsoForLogin: boolean = projectRequireSsoForLogin;
546
+ if (!requireSsoForLogin && !isMasterAdmin) {
547
+ requireSsoForLogin =
548
+ await GlobalConfigService.getRequireSsoForLogin().catch(() => {
549
+ return false;
550
+ });
551
+ }
552
+
553
+ if (requireSsoForLogin) {
554
+ /*
555
+ * Only resolve the specific-provider requirement when SSO is enforced.
556
+ * The provider-id cache is already warm from getRequireSsoForLogin above.
557
+ */
558
+ const requiredSsoProviderId: ObjectID | null =
559
+ await ProjectService.getRequireSsoWithSsoProviderId(tenantId).catch(
560
+ () => {
561
+ return null;
562
+ },
563
+ );
564
+
565
+ if (
566
+ !UserMiddleware.doesSsoTokenForProjectExist(
567
+ req,
568
+ tenantId,
569
+ userId,
570
+ requiredSsoProviderId ?? undefined,
571
+ )
572
+ ) {
573
+ throw new SsoAuthorizationException();
574
+ }
523
575
  }
524
576
 
525
577
  return tenantPermission;
@@ -535,48 +587,67 @@ export default class UserMiddleware {
535
587
  return null;
536
588
  }
537
589
 
538
- const projects: Array<Project> = await ProjectService.findBy({
539
- query: {
540
- _id: QueryHelper.any(
541
- projectIds.map((i: ObjectID) => {
542
- return i.toString();
543
- }) || [],
544
- ),
545
- },
546
- select: {
547
- requireSsoForLogin: true,
548
- },
549
- limit: LIMIT_PER_PROJECT,
550
- skip: 0,
551
- props: {
552
- isRoot: true,
553
- },
554
- });
590
+ const isMasterAdmin: boolean =
591
+ (req as OneUptimeRequest).userAuthorization?.isMasterAdmin === true;
592
+
593
+ /*
594
+ * Instance-wide "Require SSO for Login" forces SSO on every project. Master
595
+ * admins are exempt. Resolved once (cached) rather than per project.
596
+ */
597
+ const globalRequireSsoForLogin: boolean = isMasterAdmin
598
+ ? false
599
+ : await GlobalConfigService.getRequireSsoForLogin().catch(() => {
600
+ return false;
601
+ });
555
602
 
556
603
  /*
557
- * Resolve permissions for every project in parallel. With the previous
558
- * for-await loop this scaled linearly with project count, adding one
559
- * round-trip per project even on cache hits.
604
+ * Resolve permissions for every project in parallel. A project's own
605
+ * requireSsoForLogin is read through the cached getter; the global flag is
606
+ * OR'd in so enforcement matches the single-tenant path.
560
607
  */
561
608
  const resolved: Array<{
562
609
  projectId: ObjectID;
563
610
  permission: UserTenantAccessPermission | null;
564
611
  }> = await Promise.all(
565
612
  projectIds.map(async (projectId: ObjectID) => {
566
- if (
567
- projects.find((p: Project) => {
568
- return p._id === projectId.toString() && p.requireSsoForLogin;
569
- }) &&
570
- !UserMiddleware.doesSsoTokenForProjectExist(req, projectId, userId)
571
- ) {
572
- return {
573
- projectId,
574
- permission:
575
- UserPermissionUtil.getDefaultUserTenantAccessPermission(
576
- projectId,
577
- ),
578
- };
613
+ const projectRequireSsoForLogin: boolean =
614
+ await ProjectService.getRequireSsoForLogin(projectId).catch(() => {
615
+ /*
616
+ * Unknown/inaccessible project: do not enforce SSO here. Actual
617
+ * access is still gated by AccessTokenService below.
618
+ */
619
+ return false;
620
+ });
621
+
622
+ const requireSsoForLogin: boolean =
623
+ projectRequireSsoForLogin || globalRequireSsoForLogin;
624
+
625
+ if (requireSsoForLogin) {
626
+ const requiredSsoProviderId: ObjectID | null =
627
+ await ProjectService.getRequireSsoWithSsoProviderId(
628
+ projectId,
629
+ ).catch(() => {
630
+ return null;
631
+ });
632
+
633
+ if (
634
+ !UserMiddleware.doesSsoTokenForProjectExist(
635
+ req,
636
+ projectId,
637
+ userId,
638
+ requiredSsoProviderId ?? undefined,
639
+ )
640
+ ) {
641
+ return {
642
+ projectId,
643
+ permission:
644
+ UserPermissionUtil.getDefaultUserTenantAccessPermission(
645
+ projectId,
646
+ ),
647
+ };
648
+ }
579
649
  }
650
+
580
651
  return {
581
652
  projectId,
582
653
  permission: await AccessTokenService.getUserTenantAccessPermission(
@@ -6,11 +6,13 @@ import Host from "../../Models/DatabaseModels/Host";
6
6
  import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
7
7
  import Label from "../../Models/DatabaseModels/Label";
8
8
  import Monitor from "../../Models/DatabaseModels/Monitor";
9
+ import PodmanHost from "../../Models/DatabaseModels/PodmanHost";
9
10
  import Service from "../../Models/DatabaseModels/Service";
10
11
  import AlertFeedService from "./AlertFeedService";
11
12
  import AlertLabelRuleService from "./AlertLabelRuleService";
12
13
  import AlertService from "./AlertService";
13
14
  import DockerHostService from "./DockerHostService";
15
+ import PodmanHostService from "./PodmanHostService";
14
16
  import HostService from "./HostService";
15
17
  import KubernetesClusterService from "./KubernetesClusterService";
16
18
  import LabelService from "./LabelService";
@@ -33,6 +35,7 @@ class AlertLabelRuleEngineServiceClass {
33
35
  * - all labels of the alert's hosts when `inheritLabelsFromHosts`
34
36
  * - all labels of the alert's Kubernetes clusters when `inheritLabelsFromKubernetesClusters`
35
37
  * - all labels of the alert's Docker hosts when `inheritLabelsFromDockerHosts`
38
+ * - all labels of the alert's Podman hosts when `inheritLabelsFromPodmanHosts`
36
39
  * - all labels of the alert's services when `inheritLabelsFromServices`
37
40
  * The union is deduped against labels already on the alert before insert
38
41
  * to avoid PK conflicts on the AlertLabel join table.
@@ -66,6 +69,7 @@ class AlertLabelRuleEngineServiceClass {
66
69
  inheritLabelsFromHosts: true,
67
70
  inheritLabelsFromKubernetesClusters: true,
68
71
  inheritLabelsFromDockerHosts: true,
72
+ inheritLabelsFromPodmanHosts: true,
69
73
  inheritLabelsFromServices: true,
70
74
  },
71
75
  limit: 100,
@@ -81,6 +85,7 @@ class AlertLabelRuleEngineServiceClass {
81
85
  let inheritFromHosts: boolean = false;
82
86
  let inheritFromKubernetesClusters: boolean = false;
83
87
  let inheritFromDockerHosts: boolean = false;
88
+ let inheritFromPodmanHosts: boolean = false;
84
89
  let inheritFromServices: boolean = false;
85
90
  const matchedRules: Array<AlertLabelRule> = [];
86
91
 
@@ -107,6 +112,9 @@ class AlertLabelRuleEngineServiceClass {
107
112
  if (rule.inheritLabelsFromDockerHosts) {
108
113
  inheritFromDockerHosts = true;
109
114
  }
115
+ if (rule.inheritLabelsFromPodmanHosts) {
116
+ inheritFromPodmanHosts = true;
117
+ }
110
118
  if (rule.inheritLabelsFromServices) {
111
119
  inheritFromServices = true;
112
120
  }
@@ -116,6 +124,7 @@ class AlertLabelRuleEngineServiceClass {
116
124
  inheritFromHosts ||
117
125
  inheritFromKubernetesClusters ||
118
126
  inheritFromDockerHosts ||
127
+ inheritFromPodmanHosts ||
119
128
  inheritFromServices;
120
129
 
121
130
  let alertWithResources: Alert | null = null;
@@ -126,6 +135,7 @@ class AlertLabelRuleEngineServiceClass {
126
135
  hosts: { _id: true },
127
136
  kubernetesClusters: { _id: true },
128
137
  dockerHosts: { _id: true },
138
+ podmanHosts: { _id: true },
129
139
  services: { _id: true },
130
140
  },
131
141
  props: { isRoot: true },
@@ -204,6 +214,25 @@ class AlertLabelRuleEngineServiceClass {
204
214
  }
205
215
  }
206
216
 
217
+ if (inheritFromPodmanHosts && alertWithResources?.podmanHosts?.length) {
218
+ for (const alertPodmanHost of alertWithResources.podmanHosts) {
219
+ if (!alertPodmanHost.id) {
220
+ continue;
221
+ }
222
+ const podmanHost: PodmanHost | null =
223
+ await PodmanHostService.findOneById({
224
+ id: alertPodmanHost.id,
225
+ select: { labels: { _id: true } },
226
+ props: { isRoot: true },
227
+ });
228
+ for (const label of podmanHost?.labels || []) {
229
+ if (label.id) {
230
+ labelIdsToAdd.add(label.id.toString());
231
+ }
232
+ }
233
+ }
234
+ }
235
+
207
236
  if (inheritFromServices && alertWithResources?.services?.length) {
208
237
  for (const alertService of alertWithResources.services) {
209
238
  if (!alertService.id) {
@@ -14,6 +14,9 @@ import Label from "../../Models/DatabaseModels/Label";
14
14
  import Monitor from "../../Models/DatabaseModels/Monitor";
15
15
  import MonitorOwnerTeam from "../../Models/DatabaseModels/MonitorOwnerTeam";
16
16
  import MonitorOwnerUser from "../../Models/DatabaseModels/MonitorOwnerUser";
17
+ import PodmanHost from "../../Models/DatabaseModels/PodmanHost";
18
+ import PodmanHostOwnerTeam from "../../Models/DatabaseModels/PodmanHostOwnerTeam";
19
+ import PodmanHostOwnerUser from "../../Models/DatabaseModels/PodmanHostOwnerUser";
17
20
  import Service from "../../Models/DatabaseModels/Service";
18
21
  import ServiceOwnerTeam from "../../Models/DatabaseModels/ServiceOwnerTeam";
19
22
  import ServiceOwnerUser from "../../Models/DatabaseModels/ServiceOwnerUser";
@@ -31,6 +34,8 @@ import KubernetesClusterOwnerUserService from "./KubernetesClusterOwnerUserServi
31
34
  import MonitorOwnerTeamService from "./MonitorOwnerTeamService";
32
35
  import MonitorOwnerUserService from "./MonitorOwnerUserService";
33
36
  import MonitorService from "./MonitorService";
37
+ import PodmanHostOwnerTeamService from "./PodmanHostOwnerTeamService";
38
+ import PodmanHostOwnerUserService from "./PodmanHostOwnerUserService";
34
39
  import ServiceOwnerTeamService from "./ServiceOwnerTeamService";
35
40
  import ServiceOwnerUserService from "./ServiceOwnerUserService";
36
41
  import TeamService from "./TeamService";
@@ -79,6 +84,7 @@ class AlertOwnerRuleEngineServiceClass {
79
84
  inheritOwnersFromHosts: true,
80
85
  inheritOwnersFromKubernetesClusters: true,
81
86
  inheritOwnersFromDockerHosts: true,
87
+ inheritOwnersFromPodmanHosts: true,
82
88
  inheritOwnersFromServices: true,
83
89
  },
84
90
  limit: 100,
@@ -105,6 +111,7 @@ class AlertOwnerRuleEngineServiceClass {
105
111
  let inheritFromHosts: boolean = false;
106
112
  let inheritFromKubernetesClusters: boolean = false;
107
113
  let inheritFromDockerHosts: boolean = false;
114
+ let inheritFromPodmanHosts: boolean = false;
108
115
  let inheritFromServices: boolean = false;
109
116
  const inheritNotifyMode: { value: boolean | null } = { value: null };
110
117
 
@@ -153,6 +160,12 @@ class AlertOwnerRuleEngineServiceClass {
153
160
  inheritNotifyMode.value =
154
161
  inheritNotifyMode.value === true ? true : notify;
155
162
  }
163
+ if (rule.inheritOwnersFromPodmanHosts) {
164
+ inheritFromPodmanHosts = true;
165
+ ruleAddedAny = true;
166
+ inheritNotifyMode.value =
167
+ inheritNotifyMode.value === true ? true : notify;
168
+ }
156
169
  if (rule.inheritOwnersFromServices) {
157
170
  inheritFromServices = true;
158
171
  ruleAddedAny = true;
@@ -172,6 +185,8 @@ class AlertOwnerRuleEngineServiceClass {
172
185
  const inheritedFromKubernetesClusterTeamIds: Set<string> = new Set();
173
186
  const inheritedFromDockerHostUserIds: Set<string> = new Set();
174
187
  const inheritedFromDockerHostTeamIds: Set<string> = new Set();
188
+ const inheritedFromPodmanHostUserIds: Set<string> = new Set();
189
+ const inheritedFromPodmanHostTeamIds: Set<string> = new Set();
175
190
  const inheritedFromServiceUserIds: Set<string> = new Set();
176
191
  const inheritedFromServiceTeamIds: Set<string> = new Set();
177
192
 
@@ -334,6 +349,47 @@ class AlertOwnerRuleEngineServiceClass {
334
349
  }
335
350
  }
336
351
 
352
+ if (inheritFromPodmanHosts && alert.podmanHosts?.length) {
353
+ const podmanHostIds: Array<ObjectID> = alert.podmanHosts
354
+ .map((p: PodmanHost) => {
355
+ return p.id;
356
+ })
357
+ .filter((id: ObjectID | null | undefined): id is ObjectID => {
358
+ return Boolean(id);
359
+ });
360
+ if (podmanHostIds.length > 0) {
361
+ const [podmanHostOwnerUsers, podmanHostOwnerTeams]: [
362
+ Array<PodmanHostOwnerUser>,
363
+ Array<PodmanHostOwnerTeam>,
364
+ ] = await Promise.all([
365
+ PodmanHostOwnerUserService.findBy({
366
+ query: { podmanHostId: QueryHelper.any(podmanHostIds) },
367
+ select: { userId: true },
368
+ props: { isRoot: true },
369
+ limit: LIMIT_MAX,
370
+ skip: 0,
371
+ }),
372
+ PodmanHostOwnerTeamService.findBy({
373
+ query: { podmanHostId: QueryHelper.any(podmanHostIds) },
374
+ select: { teamId: true },
375
+ props: { isRoot: true },
376
+ limit: LIMIT_MAX,
377
+ skip: 0,
378
+ }),
379
+ ]);
380
+ for (const ownerUser of podmanHostOwnerUsers) {
381
+ if (ownerUser.userId) {
382
+ inheritedFromPodmanHostUserIds.add(ownerUser.userId.toString());
383
+ }
384
+ }
385
+ for (const ownerTeam of podmanHostOwnerTeams) {
386
+ if (ownerTeam.teamId) {
387
+ inheritedFromPodmanHostTeamIds.add(ownerTeam.teamId.toString());
388
+ }
389
+ }
390
+ }
391
+ }
392
+
337
393
  if (inheritFromServices && alert.services?.length) {
338
394
  const serviceIds: Array<ObjectID> = alert.services
339
395
  .map((s: Service) => {
@@ -380,6 +436,7 @@ class AlertOwnerRuleEngineServiceClass {
380
436
  ...inheritedFromHostUserIds,
381
437
  ...inheritedFromKubernetesClusterUserIds,
382
438
  ...inheritedFromDockerHostUserIds,
439
+ ...inheritedFromPodmanHostUserIds,
383
440
  ...inheritedFromServiceUserIds,
384
441
  ]);
385
442
  const inheritedTeamIds: Set<string> = new Set([
@@ -387,6 +444,7 @@ class AlertOwnerRuleEngineServiceClass {
387
444
  ...inheritedFromHostTeamIds,
388
445
  ...inheritedFromKubernetesClusterTeamIds,
389
446
  ...inheritedFromDockerHostTeamIds,
447
+ ...inheritedFromPodmanHostTeamIds,
390
448
  ...inheritedFromServiceTeamIds,
391
449
  ]);
392
450
 
@@ -458,6 +516,10 @@ class AlertOwnerRuleEngineServiceClass {
458
516
  inheritedFromDockerHostUserIds.size +
459
517
  inheritedFromDockerHostTeamIds.size >
460
518
  0,
519
+ inheritedFromPodmanHosts:
520
+ inheritedFromPodmanHostUserIds.size +
521
+ inheritedFromPodmanHostTeamIds.size >
522
+ 0,
461
523
  inheritedFromServices:
462
524
  inheritedFromServiceUserIds.size + inheritedFromServiceTeamIds.size >
463
525
  0,
@@ -480,6 +542,7 @@ class AlertOwnerRuleEngineServiceClass {
480
542
  inheritedFromHosts: boolean;
481
543
  inheritedFromKubernetesClusters: boolean;
482
544
  inheritedFromDockerHosts: boolean;
545
+ inheritedFromPodmanHosts: boolean;
483
546
  inheritedFromServices: boolean;
484
547
  }): Promise<void> {
485
548
  const {
@@ -491,6 +554,7 @@ class AlertOwnerRuleEngineServiceClass {
491
554
  inheritedFromHosts,
492
555
  inheritedFromKubernetesClusters,
493
556
  inheritedFromDockerHosts,
557
+ inheritedFromPodmanHosts,
494
558
  inheritedFromServices,
495
559
  } = data;
496
560
  if (
@@ -575,6 +639,9 @@ class AlertOwnerRuleEngineServiceClass {
575
639
  if (inheritedFromDockerHosts) {
576
640
  inheritedSources.push("Docker hosts");
577
641
  }
642
+ if (inheritedFromPodmanHosts) {
643
+ inheritedSources.push("Podman hosts");
644
+ }
578
645
  if (inheritedFromServices) {
579
646
  inheritedSources.push("services");
580
647
  }
@@ -0,0 +1,214 @@
1
+ import Label from "../../Models/DatabaseModels/Label";
2
+ import DockerSwarmCluster from "../../Models/DatabaseModels/DockerSwarmCluster";
3
+ import DockerSwarmClusterLabelRule from "../../Models/DatabaseModels/DockerSwarmClusterLabelRule";
4
+ import DockerSwarmClusterLabelRuleService from "./DockerSwarmClusterLabelRuleService";
5
+ import DockerSwarmClusterService from "./DockerSwarmClusterService";
6
+ import ObjectID from "../../Types/ObjectID";
7
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
8
+ import logger, { LogAttributes } from "../Utils/Logger";
9
+
10
+ class DockerSwarmClusterLabelRuleEngineServiceClass {
11
+ /**
12
+ * Evaluates DockerSwarmClusterLabelRule rows for the given DockerSwarm cluster and attaches matched
13
+ * labels to it. The union is deduped against labels already on the DockerSwarm cluster
14
+ * before insert to avoid PK conflicts on the join table.
15
+ */
16
+ @CaptureSpan()
17
+ public async applyRulesToDockerSwarmCluster(
18
+ dockerSwarmCluster: DockerSwarmCluster,
19
+ ): Promise<void> {
20
+ if (!dockerSwarmCluster.id || !dockerSwarmCluster.projectId) {
21
+ return;
22
+ }
23
+
24
+ try {
25
+ const rules: Array<DockerSwarmClusterLabelRule> =
26
+ await DockerSwarmClusterLabelRuleService.findBy({
27
+ query: {
28
+ projectId: dockerSwarmCluster.projectId,
29
+ isEnabled: true,
30
+ },
31
+ props: { isRoot: true },
32
+ select: {
33
+ _id: true,
34
+ name: true,
35
+ dockerSwarmClusterLabels: { _id: true },
36
+ dockerSwarmClusterNamePattern: true,
37
+ dockerSwarmClusterDescriptionPattern: true,
38
+ labelsToAdd: { _id: true },
39
+ },
40
+ limit: 100,
41
+ skip: 0,
42
+ });
43
+
44
+ if (rules.length === 0) {
45
+ return;
46
+ }
47
+
48
+ const dockerSwarmClusterWithDetails: DockerSwarmCluster | null =
49
+ await DockerSwarmClusterService.findOneById({
50
+ id: dockerSwarmCluster.id,
51
+ select: {
52
+ name: true,
53
+ description: true,
54
+ labels: { _id: true },
55
+ },
56
+ props: { isRoot: true },
57
+ });
58
+
59
+ if (!dockerSwarmClusterWithDetails) {
60
+ return;
61
+ }
62
+
63
+ const labelIdsToAdd: Set<string> = new Set();
64
+
65
+ for (const rule of rules) {
66
+ const matches: boolean = this.doesDockerSwarmClusterMatchRule(
67
+ dockerSwarmClusterWithDetails,
68
+ rule,
69
+ );
70
+ if (!matches) {
71
+ continue;
72
+ }
73
+ for (const label of rule.labelsToAdd || []) {
74
+ if (label.id) {
75
+ labelIdsToAdd.add(label.id.toString());
76
+ }
77
+ }
78
+ }
79
+
80
+ if (labelIdsToAdd.size === 0) {
81
+ return;
82
+ }
83
+
84
+ const existingLabelIds: Set<string> = new Set(
85
+ (dockerSwarmClusterWithDetails.labels || [])
86
+ .map((l: Label) => {
87
+ return l.id?.toString() || "";
88
+ })
89
+ .filter((id: string) => {
90
+ return id !== "";
91
+ }),
92
+ );
93
+
94
+ const newLabelIds: Array<string> = Array.from(labelIdsToAdd).filter(
95
+ (id: string) => {
96
+ return !existingLabelIds.has(id);
97
+ },
98
+ );
99
+ if (newLabelIds.length === 0) {
100
+ return;
101
+ }
102
+
103
+ await DockerSwarmClusterService.getRepository()
104
+ .createQueryBuilder()
105
+ .relation(DockerSwarmCluster, "labels")
106
+ .of(dockerSwarmCluster.id.toString())
107
+ .add(newLabelIds);
108
+
109
+ /*
110
+ * Sync in-memory dockerSwarmCluster.labels so a downstream owner-rule engine in
111
+ * the same onCreateSuccess chain can match on rule-added labels.
112
+ */
113
+ const mergedLabelIds: Set<string> = new Set([
114
+ ...existingLabelIds,
115
+ ...newLabelIds,
116
+ ]);
117
+ dockerSwarmCluster.labels = Array.from(mergedLabelIds).map(
118
+ (id: string) => {
119
+ const label: Label = new Label();
120
+ label.id = new ObjectID(id);
121
+ return label;
122
+ },
123
+ );
124
+
125
+ logger.debug(
126
+ `DockerSwarmClusterLabelRuleEngine attached ${newLabelIds.length} labels to DockerSwarm cluster ${dockerSwarmCluster.id}`,
127
+ { projectId: dockerSwarmCluster.projectId.toString() } as LogAttributes,
128
+ );
129
+ } catch (error) {
130
+ logger.error(`Error applying DockerSwarm cluster label rules: ${error}`, {
131
+ projectId: dockerSwarmCluster.projectId?.toString(),
132
+ dockerSwarmClusterId: dockerSwarmCluster.id?.toString(),
133
+ } as LogAttributes);
134
+ }
135
+ }
136
+
137
+ private doesDockerSwarmClusterMatchRule(
138
+ dockerSwarmCluster: DockerSwarmCluster,
139
+ rule: DockerSwarmClusterLabelRule,
140
+ ): boolean {
141
+ if (
142
+ rule.dockerSwarmClusterLabels &&
143
+ rule.dockerSwarmClusterLabels.length > 0
144
+ ) {
145
+ if (
146
+ !dockerSwarmCluster.labels ||
147
+ dockerSwarmCluster.labels.length === 0
148
+ ) {
149
+ return false;
150
+ }
151
+ const ruleLabelIds: Array<string> = rule.dockerSwarmClusterLabels.map(
152
+ (l: Label) => {
153
+ return l.id?.toString() || "";
154
+ },
155
+ );
156
+ const labelIds: Array<string> = dockerSwarmCluster.labels.map(
157
+ (l: Label) => {
158
+ return l.id?.toString() || "";
159
+ },
160
+ );
161
+ if (
162
+ !ruleLabelIds.some((id: string) => {
163
+ return labelIds.includes(id);
164
+ })
165
+ ) {
166
+ return false;
167
+ }
168
+ }
169
+
170
+ if (
171
+ rule.dockerSwarmClusterNamePattern &&
172
+ (!dockerSwarmCluster.name ||
173
+ !this.testRegex(
174
+ rule.dockerSwarmClusterNamePattern,
175
+ dockerSwarmCluster.name,
176
+ rule,
177
+ ))
178
+ ) {
179
+ return false;
180
+ }
181
+
182
+ if (
183
+ rule.dockerSwarmClusterDescriptionPattern &&
184
+ (!dockerSwarmCluster.description ||
185
+ !this.testRegex(
186
+ rule.dockerSwarmClusterDescriptionPattern,
187
+ dockerSwarmCluster.description,
188
+ rule,
189
+ ))
190
+ ) {
191
+ return false;
192
+ }
193
+
194
+ return true;
195
+ }
196
+
197
+ private testRegex(
198
+ pattern: string,
199
+ value: string,
200
+ rule: DockerSwarmClusterLabelRule,
201
+ ): boolean {
202
+ try {
203
+ const regex: RegExp = new RegExp(pattern, "i");
204
+ return regex.test(value);
205
+ } catch {
206
+ logger.warn(
207
+ `Invalid regex in DockerSwarm cluster label rule ${rule.id}: ${pattern}`,
208
+ );
209
+ return false;
210
+ }
211
+ }
212
+ }
213
+
214
+ export default new DockerSwarmClusterLabelRuleEngineServiceClass();
@@ -0,0 +1,14 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import Model from "../../Models/DatabaseModels/DockerSwarmClusterLabelRule";
3
+ import { IsBillingEnabled } from "../EnvironmentConfig";
4
+
5
+ export class Service extends DatabaseService<Model> {
6
+ public constructor() {
7
+ super(Model);
8
+ if (IsBillingEnabled) {
9
+ this.hardDeleteItemsOlderThanInDays("createdAt", 3 * 365);
10
+ }
11
+ }
12
+ }
13
+
14
+ export default new Service();