@oneuptime/common 12.0.31 → 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/AlertState.ts +0 -2
- package/Models/DatabaseModels/Domain.ts +1 -1
- package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
- package/Models/DatabaseModels/Incident.ts +1 -1
- package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
- package/Models/DatabaseModels/Index.ts +12 -0
- package/Models/DatabaseModels/MetricType.ts +0 -2
- package/Models/DatabaseModels/Monitor.ts +76 -0
- package/Models/DatabaseModels/MonitorStatusTimeline.ts +0 -2
- package/Models/DatabaseModels/MonitorTest.ts +0 -2
- package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
- package/Models/DatabaseModels/NetworkDevice.ts +297 -3
- package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +3 -1
- package/Models/DatabaseModels/NetworkDeviceRole.ts +648 -0
- package/Models/DatabaseModels/NetworkSite.ts +201 -2
- package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
- package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -1
- package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -1
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +0 -2
- package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +0 -2
- package/Models/DatabaseModels/StatusPagePrivateUser.ts +0 -2
- package/Models/DatabaseModels/StatusPageResource.ts +0 -2
- package/Models/DatabaseModels/StatusPageSubscriber.ts +0 -2
- 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/1790800000000-AddNetworkDeviceRoleTable.ts +72 -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 +14 -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/DatabaseService.ts +39 -9
- package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
- package/Server/Services/EnterpriseLicenseService.ts +55 -0
- package/Server/Services/Index.ts +12 -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/NetworkDeviceRoleService.ts +90 -0
- 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 +186 -44
- 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 -31
- 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 +158 -27
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
- package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +35 -8
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +107 -3
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
- package/Tests/App/Dashboard/DashboardWideChartZoom.test.tsx +401 -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/MonitorTemplateColumnAndFacet.test.tsx +318 -0
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
- package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +357 -0
- 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 +626 -0
- 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/SideMenuHarness.tsx +11 -3
- 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/DatabaseModels/ModelRegistryInvariants.test.ts +115 -41
- 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/NetworkDeviceRoleTableMigration.test.ts +476 -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/DatabaseServiceGenerateSlug.test.ts +215 -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/NetworkDeviceRoleModel.test.ts +672 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +1 -1
- 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/ProjectServiceCreateSubscriptionStarted.test.ts +67 -4
- package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberEndTime.test.ts +369 -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/UserNotificationSettingMonitorDefaults.test.ts +248 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +145 -3
- 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/BasicCron.test.ts +283 -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/IncomingCallPhoneNumber.test.ts +174 -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/DefaultNetworkDeviceRole.test.ts +417 -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/Charts/ChartClickDoubleClickDisambiguation.test.tsx +221 -0
- package/Tests/UI/Components/Charts/ChartDoubleClickReset.test.tsx +220 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +751 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +475 -43
- package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +89 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +103 -8
- package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
- package/Tests/UI/Components/SideMenuItem.test.tsx +256 -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/UI/Utils/TableColumnsToCsv.test.ts +30 -0
- package/Tests/UI/Utils/UseDashboardTimeRangeZoom.test.tsx +187 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +302 -0
- package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +242 -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/NetworkDeviceRoleCatalog.test.ts +981 -0
- package/Tests/Utils/Monitor/NetworkTopologyRoleCatalog.test.ts +865 -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/DeviceRoleKeyUtil.test.ts +538 -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/Slo/SloEvaluation.test.ts +171 -0
- package/Tests/Utils/Slug.test.ts +61 -1
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
- package/Tests/jest.setup.ts +19 -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/SnmpMonitor/NetworkTopology.ts +61 -0
- package/Types/Monitor/SqlConnectionConfig.ts +31 -0
- package/Types/NetworkDevice/DefaultNetworkDeviceRole.ts +145 -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 +135 -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/Charts/Area/AreaChart.tsx +7 -0
- package/UI/Components/Charts/Bar/BarChart.tsx +6 -0
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +9 -1
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +97 -35
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +14 -0
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +97 -35
- package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +13 -0
- package/UI/Components/Charts/Line/LineChart.tsx +7 -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/ModelTable/BaseModelTable.tsx +50 -15
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/Navbar/NavBar.tsx +62 -13
- package/UI/Components/Navbar/NavBarMenuModal.tsx +7 -2
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +2 -0
- package/UI/Components/SideMenu/SideMenu.tsx +135 -7
- package/UI/Components/SideMenu/SideMenuItem.tsx +80 -85
- package/UI/Components/SideMenu/SideMenuSection.tsx +69 -25
- 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/UI/Utils/UseDashboardTimeRangeZoom.ts +77 -0
- package/Utils/Dashboard/DashboardTimeRangeZoom.ts +118 -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/NetworkDeviceRoleCatalog.ts +232 -0
- package/Utils/Monitor/NetworkDeviceRoleUtil.ts +2 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +139 -36
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
- package/Utils/NetworkDevice/DeviceRoleKeyUtil.ts +137 -0
- 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/Utils/Rules/RulePatternMatchUtil.ts +1 -1
- package/Utils/Slug.ts +34 -1
- package/build/dist/Models/AnalyticsModels/Span.js +14 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertState.js +0 -2
- package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Domain.js +1 -1
- package/build/dist/Models/DatabaseModels/Domain.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/Incident.js +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +12 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricType.js +0 -2
- package/build/dist/Models/DatabaseModels/MetricType.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/MonitorStatusTimeline.js +0 -2
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTest.js +0 -2
- package/build/dist/Models/DatabaseModels/MonitorTest.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 +304 -4
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +3 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +677 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -0
- 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/ScheduledMaintenance.js +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageResource.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
- 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/1790800000000-AddNetworkDeviceRoleTable.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.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 +14 -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/DatabaseService.js +31 -5
- package/build/dist/Server/Services/DatabaseService.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 +12 -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/NetworkDeviceRoleService.js +70 -0
- package/build/dist/Server/Services/NetworkDeviceRoleService.js.map +1 -0
- 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 +131 -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 -21
- 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/DefaultNetworkDeviceRole.js +105 -0
- package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.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 +120 -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/Charts/Area/AreaChart.js +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +79 -31
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +7 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +79 -31
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +14 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- 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/ModelTable/BaseModelTable.js +39 -13
- package/build/dist/UI/Components/ModelTable/BaseModelTable.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/Navbar/NavBar.js +44 -9
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.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/CountModelSideMenuItem.js +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +76 -11
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +50 -54
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +32 -9
- 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/UI/Utils/UseDashboardTimeRangeZoom.js +42 -0
- package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js.map +1 -0
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +74 -0
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -0
- 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/NetworkDeviceRoleCatalog.js +126 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +2 -1
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +75 -35
- 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/DeviceRoleKeyUtil.js +114 -0
- package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js.map +1 -0
- 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/build/dist/Utils/Rules/RulePatternMatchUtil.js +1 -1
- package/build/dist/Utils/Slug.js +31 -1
- package/build/dist/Utils/Slug.js.map +1 -1
- 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
|
+
});
|