@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.
- package/Models/AnalyticsModels/Span.ts +14 -0
- package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
- package/Models/DatabaseModels/Index.ts +10 -0
- package/Models/DatabaseModels/Monitor.ts +76 -0
- package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
- package/Models/DatabaseModels/NetworkDevice.ts +176 -1
- package/Models/DatabaseModels/NetworkSite.ts +201 -2
- package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
- package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
- package/Models/DatabaseModels/TelemetryException.ts +119 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
- package/Server/API/EnterpriseLicenseAPI.ts +391 -64
- package/Server/API/LlmProviderAPI.ts +137 -22
- package/Server/EnvironmentConfig.ts +14 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Infrastructure/QueueWorker.ts +38 -8
- package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
- package/Server/Middleware/ProjectAuthorization.ts +11 -0
- package/Server/Middleware/SCIMAuthorization.ts +12 -0
- package/Server/Middleware/TelemetryIngest.ts +11 -0
- package/Server/Services/AIBillingService.ts +101 -27
- package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
- package/Server/Services/EnterpriseLicenseService.ts +55 -0
- package/Server/Services/Index.ts +10 -0
- package/Server/Services/MonitorService.ts +143 -21
- package/Server/Services/MonitorStatusTimelineService.ts +150 -8
- package/Server/Services/MonitorTemplateService.ts +217 -1
- package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
- package/Server/Services/NetworkAlertPolicyService.ts +944 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
- package/Server/Services/NetworkDeviceService.ts +1032 -73
- package/Server/Services/NetworkSiteService.ts +1502 -129
- package/Server/Services/NetworkSiteTypeService.ts +1216 -0
- package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
- package/Server/Services/NotificationService.ts +118 -28
- package/Server/Services/ProjectService.ts +105 -48
- package/Server/Services/StatusPagePrivateUserService.ts +103 -3
- package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
- package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
- package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
- package/Server/Services/UserNotificationSettingService.ts +62 -25
- package/Server/Services/UserService.ts +95 -0
- package/Server/Types/Database/QueryHelper.ts +2 -2
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
- package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
- package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
- package/Server/Utils/DataSource/HttpFetch.ts +9 -2
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
- package/Server/Utils/LLM/LLMService.ts +78 -0
- package/Server/Utils/LogRedaction.ts +8 -0
- package/Server/Utils/Logger.ts +79 -1
- package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
- package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
- package/Server/Utils/OutboundUserAgent.ts +152 -0
- package/Server/Utils/StartServer.ts +51 -19
- package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
- package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
- package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
- package/Server/Utils/Telemetry.ts +198 -51
- package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
- package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
- package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
- package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
- package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
- package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
- package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
- package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
- package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
- package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
- package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
- package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
- package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
- package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
- package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
- package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
- package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
- package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
- package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
- package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
- package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
- package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
- package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
- package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
- package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
- package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
- package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
- package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
- package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
- package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
- package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
- package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
- package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
- package/Tests/Server/Utils/Captcha.test.ts +422 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
- package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
- package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
- package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
- package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
- package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
- package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
- package/Tests/Server/Utils/Telemetry.test.ts +456 -66
- package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
- package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
- package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
- package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
- package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
- package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
- package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
- package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
- package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
- package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
- package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
- package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
- package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
- package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
- package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
- package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
- package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
- package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
- package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
- package/Types/AI/ExceptionAIClassification.ts +10 -24
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
- package/Types/Exception/ApiException.ts +10 -0
- package/Types/Exception/BadDataException.ts +11 -0
- package/Types/Exception/BadRequestException.ts +11 -0
- package/Types/Exception/Exception.ts +65 -0
- package/Types/Exception/ForbiddenException.ts +10 -0
- package/Types/Exception/NotAuthenticatedException.ts +10 -0
- package/Types/Exception/NotAuthorizedException.ts +10 -0
- package/Types/Exception/NotFoundException.ts +11 -0
- package/Types/Exception/PayloadTooLargeException.ts +11 -0
- package/Types/Exception/PaymentRequiredException.ts +10 -0
- package/Types/Exception/ServiceUnavailableException.ts +10 -0
- package/Types/Exception/SsoAuthorizationException.ts +10 -0
- package/Types/Exception/TenantNotFoundException.ts +11 -0
- package/Types/Exception/TimeoutException.ts +10 -0
- package/Types/Exception/TooManyRequestsException.ts +10 -0
- package/Types/Exception/UnableToReachServer.ts +10 -0
- package/Types/Exception/WebsiteRequestException.ts +10 -0
- package/Types/Monitor/CriteriaFilter.ts +60 -2
- package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
- package/Types/Monitor/MonitorMetricType.ts +71 -0
- package/Types/Monitor/MonitorStep.ts +76 -0
- package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
- package/Types/Monitor/MonitorType.ts +47 -1
- package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
- package/Types/Monitor/SqlConnectionConfig.ts +31 -0
- package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
- package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
- package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
- package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
- package/Types/Permission.ts +90 -0
- package/Types/Probe/ProbeMonitorResponse.ts +16 -0
- package/Types/Telemetry/ErrorClass.ts +274 -0
- package/Types/Telemetry/UnitOfWork.ts +59 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
- package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
- package/UI/Components/Modal/Modal.tsx +2 -8
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
- package/UI/Components/SideMenu/SideMenu.tsx +123 -5
- package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
- package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
- package/UI/Components/SideOver/SideOver.tsx +21 -20
- package/UI/Utils/PageScrollLock.ts +79 -3
- package/UI/Utils/PermissionGate.ts +61 -0
- package/UI/Utils/SensitiveUrlToken.ts +112 -0
- package/UI/Utils/TestLLMProvider.ts +11 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
- package/Utils/Monitor/MonitorMetricType.ts +153 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
- package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
- package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
- package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
- package/build/dist/Models/AnalyticsModels/Span.js +14 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +10 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/LlmProviderAPI.js +108 -13
- package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +12 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIBillingService.js +70 -16
- package/build/dist/Server/Services/AIBillingService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +10 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +119 -21
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
- package/build/dist/Server/Services/NotificationService.js +80 -17
- package/build/dist/Server/Services/NotificationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +66 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +90 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
- package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +8 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +63 -1
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +38 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +162 -46
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
- package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
- package/build/dist/Types/Exception/ApiException.js +9 -0
- package/build/dist/Types/Exception/ApiException.js.map +1 -1
- package/build/dist/Types/Exception/BadDataException.js +10 -0
- package/build/dist/Types/Exception/BadDataException.js.map +1 -1
- package/build/dist/Types/Exception/BadRequestException.js +10 -0
- package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
- package/build/dist/Types/Exception/Exception.js +56 -0
- package/build/dist/Types/Exception/Exception.js.map +1 -1
- package/build/dist/Types/Exception/ForbiddenException.js +9 -0
- package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
- package/build/dist/Types/Exception/NotFoundException.js +10 -0
- package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
- package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
- package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
- package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
- package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
- package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
- package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/TimeoutException.js +9 -0
- package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
- package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
- package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
- package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
- package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
- package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +54 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +45 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
- package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
- package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +80 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
- package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -7
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +31 -3
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +42 -1
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
- package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
- package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
- 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
|
-
|
|
352
|
-
|
|
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
|
-
|
|
518
|
-
|
|
519
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
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
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
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
|
-
|
|
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
|
-
|
|
656
|
+
...connectionOf(buildDevice({ snmpPort: undefined })),
|
|
615
657
|
oids: [],
|
|
616
658
|
monitorInterfaces: true,
|
|
617
659
|
});
|
|
618
660
|
const explicit: MonitorStepSnmpMonitor =
|
|
619
661
|
NetworkDeviceHydrationUtil.buildSnmpMonitorConfig({
|
|
620
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
});
|