@oneuptime/common 13.0.5 → 13.0.6

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 (1091) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +81 -1
  2. package/Models/AnalyticsModels/SecurityEvent.ts +4 -4
  3. package/Models/DatabaseModels/Alert.ts +62 -0
  4. package/Models/DatabaseModels/GlobalConfig.ts +1 -1
  5. package/Models/DatabaseModels/Incident.ts +66 -0
  6. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +74 -0
  7. package/Models/DatabaseModels/IncidentPublicNote.ts +74 -0
  8. package/Models/DatabaseModels/Index.ts +6 -4
  9. package/Models/DatabaseModels/NetworkDevice.ts +67 -0
  10. package/Models/DatabaseModels/NetworkDeviceDiagnostic.ts +746 -0
  11. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +151 -0
  12. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +1 -1
  13. package/Models/DatabaseModels/Project.ts +41 -0
  14. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +74 -0
  15. package/Models/DatabaseModels/SecurityEventConnection.ts +11 -11
  16. package/Models/DatabaseModels/ServiceLevelObjective.ts +185 -8
  17. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +746 -43
  18. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +575 -0
  19. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +582 -0
  20. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +16 -0
  21. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +16 -0
  22. package/Models/DatabaseModels/StatusPageAnnouncement.ts +75 -0
  23. package/Models/DatabaseModels/ThreatIntelFeed.ts +1 -1
  24. package/Server/API/BaseAPI.ts +17 -0
  25. package/Server/API/BillingInvoiceAPI.ts +343 -30
  26. package/Server/API/BillingPaymentMethodAPI.ts +126 -5
  27. package/Server/API/DashboardAPI.ts +96 -2
  28. package/Server/API/SecurityEventConnectionAPI.ts +141 -11
  29. package/Server/API/StatusPageAPI.ts +308 -199
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.ts +83 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.ts +36 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.ts +29 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.ts +516 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.ts +98 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.ts +27 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.ts +97 -0
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  38. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +138 -67
  39. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +213 -84
  40. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +112 -35
  41. package/Server/Services/AlertLabelRuleEngineService.ts +299 -217
  42. package/Server/Services/AlertOwnerRuleEngineService.ts +572 -396
  43. package/Server/Services/AlertPrivacyRuleEngineService.ts +116 -40
  44. package/Server/Services/AlertService.ts +111 -4
  45. package/Server/Services/AuditLogService.ts +612 -59
  46. package/Server/Services/BillingInvoiceService.ts +112 -102
  47. package/Server/Services/BillingService.ts +539 -11
  48. package/Server/Services/CephClusterLabelRuleEngineService.ts +170 -109
  49. package/Server/Services/CephClusterOwnerRuleEngineService.ts +233 -115
  50. package/Server/Services/CloudResourceLabelRuleEngineService.ts +163 -100
  51. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +236 -115
  52. package/Server/Services/DashboardLabelRuleEngineService.ts +145 -84
  53. package/Server/Services/DashboardOwnerRuleEngineService.ts +213 -95
  54. package/Server/Services/DatabaseService.ts +171 -21
  55. package/Server/Services/DockerHostLabelRuleEngineService.ts +171 -110
  56. package/Server/Services/DockerHostOwnerRuleEngineService.ts +233 -115
  57. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +181 -112
  58. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +243 -118
  59. package/Server/Services/HostLabelRuleEngineService.ts +167 -106
  60. package/Server/Services/HostOwnerRuleEngineService.ts +229 -111
  61. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +141 -67
  62. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +272 -72
  63. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +112 -35
  64. package/Server/Services/IncidentEpisodePublicNoteService.ts +24 -0
  65. package/Server/Services/IncidentLabelRuleEngineService.ts +279 -204
  66. package/Server/Services/IncidentOwnerRuleEngineService.ts +595 -425
  67. package/Server/Services/IncidentPrivacyRuleEngineService.ts +117 -44
  68. package/Server/Services/IncidentPublicNoteService.ts +24 -0
  69. package/Server/Services/IncidentService.ts +114 -3
  70. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +147 -83
  71. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +221 -100
  72. package/Server/Services/Index.ts +6 -4
  73. package/Server/Services/IoTFleetLabelRuleEngineService.ts +145 -84
  74. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +213 -95
  75. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +181 -112
  76. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +243 -118
  77. package/Server/Services/LabelService.ts +23 -28
  78. package/Server/Services/MonitorLabelRuleEngineService.ts +152 -92
  79. package/Server/Services/MonitorOwnerRuleEngineService.ts +220 -104
  80. package/Server/Services/MonitorProbeService.ts +20 -2
  81. package/Server/Services/MonitorService.ts +11 -9
  82. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +376 -5
  83. package/Server/Services/NetworkDeviceDiagnosticService.ts +417 -0
  84. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +147 -83
  85. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +218 -97
  86. package/Server/Services/NetworkDeviceService.ts +39 -2
  87. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +151 -80
  88. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +222 -97
  89. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +154 -83
  90. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +225 -100
  91. package/Server/Services/PodmanHostLabelRuleEngineService.ts +171 -110
  92. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +235 -115
  93. package/Server/Services/ProjectService.ts +111 -10
  94. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +174 -110
  95. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +239 -116
  96. package/Server/Services/RumApplicationLabelRuleEngineService.ts +137 -73
  97. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +200 -83
  98. package/Server/Services/RunbookLabelRuleEngineService.ts +146 -84
  99. package/Server/Services/RunbookOwnerRuleEngineService.ts +216 -95
  100. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +324 -230
  101. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +613 -428
  102. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +24 -0
  103. package/Server/Services/ScheduledMaintenanceService.ts +43 -14
  104. package/Server/Services/SecurityEventConnectionService.ts +56 -4
  105. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +143 -74
  106. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +206 -85
  107. package/Server/Services/ServiceLabelRuleEngineService.ts +172 -110
  108. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +1057 -18
  109. package/Server/Services/ServiceLevelObjectiveFeedService.ts +108 -0
  110. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +793 -97
  111. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +1069 -0
  112. package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +240 -1
  113. package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +257 -1
  114. package/Server/Services/ServiceLevelObjectiveService.ts +1356 -56
  115. package/Server/Services/ServiceOwnerRuleEngineService.ts +238 -116
  116. package/Server/Services/StatusPageAnnouncementService.ts +13 -0
  117. package/Server/Services/StatusPageLabelRuleEngineService.ts +146 -85
  118. package/Server/Services/StatusPageOwnerRuleEngineService.ts +210 -99
  119. package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +28 -232
  120. package/Server/Services/StatusPageSubscriberService.ts +6 -0
  121. package/Server/Services/TelemetryUsageBillingService.ts +38 -7
  122. package/Server/Services/ThreatIntelFeedService.ts +1 -1
  123. package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +173 -110
  124. package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +238 -116
  125. package/Server/Services/WorkflowLabelRuleEngineService.ts +145 -84
  126. package/Server/Services/WorkflowOwnerRuleEngineService.ts +215 -95
  127. package/Server/Types/Database/UpdateByID.ts +3 -0
  128. package/Server/Types/Database/UpdateOneBy.ts +7 -0
  129. package/Server/Utils/AI/AlertAIContextBuilder.ts +19 -0
  130. package/Server/Utils/AI/IncidentAIContextBuilder.ts +39 -0
  131. package/Server/Utils/AI/Toolbox/AlertTools.ts +37 -1
  132. package/Server/Utils/AI/Toolbox/IncidentTools.ts +22 -1
  133. package/Server/Utils/AI/Toolbox/SloTools.ts +416 -51
  134. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +151 -13
  135. package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +17 -4
  136. package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +155 -8
  137. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +16 -0
  138. package/Server/Utils/Database/RelationValueUtil.ts +106 -0
  139. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +6 -1
  140. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +22 -27
  141. package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +3 -1
  142. package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +50 -20
  143. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +13 -1
  144. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +6 -11
  145. package/Server/Utils/Rules/MonitorRulePatternValidator.ts +51 -0
  146. package/Server/Utils/Rules/OwnerRuleAssignment.ts +110 -0
  147. package/Server/Utils/Rules/RuleRun/RuleApplication.ts +81 -0
  148. package/Server/Utils/Rules/RuleRun/RuleRunPermission.ts +188 -0
  149. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +803 -0
  150. package/Server/Utils/Rules/RuleRun/RuleRunner.ts +341 -0
  151. package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +3 -2
  152. package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +6 -4
  153. package/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.ts +263 -16
  154. package/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.ts +2101 -0
  155. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +194 -14
  156. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +1 -2
  157. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +38 -7
  158. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +2 -0
  159. package/Server/Utils/SecurityEvent/Connectors/Types.ts +242 -2
  160. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +1 -1
  161. package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +3 -3
  162. package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +2 -2
  163. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +217 -56
  164. package/Server/Utils/Slo/SloFeedUtil.ts +200 -0
  165. package/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.ts +173 -0
  166. package/Server/Utils/Slo/SloMetricUtil.ts +327 -0
  167. package/Server/Utils/Slo/SloOwnerReferenceValidator.ts +208 -0
  168. package/Server/Utils/Slo/SloRecordReferenceValidator.ts +169 -0
  169. package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +6 -43
  170. package/Server/Utils/StatusPageResource.ts +50 -5
  171. package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +664 -15
  172. package/Tests/App/Dashboard/AddWidgetModal.test.tsx +4 -1
  173. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +307 -0
  174. package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +289 -0
  175. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +598 -0
  176. package/Tests/App/Dashboard/BillingDefaultPaymentMethod.test.tsx +1046 -0
  177. package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +3 -0
  178. package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +201 -7
  179. package/Tests/App/Dashboard/BooleanSeriesCriteriaFilterText.test.ts +82 -0
  180. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +16 -1
  181. package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +116 -8
  182. package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +168 -1
  183. package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +1 -1
  184. package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +20 -3
  185. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +1095 -1
  186. package/Tests/App/Dashboard/CorrelateFilterChips.test.tsx +910 -0
  187. package/Tests/App/Dashboard/CorrelateGraph.test.tsx +3747 -25
  188. package/Tests/App/Dashboard/CorrelateGraphHelpers.test.ts +1085 -0
  189. package/Tests/App/Dashboard/CorrelateInspector.test.tsx +1534 -0
  190. package/Tests/App/Dashboard/CorrelateNodeCard.test.tsx +965 -0
  191. package/Tests/App/Dashboard/CorrelateResultSummary.test.tsx +1525 -0
  192. package/Tests/App/Dashboard/CorrelationGraph.test.ts +1030 -0
  193. package/Tests/App/Dashboard/CorrelationGraphLayout.test.ts +526 -0
  194. package/Tests/App/Dashboard/DeviceDiagnostics.test.tsx +787 -0
  195. package/Tests/App/Dashboard/DeviceLatencyTrend.test.tsx +278 -0
  196. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +279 -0
  197. package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +87 -0
  198. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +443 -8
  199. package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +340 -0
  200. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +98 -2
  201. package/Tests/App/Dashboard/ExceptionSegmentedControl.test.tsx +1020 -0
  202. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +268 -47
  203. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1114 -76
  204. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +124 -2
  205. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +279 -176
  206. package/Tests/App/Dashboard/InvestigationRunDetails.test.tsx +1166 -0
  207. package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +437 -0
  208. package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +65 -0
  209. package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +5 -0
  210. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +74 -0
  211. package/Tests/App/Dashboard/ResourceFeed.test.tsx +125 -5
  212. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
  213. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +1764 -0
  214. package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1000 -64
  215. package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +448 -0
  216. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +739 -189
  217. package/Tests/App/Dashboard/SecurityEventSeverityPill.test.tsx +233 -0
  218. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +282 -0
  219. package/Tests/App/Dashboard/SloActiveBurnEventsCard.test.tsx +538 -0
  220. package/Tests/App/Dashboard/SloBulkActionsArchive.test.tsx +252 -0
  221. package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +322 -518
  222. package/Tests/App/Dashboard/SloElement.test.tsx +194 -0
  223. package/Tests/App/Dashboard/SloFeed.test.tsx +289 -0
  224. package/Tests/App/Dashboard/SloHistoryCharts.test.tsx +471 -0
  225. package/Tests/App/Dashboard/SloHistorySeries.test.tsx +607 -0
  226. package/Tests/App/Dashboard/SloListWidget.test.tsx +783 -0
  227. package/Tests/App/Dashboard/SloMetricsPage.test.tsx +346 -0
  228. package/Tests/App/Dashboard/SloMonitorsPage.test.tsx +661 -0
  229. package/Tests/App/Dashboard/SloMonitorsSummaryCard.test.tsx +489 -0
  230. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +437 -0
  231. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +305 -0
  232. package/Tests/App/Dashboard/SloOverviewData.test.tsx +563 -0
  233. package/Tests/App/Dashboard/SloOverviewHero.test.tsx +311 -0
  234. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +426 -0
  235. package/Tests/App/Dashboard/SloOverviewSidebarCards.test.tsx +493 -0
  236. package/Tests/App/Dashboard/SloSettings.test.tsx +633 -0
  237. package/Tests/App/Dashboard/SloStatusSummaryCards.test.tsx +403 -0
  238. package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +373 -0
  239. package/Tests/App/Dashboard/SloWidgetVariableBinding.test.tsx +689 -0
  240. package/Tests/App/Dashboard/TopologyConnectivitySection.test.tsx +206 -0
  241. package/Tests/App/Dashboard/TracesEntityNames.test.tsx +47 -15
  242. package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +1312 -0
  243. package/Tests/App/Dashboard/WidgetCatalog.test.ts +9 -1
  244. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +14 -16
  245. package/Tests/Models/DatabaseModels/AuditLogModelConfiguration.test.ts +442 -0
  246. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +9 -10
  247. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +48 -1
  248. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +835 -0
  249. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +3 -2
  250. package/Tests/Models/DiscoveryScanNetbiosLookupColumn.test.ts +328 -0
  251. package/Tests/Models/DiscoveryScanShortDeviceNamesColumn.test.ts +335 -0
  252. package/Tests/Models/NetworkDeviceDiagnosticContract.test.ts +194 -0
  253. package/Tests/Models/NetworkDeviceDnsNameColumn.test.ts +321 -0
  254. package/Tests/Models/ProjectDataResidencyColumn.test.ts +154 -0
  255. package/Tests/Models/SecurityDomainAccessControl.test.ts +181 -50
  256. package/Tests/Server/API/BaseAPI.test.ts +6 -0
  257. package/Tests/Server/API/BaseAPIUpdateMiscDataProps.test.ts +217 -0
  258. package/Tests/Server/API/BillingInvoiceAPI.test.ts +7 -0
  259. package/Tests/Server/API/BillingInvoiceAPIPaymentStates.test.ts +990 -0
  260. package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +498 -0
  261. package/Tests/Server/API/DashboardPublicSloAPI.test.ts +405 -0
  262. package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +901 -7
  263. package/Tests/Server/API/SessionReplayAPI.test.ts +116 -0
  264. package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +857 -0
  265. package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +1084 -0
  266. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +33 -3
  267. package/Tests/Server/Infrastructure/Postgres/AddDataResidencyToProjectMigration.test.ts +202 -0
  268. package/Tests/Server/Infrastructure/Postgres/AddNetbiosLookupToNetworkDeviceDiscoveryScanMigration.test.ts +330 -0
  269. package/Tests/Server/Infrastructure/Postgres/AddNetworkDeviceDnsNameAndShortDeviceNamesMigration.test.ts +340 -0
  270. package/Tests/Server/Infrastructure/Postgres/BackfillSloMonitorRulesAndAffectedResourcesMigration.test.ts +343 -0
  271. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +801 -0
  272. package/Tests/Server/Services/AddSubscriberUpdateNotificationStatusMigration.test.ts +307 -0
  273. package/Tests/Server/Services/AuditLogService.test.ts +1124 -0
  274. package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +200 -1
  275. package/Tests/Server/Services/BillingInvoiceServiceMutexRelease.test.ts +254 -0
  276. package/Tests/Server/Services/BillingService.test.ts +70 -0
  277. package/Tests/Server/Services/BillingServicePayInvoiceStates.test.ts +723 -0
  278. package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +14 -2
  279. package/Tests/Server/Services/BillingServiceSubscriptionPaymentMethodSync.test.ts +1634 -0
  280. package/Tests/Server/Services/DatabaseServiceAuditRelationDiff.test.ts +492 -0
  281. package/Tests/Server/Services/DatabaseServicePasswordFieldSecrets.test.ts +629 -0
  282. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +431 -0
  283. package/Tests/Server/Services/IncidentAlertSloReferenceGuard.test.ts +358 -0
  284. package/Tests/Server/Services/MonitorProbeServicePastDueMonitoring.test.ts +362 -0
  285. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1460 -1
  286. package/Tests/Server/Services/NetworkDeviceDiagnosticService.test.ts +962 -0
  287. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +106 -0
  288. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +10 -1
  289. package/Tests/Server/Services/NetworkDeviceServicePastDueMonitoring.test.ts +335 -0
  290. package/Tests/Server/Services/NetworkDeviceSiteRuleDnsName.test.ts +568 -0
  291. package/Tests/Server/Services/ProjectDataResidencyPostgres.test.ts +344 -0
  292. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +187 -0
  293. package/Tests/Server/Services/ProjectServiceDataResidency.test.ts +369 -0
  294. package/Tests/Server/Services/ProjectServiceDataResidencySelfHosted.test.ts +176 -0
  295. package/Tests/Server/Services/ProjectServicePastDueMonitoring.test.ts +289 -0
  296. package/Tests/Server/Services/ResourceFeedServices.test.ts +24 -8
  297. package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +1396 -0
  298. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupARun.test.ts +917 -0
  299. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +1262 -0
  300. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +902 -0
  301. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +1163 -0
  302. package/Tests/Server/Services/RuleRun/PrivacyRuleEnginesRun.test.ts +843 -0
  303. package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +465 -0
  304. package/Tests/Server/Services/SecurityEventConnectionService.test.ts +525 -4
  305. package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +77 -23
  306. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleFeedWrites.test.ts +777 -0
  307. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleOptions.test.ts +1399 -0
  308. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +67 -74
  309. package/Tests/Server/Services/ServiceLevelObjectiveChildRowTenancy.test.ts +906 -0
  310. package/Tests/Server/Services/ServiceLevelObjectiveDeleteTenancy.test.ts +1029 -0
  311. package/Tests/Server/Services/ServiceLevelObjectiveFeedService.test.ts +313 -0
  312. package/Tests/Server/Services/ServiceLevelObjectiveFeedWrites.test.ts +1214 -0
  313. package/Tests/Server/Services/ServiceLevelObjectiveMarkdownLink.test.ts +289 -0
  314. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +1455 -430
  315. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleLegacyLabelAdoption.test.ts +634 -0
  316. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +1193 -0
  317. package/Tests/Server/Services/{SloMonitorLabelRuleHooks.test.ts → ServiceLevelObjectiveMonitorRuleTriggers.test.ts} +135 -41
  318. package/Tests/Server/Services/ServiceLevelObjectiveOwnerFeedWrites.test.ts +671 -0
  319. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +180 -85
  320. package/Tests/Server/Services/ServiceLevelObjectiveServiceArchive.test.ts +537 -0
  321. package/Tests/Server/Services/ServiceLevelObjectiveServiceLegacyMonitorLabelWrite.test.ts +870 -0
  322. package/Tests/Server/Services/ServiceLevelObjectiveServiceMonitorRuleGuard.test.ts +343 -0
  323. package/Tests/Server/Services/ServiceLevelObjectiveServiceReEvaluation.test.ts +246 -0
  324. package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +501 -0
  325. package/Tests/Server/Services/SloAffectedResourceLinkContract.test.ts +86 -0
  326. package/Tests/Server/Services/SloAffectedResourceMetricAttributes.test.ts +547 -0
  327. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +10 -4
  328. package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +7 -2
  329. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +174 -0
  330. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateServiceVariables.test.ts +40 -0
  331. package/Tests/Server/Services/SubscriberUpdateNotificationHooks.test.ts +541 -0
  332. package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +288 -0
  333. package/Tests/Server/TestingUtils/PastDueMonitoringClaimSql.ts +177 -0
  334. package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +51 -10
  335. package/Tests/Server/TestingUtils/__mocks__/Stripe.mock.ts +16 -1
  336. package/Tests/Server/Types/Database/Permissions/ProjectDataResidencyColumn.test.ts +386 -0
  337. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +26 -36
  338. package/Tests/Server/Utils/AI/SloAffectedResourceAIContext.test.ts +445 -0
  339. package/Tests/Server/Utils/AI/SloTools.test.ts +423 -1
  340. package/Tests/Server/Utils/AI/SloToolsArchive.test.ts +294 -0
  341. package/Tests/Server/Utils/AI/SloToolsRuleReadPermissions.test.ts +297 -0
  342. package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +255 -10
  343. package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +404 -750
  344. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +45 -0
  345. package/Tests/Server/Utils/Database/RelationValueUtil.test.ts +157 -0
  346. package/Tests/Server/Utils/Monitor/Criteria/BooleanSeriesEvaluateOverTime.test.ts +260 -0
  347. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +181 -0
  348. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +147 -30
  349. package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.test.ts +17 -0
  350. package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +136 -0
  351. package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidatorLoadOrder.test.ts +472 -0
  352. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +48 -2
  353. package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +435 -475
  354. package/Tests/Server/Utils/Rules/MonitorRulePatternValidator.test.ts +77 -0
  355. package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +177 -0
  356. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +365 -0
  357. package/Tests/Server/Utils/Rules/RuleRun/RuleRunRegistry.test.ts +173 -0
  358. package/Tests/Server/Utils/Rules/RuleRun/RuleRunner.test.ts +675 -0
  359. package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +8 -8
  360. package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorFetchSummary.test.ts +261 -0
  361. package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +68 -13
  362. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsAuth.test.ts → Connectors/GoogleSecOps/GoogleSecOpsAuth.test.ts} +5 -5
  363. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClient.test.ts → Connectors/GoogleSecOps/GoogleSecOpsClient.test.ts} +4 -4
  364. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.test.ts +483 -0
  365. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorCuratedAndLateAlerts.test.ts +676 -0
  366. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFetchEvents.test.ts +1994 -0
  367. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFixtures.ts +332 -0
  368. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorHttpIntegration.test.ts +680 -0
  369. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorRequestContract.test.ts +1206 -0
  370. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorTestConnection.test.ts +1136 -0
  371. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsCuratedRuleCounts.test.ts +407 -0
  372. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsErrorHandling.test.ts → Connectors/GoogleSecOps/GoogleSecOpsErrorHandling.test.ts} +5 -5
  373. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingAdaptiveCatchUp.test.ts +730 -0
  374. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClickhouseIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts} +130 -35
  375. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFailureTaxonomy.test.ts +772 -0
  376. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFixtures.ts +648 -0
  377. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsHttpIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingHttpIntegration.test.ts} +230 -225
  378. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingIntegration.test.ts +1390 -0
  379. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingLoop.test.ts +981 -0
  380. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingNothingImportedRegression.test.ts +290 -0
  381. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsRequestContract.test.ts → Connectors/GoogleSecOps/GoogleSecOpsRequestContract.test.ts} +2 -2
  382. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsResponseParsing.test.ts → Connectors/GoogleSecOps/GoogleSecOpsResponseParsing.test.ts} +5 -5
  383. package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsSearchDetections.test.ts → Connectors/GoogleSecOps/GoogleSecOpsSearchDetections.test.ts} +38 -5
  384. package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsTesterIntegration.test.ts +421 -0
  385. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +1445 -3
  386. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +14 -4
  387. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +313 -4
  388. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +352 -0
  389. package/Tests/Server/Utils/Slo/SloFeedUtil.test.ts +326 -0
  390. package/Tests/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.test.ts +260 -0
  391. package/Tests/Server/Utils/Slo/SloMetricUtil.test.ts +592 -0
  392. package/Tests/Server/Utils/Slo/SloRecordReferenceValidator.test.ts +311 -0
  393. package/Tests/Server/Utils/StatusPageResource.test.ts +91 -3
  394. package/Tests/Types/Billing/SubscriptionStatus.test.ts +176 -0
  395. package/Tests/Types/Billing/SubscriptionStatusPastDueMonitoring.test.ts +187 -0
  396. package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +53 -7
  397. package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +816 -792
  398. package/Tests/Types/Monitor/CriteriaFilter.test.ts +216 -24
  399. package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +14 -1
  400. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +14 -1
  401. package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +14 -1
  402. package/Tests/Types/Monitor/MonitorStepRetriesParsing.test.ts +201 -0
  403. package/Tests/Types/Rules/RuleRun.test.ts +315 -0
  404. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +60 -0
  405. package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +29 -4
  406. package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +217 -0
  407. package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +200 -0
  408. package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +141 -87
  409. package/Tests/UI/Components/AlertBanner.test.tsx +319 -0
  410. package/Tests/UI/Components/BulkArchiveActionsCopy.test.tsx +310 -0
  411. package/Tests/UI/Components/Detail/DetailIdIsUnique.test.tsx +87 -0
  412. package/Tests/UI/Components/Dropdown/DropdownClearable.test.tsx +393 -0
  413. package/Tests/UI/Components/Dropdown/DropdownMultiSelectChipAccessibleName.test.tsx +64 -0
  414. package/Tests/UI/Components/EmptyState/EmptyState.test.tsx +335 -4
  415. package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +337 -0
  416. package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +21 -20
  417. package/Tests/UI/Components/LabelRuleImportExport.test.tsx +15 -2
  418. package/Tests/UI/Components/LockedFilterChip.test.tsx +281 -144
  419. package/Tests/UI/Components/MoreMenu.test.tsx +133 -0
  420. package/Tests/UI/Components/MoreMenuMotion.test.tsx +84 -3
  421. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  422. package/Tests/UI/Components/RuleRun/RuleDetailFields.test.tsx +336 -0
  423. package/Tests/UI/Components/RuleRun/RuleTable.test.tsx +304 -0
  424. package/Tests/UI/Components/RuleRun/RunRuleNowModal.test.tsx +231 -0
  425. package/Tests/UI/Components/RuleRun/RunRulesBulkAction.test.ts +213 -0
  426. package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +124 -61
  427. package/Tests/UI/Rum/ReplayEngine.test.ts +154 -0
  428. package/Tests/UI/Rum/ReplayHeader.test.tsx +234 -123
  429. package/Tests/UI/Rum/ReplayPinControl.test.tsx +122 -0
  430. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +245 -0
  431. package/Tests/UI/Rum/ReplayRail.test.tsx +294 -0
  432. package/Tests/UI/Rum/ReplayScrubber.test.tsx +213 -1
  433. package/Tests/UI/Rum/ReplayStage.test.tsx +565 -172
  434. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +260 -3
  435. package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +1391 -0
  436. package/Tests/UI/Rum/ReplayTimeline.test.tsx +222 -0
  437. package/Tests/UI/Utils/DashboardStackingLayers.test.ts +8 -1
  438. package/Tests/UI/Utils/RuleRunClient.test.ts +303 -0
  439. package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +1 -0
  440. package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +2 -0
  441. package/Tests/Utils/Dashboard/Components/DashboardSloListComponent.test.ts +206 -0
  442. package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +36 -2
  443. package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +409 -588
  444. package/Tests/Utils/Dashboard/SloWidgetSource.test.ts +351 -0
  445. package/Tests/Utils/Markdown/MarkdownEscape.test.ts +361 -0
  446. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +1425 -118
  447. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +188 -3
  448. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +661 -13
  449. package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +349 -0
  450. package/Tests/Utils/NetworkDiscovery/RunImportedDeviceNaming.test.ts +656 -0
  451. package/Tests/Utils/NetworkDiscovery/ShortDeviceNamePlanner.test.ts +1020 -0
  452. package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +619 -0
  453. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +317 -0
  454. package/Tests/Utils/Project/DataResidency.test.ts +198 -0
  455. package/Tests/Utils/Rules/RuleRunSummary.test.ts +394 -0
  456. package/Tests/Utils/Slo/SloAffectedResourceMarkdown.test.ts +302 -0
  457. package/Tests/Utils/Slo/SloBurnRateTemplate.test.ts +468 -0
  458. package/Tests/Utils/Slo/SloEvaluation.test.ts +20 -4
  459. package/Tests/Utils/Slo/SloFeedMarkdown.test.ts +1185 -0
  460. package/Tests/Utils/Slo/SloHealth.test.ts +262 -0
  461. package/Tests/Utils/Slo/SloHistoryMetricName.test.ts +102 -0
  462. package/Tests/Utils/Slo/SloListWidgetFormat.test.ts +522 -0
  463. package/Tests/Utils/Slo/SloMetricType.test.ts +355 -0
  464. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +387 -0
  465. package/Tests/Utils/Slo/SloMonitorStatusSummary.test.ts +210 -0
  466. package/Tests/Utils/Slo/SloOverviewText.test.ts +226 -0
  467. package/Tests/Utils/Slo/SloProjection.test.ts +1039 -0
  468. package/Tests/Utils/Slo/SloWidgetFormat.test.ts +47 -0
  469. package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +1 -80
  470. package/Types/BaseDatabase/EnableAuditLogOn.ts +41 -0
  471. package/Types/Billing/SubscriptionStatus.ts +39 -4
  472. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  473. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +5 -0
  474. package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +10 -0
  475. package/Types/Dashboard/DashboardComponents/DashboardSloListComponent.ts +29 -0
  476. package/Types/Dashboard/DashboardTemplates.ts +290 -297
  477. package/Types/Database/EnableAuditLog.ts +23 -1
  478. package/Types/Email/EmailTemplateType.ts +4 -0
  479. package/Types/Monitor/CriteriaFilter.ts +55 -8
  480. package/Types/Monitor/MonitorStep.ts +5 -2
  481. package/Types/Monitor/MonitorStepDnsMonitor.ts +3 -1
  482. package/Types/Monitor/MonitorStepDnssecMonitor.ts +3 -1
  483. package/Types/Monitor/MonitorStepDomainMonitor.ts +3 -1
  484. package/Types/Monitor/MonitorStepExternalStatusPageMonitor.ts +3 -1
  485. package/Types/Monitor/MonitorStepRetries.ts +59 -0
  486. package/Types/Monitor/MonitorStepSnmpMonitor.ts +9 -2
  487. package/Types/NetworkDevice/NetworkDeviceDiagnosticResult.ts +104 -0
  488. package/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.ts +47 -0
  489. package/Types/NetworkDevice/NetworkDeviceDiagnosticType.ts +47 -0
  490. package/Types/NetworkDevice/NetworkDevicePingMetricNames.ts +20 -0
  491. package/Types/Permission.ts +127 -0
  492. package/Types/Rules/RuleCriteriaFieldRegistry.ts +5 -0
  493. package/Types/Rules/RuleRun.ts +518 -0
  494. package/Types/Rum/SessionReplayApi.ts +18 -0
  495. package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +6 -0
  496. package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +30 -4
  497. package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +108 -1
  498. package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +6 -2
  499. package/Types/ServiceLevelObjective/SloHistoryMetricName.ts +25 -0
  500. package/Types/ServiceLevelObjective/SloMetricType.ts +49 -0
  501. package/Types/StatusPage/StatusPageSubscriberNotificationEventType.ts +4 -0
  502. package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +331 -0
  503. package/Types/StatusPage/SubscriberNotificationTrigger.ts +12 -0
  504. package/Types/StatusPage/SubscriberUpdateNotification.ts +89 -0
  505. package/Types/Telemetry/LockedFilterDetail.ts +7 -28
  506. package/Types/Telemetry/ServiceType.ts +7 -0
  507. package/Typings/Index.d.ts +53 -3
  508. package/UI/Components/AlertBanner/AlertBanner.tsx +85 -27
  509. package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +21 -2
  510. package/UI/Components/Detail/Detail.tsx +9 -2
  511. package/UI/Components/Dropdown/Dropdown.tsx +64 -1
  512. package/UI/Components/EmptyState/EmptyState.tsx +27 -3
  513. package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +124 -0
  514. package/UI/Components/Forms/ModelForm.tsx +6 -5
  515. package/UI/Components/LabelRule/LabelRuleTable.tsx +8 -2
  516. package/UI/Components/LogsViewer/LogsViewer.tsx +2 -6
  517. package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +2 -13
  518. package/UI/Components/LogsViewer/types.ts +2 -2
  519. package/UI/Components/MoreMenu/MoreMenu.tsx +14 -3
  520. package/UI/Components/RuleRun/RuleDetailFields.tsx +359 -0
  521. package/UI/Components/RuleRun/RuleTable.tsx +183 -0
  522. package/UI/Components/RuleRun/RuleView.tsx +170 -0
  523. package/UI/Components/RuleRun/RunRuleNowModal.tsx +147 -0
  524. package/UI/Components/RuleRun/RunRulesBulkAction.ts +103 -0
  525. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +2 -6
  526. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +38 -104
  527. package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +2 -18
  528. package/UI/Components/TelemetryViewer/types.ts +2 -2
  529. package/UI/Utils/Rules/RuleRunClient.ts +178 -0
  530. package/UI/Utils/Telemetry/TelemetryEntityNames.ts +8 -0
  531. package/Utils/Dashboard/Components/DashboardSloComponent.ts +19 -2
  532. package/Utils/Dashboard/Components/DashboardSloListComponent.ts +126 -0
  533. package/Utils/Dashboard/Components/Index.ts +7 -0
  534. package/Utils/Dashboard/SloWidgetSource.ts +188 -0
  535. package/Utils/Markdown/MarkdownEscape.ts +63 -0
  536. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +161 -36
  537. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +25 -0
  538. package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +146 -0
  539. package/Utils/NetworkDiscovery/RunImportedDeviceNaming.ts +390 -0
  540. package/Utils/NetworkDiscovery/ShortDeviceNamePlanner.ts +291 -0
  541. package/Utils/NetworkDiscovery/ShortHostnameUtil.ts +91 -0
  542. package/Utils/NetworkSite/CidrMatchUtil.ts +37 -12
  543. package/Utils/Project/DataResidency.ts +63 -0
  544. package/Utils/Rules/RuleRunSummary.ts +323 -0
  545. package/Utils/Slo/SloAffectedResourceMarkdown.ts +123 -0
  546. package/Utils/Slo/SloBurnRateTemplate.ts +373 -0
  547. package/Utils/Slo/SloFeedMarkdown.ts +1507 -0
  548. package/Utils/Slo/SloHealth.ts +96 -9
  549. package/Utils/Slo/SloListWidgetFormat.ts +370 -0
  550. package/Utils/Slo/SloMetricType.ts +237 -0
  551. package/Utils/Slo/SloMonitorRuleCriteria.ts +364 -0
  552. package/Utils/Slo/SloMonitorStatusSummary.ts +210 -0
  553. package/Utils/Slo/SloOverviewText.ts +265 -0
  554. package/Utils/Slo/SloProjection.ts +967 -0
  555. package/Utils/Slo/SloWidgetFormat.ts +12 -2
  556. package/Utils/Telemetry/LockedFilterSearch.ts +3 -49
  557. package/build/dist/Models/AnalyticsModels/AuditLog.js +70 -1
  558. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  559. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +4 -4
  560. package/build/dist/Models/DatabaseModels/Alert.js +60 -0
  561. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  562. package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
  563. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  564. package/build/dist/Models/DatabaseModels/Incident.js +64 -0
  565. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  566. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +75 -0
  567. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  568. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +75 -0
  569. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  570. package/build/dist/Models/DatabaseModels/Index.js +6 -4
  571. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  572. package/build/dist/Models/DatabaseModels/NetworkDevice.js +68 -0
  573. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  574. package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js +772 -0
  575. package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js.map +1 -0
  576. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +140 -0
  577. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  578. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +1 -1
  579. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
  580. package/build/dist/Models/DatabaseModels/Project.js +42 -0
  581. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  582. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +75 -0
  583. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  584. package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +11 -11
  585. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +192 -10
  586. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -1
  587. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +798 -96
  588. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
  589. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +596 -0
  590. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -0
  591. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +590 -0
  592. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -0
  593. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +16 -0
  594. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
  595. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +16 -0
  596. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
  597. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +75 -0
  598. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  599. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +1 -1
  600. package/build/dist/Server/API/BaseAPI.js +14 -0
  601. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  602. package/build/dist/Server/API/BillingInvoiceAPI.js +233 -19
  603. package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
  604. package/build/dist/Server/API/BillingPaymentMethodAPI.js +86 -5
  605. package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
  606. package/build/dist/Server/API/DashboardAPI.js +72 -2
  607. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  608. package/build/dist/Server/API/SecurityEventConnectionAPI.js +102 -10
  609. package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -1
  610. package/build/dist/Server/API/StatusPageAPI.js +236 -154
  611. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  612. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js +34 -0
  613. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js.map +1 -0
  614. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js +24 -0
  615. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js.map +1 -0
  616. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js +21 -0
  617. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js.map +1 -0
  618. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js +207 -0
  619. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js.map +1 -0
  620. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js +72 -0
  621. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js.map +1 -0
  622. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js +20 -0
  623. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js.map +1 -0
  624. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js +46 -0
  625. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js.map +1 -0
  626. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  627. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  628. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +112 -56
  629. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  630. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +167 -68
  631. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  632. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +87 -26
  633. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  634. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +270 -203
  635. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  636. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +498 -354
  637. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  638. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +97 -34
  639. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  640. package/build/dist/Server/Services/AlertService.js +91 -8
  641. package/build/dist/Server/Services/AlertService.js.map +1 -1
  642. package/build/dist/Server/Services/AuditLogService.js +408 -44
  643. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  644. package/build/dist/Server/Services/BillingInvoiceService.js +94 -85
  645. package/build/dist/Server/Services/BillingInvoiceService.js.map +1 -1
  646. package/build/dist/Server/Services/BillingService.js +406 -14
  647. package/build/dist/Server/Services/BillingService.js.map +1 -1
  648. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +141 -92
  649. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  650. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +189 -101
  651. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  652. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +135 -86
  653. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  654. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +189 -100
  655. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  656. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +117 -69
  657. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  658. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +171 -83
  659. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  660. package/build/dist/Server/Services/DatabaseService.js +125 -18
  661. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  662. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +141 -92
  663. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  664. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +189 -101
  665. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  666. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +145 -91
  667. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  668. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +191 -101
  669. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  670. package/build/dist/Server/Services/HostLabelRuleEngineService.js +141 -92
  671. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  672. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +190 -102
  673. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  674. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +112 -56
  675. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  676. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +220 -63
  677. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  678. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +87 -26
  679. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  680. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
  681. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  682. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +258 -192
  683. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  684. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +519 -376
  685. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  686. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +95 -32
  687. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  688. package/build/dist/Server/Services/IncidentPublicNoteService.js +24 -0
  689. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  690. package/build/dist/Server/Services/IncidentService.js +90 -5
  691. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  692. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +113 -65
  693. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  694. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +171 -83
  695. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  696. package/build/dist/Server/Services/Index.js +6 -4
  697. package/build/dist/Server/Services/Index.js.map +1 -1
  698. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +117 -69
  699. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  700. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +171 -83
  701. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  702. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +145 -91
  703. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  704. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +191 -101
  705. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  706. package/build/dist/Server/Services/LabelService.js +20 -25
  707. package/build/dist/Server/Services/LabelService.js.map +1 -1
  708. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +123 -77
  709. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  710. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +167 -82
  711. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  712. package/build/dist/Server/Services/MonitorProbeService.js +18 -2
  713. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  714. package/build/dist/Server/Services/MonitorService.js +11 -9
  715. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  716. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +287 -5
  717. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  718. package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js +333 -0
  719. package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js.map +1 -0
  720. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +117 -69
  721. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  722. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +171 -83
  723. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  724. package/build/dist/Server/Services/NetworkDeviceService.js +36 -2
  725. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  726. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +117 -64
  727. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  728. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +173 -83
  729. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  730. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +116 -65
  731. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  732. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +171 -83
  733. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  734. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +141 -92
  735. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  736. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +189 -101
  737. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  738. package/build/dist/Server/Services/ProjectService.js +82 -10
  739. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  740. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +141 -92
  741. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  742. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +189 -101
  743. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  744. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +111 -63
  745. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  746. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +161 -77
  747. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  748. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +117 -69
  749. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  750. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +171 -83
  751. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  752. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +280 -209
  753. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  754. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +521 -376
  755. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  756. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +24 -0
  757. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  758. package/build/dist/Server/Services/ScheduledMaintenanceService.js +24 -8
  759. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  760. package/build/dist/Server/Services/SecurityEventConnectionService.js +43 -3
  761. package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -1
  762. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +115 -62
  763. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  764. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +163 -77
  765. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  766. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +141 -92
  767. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  768. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +769 -18
  769. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
  770. package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js +96 -0
  771. package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js.map +1 -0
  772. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +614 -87
  773. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  774. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +844 -0
  775. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -0
  776. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +207 -1
  777. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -1
  778. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +221 -1
  779. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -1
  780. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +997 -50
  781. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  782. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +191 -102
  783. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  784. package/build/dist/Server/Services/StatusPageAnnouncementService.js +12 -0
  785. package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
  786. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +118 -70
  787. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  788. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +158 -76
  789. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  790. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +19 -215
  791. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
  792. package/build/dist/Server/Services/StatusPageSubscriberService.js +6 -0
  793. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  794. package/build/dist/Server/Services/TelemetryUsageBillingService.js +27 -5
  795. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  796. package/build/dist/Server/Services/ThreatIntelFeedService.js +1 -1
  797. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +141 -92
  798. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
  799. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +189 -101
  800. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
  801. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +117 -69
  802. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  803. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +171 -83
  804. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  805. package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js +17 -0
  806. package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js.map +1 -1
  807. package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +31 -0
  808. package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -1
  809. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +24 -1
  810. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  811. package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +21 -1
  812. package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
  813. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +337 -53
  814. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  815. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +108 -15
  816. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
  817. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +2 -2
  818. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -1
  819. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +115 -6
  820. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -1
  821. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +13 -0
  822. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  823. package/build/dist/Server/Utils/Database/RelationValueUtil.js +82 -0
  824. package/build/dist/Server/Utils/Database/RelationValueUtil.js.map +1 -0
  825. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +10 -6
  826. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  827. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +17 -21
  828. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  829. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +5 -4
  830. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
  831. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +50 -10
  832. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
  833. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +13 -1
  834. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  835. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +6 -10
  836. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  837. package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js +34 -0
  838. package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js.map +1 -0
  839. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +69 -0
  840. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -0
  841. package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js +25 -0
  842. package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js.map +1 -0
  843. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js +128 -0
  844. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js.map +1 -0
  845. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +746 -0
  846. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -0
  847. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js +221 -0
  848. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js.map +1 -0
  849. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +3 -2
  850. package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
  851. package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +6 -4
  852. package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -1
  853. package/build/dist/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.js +174 -14
  854. package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
  855. package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js +1417 -0
  856. package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js.map +1 -0
  857. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +138 -18
  858. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -1
  859. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +1 -2
  860. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -1
  861. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +23 -18
  862. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -1
  863. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +2 -0
  864. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -1
  865. package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +95 -0
  866. package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -1
  867. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +1 -1
  868. package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +3 -3
  869. package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +2 -2
  870. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +118 -40
  871. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  872. package/build/dist/Server/Utils/Slo/SloFeedUtil.js +150 -0
  873. package/build/dist/Server/Utils/Slo/SloFeedUtil.js.map +1 -0
  874. package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js +136 -0
  875. package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js.map +1 -0
  876. package/build/dist/Server/Utils/Slo/SloMetricUtil.js +269 -0
  877. package/build/dist/Server/Utils/Slo/SloMetricUtil.js.map +1 -0
  878. package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js +134 -0
  879. package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js.map +1 -0
  880. package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js +137 -0
  881. package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js.map +1 -0
  882. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +6 -26
  883. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -1
  884. package/build/dist/Server/Utils/StatusPageResource.js +31 -5
  885. package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
  886. package/build/dist/Types/Billing/SubscriptionStatus.js +37 -3
  887. package/build/dist/Types/Billing/SubscriptionStatus.js.map +1 -1
  888. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  889. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  890. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +5 -0
  891. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  892. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js +2 -0
  893. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js.map +1 -0
  894. package/build/dist/Types/Dashboard/DashboardTemplates.js +275 -286
  895. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  896. package/build/dist/Types/Database/EnableAuditLog.js +19 -1
  897. package/build/dist/Types/Database/EnableAuditLog.js.map +1 -1
  898. package/build/dist/Types/Email/EmailTemplateType.js +4 -0
  899. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  900. package/build/dist/Types/Monitor/CriteriaFilter.js +45 -6
  901. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  902. package/build/dist/Types/Monitor/MonitorStep.js +2 -0
  903. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  904. package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js +3 -1
  905. package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js.map +1 -1
  906. package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js +3 -1
  907. package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js.map +1 -1
  908. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +3 -1
  909. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
  910. package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js +3 -1
  911. package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js.map +1 -1
  912. package/build/dist/Types/Monitor/MonitorStepRetries.js +47 -0
  913. package/build/dist/Types/Monitor/MonitorStepRetries.js.map +1 -0
  914. package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js +3 -1
  915. package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js.map +1 -1
  916. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js +29 -0
  917. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js.map +1 -0
  918. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js +37 -0
  919. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js.map +1 -0
  920. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js +42 -0
  921. package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js.map +1 -0
  922. package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js +20 -0
  923. package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js.map +1 -0
  924. package/build/dist/Types/Permission.js +114 -0
  925. package/build/dist/Types/Permission.js.map +1 -1
  926. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +5 -0
  927. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  928. package/build/dist/Types/Rules/RuleRun.js +267 -0
  929. package/build/dist/Types/Rules/RuleRun.js.map +1 -0
  930. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
  931. package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -1
  932. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +16 -1
  933. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -1
  934. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +65 -0
  935. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
  936. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +6 -2
  937. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -1
  938. package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js +26 -0
  939. package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js.map +1 -0
  940. package/build/dist/Types/ServiceLevelObjective/SloMetricType.js +45 -0
  941. package/build/dist/Types/ServiceLevelObjective/SloMetricType.js.map +1 -0
  942. package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js +4 -0
  943. package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js.map +1 -1
  944. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +295 -0
  945. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -0
  946. package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js +13 -0
  947. package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js.map +1 -0
  948. package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +67 -0
  949. package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -0
  950. package/build/dist/Types/Telemetry/LockedFilterDetail.js +7 -7
  951. package/build/dist/Types/Telemetry/ServiceType.js +7 -0
  952. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  953. package/build/dist/UI/Components/AlertBanner/AlertBanner.js +48 -19
  954. package/build/dist/UI/Components/AlertBanner/AlertBanner.js.map +1 -1
  955. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +10 -2
  956. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
  957. package/build/dist/UI/Components/Detail/Detail.js +12 -3
  958. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  959. package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -5
  960. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  961. package/build/dist/UI/Components/EmptyState/EmptyState.js +3 -3
  962. package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
  963. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +47 -0
  964. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +1 -0
  965. package/build/dist/UI/Components/Forms/ModelForm.js +6 -5
  966. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  967. package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +6 -2
  968. package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -1
  969. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +1 -1
  970. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  971. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +0 -2
  972. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
  973. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +3 -1
  974. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  975. package/build/dist/UI/Components/RuleRun/RuleDetailFields.js +226 -0
  976. package/build/dist/UI/Components/RuleRun/RuleDetailFields.js.map +1 -0
  977. package/build/dist/UI/Components/RuleRun/RuleTable.js +97 -0
  978. package/build/dist/UI/Components/RuleRun/RuleTable.js.map +1 -0
  979. package/build/dist/UI/Components/RuleRun/RuleView.js +83 -0
  980. package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -0
  981. package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js +74 -0
  982. package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js.map +1 -0
  983. package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js +78 -0
  984. package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js.map +1 -0
  985. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
  986. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  987. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +24 -50
  988. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
  989. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +0 -4
  990. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
  991. package/build/dist/UI/Utils/Rules/RuleRunClient.js +98 -0
  992. package/build/dist/UI/Utils/Rules/RuleRunClient.js.map +1 -0
  993. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +8 -0
  994. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
  995. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +16 -2
  996. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -1
  997. package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js +94 -0
  998. package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js.map +1 -0
  999. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  1000. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  1001. package/build/dist/Utils/Dashboard/SloWidgetSource.js +125 -0
  1002. package/build/dist/Utils/Dashboard/SloWidgetSource.js.map +1 -0
  1003. package/build/dist/Utils/Markdown/MarkdownEscape.js +49 -0
  1004. package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -0
  1005. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +112 -34
  1006. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  1007. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +22 -0
  1008. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  1009. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +129 -0
  1010. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -0
  1011. package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js +255 -0
  1012. package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js.map +1 -0
  1013. package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js +184 -0
  1014. package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js.map +1 -0
  1015. package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js +79 -0
  1016. package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js.map +1 -0
  1017. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +21 -12
  1018. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
  1019. package/build/dist/Utils/Project/DataResidency.js +51 -0
  1020. package/build/dist/Utils/Project/DataResidency.js.map +1 -0
  1021. package/build/dist/Utils/Rules/RuleRunSummary.js +197 -0
  1022. package/build/dist/Utils/Rules/RuleRunSummary.js.map +1 -0
  1023. package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js +51 -0
  1024. package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js.map +1 -0
  1025. package/build/dist/Utils/Slo/SloBurnRateTemplate.js +228 -0
  1026. package/build/dist/Utils/Slo/SloBurnRateTemplate.js.map +1 -0
  1027. package/build/dist/Utils/Slo/SloFeedMarkdown.js +934 -0
  1028. package/build/dist/Utils/Slo/SloFeedMarkdown.js.map +1 -0
  1029. package/build/dist/Utils/Slo/SloHealth.js +75 -9
  1030. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  1031. package/build/dist/Utils/Slo/SloListWidgetFormat.js +217 -0
  1032. package/build/dist/Utils/Slo/SloListWidgetFormat.js.map +1 -0
  1033. package/build/dist/Utils/Slo/SloMetricType.js +212 -0
  1034. package/build/dist/Utils/Slo/SloMetricType.js.map +1 -0
  1035. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +216 -0
  1036. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -0
  1037. package/build/dist/Utils/Slo/SloMonitorStatusSummary.js +129 -0
  1038. package/build/dist/Utils/Slo/SloMonitorStatusSummary.js.map +1 -0
  1039. package/build/dist/Utils/Slo/SloOverviewText.js +110 -0
  1040. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -0
  1041. package/build/dist/Utils/Slo/SloProjection.js +448 -0
  1042. package/build/dist/Utils/Slo/SloProjection.js.map +1 -0
  1043. package/build/dist/Utils/Slo/SloWidgetFormat.js +4 -2
  1044. package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -1
  1045. package/build/dist/Utils/Telemetry/LockedFilterSearch.js +1 -26
  1046. package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -1
  1047. package/package.json +1 -1
  1048. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +0 -447
  1049. package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +0 -263
  1050. package/Server/API/GoogleSecOpsConnectionAPI.ts +0 -320
  1051. package/Server/Services/GoogleSecOpsConnectionRunService.ts +0 -10
  1052. package/Server/Services/GoogleSecOpsConnectionService.ts +0 -116
  1053. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +0 -777
  1054. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +0 -1373
  1055. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +0 -512
  1056. package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +0 -838
  1057. package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +0 -441
  1058. package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +0 -1001
  1059. package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +0 -657
  1060. package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +0 -153
  1061. package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +0 -784
  1062. package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +0 -823
  1063. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +0 -918
  1064. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +0 -738
  1065. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +0 -874
  1066. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +0 -1297
  1067. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +0 -1577
  1068. package/Tests/UI/Components/LockedFilterActions.test.tsx +0 -396
  1069. package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +0 -111
  1070. package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +0 -205
  1071. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +0 -478
  1072. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +0 -1
  1073. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +0 -287
  1074. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +0 -1
  1075. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +0 -231
  1076. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +0 -1
  1077. package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +0 -9
  1078. package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +0 -1
  1079. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +0 -70
  1080. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +0 -1
  1081. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +0 -1
  1082. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +0 -537
  1083. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +0 -1
  1084. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +0 -1034
  1085. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +0 -1
  1086. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +0 -410
  1087. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +0 -1
  1088. package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +0 -2
  1089. package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +0 -1
  1090. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +0 -88
  1091. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +0 -1
@@ -43,6 +43,9 @@ jest.mock("../../../Server/Services/NetworkDeviceService", () => {
43
43
  findBy: jest.fn(),
44
44
  findOneBy: jest.fn(),
45
45
  getDevicesByHostnames: jest.fn(),
46
+ // The rename-after-completion step (issue #3677).
47
+ updateOneById: jest.fn(),
48
+ countBy: jest.fn(),
46
49
  },
47
50
  };
48
51
  });
@@ -112,16 +115,19 @@ jest.mock("../../../Server/Utils/Logger", () => {
112
115
  });
113
116
 
114
117
  import NetworkDeviceAutoImportRuleEngineService, {
118
+ AUTO_IMPORT_SCAN_BUILDER_SELECT,
115
119
  AUTO_IMPORT_SWEEP_LOCK_KEY,
116
120
  AUTO_IMPORT_SWEEP_LOCK_NAMESPACE,
117
121
  AUTO_IMPORT_SWEEP_LOCK_TIMEOUT_MS,
118
122
  ExistingHostnamesByProjectId,
119
123
  ImportAttemptBudgetsByProjectId,
120
124
  MAX_CONSECUTIVE_MONITOR_CREATE_FAILURES,
125
+ MAX_DEVICE_RENAMES_PER_SCAN_PASS,
121
126
  MAX_DEVICES_PER_AUTO_IMPORT_RUN,
122
127
  MAX_MONITORS_PER_AUTO_IMPORT_RUN,
123
128
  MAX_RESULT_AGE_IN_HOURS,
124
129
  MAX_SCANS_PER_AUTO_IMPORT_RULE_RUN,
130
+ RUN_IMPORTED_DEVICE_LOOKUP_CHUNK_SIZE,
125
131
  } from "../../../Server/Services/NetworkDeviceAutoImportRuleEngineService";
126
132
  import NetworkDeviceAutoImportRuleService from "../../../Server/Services/NetworkDeviceAutoImportRuleService";
127
133
  import NetworkDeviceDiscoveryScanService from "../../../Server/Services/NetworkDeviceDiscoveryScanService";
@@ -139,9 +145,11 @@ import NetworkDeviceDiscoveryScan, {
139
145
  DiscoveredNetworkDevice,
140
146
  } from "../../../Models/DatabaseModels/NetworkDeviceDiscoveryScan";
141
147
  import { DiscoveryScanSnmpConfig } from "../../../Utils/NetworkDiscovery/SnmpScanConfigUtil";
148
+ import * as DiscoveredDeviceBuilder from "../../../Utils/NetworkDiscovery/DiscoveredDeviceBuilder";
142
149
  import BadDataException from "../../../Types/Exception/BadDataException";
143
150
  import { JSONObject } from "../../../Types/JSON";
144
151
  import ObjectID from "../../../Types/ObjectID";
152
+ import PositiveNumber from "../../../Types/PositiveNumber";
145
153
  import OneUptimeDate from "../../../Types/Date";
146
154
  import MonitorSteps from "../../../Types/Monitor/MonitorSteps";
147
155
  import MonitorStep from "../../../Types/Monitor/MonitorStep";
@@ -150,7 +158,7 @@ import {
150
158
  AutoImportRuleRunResult,
151
159
  MAX_MATCHED_IP_SAMPLE,
152
160
  } from "../../../Types/NetworkAutomation/RuleRunResult";
153
- import { describe, expect, it, beforeEach } from "@jest/globals";
161
+ import { afterEach, describe, expect, it, beforeEach } from "@jest/globals";
154
162
 
155
163
  /*
156
164
  * The engine yields the event loop between scans via setImmediate — a Node
@@ -3302,3 +3310,1454 @@ describe("a capped run reports the remainder (issue #3642)", () => {
3302
3310
  expect(Object.keys(updateCall.data)).not.toContain("autoImportProcessedAt");
3303
3311
  });
3304
3312
  });
3313
+
3314
+ /*
3315
+ * OneUptime issue #3678: discovered devices were named by their full FQDN
3316
+ * ("wb-0660-kds01.wbhq.com") and the operator wanted the short hostname, with
3317
+ * the FQDN kept separately.
3318
+ *
3319
+ * The naming decision itself lives in DiscoveredDeviceBuilder and is tested
3320
+ * there. What these pin is the part only the ENGINE can get wrong, all of it
3321
+ * silently:
3322
+ *
3323
+ * - the scan's `useShortDeviceNames` column has to be SELECTED on both of
3324
+ * the engine's scan reads, or it arrives undefined and the builder reads
3325
+ * that as "off" — every host then imports under its FQDN on the path
3326
+ * nobody reviews;
3327
+ * - the collision retry has to name the device under the same choice, or
3328
+ * only the hosts that happened to collide come back as FQDNs;
3329
+ * - a dry run has to preview what the real run will create;
3330
+ * - the full reverse-DNS name has to land on the device as `dnsName`
3331
+ * whatever the choice, because with short names on it is the only place
3332
+ * the FQDN survives.
3333
+ *
3334
+ * Unlike the rest of this file, the scan reads here are PROJECTED THROUGH THE
3335
+ * ENGINE'S OWN `select`. A stub that handed back the whole fixture would carry
3336
+ * `useShortDeviceNames: true` into the builder whether or not the engine asked
3337
+ * for the column, and every test below would pass against an engine that
3338
+ * imports FQDNs in production.
3339
+ */
3340
+ describe("short device names on auto-import (issue #3678)", () => {
3341
+ const PTR_NAME: string = "wb-0660-kds01.wbhq.com";
3342
+ const SHORT_NAME: string = "wb-0660-kds01";
3343
+
3344
+ /*
3345
+ * The row as the database would return it for a given select: only the
3346
+ * selected columns, everything else absent. `id` rides along with `_id`
3347
+ * because on a real model it is a getter over `_id`.
3348
+ */
3349
+ function projectThroughSelect(
3350
+ scan: NetworkDeviceDiscoveryScan,
3351
+ select: Record<string, unknown> | undefined,
3352
+ ): NetworkDeviceDiscoveryScan {
3353
+ const stored: Record<string, unknown> = scan as unknown as Record<
3354
+ string,
3355
+ unknown
3356
+ >;
3357
+ const projected: Record<string, unknown> = {};
3358
+
3359
+ for (const column of Object.keys(select || {})) {
3360
+ if (column in stored) {
3361
+ projected[column] = stored[column];
3362
+ }
3363
+ }
3364
+
3365
+ if ("_id" in projected) {
3366
+ projected["id"] = stored["id"];
3367
+ }
3368
+
3369
+ return projected as unknown as NetworkDeviceDiscoveryScan;
3370
+ }
3371
+
3372
+ // The automatic path's single scan read, honouring its select.
3373
+ function mockProcessedScan(scan: NetworkDeviceDiscoveryScan): void {
3374
+ scanFindOneByMock.mockImplementation(
3375
+ (args: { select?: Record<string, unknown> }) => {
3376
+ return Promise.resolve(projectThroughSelect(scan, args.select));
3377
+ },
3378
+ );
3379
+ }
3380
+
3381
+ // Run Now's two-phase read, with the per-scan re-read honouring its select.
3382
+ function mockRunNowScan(scan: NetworkDeviceDiscoveryScan): void {
3383
+ scanFindByMock.mockResolvedValue([
3384
+ { id: SCAN_ID } as unknown as NetworkDeviceDiscoveryScan,
3385
+ ]);
3386
+ scanFindOneByMock.mockImplementation(
3387
+ (args: { select?: Record<string, unknown> }) => {
3388
+ return Promise.resolve(projectThroughSelect(scan, args.select));
3389
+ },
3390
+ );
3391
+ }
3392
+
3393
+ /*
3394
+ * A host with no sysName, named only by its PTR record — the reporter's
3395
+ * case: SNMP was not answering, so reverse DNS is the only name there is.
3396
+ */
3397
+ function makePtrNamedHost(
3398
+ overrides: Partial<DiscoveredNetworkDevice> = {},
3399
+ ): DiscoveredNetworkDevice {
3400
+ return {
3401
+ ipAddress: "10.0.0.5",
3402
+ dnsHostname: PTR_NAME,
3403
+ ...overrides,
3404
+ };
3405
+ }
3406
+
3407
+ /*
3408
+ * The builder spy the dry-run cases install, put back after each test so
3409
+ * the real builder is what every later test in this file runs against.
3410
+ * Tracked and restored by name, so nothing else this file mocks is touched.
3411
+ */
3412
+ let builderSpy: jest.SpyInstance | null = null;
3413
+
3414
+ function spyOnDeviceBuilder(): jest.SpyInstance {
3415
+ builderSpy = jest.spyOn(
3416
+ DiscoveredDeviceBuilder,
3417
+ "buildNetworkDeviceFromDiscoveredHost",
3418
+ );
3419
+ return builderSpy;
3420
+ }
3421
+
3422
+ afterEach(() => {
3423
+ builderSpy?.mockRestore();
3424
+ builderSpy = null;
3425
+ });
3426
+
3427
+ describe("the scan reads", () => {
3428
+ it("selects the whole builder select, naming choice included, on the automatic path", async () => {
3429
+ mockProcessedScan(
3430
+ makeScan({
3431
+ useShortDeviceNames: true,
3432
+ discoveredDevices: [makePtrNamedHost()],
3433
+ }),
3434
+ );
3435
+
3436
+ await processScan();
3437
+
3438
+ const select: Record<string, unknown> =
3439
+ scanFindOneByMock.mock.calls[0]![0].select;
3440
+
3441
+ expect(select["useShortDeviceNames"]).toBe(true);
3442
+ expect(select).toMatchObject(AUTO_IMPORT_SCAN_BUILDER_SELECT);
3443
+ });
3444
+
3445
+ it("selects the whole builder select, naming choice included, on Run Now's re-read", async () => {
3446
+ ruleFindOneByMock.mockResolvedValue(makeRule());
3447
+ ruleFindByMock.mockResolvedValue([]);
3448
+ mockRunNowScan(
3449
+ makeScan({
3450
+ useShortDeviceNames: true,
3451
+ discoveredDevices: [makePtrNamedHost()],
3452
+ }),
3453
+ );
3454
+
3455
+ await runRule(true);
3456
+
3457
+ const select: Record<string, unknown> =
3458
+ scanFindOneByMock.mock.calls[0]![0].select;
3459
+
3460
+ expect(select["useShortDeviceNames"]).toBe(true);
3461
+ expect(select).toMatchObject(AUTO_IMPORT_SCAN_BUILDER_SELECT);
3462
+ });
3463
+ });
3464
+
3465
+ describe("the automatic path", () => {
3466
+ it("imports a PTR-named host under its short name when the scan asks for short names", async () => {
3467
+ mockProcessedScan(
3468
+ makeScan({
3469
+ useShortDeviceNames: true,
3470
+ discoveredDevices: [makePtrNamedHost()],
3471
+ }),
3472
+ );
3473
+
3474
+ const result: AutoImportRuleRunResult | null = await processScan();
3475
+
3476
+ expect(result).toMatchObject({ devicesCreated: 1, devicesFailed: 0 });
3477
+ expect(createMock).toHaveBeenCalledTimes(1);
3478
+
3479
+ const device: NetworkDevice = createdDevice(0);
3480
+ expect(device.name).toBe(SHORT_NAME);
3481
+ // The FQDN the name no longer carries is kept on the device.
3482
+ expect(device.dnsName).toBe(PTR_NAME);
3483
+ expect(device.hostname).toBe("10.0.0.5");
3484
+ });
3485
+
3486
+ it("imports a PTR-named host under its full name when the scan's flag is off", async () => {
3487
+ mockProcessedScan(
3488
+ makeScan({
3489
+ useShortDeviceNames: false,
3490
+ discoveredDevices: [makePtrNamedHost()],
3491
+ }),
3492
+ );
3493
+
3494
+ await processScan();
3495
+
3496
+ const device: NetworkDevice = createdDevice(0);
3497
+ expect(device.name).toBe(PTR_NAME);
3498
+ /*
3499
+ * Set with the flag off too: it is a fact about the host, and it is what
3500
+ * keeps the device findable (and site-rule-matchable) by its DNS name
3501
+ * after somebody renames it.
3502
+ */
3503
+ expect(device.dnsName).toBe(PTR_NAME);
3504
+ });
3505
+
3506
+ /*
3507
+ * Every scan that existed before the column did, and any scan row written
3508
+ * without it, reads as off — nothing about an existing estate's naming
3509
+ * changes on deploy.
3510
+ */
3511
+ it("imports the full name from a scan that never set the flag", async () => {
3512
+ mockProcessedScan(makeScan({ discoveredDevices: [makePtrNamedHost()] }));
3513
+
3514
+ await processScan();
3515
+
3516
+ expect(createdDevice(0).name).toBe(PTR_NAME);
3517
+ expect(createdDevice(0).dnsName).toBe(PTR_NAME);
3518
+ });
3519
+
3520
+ /*
3521
+ * The column is boolean NOT NULL, but the value still comes out of a row
3522
+ * the engine did not write. Only an exact `true` turns renaming on.
3523
+ */
3524
+ it("does not treat a truthy non-boolean flag as on", async () => {
3525
+ mockProcessedScan(
3526
+ makeScan({
3527
+ useShortDeviceNames: "true",
3528
+ discoveredDevices: [makePtrNamedHost()],
3529
+ }),
3530
+ );
3531
+
3532
+ await processScan();
3533
+
3534
+ expect(createdDevice(0).name).toBe(PTR_NAME);
3535
+ });
3536
+
3537
+ /*
3538
+ * Network gear routinely reports its FQDN as sysName, so short names apply
3539
+ * to the sysName winner as well — and shortening never changes WHICH name
3540
+ * wins. The PTR name here is a DHCP-style one that would make a poor
3541
+ * device name; it is still what goes into `dnsName`, because that column
3542
+ * is what DNS says, not what the device says.
3543
+ */
3544
+ it("shortens an FQDN sysName, keeps sysName ahead of the PTR name, and stores the PTR name as dnsName", async () => {
3545
+ mockProcessedScan(
3546
+ makeScan({
3547
+ useShortDeviceNames: true,
3548
+ discoveredDevices: [
3549
+ makeHost({
3550
+ sysName: "core-sw01.corp.example.com",
3551
+ dnsHostname: "10-0-0-5.dhcp.corp.example.com",
3552
+ }),
3553
+ ],
3554
+ }),
3555
+ );
3556
+
3557
+ await processScan();
3558
+
3559
+ const device: NetworkDevice = createdDevice(0);
3560
+ expect(device.name).toBe("core-sw01");
3561
+ expect(device.dnsName).toBe("10-0-0-5.dhcp.corp.example.com");
3562
+ });
3563
+
3564
+ // A device's own name is never passed off as a DNS name.
3565
+ it("never fills dnsName from sysName when the host has no PTR record", async () => {
3566
+ mockProcessedScan(
3567
+ makeScan({
3568
+ useShortDeviceNames: true,
3569
+ discoveredDevices: [
3570
+ makeHost({ sysName: "core-sw01.corp.example.com" }),
3571
+ ],
3572
+ }),
3573
+ );
3574
+
3575
+ await processScan();
3576
+
3577
+ const device: NetworkDevice = createdDevice(0);
3578
+ expect(device.name).toBe("core-sw01");
3579
+ expect(device.dnsName).toBeUndefined();
3580
+ });
3581
+
3582
+ it("leaves a single-label sysName exactly as the device reported it", async () => {
3583
+ mockProcessedScan(
3584
+ makeScan({
3585
+ useShortDeviceNames: true,
3586
+ discoveredDevices: [makeHost()],
3587
+ }),
3588
+ );
3589
+
3590
+ await processScan();
3591
+
3592
+ expect(createdDevice(0).name).toBe("core-switch-01");
3593
+ });
3594
+
3595
+ /*
3596
+ * The address is the last-resort name, and "10.0.0.5" has the shape of a
3597
+ * four-label hostname. Cutting it to "10" would give every nameless host
3598
+ * in a /8 the same name.
3599
+ */
3600
+ it("never shortens a host named only by its address", async () => {
3601
+ mockProcessedScan(
3602
+ makeScan({
3603
+ useShortDeviceNames: true,
3604
+ discoveredDevices: [{ ipAddress: "10.0.0.5" }],
3605
+ }),
3606
+ );
3607
+
3608
+ await processScan();
3609
+
3610
+ const device: NetworkDevice = createdDevice(0);
3611
+ expect(device.name).toBe("10.0.0.5");
3612
+ expect(device.dnsName).toBeUndefined();
3613
+ });
3614
+
3615
+ it("stores the PTR name without its root label", async () => {
3616
+ mockProcessedScan(
3617
+ makeScan({
3618
+ useShortDeviceNames: true,
3619
+ discoveredDevices: [
3620
+ makePtrNamedHost({ dnsHostname: `${PTR_NAME}.` }),
3621
+ ],
3622
+ }),
3623
+ );
3624
+
3625
+ await processScan();
3626
+
3627
+ expect(createdDevice(0).name).toBe(SHORT_NAME);
3628
+ expect(createdDevice(0).dnsName).toBe(PTR_NAME);
3629
+ });
3630
+
3631
+ it("stores no dnsName for a blank PTR name rather than an empty string", async () => {
3632
+ mockProcessedScan(
3633
+ makeScan({
3634
+ discoveredDevices: [makeHost({ dnsHostname: " " })],
3635
+ }),
3636
+ );
3637
+
3638
+ await processScan();
3639
+
3640
+ expect(createdDevice(0).name).toBe("core-switch-01");
3641
+ expect(createdDevice(0).dnsName).toBeUndefined();
3642
+ });
3643
+ });
3644
+
3645
+ describe("the name-collision retry", () => {
3646
+ /*
3647
+ * Short names collide far more often than FQDNs — "sw01" in two sites is
3648
+ * ordinary — so this retry is the common path for short names, not an edge
3649
+ * case. It must keep the naming choice: a fallback of
3650
+ * "wb-0660-kds01.wbhq.com (10.0.0.5)" would bring the FQDN back for
3651
+ * exactly the devices that collided.
3652
+ */
3653
+ it("retries under the short name plus the address when short names are on", async () => {
3654
+ mockProcessedScan(
3655
+ makeScan({
3656
+ useShortDeviceNames: true,
3657
+ discoveredDevices: [makePtrNamedHost()],
3658
+ }),
3659
+ );
3660
+ createMock
3661
+ .mockRejectedValueOnce(
3662
+ new BadDataException("Network Device with this name already exists."),
3663
+ )
3664
+ .mockResolvedValueOnce({});
3665
+ deviceFindOneByMock.mockResolvedValue(null);
3666
+
3667
+ const result: AutoImportRuleRunResult | null = await processScan();
3668
+
3669
+ expect(createMock).toHaveBeenCalledTimes(2);
3670
+ expect(createdDevice(0).name).toBe(SHORT_NAME);
3671
+ expect(createdDevice(1).name).toBe(`${SHORT_NAME} (10.0.0.5)`);
3672
+ // Same device both times: the FQDN is kept on the retry too.
3673
+ expect(createdDevice(1).dnsName).toBe(PTR_NAME);
3674
+ expect(createdDevice(1).hostname).toBe("10.0.0.5");
3675
+ expect(result).toMatchObject({ devicesCreated: 1, devicesFailed: 0 });
3676
+ });
3677
+
3678
+ it("retries under the full name plus the address when short names are off", async () => {
3679
+ mockProcessedScan(
3680
+ makeScan({
3681
+ useShortDeviceNames: false,
3682
+ discoveredDevices: [makePtrNamedHost()],
3683
+ }),
3684
+ );
3685
+ createMock
3686
+ .mockRejectedValueOnce(
3687
+ new BadDataException("Network Device with this name already exists."),
3688
+ )
3689
+ .mockResolvedValueOnce({});
3690
+ deviceFindOneByMock.mockResolvedValue(null);
3691
+
3692
+ await processScan();
3693
+
3694
+ expect(createdDevice(0).name).toBe(PTR_NAME);
3695
+ expect(createdDevice(1).name).toBe(`${PTR_NAME} (10.0.0.5)`);
3696
+ });
3697
+ });
3698
+
3699
+ describe("Run Now", () => {
3700
+ /*
3701
+ * A dry run reports counts rather than names, so what it would create is
3702
+ * read off the builder call itself — the same in-memory device the real
3703
+ * run's create would have been handed. The spy calls through.
3704
+ */
3705
+ it("previews the short name on a dry run", async () => {
3706
+ const spy: jest.SpyInstance = spyOnDeviceBuilder();
3707
+
3708
+ ruleFindOneByMock.mockResolvedValue(makeRule());
3709
+ ruleFindByMock.mockResolvedValue([]);
3710
+ mockRunNowScan(
3711
+ makeScan({
3712
+ useShortDeviceNames: true,
3713
+ discoveredDevices: [makePtrNamedHost()],
3714
+ }),
3715
+ );
3716
+
3717
+ const result: AutoImportRuleRunResult = await runRule(true);
3718
+
3719
+ expect(result).toMatchObject({
3720
+ hostsMatched: 1,
3721
+ devicesCreated: 0,
3722
+ isDryRun: true,
3723
+ });
3724
+ expect(createMock).not.toHaveBeenCalled();
3725
+
3726
+ expect(spy).toHaveBeenCalledTimes(1);
3727
+ const previewed: NetworkDevice = spy.mock.results[0]!
3728
+ .value as NetworkDevice;
3729
+ expect(previewed.name).toBe(SHORT_NAME);
3730
+ expect(previewed.dnsName).toBe(PTR_NAME);
3731
+ });
3732
+
3733
+ it("previews the full name on a dry run of a scan without short names", async () => {
3734
+ const spy: jest.SpyInstance = spyOnDeviceBuilder();
3735
+
3736
+ ruleFindOneByMock.mockResolvedValue(makeRule());
3737
+ ruleFindByMock.mockResolvedValue([]);
3738
+ mockRunNowScan(makeScan({ discoveredDevices: [makePtrNamedHost()] }));
3739
+
3740
+ await runRule(true);
3741
+
3742
+ expect(spy).toHaveBeenCalledTimes(1);
3743
+ const previewed: NetworkDevice = spy.mock.results[0]!
3744
+ .value as NetworkDevice;
3745
+ expect(previewed.name).toBe(PTR_NAME);
3746
+ });
3747
+
3748
+ it("imports the short name on a real run", async () => {
3749
+ ruleFindOneByMock.mockResolvedValue(makeRule());
3750
+ ruleFindByMock.mockResolvedValue([]);
3751
+ mockRunNowScan(
3752
+ makeScan({
3753
+ useShortDeviceNames: true,
3754
+ discoveredDevices: [makePtrNamedHost()],
3755
+ }),
3756
+ );
3757
+
3758
+ const result: AutoImportRuleRunResult = await runRule(false);
3759
+
3760
+ expect(result).toMatchObject({ devicesCreated: 1, isDryRun: false });
3761
+ expect(createdDevice(0).name).toBe(SHORT_NAME);
3762
+ expect(createdDevice(0).dnsName).toBe(PTR_NAME);
3763
+ });
3764
+ });
3765
+
3766
+ describe("monitors provisioned onto a short-named device", () => {
3767
+ /*
3768
+ * The engine names no monitor itself — a template monitor is named after
3769
+ * the device it watches — so a short-named device must yield a
3770
+ * short-named monitor without any naming code of the engine's own. Driven
3771
+ * through a ping-only host, which is exactly the reporter's estate: no
3772
+ * SNMP answer, a PTR record, and a rule with includePingOnlyHosts.
3773
+ */
3774
+ it("names a ping-only host's template monitor after the short device name", async () => {
3775
+ mockProcessedScan(
3776
+ makeScan({
3777
+ useShortDeviceNames: true,
3778
+ discoveredDevices: [makePtrNamedHost({ snmpReachable: false })],
3779
+ }),
3780
+ );
3781
+ ruleFindByMock.mockResolvedValue([
3782
+ makeRule({
3783
+ includePingOnlyHosts: true,
3784
+ monitorTemplateId: TEMPLATE_ID,
3785
+ }),
3786
+ ]);
3787
+ monitorTemplateFindByMock.mockResolvedValue([makeTemplate()]);
3788
+
3789
+ const result: AutoImportRuleRunResult | null = await processScan();
3790
+
3791
+ expect(result).toMatchObject({ devicesCreated: 1, monitorsCreated: 1 });
3792
+ expect(createdDevice(0).name).toBe(SHORT_NAME);
3793
+ expect(provisionedMonitor(0).name).toBe(`${SHORT_NAME} - SNMP health`);
3794
+ expect(provisionedMonitor(0).name).not.toContain("wbhq.com");
3795
+ });
3796
+
3797
+ it("names the monitor after the full device name when short names are off", async () => {
3798
+ mockProcessedScan(
3799
+ makeScan({
3800
+ discoveredDevices: [makePtrNamedHost({ snmpReachable: false })],
3801
+ }),
3802
+ );
3803
+ ruleFindByMock.mockResolvedValue([
3804
+ makeRule({
3805
+ includePingOnlyHosts: true,
3806
+ monitorTemplateId: TEMPLATE_ID,
3807
+ }),
3808
+ ]);
3809
+ monitorTemplateFindByMock.mockResolvedValue([
3810
+ makeTemplate({ monitorName: undefined }),
3811
+ ]);
3812
+
3813
+ await processScan();
3814
+
3815
+ expect(provisionedMonitor(0).name).toBe(PTR_NAME);
3816
+ });
3817
+ });
3818
+ });
3819
+
3820
+ describe("renaming devices imported during the run (issue #3677)", () => {
3821
+ /*
3822
+ * The bug: auto-import (and an operator in the Review dialog) imports from
3823
+ * a running sweep's partial snapshots, which never carry reverse-DNS names —
3824
+ * the probe resolves those after the sweep, for the final upload only. A
3825
+ * host with no sysName therefore imports named by its address, and when the
3826
+ * Completed result lands with the PTR name, the import skips the host as
3827
+ * already registered. Without this step the device is "10.0.0.5" forever.
3828
+ *
3829
+ * These cases pin the step's wiring into the automatic path — when it runs
3830
+ * and when it must not, how it resolves names against the rest of the
3831
+ * project, and that nothing it does can cost the scan its import or its
3832
+ * processed stamp. The per-device decision rules are pinned in
3833
+ * Tests/Utils/NetworkDiscovery/RunImportedDeviceNaming.test.ts.
3834
+ */
3835
+ const deviceUpdateMock: jest.Mock =
3836
+ NetworkDeviceService.updateOneById as unknown as jest.Mock;
3837
+ const deviceCountByMock: jest.Mock =
3838
+ NetworkDeviceService.countBy as unknown as jest.Mock;
3839
+ const loggerInfoMock: jest.Mock = logger.info as unknown as jest.Mock;
3840
+
3841
+ const PTR_NAME: string = "kds01.wbhq.com";
3842
+ const RUN_STARTED_AT: Date = new Date(
3843
+ RECENT_COMPLETED_AT.getTime() - 20 * 60 * 1000,
3844
+ );
3845
+ const DURING_RUN: Date = new Date(RUN_STARTED_AT.getTime() + 5 * 60 * 1000);
3846
+ const BEFORE_RUN: Date = new Date(
3847
+ RUN_STARTED_AT.getTime() - 24 * 60 * 60 * 1000,
3848
+ );
3849
+
3850
+ // The row a finished run uploads: the host now carries its PTR name.
3851
+ function makeNamedHost(
3852
+ overrides: Partial<DiscoveredNetworkDevice> = {},
3853
+ ): DiscoveredNetworkDevice {
3854
+ return {
3855
+ ipAddress: "10.0.0.5",
3856
+ dnsHostname: PTR_NAME,
3857
+ snmpReachable: false,
3858
+ ...overrides,
3859
+ };
3860
+ }
3861
+
3862
+ function makeCompletedRunScan(
3863
+ overrides: Record<string, unknown> = {},
3864
+ ): NetworkDeviceDiscoveryScan {
3865
+ return makeScan({
3866
+ startedAt: RUN_STARTED_AT,
3867
+ discoveredDevices: [makeNamedHost()],
3868
+ ...overrides,
3869
+ });
3870
+ }
3871
+
3872
+ let nextDeviceNumber: number = 0;
3873
+
3874
+ // A device imported from a partial snapshot of this run: named by address.
3875
+ function makeRunImportedDevice(
3876
+ overrides: Record<string, unknown> = {},
3877
+ ): NetworkDevice {
3878
+ nextDeviceNumber++;
3879
+ const suffix: string = nextDeviceNumber.toString(16).padStart(12, "0");
3880
+ const hostname: string = (overrides["hostname"] as string) || "10.0.0.5";
3881
+
3882
+ return makeExistingDevice({
3883
+ id: new ObjectID(`66666666-6666-4666-8666-${suffix}`),
3884
+ name: hostname,
3885
+ hostname: hostname,
3886
+ createdAt: DURING_RUN,
3887
+ ...overrides,
3888
+ });
3889
+ }
3890
+
3891
+ // The text a QueryHelper.findWithSameText filter compares against.
3892
+ function sameTextValue(filter: unknown): string {
3893
+ const parameters: Record<string, string> = (
3894
+ filter as { _objectLiteralParameters?: Record<string, string> }
3895
+ )._objectLiteralParameters!;
3896
+
3897
+ return Object.values(parameters)[0]!;
3898
+ }
3899
+
3900
+ /*
3901
+ * The project's device table, for every read the engine makes of it. The
3902
+ * name count deliberately does NOT see this pass's renames — the update
3903
+ * mock records them without touching the rows — so a test about two
3904
+ * devices wanting the same name proves the engine remembers what it handed
3905
+ * out, rather than leaning on a read-after-write the database need not give.
3906
+ */
3907
+ function useInventory(
3908
+ devices: Array<NetworkDevice>,
3909
+ otherDeviceNames: Array<string> = [],
3910
+ ): void {
3911
+ deviceFindByMock.mockImplementation(
3912
+ (args?: {
3913
+ query?: { hostname?: unknown };
3914
+ }): Promise<Array<NetworkDevice>> => {
3915
+ if (!args?.query?.hostname) {
3916
+ return Promise.resolve(devices);
3917
+ }
3918
+
3919
+ const wanted: Set<string> = new Set<string>(
3920
+ statusesMatchedBy(args.query.hostname),
3921
+ );
3922
+
3923
+ return Promise.resolve(
3924
+ devices.filter((device: NetworkDevice): boolean => {
3925
+ return wanted.has(device.hostname || "");
3926
+ }),
3927
+ );
3928
+ },
3929
+ );
3930
+
3931
+ devicesByHostnamesMock.mockImplementation(
3932
+ (data: {
3933
+ hostnames: Array<string>;
3934
+ }): Promise<Map<string, NetworkDevice>> => {
3935
+ const wanted: Set<string> = new Set<string>(data.hostnames);
3936
+ const found: Map<string, NetworkDevice> = new Map<
3937
+ string,
3938
+ NetworkDevice
3939
+ >();
3940
+
3941
+ for (const device of devices) {
3942
+ if (device.hostname && wanted.has(device.hostname)) {
3943
+ found.set(device.hostname, device);
3944
+ }
3945
+ }
3946
+
3947
+ return Promise.resolve(found);
3948
+ },
3949
+ );
3950
+
3951
+ deviceCountByMock.mockImplementation(
3952
+ (args: { query: { name: unknown } }): Promise<PositiveNumber> => {
3953
+ const wanted: string = sameTextValue(args.query.name);
3954
+ const holders: number = [
3955
+ ...devices.map((device: NetworkDevice): string => {
3956
+ return device.name || "";
3957
+ }),
3958
+ ...otherDeviceNames,
3959
+ ].filter((name: string): boolean => {
3960
+ return name.trim().toLowerCase() === wanted;
3961
+ }).length;
3962
+
3963
+ return Promise.resolve(new PositiveNumber(holders));
3964
+ },
3965
+ );
3966
+ }
3967
+
3968
+ // The engine's rename lookups, told apart from the import's by their filter.
3969
+ function renameLookupCalls(): Array<any> {
3970
+ return deviceFindByMock.mock.calls
3971
+ .map((call: Array<any>): any => {
3972
+ return call[0];
3973
+ })
3974
+ .filter((args: any): boolean => {
3975
+ return Boolean(args?.query?.createdAt);
3976
+ });
3977
+ }
3978
+
3979
+ function renameUpdates(): Array<{
3980
+ id: string;
3981
+ data: JSONObject;
3982
+ props: any;
3983
+ }> {
3984
+ return deviceUpdateMock.mock.calls.map(
3985
+ (call: Array<any>): { id: string; data: JSONObject; props: any } => {
3986
+ return {
3987
+ id: call[0].id.toString(),
3988
+ data: call[0].data,
3989
+ props: call[0].props,
3990
+ };
3991
+ },
3992
+ );
3993
+ }
3994
+
3995
+ beforeEach(() => {
3996
+ nextDeviceNumber = 0;
3997
+ deviceUpdateMock.mockResolvedValue(1);
3998
+ deviceCountByMock.mockResolvedValue(new PositiveNumber(0));
3999
+ // Only a rule that imports nothing here, unless a case says otherwise.
4000
+ ruleFindByMock.mockResolvedValue([
4001
+ makeRule({ ipMatchTarget: "192.168.99.0/24" }),
4002
+ ]);
4003
+ });
4004
+
4005
+ describe("on a Completed result", () => {
4006
+ it("renames a device the run imported by address to the name the result resolved", async () => {
4007
+ const device: NetworkDevice = makeRunImportedDevice();
4008
+ useInventory([device]);
4009
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4010
+
4011
+ await processScan();
4012
+
4013
+ expect(renameUpdates()).toEqual([
4014
+ {
4015
+ id: device.id!.toString(),
4016
+ data: { name: PTR_NAME, dnsName: PTR_NAME },
4017
+ props: { isRoot: true },
4018
+ },
4019
+ ]);
4020
+ });
4021
+
4022
+ it("selects startedAt on the scan read, since it is what the step compares against", async () => {
4023
+ useInventory([]);
4024
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4025
+
4026
+ await processScan();
4027
+
4028
+ expect(scanFindOneByMock.mock.calls[0]![0].select.startedAt).toBe(true);
4029
+ });
4030
+
4031
+ it("asks only for this project's devices at the named addresses, created since the run started, and only the columns it needs", async () => {
4032
+ useInventory([makeRunImportedDevice()]);
4033
+ scanFindOneByMock.mockResolvedValue(
4034
+ makeCompletedRunScan({
4035
+ discoveredDevices: [
4036
+ makeNamedHost(),
4037
+ // No name yet: nothing to rename it to, so it is not asked about.
4038
+ makeNamedHost({ ipAddress: "10.0.0.6", dnsHostname: undefined }),
4039
+ ],
4040
+ }),
4041
+ );
4042
+
4043
+ await processScan();
4044
+
4045
+ const lookups: Array<any> = renameLookupCalls();
4046
+
4047
+ expect(lookups).toHaveLength(1);
4048
+ expect(lookups[0].query.projectId).toBe(PROJECT_ID);
4049
+ expect(statusesMatchedBy(lookups[0].query.hostname)).toEqual([
4050
+ "10.0.0.5",
4051
+ ]);
4052
+ expect(
4053
+ Object.values(
4054
+ (
4055
+ lookups[0].query.createdAt as {
4056
+ _objectLiteralParameters: Record<string, unknown>;
4057
+ }
4058
+ )._objectLiteralParameters,
4059
+ ),
4060
+ ).toEqual([RUN_STARTED_AT]);
4061
+ expect(lookups[0].select).toEqual({
4062
+ _id: true,
4063
+ projectId: true,
4064
+ name: true,
4065
+ hostname: true,
4066
+ dnsName: true,
4067
+ createdAt: true,
4068
+ });
4069
+ expect(lookups[0].props).toEqual({ isRoot: true });
4070
+ });
4071
+
4072
+ it("checks the new name the way the create-time uniqueness check does: case-insensitively, within the project", async () => {
4073
+ useInventory([makeRunImportedDevice()]);
4074
+ scanFindOneByMock.mockResolvedValue(
4075
+ makeCompletedRunScan({
4076
+ discoveredDevices: [makeNamedHost({ dnsHostname: "KDS01.WbHq.com" })],
4077
+ }),
4078
+ );
4079
+
4080
+ await processScan();
4081
+
4082
+ expect(deviceCountByMock).toHaveBeenCalled();
4083
+ const countArgs: any = deviceCountByMock.mock.calls[0]![0];
4084
+ expect(countArgs.query.projectId).toBe(PROJECT_ID);
4085
+ expect(sameTextValue(countArgs.query.name)).toBe("kds01.wbhq.com");
4086
+ expect(countArgs.props).toEqual({ isRoot: true });
4087
+ // Case as the reverse zone wrote it.
4088
+ expect(renameUpdates()[0]!.data["name"]).toBe("KDS01.WbHq.com");
4089
+ });
4090
+
4091
+ it("runs even when the project has no import rules at all, and still stamps the result", async () => {
4092
+ const device: NetworkDevice = makeRunImportedDevice();
4093
+ useInventory([device]);
4094
+ ruleFindByMock.mockResolvedValue([]);
4095
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4096
+
4097
+ const result: AutoImportRuleRunResult | null = await processScan();
4098
+
4099
+ expect(result).toBeNull();
4100
+ expect(renameUpdates()).toHaveLength(1);
4101
+ expect(renameUpdates()[0]!.data["name"]).toBe(PTR_NAME);
4102
+ expect(scanUpdateMock).toHaveBeenCalledTimes(1);
4103
+ expect(
4104
+ scanUpdateMock.mock.calls[0]![0].data.autoImportProcessedAt,
4105
+ ).toBeInstanceOf(Date);
4106
+ });
4107
+
4108
+ it("runs when the project's only rules are exclusions", async () => {
4109
+ useInventory([makeRunImportedDevice()]);
4110
+ ruleFindByMock.mockResolvedValue([makeRule({ isExclusion: true })]);
4111
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4112
+
4113
+ await processScan();
4114
+
4115
+ expect(renameUpdates()).toHaveLength(1);
4116
+ });
4117
+
4118
+ it("renames before the import re-reads the devices, so a monitor built in the same pass sees the new name", async () => {
4119
+ useInventory([makeRunImportedDevice()]);
4120
+ ruleFindByMock.mockResolvedValue([
4121
+ makeRule({ includePingOnlyHosts: true }),
4122
+ ]);
4123
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4124
+
4125
+ await processScan();
4126
+
4127
+ expect(deviceUpdateMock).toHaveBeenCalledTimes(1);
4128
+ expect(devicesByHostnamesMock).toHaveBeenCalled();
4129
+ expect(deviceUpdateMock.mock.invocationCallOrder[0]!).toBeLessThan(
4130
+ devicesByHostnamesMock.mock.invocationCallOrder[0]!,
4131
+ );
4132
+ });
4133
+
4134
+ it("still imports the result's new hosts in the same pass", async () => {
4135
+ useInventory([makeRunImportedDevice()]);
4136
+ ruleFindByMock.mockResolvedValue([
4137
+ makeRule({ includePingOnlyHosts: true }),
4138
+ ]);
4139
+ scanFindOneByMock.mockResolvedValue(
4140
+ makeCompletedRunScan({
4141
+ discoveredDevices: [
4142
+ makeNamedHost(),
4143
+ makeNamedHost({
4144
+ ipAddress: "10.0.0.9",
4145
+ dnsHostname: "new.wbhq.com",
4146
+ }),
4147
+ ],
4148
+ }),
4149
+ );
4150
+
4151
+ const result: AutoImportRuleRunResult | null = await processScan();
4152
+
4153
+ expect(renameUpdates()).toHaveLength(1);
4154
+ expect(result).toMatchObject({
4155
+ devicesCreated: 1,
4156
+ hostsSkippedAlreadyRegistered: 1,
4157
+ });
4158
+ expect(createdDevice(0).name).toBe("new.wbhq.com");
4159
+ });
4160
+
4161
+ it("renames to the short hostname when the scan asks for short names, keeping the FQDN as dnsName", async () => {
4162
+ useInventory([makeRunImportedDevice()]);
4163
+ scanFindOneByMock.mockResolvedValue(
4164
+ makeCompletedRunScan({ useShortDeviceNames: true }),
4165
+ );
4166
+
4167
+ await processScan();
4168
+
4169
+ expect(renameUpdates()[0]!.data).toEqual({
4170
+ name: "kds01",
4171
+ dnsName: PTR_NAME,
4172
+ });
4173
+ });
4174
+
4175
+ it("renames a device whose name is its address in a different case or with whitespace", async () => {
4176
+ useInventory([makeRunImportedDevice({ name: " 10.0.0.5 " })]);
4177
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4178
+
4179
+ await processScan();
4180
+
4181
+ expect(renameUpdates()).toHaveLength(1);
4182
+ });
4183
+
4184
+ it("renames by sysName when the final result carries one", async () => {
4185
+ useInventory([makeRunImportedDevice()]);
4186
+ scanFindOneByMock.mockResolvedValue(
4187
+ makeCompletedRunScan({
4188
+ discoveredDevices: [
4189
+ makeNamedHost({ sysName: "core-sw-01", dnsHostname: undefined }),
4190
+ ],
4191
+ }),
4192
+ );
4193
+
4194
+ await processScan();
4195
+
4196
+ // No PTR record, so nothing to store as a DNS name.
4197
+ expect(renameUpdates()[0]!.data).toEqual({ name: "core-sw-01" });
4198
+ });
4199
+
4200
+ it("logs how many devices it named, with the project attached", async () => {
4201
+ useInventory([makeRunImportedDevice()]);
4202
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4203
+
4204
+ await processScan();
4205
+
4206
+ expect(loggerInfoMock).toHaveBeenCalledWith(
4207
+ expect.stringContaining("named 1 device(s)"),
4208
+ { projectId: PROJECT_ID.toString() },
4209
+ );
4210
+ });
4211
+ });
4212
+
4213
+ describe("when it must not run", () => {
4214
+ it("does not run for a scan that is still In Progress", async () => {
4215
+ useInventory([makeRunImportedDevice()]);
4216
+ scanFindOneByMock.mockResolvedValue(
4217
+ makeCompletedRunScan({
4218
+ status: "In Progress",
4219
+ completedAt: undefined,
4220
+ }),
4221
+ );
4222
+
4223
+ await processScan();
4224
+
4225
+ expect(renameLookupCalls()).toHaveLength(0);
4226
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4227
+ });
4228
+
4229
+ it("does not run for a Failed scan, whatever its rows say", async () => {
4230
+ useInventory([makeRunImportedDevice()]);
4231
+ scanFindOneByMock.mockResolvedValue(
4232
+ makeCompletedRunScan({ status: "Failed" }),
4233
+ );
4234
+
4235
+ await processScan();
4236
+
4237
+ expect(renameLookupCalls()).toHaveLength(0);
4238
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4239
+ });
4240
+
4241
+ it("does not run for a Completed result too old to auto-import, and still stamps it", async () => {
4242
+ const startedAt: Date = OneUptimeDate.getSomeHoursAgo(
4243
+ MAX_RESULT_AGE_IN_HOURS + 2,
4244
+ );
4245
+ useInventory([
4246
+ makeRunImportedDevice({
4247
+ createdAt: new Date(startedAt.getTime() + 60 * 1000),
4248
+ }),
4249
+ ]);
4250
+ scanFindOneByMock.mockResolvedValue(
4251
+ makeCompletedRunScan({
4252
+ startedAt: startedAt,
4253
+ completedAt: OneUptimeDate.getSomeHoursAgo(
4254
+ MAX_RESULT_AGE_IN_HOURS + 1,
4255
+ ),
4256
+ }),
4257
+ );
4258
+
4259
+ const result: AutoImportRuleRunResult | null = await processScan();
4260
+
4261
+ expect(result).toBeNull();
4262
+ expect(renameLookupCalls()).toHaveLength(0);
4263
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4264
+ expect(scanUpdateMock).toHaveBeenCalledTimes(1);
4265
+ expect(loggerWarnMock).toHaveBeenCalledWith(
4266
+ expect.stringContaining("stamping it processed without importing"),
4267
+ expect.anything(),
4268
+ );
4269
+ });
4270
+
4271
+ it("does not run for a too-old result in a project with no import rules either", async () => {
4272
+ const startedAt: Date = OneUptimeDate.getSomeHoursAgo(
4273
+ MAX_RESULT_AGE_IN_HOURS + 2,
4274
+ );
4275
+ useInventory([
4276
+ makeRunImportedDevice({
4277
+ createdAt: new Date(startedAt.getTime() + 60 * 1000),
4278
+ }),
4279
+ ]);
4280
+ ruleFindByMock.mockResolvedValue([]);
4281
+ scanFindOneByMock.mockResolvedValue(
4282
+ makeCompletedRunScan({
4283
+ startedAt: startedAt,
4284
+ completedAt: OneUptimeDate.getSomeHoursAgo(
4285
+ MAX_RESULT_AGE_IN_HOURS + 1,
4286
+ ),
4287
+ }),
4288
+ );
4289
+
4290
+ await processScan();
4291
+
4292
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4293
+ expect(scanUpdateMock).toHaveBeenCalledTimes(1);
4294
+ // A rule-less project still retires old results without the warning.
4295
+ expect(loggerWarnMock).not.toHaveBeenCalled();
4296
+ });
4297
+
4298
+ /*
4299
+ * A Completed result is processed again when saving an auto-import rule
4300
+ * re-arms recent scans. A device added AFTER the run finished — typed in
4301
+ * by hand as its address, or deleted and re-added — was never imported
4302
+ * from this run's partial snapshot, so the re-armed pass must leave it
4303
+ * alone.
4304
+ */
4305
+ it("does not rename a device created after the run completed, when the result is re-processed", async () => {
4306
+ useInventory([
4307
+ makeRunImportedDevice({
4308
+ createdAt: new Date(RECENT_COMPLETED_AT.getTime() + 60 * 1000),
4309
+ }),
4310
+ ]);
4311
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4312
+
4313
+ await processScan();
4314
+
4315
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4316
+ });
4317
+
4318
+ it("does nothing, and reads no devices, when the scan has no completedAt", async () => {
4319
+ useInventory([makeRunImportedDevice()]);
4320
+ scanFindOneByMock.mockResolvedValue(
4321
+ makeCompletedRunScan({ completedAt: undefined }),
4322
+ );
4323
+
4324
+ await processScan();
4325
+
4326
+ expect(renameLookupCalls()).toHaveLength(0);
4327
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4328
+ });
4329
+
4330
+ it("does nothing, and reads no devices, when the scan has no startedAt", async () => {
4331
+ useInventory([makeRunImportedDevice()]);
4332
+ scanFindOneByMock.mockResolvedValue(
4333
+ makeCompletedRunScan({ startedAt: undefined }),
4334
+ );
4335
+
4336
+ await processScan();
4337
+
4338
+ expect(renameLookupCalls()).toHaveLength(0);
4339
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4340
+ });
4341
+
4342
+ it("does not run for a result already stamped processed", async () => {
4343
+ useInventory([makeRunImportedDevice()]);
4344
+ scanFindOneByMock.mockResolvedValue(
4345
+ makeCompletedRunScan({ autoImportProcessedAt: RECENT_COMPLETED_AT }),
4346
+ );
4347
+
4348
+ await processScan();
4349
+
4350
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4351
+ });
4352
+
4353
+ it("does not rename a device created before the run started", async () => {
4354
+ useInventory([makeRunImportedDevice({ createdAt: BEFORE_RUN })]);
4355
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4356
+
4357
+ await processScan();
4358
+
4359
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4360
+ expect(deviceCountByMock).not.toHaveBeenCalled();
4361
+ });
4362
+
4363
+ it("does not rename a device someone has already named", async () => {
4364
+ useInventory([makeRunImportedDevice({ name: "KDS till 1" })]);
4365
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4366
+
4367
+ await processScan();
4368
+
4369
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4370
+ });
4371
+
4372
+ it("does not rename a device whose host still has no name in the final result", async () => {
4373
+ useInventory([makeRunImportedDevice()]);
4374
+ scanFindOneByMock.mockResolvedValue(
4375
+ makeCompletedRunScan({
4376
+ discoveredDevices: [makeNamedHost({ dnsHostname: undefined })],
4377
+ }),
4378
+ );
4379
+
4380
+ await processScan();
4381
+
4382
+ expect(renameLookupCalls()).toHaveLength(0);
4383
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4384
+ });
4385
+
4386
+ it("never renames on a real Run Now", async () => {
4387
+ useInventory([makeRunImportedDevice()]);
4388
+ ruleFindOneByMock.mockResolvedValue(
4389
+ makeRule({ includePingOnlyHosts: true }),
4390
+ );
4391
+ ruleFindByMock.mockResolvedValue([]);
4392
+ mockRunNowScans([makeCompletedRunScan()]);
4393
+
4394
+ await runRule(false);
4395
+
4396
+ expect(renameLookupCalls()).toHaveLength(0);
4397
+ expect(deviceCountByMock).not.toHaveBeenCalled();
4398
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4399
+ });
4400
+
4401
+ it("never renames on a dry run", async () => {
4402
+ useInventory([makeRunImportedDevice()]);
4403
+ ruleFindOneByMock.mockResolvedValue(
4404
+ makeRule({ includePingOnlyHosts: true }),
4405
+ );
4406
+ ruleFindByMock.mockResolvedValue([]);
4407
+ mockRunNowScans([makeCompletedRunScan()]);
4408
+
4409
+ await runRule(true);
4410
+
4411
+ expect(renameLookupCalls()).toHaveLength(0);
4412
+ expect(deviceCountByMock).not.toHaveBeenCalled();
4413
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4414
+ });
4415
+ });
4416
+
4417
+ describe("name collisions", () => {
4418
+ it("falls back to the address-suffixed name when another device already has the name", async () => {
4419
+ useInventory([makeRunImportedDevice()], [PTR_NAME.toUpperCase()]);
4420
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4421
+
4422
+ await processScan();
4423
+
4424
+ expect(renameUpdates()[0]!.data).toEqual({
4425
+ name: `${PTR_NAME} (10.0.0.5)`,
4426
+ dnsName: PTR_NAME,
4427
+ });
4428
+ });
4429
+
4430
+ it("skips the device when the fallback name is taken too, and still imports and stamps", async () => {
4431
+ useInventory(
4432
+ [makeRunImportedDevice()],
4433
+ [PTR_NAME, `${PTR_NAME} (10.0.0.5)`],
4434
+ );
4435
+ ruleFindByMock.mockResolvedValue([
4436
+ makeRule({ includePingOnlyHosts: true }),
4437
+ ]);
4438
+ scanFindOneByMock.mockResolvedValue(
4439
+ makeCompletedRunScan({
4440
+ discoveredDevices: [
4441
+ makeNamedHost(),
4442
+ makeNamedHost({
4443
+ ipAddress: "10.0.0.9",
4444
+ dnsHostname: "new.wbhq.com",
4445
+ }),
4446
+ ],
4447
+ }),
4448
+ );
4449
+
4450
+ const result: AutoImportRuleRunResult | null = await processScan();
4451
+
4452
+ expect(deviceCountByMock).toHaveBeenCalledTimes(2);
4453
+ expect(deviceUpdateMock).not.toHaveBeenCalled();
4454
+ expect(result).toMatchObject({ devicesCreated: 1 });
4455
+ expect(scanUpdateMock).toHaveBeenCalledTimes(1);
4456
+ expect(loggerInfoMock).toHaveBeenCalledWith(
4457
+ expect.stringContaining("1 kept their address"),
4458
+ { projectId: PROJECT_ID.toString() },
4459
+ );
4460
+ });
4461
+
4462
+ it("gives the second of two devices wanting the same name in one pass the fallback name", async () => {
4463
+ // A wildcard reverse zone: two hosts, one PTR answer.
4464
+ const first: NetworkDevice = makeRunImportedDevice({
4465
+ hostname: "10.0.0.5",
4466
+ createdAt: DURING_RUN,
4467
+ });
4468
+ const second: NetworkDevice = makeRunImportedDevice({
4469
+ hostname: "10.0.0.6",
4470
+ createdAt: new Date(DURING_RUN.getTime() + 1000),
4471
+ });
4472
+ useInventory([second, first]);
4473
+ scanFindOneByMock.mockResolvedValue(
4474
+ makeCompletedRunScan({
4475
+ discoveredDevices: [
4476
+ makeNamedHost({ ipAddress: "10.0.0.6" }),
4477
+ makeNamedHost({ ipAddress: "10.0.0.5" }),
4478
+ ],
4479
+ }),
4480
+ );
4481
+
4482
+ await processScan();
4483
+
4484
+ expect(renameUpdates()).toEqual([
4485
+ {
4486
+ id: first.id!.toString(),
4487
+ data: { name: PTR_NAME, dnsName: PTR_NAME },
4488
+ props: { isRoot: true },
4489
+ },
4490
+ {
4491
+ id: second.id!.toString(),
4492
+ data: { name: `${PTR_NAME} (10.0.0.6)`, dnsName: PTR_NAME },
4493
+ props: { isRoot: true },
4494
+ },
4495
+ ]);
4496
+ });
4497
+
4498
+ it("skips the second of two devices at the same address when this pass already took both of its names", async () => {
4499
+ // Two devices at one address can only tell each other apart so far.
4500
+ const first: NetworkDevice = makeRunImportedDevice();
4501
+ const second: NetworkDevice = makeRunImportedDevice({
4502
+ createdAt: new Date(DURING_RUN.getTime() + 1000),
4503
+ });
4504
+ const third: NetworkDevice = makeRunImportedDevice({
4505
+ createdAt: new Date(DURING_RUN.getTime() + 2000),
4506
+ });
4507
+ useInventory([first, second, third]);
4508
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4509
+
4510
+ await processScan();
4511
+
4512
+ expect(renameUpdates()).toEqual([
4513
+ {
4514
+ id: first.id!.toString(),
4515
+ data: { name: PTR_NAME, dnsName: PTR_NAME },
4516
+ props: { isRoot: true },
4517
+ },
4518
+ {
4519
+ id: second.id!.toString(),
4520
+ data: { name: `${PTR_NAME} (10.0.0.5)`, dnsName: PTR_NAME },
4521
+ props: { isRoot: true },
4522
+ },
4523
+ ]);
4524
+ });
4525
+ });
4526
+
4527
+ describe("dnsName", () => {
4528
+ it("is written when the device has none", async () => {
4529
+ useInventory([makeRunImportedDevice()]);
4530
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4531
+
4532
+ await processScan();
4533
+
4534
+ expect(renameUpdates()[0]!.data["dnsName"]).toBe(PTR_NAME);
4535
+ });
4536
+
4537
+ it("is left alone on a device that already has one, while the name is still fixed", async () => {
4538
+ useInventory([
4539
+ makeRunImportedDevice({ dnsName: "kds01.old-zone.wbhq.com" }),
4540
+ ]);
4541
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4542
+
4543
+ await processScan();
4544
+
4545
+ expect(renameUpdates()[0]!.data).toEqual({ name: PTR_NAME });
4546
+ });
4547
+ });
4548
+
4549
+ describe("failures", () => {
4550
+ it("logs a failed rename and carries on with the other devices, the import and the stamp", async () => {
4551
+ const failing: NetworkDevice = makeRunImportedDevice({
4552
+ hostname: "10.0.0.5",
4553
+ });
4554
+ const fine: NetworkDevice = makeRunImportedDevice({
4555
+ hostname: "10.0.0.6",
4556
+ createdAt: new Date(DURING_RUN.getTime() + 1000),
4557
+ });
4558
+ useInventory([failing, fine]);
4559
+ deviceUpdateMock.mockImplementation(
4560
+ (args: { id: ObjectID }): Promise<number> => {
4561
+ if (args.id.toString() === failing.id!.toString()) {
4562
+ return Promise.reject(new Error("deadlock detected"));
4563
+ }
4564
+ return Promise.resolve(1);
4565
+ },
4566
+ );
4567
+ ruleFindByMock.mockResolvedValue([
4568
+ makeRule({ includePingOnlyHosts: true }),
4569
+ ]);
4570
+ scanFindOneByMock.mockResolvedValue(
4571
+ makeCompletedRunScan({
4572
+ discoveredDevices: [
4573
+ makeNamedHost({ ipAddress: "10.0.0.5", dnsHostname: "a.wbhq.com" }),
4574
+ makeNamedHost({ ipAddress: "10.0.0.6", dnsHostname: "b.wbhq.com" }),
4575
+ makeNamedHost({ ipAddress: "10.0.0.9", dnsHostname: "c.wbhq.com" }),
4576
+ ],
4577
+ }),
4578
+ );
4579
+
4580
+ const result: AutoImportRuleRunResult | null = await processScan();
4581
+
4582
+ expect(deviceUpdateMock).toHaveBeenCalledTimes(2);
4583
+ expect(renameUpdates()[1]).toMatchObject({
4584
+ id: fine.id!.toString(),
4585
+ data: { name: "b.wbhq.com" },
4586
+ });
4587
+ expect(loggerErrorMock).toHaveBeenCalledWith(
4588
+ expect.stringContaining(
4589
+ `could not rename Network Device ${failing.id!.toString()}`,
4590
+ ),
4591
+ { projectId: PROJECT_ID.toString() },
4592
+ );
4593
+ expect(result).toMatchObject({ devicesCreated: 1 });
4594
+ expect(createdDevice(0).hostname).toBe("10.0.0.9");
4595
+ expect(scanUpdateMock).toHaveBeenCalledTimes(1);
4596
+ expect(
4597
+ scanUpdateMock.mock.calls[0]![0].data.autoImportProcessedAt,
4598
+ ).toBeInstanceOf(Date);
4599
+ });
4600
+
4601
+ it("does not hand a failed rename's name out as taken", async () => {
4602
+ // Same PTR answer for both: the first write fails, so the second may have it.
4603
+ const failing: NetworkDevice = makeRunImportedDevice({
4604
+ hostname: "10.0.0.5",
4605
+ });
4606
+ const fine: NetworkDevice = makeRunImportedDevice({
4607
+ hostname: "10.0.0.6",
4608
+ createdAt: new Date(DURING_RUN.getTime() + 1000),
4609
+ });
4610
+ useInventory([failing, fine]);
4611
+ deviceUpdateMock.mockRejectedValueOnce(new Error("deadlock detected"));
4612
+ scanFindOneByMock.mockResolvedValue(
4613
+ makeCompletedRunScan({
4614
+ discoveredDevices: [
4615
+ makeNamedHost({ ipAddress: "10.0.0.5" }),
4616
+ makeNamedHost({ ipAddress: "10.0.0.6" }),
4617
+ ],
4618
+ }),
4619
+ );
4620
+
4621
+ await processScan();
4622
+
4623
+ expect(renameUpdates()[1]).toMatchObject({
4624
+ id: fine.id!.toString(),
4625
+ data: { name: PTR_NAME },
4626
+ });
4627
+ });
4628
+
4629
+ it("logs a failed name check for one device and carries on with the next", async () => {
4630
+ const first: NetworkDevice = makeRunImportedDevice({
4631
+ hostname: "10.0.0.5",
4632
+ });
4633
+ const second: NetworkDevice = makeRunImportedDevice({
4634
+ hostname: "10.0.0.6",
4635
+ createdAt: new Date(DURING_RUN.getTime() + 1000),
4636
+ });
4637
+ useInventory([first, second]);
4638
+ deviceCountByMock.mockRejectedValueOnce(new Error("connection reset"));
4639
+ scanFindOneByMock.mockResolvedValue(
4640
+ makeCompletedRunScan({
4641
+ discoveredDevices: [
4642
+ makeNamedHost({ ipAddress: "10.0.0.5", dnsHostname: "a.wbhq.com" }),
4643
+ makeNamedHost({ ipAddress: "10.0.0.6", dnsHostname: "b.wbhq.com" }),
4644
+ ],
4645
+ }),
4646
+ );
4647
+
4648
+ await processScan();
4649
+
4650
+ expect(renameUpdates()).toHaveLength(1);
4651
+ expect(renameUpdates()[0]!.id).toBe(second.id!.toString());
4652
+ expect(loggerErrorMock).toHaveBeenCalledWith(
4653
+ expect.stringContaining("connection reset"),
4654
+ { projectId: PROJECT_ID.toString() },
4655
+ );
4656
+ });
4657
+
4658
+ it("logs and swallows a failure of the whole step, and the import and stamp still happen", async () => {
4659
+ useInventory([]);
4660
+ // The rename lookup is the only device findBy this pass makes.
4661
+ deviceFindByMock.mockRejectedValue(new Error("statement timeout"));
4662
+ ruleFindByMock.mockResolvedValue([
4663
+ makeRule({ includePingOnlyHosts: true }),
4664
+ ]);
4665
+ scanFindOneByMock.mockResolvedValue(makeCompletedRunScan());
4666
+
4667
+ const result: AutoImportRuleRunResult | null = await processScan();
4668
+
4669
+ expect(loggerErrorMock).toHaveBeenCalledWith(
4670
+ expect.stringContaining("statement timeout"),
4671
+ { projectId: PROJECT_ID.toString() },
4672
+ );
4673
+ expect(result).toMatchObject({ devicesCreated: 1 });
4674
+ expect(scanUpdateMock).toHaveBeenCalledTimes(1);
4675
+ });
4676
+ });
4677
+
4678
+ describe("bounds", () => {
4679
+ function makeManyRunImportedDevices(count: number): {
4680
+ hosts: Array<DiscoveredNetworkDevice>;
4681
+ devices: Array<NetworkDevice>;
4682
+ } {
4683
+ const hosts: Array<DiscoveredNetworkDevice> = [];
4684
+ const devices: Array<NetworkDevice> = [];
4685
+
4686
+ for (let i: number = 0; i < count; i++) {
4687
+ const address: string = `10.1.${Math.floor(i / 256)}.${i % 256}`;
4688
+ hosts.push(
4689
+ makeNamedHost({
4690
+ ipAddress: address,
4691
+ dnsHostname: `host-${i}.wbhq.com`,
4692
+ }),
4693
+ );
4694
+ devices.push(
4695
+ makeRunImportedDevice({
4696
+ hostname: address,
4697
+ createdAt: new Date(DURING_RUN.getTime() + i),
4698
+ }),
4699
+ );
4700
+ }
4701
+
4702
+ return { hosts, devices };
4703
+ }
4704
+
4705
+ it("stops at the per-pass rename cap and says how many devices were left", async () => {
4706
+ const many: {
4707
+ hosts: Array<DiscoveredNetworkDevice>;
4708
+ devices: Array<NetworkDevice>;
4709
+ } = makeManyRunImportedDevices(MAX_DEVICE_RENAMES_PER_SCAN_PASS + 3);
4710
+ useInventory(many.devices);
4711
+ ruleFindByMock.mockResolvedValue([]);
4712
+ scanFindOneByMock.mockResolvedValue(
4713
+ makeCompletedRunScan({ discoveredDevices: many.hosts }),
4714
+ );
4715
+
4716
+ await processScan();
4717
+
4718
+ expect(deviceUpdateMock).toHaveBeenCalledTimes(
4719
+ MAX_DEVICE_RENAMES_PER_SCAN_PASS,
4720
+ );
4721
+ // Oldest first, so the cap leaves the newest imports over.
4722
+ expect(renameUpdates()[0]!.data["name"]).toBe("host-0.wbhq.com");
4723
+ expect(loggerWarnMock).toHaveBeenCalledWith(
4724
+ expect.stringContaining(
4725
+ `cap of ${MAX_DEVICE_RENAMES_PER_SCAN_PASS} device renames`,
4726
+ ),
4727
+ { projectId: PROJECT_ID.toString() },
4728
+ );
4729
+ expect(loggerWarnMock).toHaveBeenCalledWith(
4730
+ expect.stringContaining("3 device(s)"),
4731
+ expect.anything(),
4732
+ );
4733
+ // The result is still retired.
4734
+ expect(scanUpdateMock).toHaveBeenCalledTimes(1);
4735
+ }, 60000);
4736
+
4737
+ it("looks devices up in bounded chunks of addresses", async () => {
4738
+ const many: {
4739
+ hosts: Array<DiscoveredNetworkDevice>;
4740
+ devices: Array<NetworkDevice>;
4741
+ } = makeManyRunImportedDevices(RUN_IMPORTED_DEVICE_LOOKUP_CHUNK_SIZE + 1);
4742
+ useInventory(many.devices);
4743
+ ruleFindByMock.mockResolvedValue([]);
4744
+ scanFindOneByMock.mockResolvedValue(
4745
+ makeCompletedRunScan({ discoveredDevices: many.hosts }),
4746
+ );
4747
+
4748
+ await processScan();
4749
+
4750
+ const lookups: Array<any> = renameLookupCalls();
4751
+
4752
+ expect(
4753
+ lookups.map((args: any): number => {
4754
+ return statusesMatchedBy(args.query.hostname).length;
4755
+ }),
4756
+ ).toEqual([RUN_IMPORTED_DEVICE_LOOKUP_CHUNK_SIZE, 1]);
4757
+ expect(deviceUpdateMock).toHaveBeenCalledTimes(
4758
+ RUN_IMPORTED_DEVICE_LOOKUP_CHUNK_SIZE + 1,
4759
+ );
4760
+ expect(loggerWarnMock).not.toHaveBeenCalled();
4761
+ });
4762
+ });
4763
+ });