@oneuptime/common 12.0.32 → 12.0.33

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 (597) hide show
  1. package/Models/AnalyticsModels/Span.ts +14 -0
  2. package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
  3. package/Models/DatabaseModels/Index.ts +10 -0
  4. package/Models/DatabaseModels/Monitor.ts +76 -0
  5. package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
  6. package/Models/DatabaseModels/NetworkDevice.ts +176 -1
  7. package/Models/DatabaseModels/NetworkSite.ts +201 -2
  8. package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
  9. package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
  10. package/Models/DatabaseModels/TelemetryException.ts +119 -0
  11. package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
  12. package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
  13. package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
  14. package/Server/API/EnterpriseLicenseAPI.ts +391 -64
  15. package/Server/API/LlmProviderAPI.ts +137 -22
  16. package/Server/EnvironmentConfig.ts +14 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  24. package/Server/Infrastructure/QueueWorker.ts +38 -8
  25. package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
  26. package/Server/Middleware/ProjectAuthorization.ts +11 -0
  27. package/Server/Middleware/SCIMAuthorization.ts +12 -0
  28. package/Server/Middleware/TelemetryIngest.ts +11 -0
  29. package/Server/Services/AIBillingService.ts +101 -27
  30. package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
  31. package/Server/Services/EnterpriseLicenseService.ts +55 -0
  32. package/Server/Services/Index.ts +10 -0
  33. package/Server/Services/MonitorService.ts +143 -21
  34. package/Server/Services/MonitorStatusTimelineService.ts +150 -8
  35. package/Server/Services/MonitorTemplateService.ts +217 -1
  36. package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
  37. package/Server/Services/NetworkAlertPolicyService.ts +944 -0
  38. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
  39. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
  40. package/Server/Services/NetworkDeviceService.ts +1032 -73
  41. package/Server/Services/NetworkSiteService.ts +1502 -129
  42. package/Server/Services/NetworkSiteTypeService.ts +1216 -0
  43. package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
  44. package/Server/Services/NotificationService.ts +118 -28
  45. package/Server/Services/ProjectService.ts +105 -48
  46. package/Server/Services/StatusPagePrivateUserService.ts +103 -3
  47. package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
  48. package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
  49. package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
  50. package/Server/Services/UserNotificationSettingService.ts +62 -25
  51. package/Server/Services/UserService.ts +95 -0
  52. package/Server/Types/Database/QueryHelper.ts +2 -2
  53. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
  54. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
  55. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
  56. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
  57. package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
  58. package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
  59. package/Server/Utils/DataSource/HttpFetch.ts +9 -2
  60. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
  61. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
  62. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
  63. package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
  64. package/Server/Utils/LLM/LLMService.ts +78 -0
  65. package/Server/Utils/LogRedaction.ts +8 -0
  66. package/Server/Utils/Logger.ts +79 -1
  67. package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
  68. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
  69. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
  70. package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
  71. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
  72. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
  73. package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
  74. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
  75. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
  76. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
  77. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
  78. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
  79. package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
  80. package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
  81. package/Server/Utils/OutboundUserAgent.ts +152 -0
  82. package/Server/Utils/StartServer.ts +51 -19
  83. package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
  84. package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
  85. package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
  86. package/Server/Utils/Telemetry.ts +198 -51
  87. package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
  88. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
  89. package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
  90. package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
  91. package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
  92. package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
  93. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
  94. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
  95. package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
  96. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
  97. package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
  98. package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
  99. package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
  100. package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
  101. package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
  102. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
  103. package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
  104. package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
  105. package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
  106. package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
  107. package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
  108. package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
  109. package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
  110. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
  111. package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
  112. package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
  113. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
  114. package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
  115. package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
  116. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
  117. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
  118. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
  119. package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
  120. package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
  121. package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
  122. package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
  123. package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
  124. package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
  125. package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
  126. package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
  127. package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
  128. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
  129. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
  130. package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
  131. package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
  132. package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
  133. package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
  134. package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
  135. package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
  136. package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
  137. package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
  138. package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
  139. package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
  140. package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
  141. package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
  142. package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
  143. package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
  144. package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
  145. package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
  146. package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
  147. package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
  148. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
  149. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
  150. package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
  151. package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
  152. package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
  153. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
  154. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
  155. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
  156. package/Tests/Server/Utils/Captcha.test.ts +422 -0
  157. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
  158. package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
  159. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
  160. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
  161. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
  162. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
  163. package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
  164. package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
  165. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
  166. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
  167. package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
  168. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
  169. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
  170. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
  171. package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
  172. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
  173. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
  174. package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
  175. package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
  176. package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
  177. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
  178. package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
  179. package/Tests/Server/Utils/Telemetry.test.ts +456 -66
  180. package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
  181. package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
  182. package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
  183. package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
  184. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
  185. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
  186. package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
  187. package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
  188. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
  189. package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
  190. package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
  191. package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
  192. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
  193. package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
  194. package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
  195. package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
  196. package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
  197. package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
  198. package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
  199. package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
  200. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
  201. package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
  202. package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
  203. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
  204. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  205. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
  206. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
  207. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
  208. package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
  209. package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
  210. package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
  211. package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
  212. package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
  213. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
  214. package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
  215. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
  216. package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
  217. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
  218. package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
  219. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
  220. package/Types/AI/ExceptionAIClassification.ts +10 -24
  221. package/Types/Email/EmailTemplateType.ts +2 -0
  222. package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
  223. package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
  224. package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
  225. package/Types/Exception/ApiException.ts +10 -0
  226. package/Types/Exception/BadDataException.ts +11 -0
  227. package/Types/Exception/BadRequestException.ts +11 -0
  228. package/Types/Exception/Exception.ts +65 -0
  229. package/Types/Exception/ForbiddenException.ts +10 -0
  230. package/Types/Exception/NotAuthenticatedException.ts +10 -0
  231. package/Types/Exception/NotAuthorizedException.ts +10 -0
  232. package/Types/Exception/NotFoundException.ts +11 -0
  233. package/Types/Exception/PayloadTooLargeException.ts +11 -0
  234. package/Types/Exception/PaymentRequiredException.ts +10 -0
  235. package/Types/Exception/ServiceUnavailableException.ts +10 -0
  236. package/Types/Exception/SsoAuthorizationException.ts +10 -0
  237. package/Types/Exception/TenantNotFoundException.ts +11 -0
  238. package/Types/Exception/TimeoutException.ts +10 -0
  239. package/Types/Exception/TooManyRequestsException.ts +10 -0
  240. package/Types/Exception/UnableToReachServer.ts +10 -0
  241. package/Types/Exception/WebsiteRequestException.ts +10 -0
  242. package/Types/Monitor/CriteriaFilter.ts +60 -2
  243. package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
  244. package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
  245. package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
  246. package/Types/Monitor/MonitorMetricType.ts +71 -0
  247. package/Types/Monitor/MonitorStep.ts +76 -0
  248. package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
  249. package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
  250. package/Types/Monitor/MonitorType.ts +47 -1
  251. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
  252. package/Types/Monitor/SqlConnectionConfig.ts +31 -0
  253. package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
  254. package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
  255. package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
  256. package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
  257. package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
  258. package/Types/Permission.ts +90 -0
  259. package/Types/Probe/ProbeMonitorResponse.ts +16 -0
  260. package/Types/Telemetry/ErrorClass.ts +274 -0
  261. package/Types/Telemetry/UnitOfWork.ts +59 -0
  262. package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
  263. package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
  264. package/UI/Components/Modal/Modal.tsx +2 -8
  265. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  266. package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
  267. package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
  268. package/UI/Components/SideMenu/SideMenu.tsx +123 -5
  269. package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
  270. package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
  271. package/UI/Components/SideOver/SideOver.tsx +21 -20
  272. package/UI/Utils/PageScrollLock.ts +79 -3
  273. package/UI/Utils/PermissionGate.ts +61 -0
  274. package/UI/Utils/SensitiveUrlToken.ts +112 -0
  275. package/UI/Utils/TestLLMProvider.ts +11 -0
  276. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
  277. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
  278. package/Utils/Monitor/MonitorMetricType.ts +153 -1
  279. package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
  280. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
  281. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
  282. package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
  283. package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
  284. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
  285. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
  286. package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
  287. package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
  288. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
  289. package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
  290. package/build/dist/Models/AnalyticsModels/Span.js +14 -0
  291. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
  293. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/Index.js +10 -0
  295. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
  297. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
  299. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
  300. package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
  301. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
  303. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
  305. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
  307. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
  308. package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
  309. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
  311. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
  312. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
  313. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
  314. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
  315. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
  316. package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
  317. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
  318. package/build/dist/Server/API/LlmProviderAPI.js +108 -13
  319. package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
  320. package/build/dist/Server/EnvironmentConfig.js +12 -0
  321. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  322. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
  323. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
  324. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
  325. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
  326. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
  327. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
  328. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
  329. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
  330. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
  331. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
  332. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
  333. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
  334. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  335. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  336. package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
  337. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  338. package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
  339. package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
  340. package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
  341. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  342. package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
  343. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
  344. package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
  345. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  346. package/build/dist/Server/Services/AIBillingService.js +70 -16
  347. package/build/dist/Server/Services/AIBillingService.js.map +1 -1
  348. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
  349. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
  350. package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
  351. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  352. package/build/dist/Server/Services/Index.js +10 -0
  353. package/build/dist/Server/Services/Index.js.map +1 -1
  354. package/build/dist/Server/Services/MonitorService.js +119 -21
  355. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  356. package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
  357. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  358. package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
  359. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  360. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
  361. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
  362. package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
  363. package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
  364. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
  365. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  366. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
  367. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  368. package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
  369. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  370. package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
  371. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  372. package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
  373. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
  374. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
  375. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
  376. package/build/dist/Server/Services/NotificationService.js +80 -17
  377. package/build/dist/Server/Services/NotificationService.js.map +1 -1
  378. package/build/dist/Server/Services/ProjectService.js +66 -30
  379. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  380. package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
  381. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  382. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
  383. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
  384. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
  385. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
  386. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
  387. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
  388. package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
  389. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  390. package/build/dist/Server/Services/UserService.js +90 -0
  391. package/build/dist/Server/Services/UserService.js.map +1 -1
  392. package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
  393. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  394. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
  395. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  396. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
  397. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  398. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
  399. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  400. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
  401. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
  402. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
  403. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  404. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
  405. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
  406. package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
  407. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  408. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
  409. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
  410. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
  411. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
  412. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
  413. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
  414. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
  415. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
  416. package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
  417. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  418. package/build/dist/Server/Utils/LogRedaction.js +8 -0
  419. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  420. package/build/dist/Server/Utils/Logger.js +63 -1
  421. package/build/dist/Server/Utils/Logger.js.map +1 -1
  422. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
  423. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
  424. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  425. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  426. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
  427. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  428. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
  429. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
  430. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
  431. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  432. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
  433. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  434. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  435. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  436. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
  437. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  438. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
  439. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  440. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
  441. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  442. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
  443. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  444. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
  445. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  446. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
  447. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
  448. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
  449. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
  450. package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
  451. package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
  452. package/build/dist/Server/Utils/StartServer.js +38 -14
  453. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  454. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
  455. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  456. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
  457. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
  458. package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
  459. package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
  460. package/build/dist/Server/Utils/Telemetry.js +162 -46
  461. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  462. package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
  463. package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
  464. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  465. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  466. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
  467. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
  468. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
  469. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
  470. package/build/dist/Types/Exception/ApiException.js +9 -0
  471. package/build/dist/Types/Exception/ApiException.js.map +1 -1
  472. package/build/dist/Types/Exception/BadDataException.js +10 -0
  473. package/build/dist/Types/Exception/BadDataException.js.map +1 -1
  474. package/build/dist/Types/Exception/BadRequestException.js +10 -0
  475. package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
  476. package/build/dist/Types/Exception/Exception.js +56 -0
  477. package/build/dist/Types/Exception/Exception.js.map +1 -1
  478. package/build/dist/Types/Exception/ForbiddenException.js +9 -0
  479. package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
  480. package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
  481. package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
  482. package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
  483. package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
  484. package/build/dist/Types/Exception/NotFoundException.js +10 -0
  485. package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
  486. package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
  487. package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
  488. package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
  489. package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
  490. package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
  491. package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
  492. package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
  493. package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
  494. package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
  495. package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
  496. package/build/dist/Types/Exception/TimeoutException.js +9 -0
  497. package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
  498. package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
  499. package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
  500. package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
  501. package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
  502. package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
  503. package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
  504. package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
  505. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  506. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
  507. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
  508. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
  509. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
  510. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
  511. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  512. package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
  513. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  514. package/build/dist/Types/Monitor/MonitorStep.js +54 -0
  515. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  516. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
  517. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
  518. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
  519. package/build/dist/Types/Monitor/MonitorType.js +45 -1
  520. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  521. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
  522. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  523. package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
  524. package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
  525. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
  526. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
  527. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
  528. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
  529. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
  530. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
  531. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
  532. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
  533. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
  534. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
  535. package/build/dist/Types/Permission.js +80 -0
  536. package/build/dist/Types/Permission.js.map +1 -1
  537. package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
  538. package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
  539. package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
  540. package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
  541. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
  542. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  543. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
  544. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  545. package/build/dist/UI/Components/Modal/Modal.js +2 -7
  546. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  547. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
  548. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  549. package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
  550. package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
  551. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
  552. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
  553. package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
  554. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  555. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
  556. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  557. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
  558. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  559. package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
  560. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  561. package/build/dist/UI/Utils/PageScrollLock.js +31 -3
  562. package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
  563. package/build/dist/UI/Utils/PermissionGate.js +42 -1
  564. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  565. package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
  566. package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
  567. package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
  568. package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
  569. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
  570. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
  571. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
  572. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  573. package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
  574. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  575. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
  576. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  577. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
  578. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
  579. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
  580. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
  581. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
  582. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
  583. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
  584. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
  585. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
  586. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  587. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
  588. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  589. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
  590. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
  591. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
  592. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
  593. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
  594. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  595. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
  596. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
  597. package/package.json +2 -2
@@ -1,9 +1,15 @@
1
1
  import { afterEach, describe, expect, test } from "@jest/globals";
2
2
  import NetworkDeviceHydrationUtil, {
3
3
  HydratableMonitor,
4
+ ResolvedSnmpCredentialsForBatch,
5
+ SnmpConnectionCredentials,
4
6
  } from "../../../../Server/Utils/Monitor/NetworkDeviceHydrationUtil";
5
7
  import NetworkDeviceService from "../../../../Server/Services/NetworkDeviceService";
8
+ import NetworkSiteService from "../../../../Server/Services/NetworkSiteService";
9
+ import NetworkSnmpCredentialProfileService from "../../../../Server/Services/NetworkSnmpCredentialProfileService";
6
10
  import NetworkDevice from "../../../../Models/DatabaseModels/NetworkDevice";
11
+ import NetworkSite from "../../../../Models/DatabaseModels/NetworkSite";
12
+ import NetworkSnmpCredentialProfile from "../../../../Models/DatabaseModels/NetworkSnmpCredentialProfile";
7
13
  import MonitorStep from "../../../../Types/Monitor/MonitorStep";
8
14
  import MonitorSteps from "../../../../Types/Monitor/MonitorSteps";
9
15
  import MonitorType from "../../../../Types/Monitor/MonitorType";
@@ -348,13 +354,21 @@ describe("NetworkDeviceHydrationUtil.hydrateNetworkDeviceMonitors", () => {
348
354
  expect(snmp?.snmpV3Auth).toBeUndefined();
349
355
  });
350
356
 
351
- test("a v2c device with no community string leaves it unset for the probe to default", async () => {
352
- mockDevices([buildDevice({ snmpVersion: "V2c" })]);
357
+ /*
358
+ * Under ping-first polling such a device is never walked at all: the
359
+ * list handler resolves it to pollMode "ping" and hands out no
360
+ * snmpMonitor. This legacy hydration path (monitor tests) still builds
361
+ * the config without a community, for the probe to default.
362
+ */
363
+ test("a v2c device with no community string is a ping-only device: no community for the probe, pollMode ping", async () => {
364
+ const device: NetworkDevice = buildDevice({ snmpVersion: "V2c" });
365
+ mockDevices([device]);
353
366
  const monitor: HydratableMonitor = buildMonitor();
354
367
 
355
368
  await NetworkDeviceHydrationUtil.hydrateNetworkDeviceMonitors([monitor]);
356
369
 
357
370
  expect(hydratedStep(monitor)?.communityString).toBeUndefined();
371
+ expect(NetworkDeviceHydrationUtil.resolvePollMode(device)).toBe("ping");
358
372
  });
359
373
  });
360
374
 
@@ -509,15 +523,31 @@ describe("NetworkDeviceHydrationUtil.hydrateNetworkDeviceMonitors", () => {
509
523
  * hydration path above uses internally, so its credential rules must match:
510
524
  * flattened v3 columns first, legacy snmpV3Auth JSON as fallback, community
511
525
  * string for v1/v2c, port defaulting to 161.
526
+ *
527
+ * WHERE to connect and WHAT to connect with are separate parameters, because
528
+ * they can come from different rows: a device walked with its site's
529
+ * credential profile supplies the hostname and the profile supplies
530
+ * everything else. These cases are the simple half of that — a device that
531
+ * carries its own credentials is its own carrier — and the resolver's own
532
+ * describe below covers the half where they differ.
512
533
  */
534
+ function connectionOf(device: NetworkDevice): {
535
+ hostname: string;
536
+ credentials: SnmpConnectionCredentials;
537
+ } {
538
+ return { hostname: device.hostname || "", credentials: device };
539
+ }
540
+
513
541
  describe("NetworkDeviceHydrationUtil.buildSnmpMonitorConfig", () => {
514
542
  test("a v2c device produces a community config with no v3 auth", () => {
515
543
  const config: MonitorStepSnmpMonitor =
516
544
  NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
517
- device: buildDevice({
518
- snmpVersion: "V2c",
519
- snmpCommunityString: "s3cret",
520
- }),
545
+ ...connectionOf(
546
+ buildDevice({
547
+ snmpVersion: "V2c",
548
+ snmpCommunityString: "s3cret",
549
+ }),
550
+ ),
521
551
  oids: [],
522
552
  monitorInterfaces: true,
523
553
  });
@@ -528,21 +558,29 @@ describe("NetworkDeviceHydrationUtil.buildSnmpMonitorConfig", () => {
528
558
  expect(config.snmpV3Auth).toBeUndefined();
529
559
  });
530
560
 
531
- test("a v2c device with no community string leaves it unset for the probe to default", () => {
561
+ test("a v2c device with no community string is a ping-only device: no community, and the poll mode says so", () => {
562
+ const device: NetworkDevice = buildDevice({ snmpVersion: "V2c" });
563
+
532
564
  const config: MonitorStepSnmpMonitor =
533
565
  NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
534
- device: buildDevice({ snmpVersion: "V2c" }),
566
+ ...connectionOf(device),
535
567
  oids: [],
536
568
  monitorInterfaces: true,
537
569
  });
538
570
 
539
571
  expect(config.communityString).toBeUndefined();
572
+ /*
573
+ * The list handler consults this BEFORE building a config, and builds
574
+ * none for a ping-mode device - so the probe never sees this config
575
+ * and never defaults the community.
576
+ */
577
+ expect(NetworkDeviceHydrationUtil.resolvePollMode(device)).toBe("ping");
540
578
  });
541
579
 
542
580
  test("a v3 device's flattened columns become a complete authPriv SnmpV3Auth", () => {
543
581
  const config: MonitorStepSnmpMonitor =
544
582
  NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
545
- device: buildV3Device(),
583
+ ...connectionOf(buildV3Device()),
546
584
  oids: [],
547
585
  monitorInterfaces: true,
548
586
  });
@@ -561,17 +599,19 @@ describe("NetworkDeviceHydrationUtil.buildSnmpMonitorConfig", () => {
561
599
  test("a device predating the flattened columns falls back to the legacy snmpV3Auth JSON", () => {
562
600
  const config: MonitorStepSnmpMonitor =
563
601
  NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
564
- device: buildDevice({
565
- snmpVersion: "V3",
566
- snmpV3Auth: {
567
- securityLevel: SnmpSecurityLevel.AuthPriv,
568
- username: "legacy-user",
569
- authProtocol: SnmpAuthProtocol.MD5,
570
- authKey: "legacy-auth",
571
- privProtocol: SnmpPrivProtocol.DES,
572
- privKey: "legacy-priv",
573
- },
574
- }),
602
+ ...connectionOf(
603
+ buildDevice({
604
+ snmpVersion: "V3",
605
+ snmpV3Auth: {
606
+ securityLevel: SnmpSecurityLevel.AuthPriv,
607
+ username: "legacy-user",
608
+ authProtocol: SnmpAuthProtocol.MD5,
609
+ authKey: "legacy-auth",
610
+ privProtocol: SnmpPrivProtocol.DES,
611
+ privKey: "legacy-priv",
612
+ },
613
+ }),
614
+ ),
575
615
  oids: [],
576
616
  monitorInterfaces: true,
577
617
  });
@@ -584,12 +624,14 @@ describe("NetworkDeviceHydrationUtil.buildSnmpMonitorConfig", () => {
584
624
  test("the flattened columns win over a stale legacy blob", () => {
585
625
  const config: MonitorStepSnmpMonitor =
586
626
  NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
587
- device: buildV3Device({
588
- snmpV3Auth: {
589
- securityLevel: SnmpSecurityLevel.NoAuthNoPriv,
590
- username: "stale-legacy-user",
591
- },
592
- }),
627
+ ...connectionOf(
628
+ buildV3Device({
629
+ snmpV3Auth: {
630
+ securityLevel: SnmpSecurityLevel.NoAuthNoPriv,
631
+ username: "stale-legacy-user",
632
+ },
633
+ }),
634
+ ),
593
635
  oids: [],
594
636
  monitorInterfaces: true,
595
637
  });
@@ -600,7 +642,7 @@ describe("NetworkDeviceHydrationUtil.buildSnmpMonitorConfig", () => {
600
642
  test("a v3 device with no credentials anywhere yields no auth at all", () => {
601
643
  const config: MonitorStepSnmpMonitor =
602
644
  NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
603
- device: buildDevice({ snmpVersion: "V3" }),
645
+ ...connectionOf(buildDevice({ snmpVersion: "V3" })),
604
646
  oids: [],
605
647
  monitorInterfaces: true,
606
648
  });
@@ -611,13 +653,13 @@ describe("NetworkDeviceHydrationUtil.buildSnmpMonitorConfig", () => {
611
653
  test("a device with no port falls back to 161, and a stored port passes through", () => {
612
654
  const defaulted: MonitorStepSnmpMonitor =
613
655
  NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
614
- device: buildDevice({ snmpPort: undefined }),
656
+ ...connectionOf(buildDevice({ snmpPort: undefined })),
615
657
  oids: [],
616
658
  monitorInterfaces: true,
617
659
  });
618
660
  const explicit: MonitorStepSnmpMonitor =
619
661
  NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
620
- device: buildDevice({ snmpPort: 1610 }),
662
+ ...connectionOf(buildDevice({ snmpPort: 1610 })),
621
663
  oids: [],
622
664
  monitorInterfaces: true,
623
665
  });
@@ -634,7 +676,7 @@ describe("NetworkDeviceHydrationUtil.buildSnmpMonitorConfig", () => {
634
676
 
635
677
  const config: MonitorStepSnmpMonitor =
636
678
  NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
637
- device: buildDevice({ snmpVersion: "V2c" }),
679
+ ...connectionOf(buildDevice({ snmpVersion: "V2c" })),
638
680
  oids: oids,
639
681
  monitorInterfaces: false,
640
682
  });
@@ -646,7 +688,7 @@ describe("NetworkDeviceHydrationUtil.buildSnmpMonitorConfig", () => {
646
688
  test("every config carries the fixed probe timeout and retry policy", () => {
647
689
  const config: MonitorStepSnmpMonitor =
648
690
  NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
649
- device: buildDevice({}),
691
+ ...connectionOf(buildDevice({})),
650
692
  oids: [],
651
693
  monitorInterfaces: true,
652
694
  });
@@ -655,3 +697,442 @@ describe("NetworkDeviceHydrationUtil.buildSnmpMonitorConfig", () => {
655
697
  expect(config.retries).toBe(3);
656
698
  });
657
699
  });
700
+
701
+ /*
702
+ * The poll-time decision under ping-first polling: a device with usable
703
+ * SNMP credentials is pinged AND walked; one without is only pinged. Purely
704
+ * a function of the credential carrier - the device's own columns today, a
705
+ * credential profile once profile resolution lands - and never of the
706
+ * monitoring method.
707
+ */
708
+ describe("NetworkDeviceHydrationUtil.resolvePollMode", () => {
709
+ test("a v2c device with a community string is walked", () => {
710
+ expect(
711
+ NetworkDeviceHydrationUtil.resolvePollMode(
712
+ buildDevice({ snmpVersion: "V2c", snmpCommunityString: "s3cret" }),
713
+ ),
714
+ ).toBe("snmp");
715
+ });
716
+
717
+ test("a device with no version at all but a community string is walked (v2c is the column default)", () => {
718
+ expect(
719
+ NetworkDeviceHydrationUtil.resolvePollMode(
720
+ buildDevice({ snmpCommunityString: "public" }),
721
+ ),
722
+ ).toBe("snmp");
723
+ });
724
+
725
+ test("a v2c device with no community string is only pinged", () => {
726
+ expect(
727
+ NetworkDeviceHydrationUtil.resolvePollMode(
728
+ buildDevice({ snmpVersion: "V2c" }),
729
+ ),
730
+ ).toBe("ping");
731
+ });
732
+
733
+ test("a whitespace-only community string is not a credential", () => {
734
+ expect(
735
+ NetworkDeviceHydrationUtil.resolvePollMode(
736
+ buildDevice({ snmpVersion: "V2c", snmpCommunityString: " " }),
737
+ ),
738
+ ).toBe("ping");
739
+ });
740
+
741
+ test("a v3 device with a username is walked, auth keys or not", () => {
742
+ expect(NetworkDeviceHydrationUtil.resolvePollMode(buildV3Device())).toBe(
743
+ "snmp",
744
+ );
745
+ expect(
746
+ NetworkDeviceHydrationUtil.resolvePollMode(
747
+ buildDevice({ snmpVersion: "V3", snmpV3Username: "monitoring" }),
748
+ ),
749
+ ).toBe("snmp");
750
+ });
751
+
752
+ test("a v3 device with no username is only pinged - a community string means nothing to v3", () => {
753
+ expect(
754
+ NetworkDeviceHydrationUtil.resolvePollMode(
755
+ buildDevice({ snmpVersion: "V3", snmpCommunityString: "public" }),
756
+ ),
757
+ ).toBe("ping");
758
+ });
759
+
760
+ test("a carrier need not be a NetworkDevice: any row with the three fields answers", () => {
761
+ expect(
762
+ NetworkDeviceHydrationUtil.resolvePollMode({
763
+ snmpVersion: "2c",
764
+ snmpCommunityString: "profile-community",
765
+ snmpV3Username: null,
766
+ }),
767
+ ).toBe("snmp");
768
+ expect(
769
+ NetworkDeviceHydrationUtil.resolvePollMode({
770
+ snmpVersion: null,
771
+ snmpCommunityString: null,
772
+ snmpV3Username: null,
773
+ }),
774
+ ).toBe("ping");
775
+ });
776
+ });
777
+
778
+ /*
779
+ * WHAT THIS BLOCK IS DEFENDING
780
+ *
781
+ * resolveSnmpCredentials answers, per device, "which row is this device
782
+ * walked with?" — its own columns, the credential profile it points at, or
783
+ * the profile its SITE points at. Both lookups run as ROOT, because a poll
784
+ * batch spans projects and there is no caller tenant to scope them to, which
785
+ * means the foreign key is not a tenancy guarantee and the comparison here is
786
+ * the only thing standing between a mis-pointed row and one project's
787
+ * community string being put on another project's wire.
788
+ *
789
+ * So these cases are not "does the resolver find the profile". They are:
790
+ * a cross-project profile is polled with NO credentials rather than that
791
+ * project's; a device that carries its own credentials never reaches a
792
+ * lookup at all; and a lookup that FAILS withholds the device rather than
793
+ * downgrading it to a credential-less ping, which the probe would report as
794
+ * a failing walk on a perfectly healthy device.
795
+ */
796
+ const RESOLVER_PROJECT_ID: ObjectID = new ObjectID(
797
+ "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
798
+ );
799
+ const RESOLVER_OTHER_PROJECT_ID: ObjectID = new ObjectID(
800
+ "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
801
+ );
802
+ const RESOLVER_PROFILE_ID: ObjectID = new ObjectID(
803
+ "cccccccc-cccc-4ccc-8ccc-cccccccccccc",
804
+ );
805
+ const RESOLVER_SITE_PROFILE_ID: ObjectID = new ObjectID(
806
+ "dddddddd-dddd-4ddd-8ddd-dddddddddddd",
807
+ );
808
+ const RESOLVER_SITE_ID: ObjectID = new ObjectID(
809
+ "eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee",
810
+ );
811
+
812
+ function resolverDevice(fields: DeviceFields): NetworkDevice {
813
+ const device: NetworkDevice = new NetworkDevice();
814
+ device._id = DEVICE_ID;
815
+ device.hostname = "10.0.0.1";
816
+ device.projectId = RESOLVER_PROJECT_ID;
817
+ Object.assign(device, fields);
818
+
819
+ return device;
820
+ }
821
+
822
+ function credentialProfile(fields: {
823
+ id: ObjectID;
824
+ projectId: ObjectID;
825
+ community?: string | undefined;
826
+ }): NetworkSnmpCredentialProfile {
827
+ const profile: NetworkSnmpCredentialProfile =
828
+ new NetworkSnmpCredentialProfile();
829
+ profile._id = fields.id.toString();
830
+ profile.projectId = fields.projectId;
831
+ profile.snmpVersion = "V2c";
832
+ profile.snmpCommunityString =
833
+ fields.community === undefined ? "profile-community" : fields.community;
834
+
835
+ return profile;
836
+ }
837
+
838
+ function siteWithProfile(
839
+ snmpCredentialProfileId: ObjectID | undefined,
840
+ ): NetworkSite {
841
+ const site: NetworkSite = new NetworkSite();
842
+ site._id = RESOLVER_SITE_ID.toString();
843
+ site.projectId = RESOLVER_PROJECT_ID;
844
+ if (snmpCredentialProfileId) {
845
+ site.snmpCredentialProfileId = snmpCredentialProfileId;
846
+ }
847
+
848
+ return site;
849
+ }
850
+
851
+ function mockLookups(data: {
852
+ profiles?: Array<NetworkSnmpCredentialProfile> | undefined;
853
+ sites?: Array<NetworkSite> | undefined;
854
+ }): void {
855
+ jest
856
+ .spyOn(NetworkSnmpCredentialProfileService, "findBy")
857
+ .mockResolvedValue(data.profiles || []);
858
+ jest.spyOn(NetworkSiteService, "findBy").mockResolvedValue(data.sites || []);
859
+ }
860
+
861
+ describe("NetworkDeviceHydrationUtil.resolveSnmpCredentials", () => {
862
+ afterEach(() => {
863
+ jest.restoreAllMocks();
864
+ });
865
+
866
+ test("a device with its own credentials is its own carrier and costs no lookup", async () => {
867
+ mockLookups({});
868
+
869
+ const device: NetworkDevice = resolverDevice({
870
+ snmpVersion: "V2c",
871
+ snmpCommunityString: "device-community",
872
+ // Pointed at a profile as well: its own columns still win the order.
873
+ snmpCredentialProfileId: RESOLVER_PROFILE_ID,
874
+ siteId: RESOLVER_SITE_ID,
875
+ });
876
+
877
+ const resolved: ResolvedSnmpCredentialsForBatch =
878
+ await NetworkDeviceHydrationUtil.resolveSnmpCredentials([device]);
879
+
880
+ expect(resolved.byDeviceId.get(DEVICE_ID)?.pollMode).toBe("snmp");
881
+ expect(
882
+ resolved.byDeviceId.get(DEVICE_ID)?.carrier.snmpCommunityString,
883
+ ).toBe("device-community");
884
+ /*
885
+ * Not a micro-optimisation assertion: a fleet where every device carries
886
+ * its own credentials must not pay two extra statements per poll batch
887
+ * for a feature it does not use.
888
+ */
889
+ expect(NetworkSnmpCredentialProfileService.findBy).not.toHaveBeenCalled();
890
+ expect(NetworkSiteService.findBy).not.toHaveBeenCalled();
891
+ });
892
+
893
+ test("a device with no credentials of its own is walked with the profile it points at", async () => {
894
+ mockLookups({
895
+ profiles: [
896
+ credentialProfile({
897
+ id: RESOLVER_PROFILE_ID,
898
+ projectId: RESOLVER_PROJECT_ID,
899
+ }),
900
+ ],
901
+ });
902
+
903
+ const resolved: ResolvedSnmpCredentialsForBatch =
904
+ await NetworkDeviceHydrationUtil.resolveSnmpCredentials([
905
+ resolverDevice({ snmpCredentialProfileId: RESOLVER_PROFILE_ID }),
906
+ ]);
907
+
908
+ expect(resolved.byDeviceId.get(DEVICE_ID)?.pollMode).toBe("snmp");
909
+ expect(
910
+ resolved.byDeviceId.get(DEVICE_ID)?.carrier.snmpCommunityString,
911
+ ).toBe("profile-community");
912
+ });
913
+
914
+ /*
915
+ * THE regression test of this file.
916
+ *
917
+ * The profile query runs isRoot, so it happily returns a row belonging to
918
+ * another project. If the comparison is dropped, this device is walked
919
+ * with that project's community string — a credential leak onto this
920
+ * project's probe's wire. The assertion is therefore not "an error is
921
+ * logged" but "the device is polled with NOTHING": ping mode, and a
922
+ * carrier holding no community at all.
923
+ */
924
+ test("a device pointed at another project's profile is pinged with no credentials, not walked with them", async () => {
925
+ mockLookups({
926
+ profiles: [
927
+ credentialProfile({
928
+ id: RESOLVER_PROFILE_ID,
929
+ projectId: RESOLVER_OTHER_PROJECT_ID,
930
+ community: "other-project-secret",
931
+ }),
932
+ ],
933
+ });
934
+
935
+ const resolved: ResolvedSnmpCredentialsForBatch =
936
+ await NetworkDeviceHydrationUtil.resolveSnmpCredentials([
937
+ resolverDevice({ snmpCredentialProfileId: RESOLVER_PROFILE_ID }),
938
+ ]);
939
+
940
+ expect(resolved.byDeviceId.get(DEVICE_ID)?.pollMode).toBe("ping");
941
+ expect(
942
+ resolved.byDeviceId.get(DEVICE_ID)?.carrier.snmpCommunityString,
943
+ ).toBeFalsy();
944
+ // Withholding is for lookup FAILURES; a dropped profile is a resolved answer.
945
+ expect(resolved.unresolvedDeviceIds.has(DEVICE_ID)).toBe(false);
946
+ });
947
+
948
+ test("the site's profile is used when the device names none of its own", async () => {
949
+ mockLookups({
950
+ profiles: [
951
+ credentialProfile({
952
+ id: RESOLVER_SITE_PROFILE_ID,
953
+ projectId: RESOLVER_PROJECT_ID,
954
+ }),
955
+ ],
956
+ sites: [siteWithProfile(RESOLVER_SITE_PROFILE_ID)],
957
+ });
958
+
959
+ const resolved: ResolvedSnmpCredentialsForBatch =
960
+ await NetworkDeviceHydrationUtil.resolveSnmpCredentials([
961
+ resolverDevice({ siteId: RESOLVER_SITE_ID }),
962
+ ]);
963
+
964
+ expect(resolved.byDeviceId.get(DEVICE_ID)?.pollMode).toBe("snmp");
965
+ expect(
966
+ resolved.byDeviceId.get(DEVICE_ID)?.carrier.snmpCommunityString,
967
+ ).toBe("profile-community");
968
+ });
969
+
970
+ /*
971
+ * The site reference gets the same comparison as the device's own, and it
972
+ * has to: a site is written through a different service, so a guard on
973
+ * only one of the two write paths would leave the other open.
974
+ */
975
+ test("a site pointing at another project's profile leaves its devices pinged", async () => {
976
+ mockLookups({
977
+ profiles: [
978
+ credentialProfile({
979
+ id: RESOLVER_SITE_PROFILE_ID,
980
+ projectId: RESOLVER_OTHER_PROJECT_ID,
981
+ community: "other-project-secret",
982
+ }),
983
+ ],
984
+ sites: [siteWithProfile(RESOLVER_SITE_PROFILE_ID)],
985
+ });
986
+
987
+ const resolved: ResolvedSnmpCredentialsForBatch =
988
+ await NetworkDeviceHydrationUtil.resolveSnmpCredentials([
989
+ resolverDevice({ siteId: RESOLVER_SITE_ID }),
990
+ ]);
991
+
992
+ expect(resolved.byDeviceId.get(DEVICE_ID)?.pollMode).toBe("ping");
993
+ expect(
994
+ resolved.byDeviceId.get(DEVICE_ID)?.carrier.snmpCommunityString,
995
+ ).toBeFalsy();
996
+ });
997
+
998
+ test("a device profile with nothing usable in it falls through to the site's", async () => {
999
+ mockLookups({
1000
+ profiles: [
1001
+ // Named by the device, but blank: it answers "no" and the order moves on.
1002
+ credentialProfile({
1003
+ id: RESOLVER_PROFILE_ID,
1004
+ projectId: RESOLVER_PROJECT_ID,
1005
+ community: "",
1006
+ }),
1007
+ credentialProfile({
1008
+ id: RESOLVER_SITE_PROFILE_ID,
1009
+ projectId: RESOLVER_PROJECT_ID,
1010
+ }),
1011
+ ],
1012
+ sites: [siteWithProfile(RESOLVER_SITE_PROFILE_ID)],
1013
+ });
1014
+
1015
+ const resolved: ResolvedSnmpCredentialsForBatch =
1016
+ await NetworkDeviceHydrationUtil.resolveSnmpCredentials([
1017
+ resolverDevice({
1018
+ snmpCredentialProfileId: RESOLVER_PROFILE_ID,
1019
+ siteId: RESOLVER_SITE_ID,
1020
+ }),
1021
+ ]);
1022
+
1023
+ expect(
1024
+ resolved.byDeviceId.get(DEVICE_ID)?.carrier.snmpCommunityString,
1025
+ ).toBe("profile-community");
1026
+ });
1027
+
1028
+ test("a device with nothing anywhere is pinged, and its own row is the carrier", async () => {
1029
+ mockLookups({ sites: [siteWithProfile(undefined)] });
1030
+
1031
+ const resolved: ResolvedSnmpCredentialsForBatch =
1032
+ await NetworkDeviceHydrationUtil.resolveSnmpCredentials([
1033
+ resolverDevice({ siteId: RESOLVER_SITE_ID }),
1034
+ ]);
1035
+
1036
+ expect(resolved.byDeviceId.get(DEVICE_ID)?.pollMode).toBe("ping");
1037
+ expect(resolved.byDeviceId.get(DEVICE_ID)?.carrier.snmpVersion).toBe(
1038
+ undefined,
1039
+ );
1040
+ });
1041
+
1042
+ /*
1043
+ * A failed lookup must WITHHOLD the device, not downgrade it. Falling back
1044
+ * to its own empty columns would hand the probe a ping-mode device that is
1045
+ * configured to be walked, so a database blip would silently stop
1046
+ * reporting interfaces, inventory and walk health across every
1047
+ * profile-using device at once — and, on the monitor side, would evaluate
1048
+ * "SNMP walk is failing" criteria against a walk nobody ran.
1049
+ */
1050
+ test("a profile lookup that throws withholds the profile-referencing devices for the cycle", async () => {
1051
+ jest
1052
+ .spyOn(NetworkSnmpCredentialProfileService, "findBy")
1053
+ .mockRejectedValue(new Error("connection terminated unexpectedly"));
1054
+ jest.spyOn(NetworkSiteService, "findBy").mockResolvedValue([]);
1055
+
1056
+ const resolved: ResolvedSnmpCredentialsForBatch =
1057
+ await NetworkDeviceHydrationUtil.resolveSnmpCredentials([
1058
+ resolverDevice({ snmpCredentialProfileId: RESOLVER_PROFILE_ID }),
1059
+ ]);
1060
+
1061
+ expect(resolved.unresolvedDeviceIds.has(DEVICE_ID)).toBe(true);
1062
+ // Absent, not "present with empty credentials": callers must skip it.
1063
+ expect(resolved.byDeviceId.has(DEVICE_ID)).toBe(false);
1064
+ });
1065
+
1066
+ test("a lookup failure does not withhold devices that carry their own credentials", async () => {
1067
+ jest
1068
+ .spyOn(NetworkSnmpCredentialProfileService, "findBy")
1069
+ .mockRejectedValue(new Error("connection terminated unexpectedly"));
1070
+ jest.spyOn(NetworkSiteService, "findBy").mockResolvedValue([]);
1071
+
1072
+ const selfCredentialled: NetworkDevice = resolverDevice({
1073
+ snmpVersion: "V2c",
1074
+ snmpCommunityString: "device-community",
1075
+ });
1076
+ selfCredentialled._id = "8f2c1f0e-0000-4000-8000-0000000000bb";
1077
+
1078
+ const resolved: ResolvedSnmpCredentialsForBatch =
1079
+ await NetworkDeviceHydrationUtil.resolveSnmpCredentials([
1080
+ selfCredentialled,
1081
+ resolverDevice({ snmpCredentialProfileId: RESOLVER_PROFILE_ID }),
1082
+ ]);
1083
+
1084
+ expect(
1085
+ resolved.byDeviceId.get("8f2c1f0e-0000-4000-8000-0000000000bb")?.pollMode,
1086
+ ).toBe("snmp");
1087
+ expect(resolved.unresolvedDeviceIds.has(DEVICE_ID)).toBe(true);
1088
+ });
1089
+
1090
+ /*
1091
+ * Monitor hydration and the poll list handler share this resolver so the
1092
+ * walk a probe is told to run and the walk a monitor is evaluated against
1093
+ * are based on the same credentials. This pins the hydration half: a
1094
+ * device using a profile hydrates with the PROFILE's community, not with
1095
+ * its own empty column.
1096
+ */
1097
+ test("monitor hydration walks a profile-credentialled device with the profile's community", async () => {
1098
+ const device: NetworkDevice = resolverDevice({
1099
+ snmpCredentialProfileId: RESOLVER_PROFILE_ID,
1100
+ });
1101
+ mockDevices([device]);
1102
+ mockLookups({
1103
+ profiles: [
1104
+ credentialProfile({
1105
+ id: RESOLVER_PROFILE_ID,
1106
+ projectId: RESOLVER_PROJECT_ID,
1107
+ }),
1108
+ ],
1109
+ });
1110
+
1111
+ const monitor: HydratableMonitor = buildMonitor();
1112
+ await NetworkDeviceHydrationUtil.hydrateNetworkDeviceMonitors([monitor]);
1113
+
1114
+ expect(hydratedStep(monitor)?.communityString).toBe("profile-community");
1115
+ // The address is always the device's, however the credentials resolved.
1116
+ expect(hydratedStep(monitor)?.hostname).toBe("10.0.0.1");
1117
+ });
1118
+
1119
+ test("monitor hydration leaves a step unhydrated when the credential lookup failed", async () => {
1120
+ mockDevices([
1121
+ resolverDevice({ snmpCredentialProfileId: RESOLVER_PROFILE_ID }),
1122
+ ]);
1123
+ jest
1124
+ .spyOn(NetworkSnmpCredentialProfileService, "findBy")
1125
+ .mockRejectedValue(new Error("connection terminated unexpectedly"));
1126
+ jest.spyOn(NetworkSiteService, "findBy").mockResolvedValue([]);
1127
+
1128
+ const monitor: HydratableMonitor = buildMonitor();
1129
+ await NetworkDeviceHydrationUtil.hydrateNetworkDeviceMonitors([monitor]);
1130
+
1131
+ /*
1132
+ * Unhydrated, NOT hydrated with an empty community: SnmpMonitor defaults
1133
+ * a missing community to "public", so a half-built config is how a
1134
+ * healthy device gets reported Down.
1135
+ */
1136
+ expect(hydratedStep(monitor)).toBeUndefined();
1137
+ });
1138
+ });