@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
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { describe, expect, test } from "@jest/globals";
|
|
2
|
+
import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
|
|
3
|
+
import NetworkSnmpCredentialProfile from "../../../Models/DatabaseModels/NetworkSnmpCredentialProfile";
|
|
4
|
+
import {
|
|
5
|
+
SnmpCredentialCarrier,
|
|
6
|
+
hasUsableCredentials,
|
|
7
|
+
} from "../../../Utils/NetworkDevice/SnmpCredentialUtil";
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
* hasUsableCredentials is the predicate behind the poller's resolution order:
|
|
11
|
+
* device columns, then the device's profile, then the site's profile, first
|
|
12
|
+
* usable set wins, and with none the device is only pinged. It cannot throw
|
|
13
|
+
* and it cannot look broken - a wrong answer just quietly leaves a device
|
|
14
|
+
* un-walked, or walks it with a set that will never authenticate - so the
|
|
15
|
+
* whole matrix is pinned here: every spelling of every version, crossed with
|
|
16
|
+
* every way a credential can be missing.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
const EMPTY_VALUES: ReadonlyArray<string | null | undefined> = [
|
|
20
|
+
undefined,
|
|
21
|
+
null,
|
|
22
|
+
"",
|
|
23
|
+
" ",
|
|
24
|
+
" ",
|
|
25
|
+
"\t",
|
|
26
|
+
"\n",
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* The stored spelling ("V2c"), the probe-contract spelling ("2c"), and the
|
|
31
|
+
* case drift a hand-written row produces. SnmpVersionUtil.parse accepts all
|
|
32
|
+
* of them, and this util must agree with parse rather than compare raw text.
|
|
33
|
+
*/
|
|
34
|
+
const V1_SPELLINGS: ReadonlyArray<string> = ["V1", "v1", "1"];
|
|
35
|
+
const V2C_SPELLINGS: ReadonlyArray<string> = ["V2c", "v2c", "V2C", "2c", "2C"];
|
|
36
|
+
const V3_SPELLINGS: ReadonlyArray<string> = ["V3", "v3", "3"];
|
|
37
|
+
|
|
38
|
+
describe("hasUsableCredentials - v1 and v2c need a community string", () => {
|
|
39
|
+
test.each([...V1_SPELLINGS, ...V2C_SPELLINGS])(
|
|
40
|
+
"version %p with a community string is usable",
|
|
41
|
+
(version: string) => {
|
|
42
|
+
expect(
|
|
43
|
+
hasUsableCredentials({
|
|
44
|
+
snmpVersion: version,
|
|
45
|
+
snmpCommunityString: "public",
|
|
46
|
+
}),
|
|
47
|
+
).toBe(true);
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
test.each([...V1_SPELLINGS, ...V2C_SPELLINGS])(
|
|
52
|
+
"version %p with a whitespace-padded community string is still usable",
|
|
53
|
+
(version: string) => {
|
|
54
|
+
expect(
|
|
55
|
+
hasUsableCredentials({
|
|
56
|
+
snmpVersion: version,
|
|
57
|
+
snmpCommunityString: " public ",
|
|
58
|
+
}),
|
|
59
|
+
).toBe(true);
|
|
60
|
+
},
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
const missingCommunity: Array<[string, string | null | undefined]> = [];
|
|
64
|
+
for (const version of [...V1_SPELLINGS, ...V2C_SPELLINGS]) {
|
|
65
|
+
for (const empty of EMPTY_VALUES) {
|
|
66
|
+
missingCommunity.push([version, empty]);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
test.each(missingCommunity)(
|
|
71
|
+
"version %p with community string %p is not usable",
|
|
72
|
+
(version: string, community: string | null | undefined) => {
|
|
73
|
+
expect(
|
|
74
|
+
hasUsableCredentials({
|
|
75
|
+
snmpVersion: version,
|
|
76
|
+
snmpCommunityString: community,
|
|
77
|
+
}),
|
|
78
|
+
).toBe(false);
|
|
79
|
+
},
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
/*
|
|
83
|
+
* A v3 username on a v2c row is a leftover from switching the version in a
|
|
84
|
+
* form, not a credential v2c can send. It must not rescue the row.
|
|
85
|
+
*/
|
|
86
|
+
test.each([...V1_SPELLINGS, ...V2C_SPELLINGS])(
|
|
87
|
+
"version %p is not rescued by a v3 username",
|
|
88
|
+
(version: string) => {
|
|
89
|
+
expect(
|
|
90
|
+
hasUsableCredentials({
|
|
91
|
+
snmpVersion: version,
|
|
92
|
+
snmpCommunityString: "",
|
|
93
|
+
snmpV3Username: "monitoring",
|
|
94
|
+
}),
|
|
95
|
+
).toBe(false);
|
|
96
|
+
},
|
|
97
|
+
);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
describe("hasUsableCredentials - v3 needs a security name", () => {
|
|
101
|
+
test.each(V3_SPELLINGS)(
|
|
102
|
+
"version %p with a username is usable",
|
|
103
|
+
(version: string) => {
|
|
104
|
+
expect(
|
|
105
|
+
hasUsableCredentials({
|
|
106
|
+
snmpVersion: version,
|
|
107
|
+
snmpV3Username: "monitoring",
|
|
108
|
+
}),
|
|
109
|
+
).toBe(true);
|
|
110
|
+
},
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
/*
|
|
114
|
+
* Auth and privacy keys are legitimately absent at noAuthNoPriv, so the
|
|
115
|
+
* predicate reads neither: a v3 row is usable on its username alone. A key
|
|
116
|
+
* that is missing at a higher security level is the device's error to
|
|
117
|
+
* report, not this function's to predict.
|
|
118
|
+
*/
|
|
119
|
+
test.each(V3_SPELLINGS)(
|
|
120
|
+
"version %p is usable on the username alone, with no keys at all",
|
|
121
|
+
(version: string) => {
|
|
122
|
+
const carrier: SnmpCredentialCarrier & {
|
|
123
|
+
snmpV3AuthKey?: string | undefined;
|
|
124
|
+
snmpV3PrivKey?: string | undefined;
|
|
125
|
+
} = {
|
|
126
|
+
snmpVersion: version,
|
|
127
|
+
snmpV3Username: "monitoring",
|
|
128
|
+
snmpV3AuthKey: undefined,
|
|
129
|
+
snmpV3PrivKey: undefined,
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
expect(hasUsableCredentials(carrier)).toBe(true);
|
|
133
|
+
},
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
const missingUsername: Array<[string, string | null | undefined]> = [];
|
|
137
|
+
for (const version of V3_SPELLINGS) {
|
|
138
|
+
for (const empty of EMPTY_VALUES) {
|
|
139
|
+
missingUsername.push([version, empty]);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
test.each(missingUsername)(
|
|
144
|
+
"version %p with username %p is not usable",
|
|
145
|
+
(version: string, username: string | null | undefined) => {
|
|
146
|
+
expect(
|
|
147
|
+
hasUsableCredentials({
|
|
148
|
+
snmpVersion: version,
|
|
149
|
+
snmpV3Username: username,
|
|
150
|
+
}),
|
|
151
|
+
).toBe(false);
|
|
152
|
+
},
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
/*
|
|
156
|
+
* The mirror of the v2c case above. A community string on a v3 row is what
|
|
157
|
+
* a device that was upgraded from v2c still carries; v3 cannot send it, so
|
|
158
|
+
* it must not make the row usable.
|
|
159
|
+
*/
|
|
160
|
+
test.each(V3_SPELLINGS)(
|
|
161
|
+
"version %p is not rescued by a community string",
|
|
162
|
+
(version: string) => {
|
|
163
|
+
expect(
|
|
164
|
+
hasUsableCredentials({
|
|
165
|
+
snmpVersion: version,
|
|
166
|
+
snmpCommunityString: "public",
|
|
167
|
+
snmpV3Username: "",
|
|
168
|
+
}),
|
|
169
|
+
).toBe(false);
|
|
170
|
+
},
|
|
171
|
+
);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
describe("hasUsableCredentials - a missing or unrecognised version reads as v2c", () => {
|
|
175
|
+
/*
|
|
176
|
+
* The column default on both the device and the profile is "V2c", and
|
|
177
|
+
* SnmpVersionUtil.parse falls back to v2c for anything it does not
|
|
178
|
+
* recognise. A row with a community string and no version is therefore
|
|
179
|
+
* polled as v2c, and this predicate has to say so, or a freshly created
|
|
180
|
+
* profile that never had its version touched would count as unusable.
|
|
181
|
+
*/
|
|
182
|
+
test.each([undefined, null, "", " ", "V4", "snmp", "2"])(
|
|
183
|
+
"version %p with a community string is usable, as v2c",
|
|
184
|
+
(version: string | null | undefined) => {
|
|
185
|
+
expect(
|
|
186
|
+
hasUsableCredentials({
|
|
187
|
+
snmpVersion: version,
|
|
188
|
+
snmpCommunityString: "public",
|
|
189
|
+
}),
|
|
190
|
+
).toBe(true);
|
|
191
|
+
},
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
test.each([undefined, null, "", "V4"])(
|
|
195
|
+
"version %p with only a v3 username is not usable, because it is not v3",
|
|
196
|
+
(version: string | null | undefined) => {
|
|
197
|
+
expect(
|
|
198
|
+
hasUsableCredentials({
|
|
199
|
+
snmpVersion: version,
|
|
200
|
+
snmpV3Username: "monitoring",
|
|
201
|
+
}),
|
|
202
|
+
).toBe(false);
|
|
203
|
+
},
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
test("an empty object is not usable", () => {
|
|
207
|
+
expect(hasUsableCredentials({})).toBe(false);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
describe("hasUsableCredentials - accepts any row carrying the three fields", () => {
|
|
212
|
+
/*
|
|
213
|
+
* The resolution order asks this question of a NetworkDevice and then of a
|
|
214
|
+
* NetworkSnmpCredentialProfile, so both model classes have to be
|
|
215
|
+
* assignable to the parameter without a cast. These are compile-time
|
|
216
|
+
* assertions as much as runtime ones: if either model renames one of the
|
|
217
|
+
* three columns, ts-jest refuses to compile this file.
|
|
218
|
+
*/
|
|
219
|
+
test("a NetworkDevice row is accepted as-is", () => {
|
|
220
|
+
const device: NetworkDevice = new NetworkDevice();
|
|
221
|
+
device.snmpVersion = "V2c";
|
|
222
|
+
device.snmpCommunityString = "public";
|
|
223
|
+
|
|
224
|
+
expect(hasUsableCredentials(device)).toBe(true);
|
|
225
|
+
|
|
226
|
+
device.snmpCommunityString = "";
|
|
227
|
+
|
|
228
|
+
expect(hasUsableCredentials(device)).toBe(false);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test("a NetworkSnmpCredentialProfile row is accepted as-is", () => {
|
|
232
|
+
const profile: NetworkSnmpCredentialProfile =
|
|
233
|
+
new NetworkSnmpCredentialProfile();
|
|
234
|
+
profile.snmpVersion = "V3";
|
|
235
|
+
profile.snmpV3Username = "monitoring";
|
|
236
|
+
|
|
237
|
+
expect(hasUsableCredentials(profile)).toBe(true);
|
|
238
|
+
|
|
239
|
+
profile.snmpV3Username = "";
|
|
240
|
+
|
|
241
|
+
expect(hasUsableCredentials(profile)).toBe(false);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
/*
|
|
245
|
+
* A freshly constructed model has every column undefined. That is the
|
|
246
|
+
* state of a device registered with nothing but an address - the exact
|
|
247
|
+
* case profiles exist for - and it must read as "ping only".
|
|
248
|
+
*/
|
|
249
|
+
test("a bare model with nothing set is not usable", () => {
|
|
250
|
+
expect(hasUsableCredentials(new NetworkDevice())).toBe(false);
|
|
251
|
+
expect(hasUsableCredentials(new NetworkSnmpCredentialProfile())).toBe(
|
|
252
|
+
false,
|
|
253
|
+
);
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
test("it never mutates the row it is asked about", () => {
|
|
257
|
+
const carrier: SnmpCredentialCarrier = {
|
|
258
|
+
snmpVersion: " v3 ",
|
|
259
|
+
snmpCommunityString: " public ",
|
|
260
|
+
snmpV3Username: " monitoring ",
|
|
261
|
+
};
|
|
262
|
+
const snapshot: SnmpCredentialCarrier = { ...carrier };
|
|
263
|
+
|
|
264
|
+
hasUsableCredentials(carrier);
|
|
265
|
+
|
|
266
|
+
expect(carrier).toEqual(snapshot);
|
|
267
|
+
});
|
|
268
|
+
});
|
|
@@ -380,12 +380,19 @@ describe("AutoImportRuleMatcher.ruleMatchesHost", () => {
|
|
|
380
380
|
});
|
|
381
381
|
});
|
|
382
382
|
|
|
383
|
+
/*
|
|
384
|
+
* The gate asks what the host ANSWERED, not how it would be monitored.
|
|
385
|
+
*
|
|
386
|
+
* Under ping-first polling (issue #3562) every discovered host imports as a
|
|
387
|
+
* probe-polled device — a ping-only host is a first-class device now, not a
|
|
388
|
+
* monitor-backed stub. So `monitoringMethodForDiscoveredHost` is a constant
|
|
389
|
+
* and cannot express this question; only `isPingOnlyDiscoveredHost` can.
|
|
390
|
+
* The gate itself is unchanged and still default-closed: an SNMP credential
|
|
391
|
+
* typo makes a whole subnet report as ping-only, and a rule silently
|
|
392
|
+
* importing hundreds of half-identified hosts on that typo is the failure
|
|
393
|
+
* mode it exists to prevent.
|
|
394
|
+
*/
|
|
383
395
|
describe("the ping-only gate", () => {
|
|
384
|
-
/*
|
|
385
|
-
* An SNMP credential typo makes a whole subnet report as ping-only; a
|
|
386
|
-
* rule silently importing hundreds of half-identified hosts on that typo
|
|
387
|
-
* is the failure mode the default-closed gate exists to prevent.
|
|
388
|
-
*/
|
|
389
396
|
it("does not let an import rule claim a ping-only host by default", () => {
|
|
390
397
|
expect(
|
|
391
398
|
AutoImportRuleMatcher.ruleMatchesHost(
|
|
@@ -395,6 +402,49 @@ describe("AutoImportRuleMatcher.ruleMatchesHost", () => {
|
|
|
395
402
|
).toBe(false);
|
|
396
403
|
});
|
|
397
404
|
|
|
405
|
+
/*
|
|
406
|
+
* The regression, stated as the fact it depends on. The gate briefly ran
|
|
407
|
+
* off the imported monitoring method, which now answers Probe for every
|
|
408
|
+
* host — so it never fired at all and the default-closed gate was open
|
|
409
|
+
* for the whole fleet. This pins it to the host's own SNMP answer: two
|
|
410
|
+
* hosts identical in every field the rule matches on, differing only in
|
|
411
|
+
* `snmpReachable`, must be claimed differently.
|
|
412
|
+
*/
|
|
413
|
+
it("keys on the host's SNMP answer, not on the method it would import under", () => {
|
|
414
|
+
const rule: AutoImportRuleCandidate = { ipMatchTarget: "10.0.0.0/24" };
|
|
415
|
+
|
|
416
|
+
expect(
|
|
417
|
+
AutoImportRuleMatcher.ruleMatchesHost(
|
|
418
|
+
rule,
|
|
419
|
+
host({ snmpReachable: true }),
|
|
420
|
+
),
|
|
421
|
+
).toBe(true);
|
|
422
|
+
expect(
|
|
423
|
+
AutoImportRuleMatcher.ruleMatchesHost(
|
|
424
|
+
rule,
|
|
425
|
+
host({ snmpReachable: false }),
|
|
426
|
+
),
|
|
427
|
+
).toBe(false);
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
/*
|
|
431
|
+
* And through the whole rule set, which is the surface the engine and the
|
|
432
|
+
* dry-run dialog actually call: a ping-only host does not import at all
|
|
433
|
+
* on a rule that never opted in.
|
|
434
|
+
*/
|
|
435
|
+
it("leaves a ping-only host unimported by an evaluation that did not opt in", () => {
|
|
436
|
+
const evaluation: AutoImportHostEvaluation =
|
|
437
|
+
AutoImportRuleMatcher.evaluateHost(
|
|
438
|
+
[{ ipMatchTarget: "10.0.0.0/24" }],
|
|
439
|
+
host({ snmpReachable: false }),
|
|
440
|
+
);
|
|
441
|
+
|
|
442
|
+
expect(evaluation.shouldImport).toBe(false);
|
|
443
|
+
expect(evaluation.matchedRules).toEqual([]);
|
|
444
|
+
// Not a veto — nothing claimed it, which reads differently in a dry run.
|
|
445
|
+
expect(evaluation.excludedByRule).toBeUndefined();
|
|
446
|
+
});
|
|
447
|
+
|
|
398
448
|
it("lets an import rule claim a ping-only host after the explicit opt-in", () => {
|
|
399
449
|
expect(
|
|
400
450
|
AutoImportRuleMatcher.ruleMatchesHost(
|
|
@@ -203,8 +203,10 @@ describe("buildNetworkDeviceFromDiscoveredHost - vendor template auto-apply flag
|
|
|
203
203
|
});
|
|
204
204
|
|
|
205
205
|
/*
|
|
206
|
-
* A ping-only host
|
|
207
|
-
* its vendor — the flag would be a dead toggle
|
|
206
|
+
* A ping-only host imports with no credentials, so no poll fingerprints
|
|
207
|
+
* its vendor until an operator adds some — the flag would be a dead toggle
|
|
208
|
+
* that reads as a promise. The device is still the scan's probe's to ping;
|
|
209
|
+
* what it lacks is the SNMP data the template auto-apply keys off.
|
|
208
210
|
*/
|
|
209
211
|
it("stays off on a ping-only host even when requested", () => {
|
|
210
212
|
const device: NetworkDevice = buildNetworkDeviceFromDiscoveredHost({
|
|
@@ -227,7 +229,7 @@ describe("buildNetworkDeviceFromDiscoveredHost - SNMP host", () => {
|
|
|
227
229
|
// The address is both the hostname and the registered-host dedup key.
|
|
228
230
|
expect(device.hostname).toBe("10.0.0.5");
|
|
229
231
|
expect(device.description).toBe("Cisco IOS Software, C2960X");
|
|
230
|
-
expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.
|
|
232
|
+
expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Probe);
|
|
231
233
|
});
|
|
232
234
|
|
|
233
235
|
/*
|
|
@@ -411,19 +413,25 @@ describe("buildNetworkDeviceFromDiscoveredHost - a scan with several SNMP config
|
|
|
411
413
|
|
|
412
414
|
describe("buildNetworkDeviceFromDiscoveredHost - ping-only host", () => {
|
|
413
415
|
/*
|
|
414
|
-
* A ping-only host becomes a
|
|
415
|
-
*
|
|
416
|
-
*
|
|
417
|
-
* not ride along.
|
|
416
|
+
* A ping-only host becomes a Probe device the scan's probe pings: it has
|
|
417
|
+
* a status from its first poll, belongs to a site, appears on the topology
|
|
418
|
+
* map, and gets walked the day an operator adds credentials. Credentials
|
|
419
|
+
* it never answered to must not ride along.
|
|
420
|
+
*
|
|
421
|
+
* (It used to become a monitor-backed device with no probe and polling
|
|
422
|
+
* off, and sat on "Pending" until a Ping monitor was hand-bound — issue
|
|
423
|
+
* #3447. The three assertions that changed here are the ones that end
|
|
424
|
+
* that: Probe, the scan's probe, polling on.)
|
|
418
425
|
*/
|
|
419
|
-
it("builds a
|
|
426
|
+
it("builds a Probe device on the scan's probe with polling on and no credentials", () => {
|
|
420
427
|
const device: NetworkDevice = build({
|
|
421
428
|
host: snmpHost({ snmpReachable: false, sysName: undefined }),
|
|
422
429
|
});
|
|
423
430
|
|
|
424
|
-
expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.
|
|
425
|
-
expect(device.isPollingEnabled).toBe(
|
|
426
|
-
expect(device.probeId).
|
|
431
|
+
expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Probe);
|
|
432
|
+
expect(device.isPollingEnabled).toBe(true);
|
|
433
|
+
expect(device.probeId).toBeInstanceOf(ObjectID);
|
|
434
|
+
expect(device.probeId?.toString()).toBe(PROBE_ID.toString());
|
|
427
435
|
expect(device.snmpVersion).toBeUndefined();
|
|
428
436
|
expect(device.snmpCommunityString).toBeUndefined();
|
|
429
437
|
expect(device.snmpPort).toBeUndefined();
|
|
@@ -443,7 +451,7 @@ describe("buildNetworkDeviceFromDiscoveredHost - ping-only host", () => {
|
|
|
443
451
|
* the same probe-written jsonb row, and nothing in the database enforces
|
|
444
452
|
* that a ping-only row leaves the first one unset — an older result, a
|
|
445
453
|
* partially-rewritten row, or a probe bug is enough. The builder must decide
|
|
446
|
-
*
|
|
454
|
+
* that the host is ping-only and return BEFORE it ever looks a config up, so
|
|
447
455
|
* that a stray id can never conjure credentials onto a device that answered
|
|
448
456
|
* nothing but a ping.
|
|
449
457
|
*/
|
|
@@ -456,14 +464,84 @@ describe("buildNetworkDeviceFromDiscoveredHost - ping-only host", () => {
|
|
|
456
464
|
scan: multiConfigScanSource(),
|
|
457
465
|
});
|
|
458
466
|
|
|
459
|
-
expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.
|
|
460
|
-
expect(device.isPollingEnabled).toBe(
|
|
461
|
-
expect(device.probeId).
|
|
467
|
+
expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Probe);
|
|
468
|
+
expect(device.isPollingEnabled).toBe(true);
|
|
469
|
+
expect(device.probeId?.toString()).toBe(PROBE_ID.toString());
|
|
462
470
|
expect(device.snmpVersion).toBeUndefined();
|
|
463
471
|
expect(device.snmpCommunityString).toBeUndefined();
|
|
464
472
|
expect(device.snmpPort).toBeUndefined();
|
|
465
473
|
expectNoV3Credentials(device);
|
|
466
474
|
});
|
|
475
|
+
|
|
476
|
+
/*
|
|
477
|
+
* The OID template an auto-import rule links is SNMP data the host did not
|
|
478
|
+
* supply; attaching it would promise a collection that cannot start until
|
|
479
|
+
* credentials exist. Kept off, like the vendor-template flag above.
|
|
480
|
+
*/
|
|
481
|
+
it("does not attach the rule's OID template to a ping-only host", () => {
|
|
482
|
+
const device: NetworkDevice = buildNetworkDeviceFromDiscoveredHost({
|
|
483
|
+
projectId: PROJECT_ID,
|
|
484
|
+
host: snmpHost({ snmpReachable: false }),
|
|
485
|
+
scan: fullScanSource(),
|
|
486
|
+
oidTemplateId: new ObjectID("44444444-4444-4444-8444-444444444444"),
|
|
487
|
+
});
|
|
488
|
+
|
|
489
|
+
expect(device.oidTemplateId).toBeUndefined();
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
/*
|
|
493
|
+
* A scan with no probe at all — an API-written row, or a scan whose probe
|
|
494
|
+
* was deleted between the sweep and the import. The device is still a
|
|
495
|
+
* Probe device with polling on; it simply has no probe to be claimed by
|
|
496
|
+
* until one is assigned, which the Settings form requires. Nothing here
|
|
497
|
+
* may throw or silently fall back to Monitor.
|
|
498
|
+
*/
|
|
499
|
+
it("still builds a Probe device with polling on when the scan names no probe", () => {
|
|
500
|
+
const device: NetworkDevice = build({
|
|
501
|
+
host: snmpHost({ snmpReachable: false }),
|
|
502
|
+
scan: { ...fullScanSource(), probeId: undefined },
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Probe);
|
|
506
|
+
expect(device.isPollingEnabled).toBe(true);
|
|
507
|
+
expect(device.probeId).toBeUndefined();
|
|
508
|
+
});
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
describe("buildNetworkDeviceFromDiscoveredHost - both kinds of host share the recipe", () => {
|
|
512
|
+
/*
|
|
513
|
+
* The point of ping-first polling from the import side: the ONLY thing
|
|
514
|
+
* that differs between an SNMP host and a ping-only one is the credentials.
|
|
515
|
+
* Method, probe and polling are identical, so an edit that reintroduced a
|
|
516
|
+
* "ping-only hosts are different" branch on any of the three fails here.
|
|
517
|
+
*/
|
|
518
|
+
it("differ only in the credentials they carry", () => {
|
|
519
|
+
const snmpDevice: NetworkDevice = build({
|
|
520
|
+
host: snmpHost({ snmpReachable: true }),
|
|
521
|
+
});
|
|
522
|
+
const pingOnlyDevice: NetworkDevice = build({
|
|
523
|
+
host: snmpHost({ snmpReachable: false }),
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
expect(pingOnlyDevice.monitoringMethod).toBe(snmpDevice.monitoringMethod);
|
|
527
|
+
expect(pingOnlyDevice.isPollingEnabled).toBe(snmpDevice.isPollingEnabled);
|
|
528
|
+
expect(pingOnlyDevice.probeId?.toString()).toBe(
|
|
529
|
+
snmpDevice.probeId?.toString(),
|
|
530
|
+
);
|
|
531
|
+
|
|
532
|
+
// Anti-vacuity: the SNMP device really does carry what the other lacks.
|
|
533
|
+
expect(snmpDevice.snmpCommunityString).toBe("public");
|
|
534
|
+
expect(pingOnlyDevice.snmpCommunityString).toBeUndefined();
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
it("writes polling on explicitly rather than leaving it to the column", () => {
|
|
538
|
+
for (const snmpReachable of [true, false, undefined]) {
|
|
539
|
+
expect(
|
|
540
|
+
build({ host: snmpHost({ snmpReachable: snmpReachable }) })
|
|
541
|
+
.isPollingEnabled,
|
|
542
|
+
).toBe(true);
|
|
543
|
+
}
|
|
544
|
+
});
|
|
467
545
|
});
|
|
468
546
|
|
|
469
547
|
describe("buildDeviceName", () => {
|
|
@@ -848,10 +926,10 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
848
926
|
expect(device.name).toBe("core-gw.corp.example.com");
|
|
849
927
|
});
|
|
850
928
|
|
|
851
|
-
test("a ping-only host still imports as a
|
|
929
|
+
test("a ping-only host still imports as a credential-less Probe device", () => {
|
|
852
930
|
/*
|
|
853
931
|
* Naming must not change WHAT a host imports as. A PTR record says
|
|
854
|
-
* nothing about whether the device
|
|
932
|
+
* nothing about whether the device answered SNMP.
|
|
855
933
|
*/
|
|
856
934
|
const device: NetworkDevice = buildNetworkDeviceFromDiscoveredHost({
|
|
857
935
|
projectId: PROJECT_ID,
|
|
@@ -864,10 +942,9 @@ describe("the reverse-DNS name (issue #3529)", () => {
|
|
|
864
942
|
});
|
|
865
943
|
|
|
866
944
|
expect(device.name).toBe("cam-lobby.corp.example.com");
|
|
867
|
-
expect(device.monitoringMethod).toBe(
|
|
868
|
-
|
|
869
|
-
);
|
|
870
|
-
expect(device.isPollingEnabled).toBe(false);
|
|
945
|
+
expect(device.monitoringMethod).toBe(NetworkDeviceMonitoringMethod.Probe);
|
|
946
|
+
expect(device.isPollingEnabled).toBe(true);
|
|
947
|
+
expect(device.probeId?.toString()).toBe(PROBE_ID.toString());
|
|
871
948
|
expect(device.snmpCommunityString).toBeUndefined();
|
|
872
949
|
});
|
|
873
950
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isImportableDiscoveredHost,
|
|
3
|
+
isPingOnlyDiscoveredHost,
|
|
3
4
|
monitoringMethodForDiscoveredHost,
|
|
4
5
|
} from "../../../Utils/NetworkDiscovery/DiscoveryImportEligibility";
|
|
5
6
|
import NetworkDeviceMonitoringMethod from "../../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
|
|
@@ -7,16 +8,23 @@ import type { DiscoveredNetworkDevice } from "../../../Models/DatabaseModels/Net
|
|
|
7
8
|
import { describe, expect, test } from "@jest/globals";
|
|
8
9
|
|
|
9
10
|
/*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* The two decisions, shared by the dashboard's Review dialog and the
|
|
12
|
+
* server-side auto-import rule engine, for HOW a discovered host imports.
|
|
13
|
+
* The two must never disagree: the group a host is shown under and the
|
|
14
|
+
* device a rule imports it as are the same call.
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
16
|
+
* Under ping-first polling every host imports as a Probe device — the scan's
|
|
17
|
+
* probe pings it, and walks it over SNMP when it has credentials — so
|
|
18
|
+
* `monitoringMethodForDiscoveredHost` has one answer for every input, and the
|
|
19
|
+
* host-level question that still matters is `isPingOnlyDiscoveredHost`:
|
|
20
|
+
* whether the host carries the scan's credentials or none.
|
|
21
|
+
*
|
|
22
|
+
* The one subtlety that predicate guards (issue #3023 / legacy scans): only an
|
|
23
|
+
* EXPLICIT snmpReachable === false is ping-only. undefined means a legacy scan
|
|
24
|
+
* row from before the field existed, where every host answered SNMP, so it
|
|
25
|
+
* must read as an SNMP host. And a nullish host must not throw, because a
|
|
26
|
+
* single junk element in the jsonb array used to take the whole page down from
|
|
27
|
+
* a table cell.
|
|
20
28
|
*/
|
|
21
29
|
|
|
22
30
|
function host(
|
|
@@ -26,38 +34,108 @@ function host(
|
|
|
26
34
|
}
|
|
27
35
|
|
|
28
36
|
describe("monitoringMethodForDiscoveredHost", () => {
|
|
29
|
-
|
|
37
|
+
/*
|
|
38
|
+
* Ping-only hosts used to import as monitor-backed devices with no probe
|
|
39
|
+
* and polling off, and sat on "Pending" until an operator hand-bound a
|
|
40
|
+
* Ping monitor (issue #3447). Reachability is a built-in capability of
|
|
41
|
+
* every probe-polled device now, so the host the probe just pinged is a
|
|
42
|
+
* Probe device like any other.
|
|
43
|
+
*/
|
|
44
|
+
test("an explicit snmpReachable === false is a Probe device, not a monitor-backed one", () => {
|
|
30
45
|
expect(
|
|
31
46
|
monitoringMethodForDiscoveredHost(host({ snmpReachable: false })),
|
|
32
|
-
).toBe(NetworkDeviceMonitoringMethod.
|
|
47
|
+
).toBe(NetworkDeviceMonitoringMethod.Probe);
|
|
33
48
|
});
|
|
34
49
|
|
|
35
|
-
test("snmpReachable === true is
|
|
50
|
+
test("snmpReachable === true is a Probe device", () => {
|
|
36
51
|
expect(
|
|
37
52
|
monitoringMethodForDiscoveredHost(host({ snmpReachable: true })),
|
|
38
|
-
).toBe(NetworkDeviceMonitoringMethod.
|
|
53
|
+
).toBe(NetworkDeviceMonitoringMethod.Probe);
|
|
39
54
|
});
|
|
40
55
|
|
|
41
|
-
test("undefined snmpReachable (legacy scan)
|
|
56
|
+
test("undefined snmpReachable (legacy scan) is a Probe device", () => {
|
|
42
57
|
expect(monitoringMethodForDiscoveredHost(host({}))).toBe(
|
|
43
|
-
NetworkDeviceMonitoringMethod.
|
|
58
|
+
NetworkDeviceMonitoringMethod.Probe,
|
|
44
59
|
);
|
|
45
60
|
expect(
|
|
46
61
|
monitoringMethodForDiscoveredHost(host({ snmpReachable: undefined })),
|
|
47
|
-
).toBe(NetworkDeviceMonitoringMethod.
|
|
62
|
+
).toBe(NetworkDeviceMonitoringMethod.Probe);
|
|
48
63
|
});
|
|
49
64
|
|
|
50
|
-
test("a null host reads as
|
|
65
|
+
test("a null host reads as Probe rather than throwing", () => {
|
|
51
66
|
expect(monitoringMethodForDiscoveredHost(null)).toBe(
|
|
52
|
-
NetworkDeviceMonitoringMethod.
|
|
67
|
+
NetworkDeviceMonitoringMethod.Probe,
|
|
53
68
|
);
|
|
54
69
|
});
|
|
55
70
|
|
|
56
|
-
test("an undefined host reads as
|
|
71
|
+
test("an undefined host reads as Probe rather than throwing", () => {
|
|
57
72
|
expect(monitoringMethodForDiscoveredHost(undefined)).toBe(
|
|
58
|
-
NetworkDeviceMonitoringMethod.
|
|
73
|
+
NetworkDeviceMonitoringMethod.Probe,
|
|
59
74
|
);
|
|
60
75
|
});
|
|
76
|
+
|
|
77
|
+
/*
|
|
78
|
+
* Discovery never has grounds to choose the Monitor override: every host it
|
|
79
|
+
* offers was reached by the probe that found it. Stated as a sweep over
|
|
80
|
+
* every shape the field can take, so a future "return Monitor when X"
|
|
81
|
+
* cannot creep back in on one branch.
|
|
82
|
+
*/
|
|
83
|
+
test("never answers Monitor, whatever the host looks like", () => {
|
|
84
|
+
const hosts: Array<DiscoveredNetworkDevice | null | undefined> = [
|
|
85
|
+
host({ snmpReachable: false }),
|
|
86
|
+
host({ snmpReachable: true }),
|
|
87
|
+
host({}),
|
|
88
|
+
host({ snmpReachable: false, isAlreadyRegistered: true }),
|
|
89
|
+
null,
|
|
90
|
+
undefined,
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
for (const candidate of hosts) {
|
|
94
|
+
expect(monitoringMethodForDiscoveredHost(candidate)).not.toBe(
|
|
95
|
+
NetworkDeviceMonitoringMethod.Monitor,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
describe("isPingOnlyDiscoveredHost", () => {
|
|
102
|
+
test("an explicit snmpReachable === false is ping-only", () => {
|
|
103
|
+
expect(isPingOnlyDiscoveredHost(host({ snmpReachable: false }))).toBe(true);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test("snmpReachable === true is an SNMP host", () => {
|
|
107
|
+
expect(isPingOnlyDiscoveredHost(host({ snmpReachable: true }))).toBe(false);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("undefined snmpReachable (legacy scan) reads as an SNMP host, not ping-only", () => {
|
|
111
|
+
/*
|
|
112
|
+
* Every host on a scan stored before the field existed answered SNMP —
|
|
113
|
+
* ping-only sweeps did not exist yet. Reading undefined as ping-only
|
|
114
|
+
* would strip those devices of the scan's credentials on import.
|
|
115
|
+
*/
|
|
116
|
+
expect(isPingOnlyDiscoveredHost(host({}))).toBe(false);
|
|
117
|
+
expect(isPingOnlyDiscoveredHost(host({ snmpReachable: undefined }))).toBe(
|
|
118
|
+
false,
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test("a nullish host reads as an SNMP host rather than throwing", () => {
|
|
123
|
+
expect(isPingOnlyDiscoveredHost(null)).toBe(false);
|
|
124
|
+
expect(isPingOnlyDiscoveredHost(undefined)).toBe(false);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test("only snmpReachable decides — every other field is ignored", () => {
|
|
128
|
+
expect(
|
|
129
|
+
isPingOnlyDiscoveredHost(
|
|
130
|
+
host({
|
|
131
|
+
isAlreadyRegistered: true,
|
|
132
|
+
sysDescr: "Some host",
|
|
133
|
+
sysName: "named-anyway",
|
|
134
|
+
snmpReachable: false,
|
|
135
|
+
}),
|
|
136
|
+
),
|
|
137
|
+
).toBe(true);
|
|
138
|
+
});
|
|
61
139
|
});
|
|
62
140
|
|
|
63
141
|
describe("isImportableDiscoveredHost", () => {
|