@oneuptime/common 12.0.32 → 12.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/AnalyticsModels/Span.ts +14 -0
- package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
- package/Models/DatabaseModels/Index.ts +10 -0
- package/Models/DatabaseModels/Monitor.ts +76 -0
- package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
- package/Models/DatabaseModels/NetworkDevice.ts +176 -1
- package/Models/DatabaseModels/NetworkSite.ts +201 -2
- package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
- package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
- package/Models/DatabaseModels/TelemetryException.ts +119 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
- package/Server/API/EnterpriseLicenseAPI.ts +391 -64
- package/Server/API/LlmProviderAPI.ts +137 -22
- package/Server/EnvironmentConfig.ts +14 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Infrastructure/QueueWorker.ts +38 -8
- package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
- package/Server/Middleware/ProjectAuthorization.ts +11 -0
- package/Server/Middleware/SCIMAuthorization.ts +12 -0
- package/Server/Middleware/TelemetryIngest.ts +11 -0
- package/Server/Services/AIBillingService.ts +101 -27
- package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
- package/Server/Services/EnterpriseLicenseService.ts +55 -0
- package/Server/Services/Index.ts +10 -0
- package/Server/Services/MonitorService.ts +143 -21
- package/Server/Services/MonitorStatusTimelineService.ts +150 -8
- package/Server/Services/MonitorTemplateService.ts +217 -1
- package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
- package/Server/Services/NetworkAlertPolicyService.ts +944 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
- package/Server/Services/NetworkDeviceService.ts +1032 -73
- package/Server/Services/NetworkSiteService.ts +1502 -129
- package/Server/Services/NetworkSiteTypeService.ts +1216 -0
- package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
- package/Server/Services/NotificationService.ts +118 -28
- package/Server/Services/ProjectService.ts +105 -48
- package/Server/Services/StatusPagePrivateUserService.ts +103 -3
- package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
- package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
- package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
- package/Server/Services/UserNotificationSettingService.ts +62 -25
- package/Server/Services/UserService.ts +95 -0
- package/Server/Types/Database/QueryHelper.ts +2 -2
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
- package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
- package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
- package/Server/Utils/DataSource/HttpFetch.ts +9 -2
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
- package/Server/Utils/LLM/LLMService.ts +78 -0
- package/Server/Utils/LogRedaction.ts +8 -0
- package/Server/Utils/Logger.ts +79 -1
- package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
- package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
- package/Server/Utils/OutboundUserAgent.ts +152 -0
- package/Server/Utils/StartServer.ts +51 -19
- package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
- package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
- package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
- package/Server/Utils/Telemetry.ts +198 -51
- package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
- package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
- package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
- package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
- package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
- package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
- package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
- package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
- package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
- package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
- package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
- package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
- package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
- package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
- package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
- package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
- package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
- package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
- package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
- package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
- package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
- package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
- package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
- package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
- package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
- package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
- package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
- package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
- package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
- package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
- package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
- package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
- package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
- package/Tests/Server/Utils/Captcha.test.ts +422 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
- package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
- package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
- package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
- package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
- package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
- package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
- package/Tests/Server/Utils/Telemetry.test.ts +456 -66
- package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
- package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
- package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
- package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
- package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
- package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
- package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
- package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
- package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
- package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
- package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
- package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
- package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
- package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
- package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
- package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
- package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
- package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
- package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
- package/Types/AI/ExceptionAIClassification.ts +10 -24
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
- package/Types/Exception/ApiException.ts +10 -0
- package/Types/Exception/BadDataException.ts +11 -0
- package/Types/Exception/BadRequestException.ts +11 -0
- package/Types/Exception/Exception.ts +65 -0
- package/Types/Exception/ForbiddenException.ts +10 -0
- package/Types/Exception/NotAuthenticatedException.ts +10 -0
- package/Types/Exception/NotAuthorizedException.ts +10 -0
- package/Types/Exception/NotFoundException.ts +11 -0
- package/Types/Exception/PayloadTooLargeException.ts +11 -0
- package/Types/Exception/PaymentRequiredException.ts +10 -0
- package/Types/Exception/ServiceUnavailableException.ts +10 -0
- package/Types/Exception/SsoAuthorizationException.ts +10 -0
- package/Types/Exception/TenantNotFoundException.ts +11 -0
- package/Types/Exception/TimeoutException.ts +10 -0
- package/Types/Exception/TooManyRequestsException.ts +10 -0
- package/Types/Exception/UnableToReachServer.ts +10 -0
- package/Types/Exception/WebsiteRequestException.ts +10 -0
- package/Types/Monitor/CriteriaFilter.ts +60 -2
- package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
- package/Types/Monitor/MonitorMetricType.ts +71 -0
- package/Types/Monitor/MonitorStep.ts +76 -0
- package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
- package/Types/Monitor/MonitorType.ts +47 -1
- package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
- package/Types/Monitor/SqlConnectionConfig.ts +31 -0
- package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
- package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
- package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
- package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
- package/Types/Permission.ts +90 -0
- package/Types/Probe/ProbeMonitorResponse.ts +16 -0
- package/Types/Telemetry/ErrorClass.ts +274 -0
- package/Types/Telemetry/UnitOfWork.ts +59 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
- package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
- package/UI/Components/Modal/Modal.tsx +2 -8
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
- package/UI/Components/SideMenu/SideMenu.tsx +123 -5
- package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
- package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
- package/UI/Components/SideOver/SideOver.tsx +21 -20
- package/UI/Utils/PageScrollLock.ts +79 -3
- package/UI/Utils/PermissionGate.ts +61 -0
- package/UI/Utils/SensitiveUrlToken.ts +112 -0
- package/UI/Utils/TestLLMProvider.ts +11 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
- package/Utils/Monitor/MonitorMetricType.ts +153 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
- package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
- package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
- package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
- package/build/dist/Models/AnalyticsModels/Span.js +14 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +10 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/LlmProviderAPI.js +108 -13
- package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +12 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIBillingService.js +70 -16
- package/build/dist/Server/Services/AIBillingService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +10 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +119 -21
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
- package/build/dist/Server/Services/NotificationService.js +80 -17
- package/build/dist/Server/Services/NotificationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +66 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +90 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
- package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +8 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +63 -1
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +38 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +162 -46
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
- package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
- package/build/dist/Types/Exception/ApiException.js +9 -0
- package/build/dist/Types/Exception/ApiException.js.map +1 -1
- package/build/dist/Types/Exception/BadDataException.js +10 -0
- package/build/dist/Types/Exception/BadDataException.js.map +1 -1
- package/build/dist/Types/Exception/BadRequestException.js +10 -0
- package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
- package/build/dist/Types/Exception/Exception.js +56 -0
- package/build/dist/Types/Exception/Exception.js.map +1 -1
- package/build/dist/Types/Exception/ForbiddenException.js +9 -0
- package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
- package/build/dist/Types/Exception/NotFoundException.js +10 -0
- package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
- package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
- package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
- package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
- package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
- package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
- package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/TimeoutException.js +9 -0
- package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
- package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
- package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
- package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
- package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
- package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +54 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +45 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
- package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
- package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +80 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
- package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -7
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +31 -3
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +42 -1
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
- package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
- package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import CriteriaFilterUtil from "../../../../App/FeatureSet/Dashboard/src/Utils/Form/Monitor/CriteriaFilter";
|
|
2
|
+
import { CheckOn, FilterType } from "../../../Types/Monitor/CriteriaFilter";
|
|
3
|
+
import MonitorType from "../../../Types/Monitor/MonitorType";
|
|
4
|
+
import { DropdownOption } from "../../../UI/Components/Dropdown/Dropdown";
|
|
5
|
+
import SnmpMonitorCriteria from "../../../Server/Utils/Monitor/Criteria/SnmpMonitorCriteria";
|
|
6
|
+
import { describe, expect, test } from "@jest/globals";
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* WHY THIS FILE EXISTS
|
|
10
|
+
*
|
|
11
|
+
* The criteria a Network Device monitor can be built from are decided in two
|
|
12
|
+
* places that have no compile-time link to each other: the CheckOn enum plus
|
|
13
|
+
* the server evaluator (SnmpMonitorCriteria), and this dashboard catalog,
|
|
14
|
+
* which filters the enum down to what the form offers per monitor type.
|
|
15
|
+
*
|
|
16
|
+
* Adding a CheckOn to the enum and teaching the evaluator to answer it does
|
|
17
|
+
* NOT make it selectable — the catalog filters it out by omission, silently,
|
|
18
|
+
* with no type error and no failing test. That is exactly how
|
|
19
|
+
* CheckOn.SnmpWalkIsSucceeding shipped server-side while remaining invisible
|
|
20
|
+
* in the form: the alert-pack template could use it, but nobody could pick it
|
|
21
|
+
* by hand.
|
|
22
|
+
*
|
|
23
|
+
* So this file holds the catalog to the evaluator: every SNMP check the
|
|
24
|
+
* server can answer is offered, each with filter types it can actually be
|
|
25
|
+
* compared with, and nothing is offered that the server would ignore.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
function values(options: Array<DropdownOption>): Array<string> {
|
|
29
|
+
return options.map((option: DropdownOption): string => {
|
|
30
|
+
return option.value.toString();
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const NETWORK_DEVICE_CHECK_ONS: Array<string> = values(
|
|
35
|
+
CriteriaFilterUtil.getCheckOnOptionsByMonitorType(MonitorType.NetworkDevice),
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
describe("what a Network Device monitor can be built from", () => {
|
|
39
|
+
/*
|
|
40
|
+
* Written as an exact list rather than a "contains" so that a CheckOn added
|
|
41
|
+
* to the enum for another monitor type cannot leak into this form, and so
|
|
42
|
+
* that removing one is a deliberate edit here.
|
|
43
|
+
*/
|
|
44
|
+
test("offers exactly the SNMP checks, and only those", () => {
|
|
45
|
+
expect(NETWORK_DEVICE_CHECK_ONS).toEqual([
|
|
46
|
+
CheckOn.SnmpOidValue,
|
|
47
|
+
CheckOn.SnmpOidExists,
|
|
48
|
+
CheckOn.SnmpResponseTime,
|
|
49
|
+
CheckOn.SnmpIsOnline,
|
|
50
|
+
CheckOn.SnmpWalkIsSucceeding,
|
|
51
|
+
CheckOn.SnmpInterfaceIsDown,
|
|
52
|
+
CheckOn.SnmpTrapReceived,
|
|
53
|
+
CheckOn.SnmpInterfaceUtilizationPercent,
|
|
54
|
+
CheckOn.SnmpInterfaceErrorsPerSecond,
|
|
55
|
+
]);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* THE ASSERTION THIS FILE EXISTS FOR.
|
|
60
|
+
*
|
|
61
|
+
* Reachability and the walk are different questions now. A device is
|
|
62
|
+
* online when it answers ping OR its walk succeeds, so a switch whose SNMP
|
|
63
|
+
* agent has died — wrong community after a config push, an ACL change, the
|
|
64
|
+
* agent simply stopped — keeps answering ping and stays Online, while
|
|
65
|
+
* interfaces, topology and inventory quietly stop arriving. "SNMP Walk Is
|
|
66
|
+
* Succeeding" is the only criterion that catches that, and a catalog that
|
|
67
|
+
* omitted it would leave the failure unalertable by hand.
|
|
68
|
+
*/
|
|
69
|
+
test("the walk can be alerted on separately from reachability", () => {
|
|
70
|
+
expect(NETWORK_DEVICE_CHECK_ONS).toContain(CheckOn.SnmpWalkIsSucceeding);
|
|
71
|
+
expect(NETWORK_DEVICE_CHECK_ONS).toContain(CheckOn.SnmpIsOnline);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
/*
|
|
75
|
+
* Both are yes/no questions, so a threshold comparison would be
|
|
76
|
+
* meaningless; offering "Greater Than" on "Is Online" is how a criterion
|
|
77
|
+
* gets built that can never be true.
|
|
78
|
+
*/
|
|
79
|
+
test.each([CheckOn.SnmpWalkIsSucceeding, CheckOn.SnmpIsOnline])(
|
|
80
|
+
"%s is compared as true or false and nothing else",
|
|
81
|
+
(checkOn: CheckOn) => {
|
|
82
|
+
expect(
|
|
83
|
+
values(CriteriaFilterUtil.getFilterTypeOptionsByCheckOn(checkOn)),
|
|
84
|
+
).toEqual([FilterType.True, FilterType.False]);
|
|
85
|
+
},
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
/*
|
|
89
|
+
* The other direction: an SNMP check must not appear on a monitor type
|
|
90
|
+
* whose probe never walks anything, or the form would offer a criterion
|
|
91
|
+
* that is never evaluated and so never breaches.
|
|
92
|
+
*/
|
|
93
|
+
test.each([MonitorType.Website, MonitorType.Ping, MonitorType.Port])(
|
|
94
|
+
"%s is not offered the SNMP walk check",
|
|
95
|
+
(monitorType: MonitorType) => {
|
|
96
|
+
expect(
|
|
97
|
+
values(CriteriaFilterUtil.getCheckOnOptionsByMonitorType(monitorType)),
|
|
98
|
+
).not.toContain(CheckOn.SnmpWalkIsSucceeding);
|
|
99
|
+
},
|
|
100
|
+
);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
describe("the catalog agrees with the server evaluator", () => {
|
|
104
|
+
/*
|
|
105
|
+
* The link the type system does not give us. Every walk-dependent check
|
|
106
|
+
* the evaluator knows about — the ones it returns null for when a poll ran
|
|
107
|
+
* no walk — has to be selectable, or the server can answer a question the
|
|
108
|
+
* form cannot ask.
|
|
109
|
+
*
|
|
110
|
+
* isWalkDependentCheckOn is private on the evaluator because nothing in
|
|
111
|
+
* production needs it; it is reached here through the class object so that
|
|
112
|
+
* this test breaks when the evaluator's list grows, which is precisely the
|
|
113
|
+
* moment the catalog needs updating.
|
|
114
|
+
*/
|
|
115
|
+
test("every walk-dependent check the evaluator knows is offered in the form", () => {
|
|
116
|
+
type IsWalkDependentFunction = (checkOn: CheckOn) => boolean;
|
|
117
|
+
|
|
118
|
+
const isWalkDependent: IsWalkDependentFunction = (
|
|
119
|
+
SnmpMonitorCriteria as unknown as {
|
|
120
|
+
isWalkDependentCheckOn: IsWalkDependentFunction;
|
|
121
|
+
}
|
|
122
|
+
).isWalkDependentCheckOn;
|
|
123
|
+
|
|
124
|
+
expect(typeof isWalkDependent).toBe("function");
|
|
125
|
+
|
|
126
|
+
const walkDependent: Array<CheckOn> = Object.values(CheckOn).filter(
|
|
127
|
+
(checkOn: CheckOn): boolean => {
|
|
128
|
+
return isWalkDependent(checkOn);
|
|
129
|
+
},
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
// A guard against the reflection above silently matching nothing.
|
|
133
|
+
expect(walkDependent.length).toBeGreaterThan(3);
|
|
134
|
+
|
|
135
|
+
for (const checkOn of walkDependent) {
|
|
136
|
+
expect({ checkOn: checkOn, offered: true }).toEqual({
|
|
137
|
+
checkOn: checkOn,
|
|
138
|
+
offered: NETWORK_DEVICE_CHECK_ONS.includes(checkOn),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
/*
|
|
144
|
+
* ...and reachability is NOT walk-dependent, which is the whole point of
|
|
145
|
+
* separating the two. If it ever became walk-dependent, a ping-only device
|
|
146
|
+
* would stop being evaluated for reachability at all and would sit at its
|
|
147
|
+
* last verdict forever.
|
|
148
|
+
*/
|
|
149
|
+
test("reachability is not walk-dependent", () => {
|
|
150
|
+
type IsWalkDependentFunction = (checkOn: CheckOn) => boolean;
|
|
151
|
+
|
|
152
|
+
const isWalkDependent: IsWalkDependentFunction = (
|
|
153
|
+
SnmpMonitorCriteria as unknown as {
|
|
154
|
+
isWalkDependentCheckOn: IsWalkDependentFunction;
|
|
155
|
+
}
|
|
156
|
+
).isWalkDependentCheckOn;
|
|
157
|
+
|
|
158
|
+
expect(isWalkDependent(CheckOn.SnmpIsOnline)).toBe(false);
|
|
159
|
+
expect(isWalkDependent(CheckOn.SnmpWalkIsSucceeding)).toBe(true);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import { cleanup, render, waitFor } from "@testing-library/react";
|
|
3
|
+
import React, { ReactElement } from "react";
|
|
4
|
+
import { MemoryRouter } from "react-router-dom";
|
|
5
|
+
import {
|
|
6
|
+
afterEach,
|
|
7
|
+
beforeEach,
|
|
8
|
+
describe,
|
|
9
|
+
expect,
|
|
10
|
+
jest,
|
|
11
|
+
test,
|
|
12
|
+
} from "@jest/globals";
|
|
13
|
+
import NetworkDeviceMonitoringMethod from "../../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
|
|
14
|
+
import NetworkSnmpCredentialProfile from "../../../Models/DatabaseModels/NetworkSnmpCredentialProfile";
|
|
15
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
16
|
+
import FormFieldSchemaType from "../../../UI/Components/Forms/Types/FormFieldSchemaType";
|
|
17
|
+
import {
|
|
18
|
+
DropdownOption,
|
|
19
|
+
DropdownValue,
|
|
20
|
+
} from "../../../UI/Components/Dropdown/Dropdown";
|
|
21
|
+
|
|
22
|
+
/*
|
|
23
|
+
* The device Settings page under ping-first polling.
|
|
24
|
+
*
|
|
25
|
+
* A probe-polled device is pinged whether or not it has SNMP credentials, so
|
|
26
|
+
* this page is where three things now have to be true and stay true:
|
|
27
|
+
*
|
|
28
|
+
* - the monitoring method is offered as "Probe" (the normal choice) versus
|
|
29
|
+
* "Bound monitor" (the override), in those words, because the create
|
|
30
|
+
* form no longer asks and this is the only place the choice is made;
|
|
31
|
+
* - the SNMP step is shown for a probe-polled device (credentials are
|
|
32
|
+
* optional on it), offers a credential profile, and has a "Ping only"
|
|
33
|
+
* affordance that blanks the device's own credentials on the way to a
|
|
34
|
+
* save — a v3 device cannot otherwise be made ping-only without knowing
|
|
35
|
+
* that the username is what the probe keys on;
|
|
36
|
+
* - the polling card (probe, interval, toggle) is editable for a
|
|
37
|
+
* probe-polled device and NOT for a bound-monitor override, which
|
|
38
|
+
* nothing polls.
|
|
39
|
+
*
|
|
40
|
+
* CardModelDetail is replaced by a prop recorder keyed on the card's name —
|
|
41
|
+
* the point is what the page hands each card, not re-testing the card.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
jest.mock("react-i18next", () => {
|
|
45
|
+
return {
|
|
46
|
+
useTranslation: () => {
|
|
47
|
+
return {
|
|
48
|
+
t: (key: string): string => {
|
|
49
|
+
return key;
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
jest.mock("../../../UI/Utils/Permission", () => {
|
|
57
|
+
return {
|
|
58
|
+
__esModule: true,
|
|
59
|
+
default: {
|
|
60
|
+
getAllPermissions: () => {
|
|
61
|
+
return [];
|
|
62
|
+
},
|
|
63
|
+
getProjectPermissions: () => {
|
|
64
|
+
return [];
|
|
65
|
+
},
|
|
66
|
+
getGlobalPermissions: () => {
|
|
67
|
+
return [];
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
jest.mock("../../../UI/Utils/User", () => {
|
|
74
|
+
return {
|
|
75
|
+
__esModule: true,
|
|
76
|
+
default: {
|
|
77
|
+
isMasterAdmin: () => {
|
|
78
|
+
return false;
|
|
79
|
+
},
|
|
80
|
+
getUserId: () => {
|
|
81
|
+
return null;
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const DEVICE_ID: ObjectID = new ObjectID(
|
|
88
|
+
"22222222-0000-4000-8000-000000000001",
|
|
89
|
+
);
|
|
90
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
91
|
+
"11111111-0000-4000-8000-000000000001",
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
jest.mock("../../../UI/Utils/Navigation", () => {
|
|
95
|
+
return {
|
|
96
|
+
__esModule: true,
|
|
97
|
+
default: {
|
|
98
|
+
getLastParamAsObjectID: () => {
|
|
99
|
+
return DEVICE_ID;
|
|
100
|
+
},
|
|
101
|
+
navigate: () => {
|
|
102
|
+
// no-op
|
|
103
|
+
},
|
|
104
|
+
getQueryStringByName: () => {
|
|
105
|
+
return null;
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
jest.mock("../../../UI/Utils/Project", () => {
|
|
112
|
+
return {
|
|
113
|
+
__esModule: true,
|
|
114
|
+
default: {
|
|
115
|
+
getCurrentProjectId: () => {
|
|
116
|
+
return PROJECT_ID;
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
/* What the page's device read returns: flipped per test. */
|
|
123
|
+
let deviceMonitoringMethod: string | undefined = undefined;
|
|
124
|
+
|
|
125
|
+
jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
|
|
126
|
+
return {
|
|
127
|
+
__esModule: true,
|
|
128
|
+
default: {
|
|
129
|
+
getItem: () => {
|
|
130
|
+
return Promise.resolve({ monitoringMethod: deviceMonitoringMethod });
|
|
131
|
+
},
|
|
132
|
+
getList: () => {
|
|
133
|
+
return Promise.resolve({ data: [], count: 0 });
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
jest.mock("../../../../App/FeatureSet/Dashboard/src/Utils/Probe", () => {
|
|
140
|
+
return {
|
|
141
|
+
__esModule: true,
|
|
142
|
+
default: {
|
|
143
|
+
getAllProbes: async () => {
|
|
144
|
+
return [{ _id: "probe-1", name: "Branch probe" }];
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
jest.mock(
|
|
151
|
+
"../../../../App/FeatureSet/Dashboard/src/Components/TelemetryResource/ArchiveResourceCard",
|
|
152
|
+
() => {
|
|
153
|
+
return {
|
|
154
|
+
__esModule: true,
|
|
155
|
+
default: () => {
|
|
156
|
+
return null;
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
},
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
type FormValuesLike = Record<string, unknown>;
|
|
163
|
+
|
|
164
|
+
type CapturedFormField = {
|
|
165
|
+
field?: Record<string, unknown> | undefined;
|
|
166
|
+
overrideField?: Record<string, unknown> | undefined;
|
|
167
|
+
overrideFieldKey?: string | undefined;
|
|
168
|
+
title?: string | undefined;
|
|
169
|
+
stepId?: string | undefined;
|
|
170
|
+
description?: string | undefined;
|
|
171
|
+
fieldType?: FormFieldSchemaType | undefined;
|
|
172
|
+
required?: boolean | ((values: FormValuesLike) => boolean) | undefined;
|
|
173
|
+
showIf?: ((values: FormValuesLike) => boolean) | undefined;
|
|
174
|
+
dropdownOptions?: Array<{ label: string; value: string }> | undefined;
|
|
175
|
+
dropdownModal?: { type: unknown } | undefined;
|
|
176
|
+
onChange?:
|
|
177
|
+
| ((
|
|
178
|
+
value: unknown,
|
|
179
|
+
currentFormValues: FormValuesLike,
|
|
180
|
+
setNewFormValues: (values: FormValuesLike) => void,
|
|
181
|
+
) => void)
|
|
182
|
+
| undefined;
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
type CapturedFormStep = {
|
|
186
|
+
id: string;
|
|
187
|
+
title: string;
|
|
188
|
+
showIf?: ((values: FormValuesLike) => boolean) | undefined;
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
type CapturedCardProps = {
|
|
192
|
+
name: string;
|
|
193
|
+
isEditable?: boolean | undefined;
|
|
194
|
+
cardProps?: { description?: string | undefined } | undefined;
|
|
195
|
+
formSteps?: Array<CapturedFormStep> | undefined;
|
|
196
|
+
formFields?: Array<CapturedFormField> | undefined;
|
|
197
|
+
onSaveSuccess?: ((item: unknown) => void) | undefined;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
const capturedCards: Map<string, CapturedCardProps> = new Map();
|
|
201
|
+
|
|
202
|
+
jest.mock("../../../UI/Components/ModelDetail/CardModelDetail", () => {
|
|
203
|
+
return {
|
|
204
|
+
__esModule: true,
|
|
205
|
+
default: (props: CapturedCardProps) => {
|
|
206
|
+
capturedCards.set(props.name, props);
|
|
207
|
+
return null;
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
import NetworkDeviceSettingsPage, {
|
|
213
|
+
PING_ONLY_FIELD_KEY,
|
|
214
|
+
} from "../../../../App/FeatureSet/Dashboard/src/Pages/NetworkDevice/View/Settings";
|
|
215
|
+
import PageComponentProps from "../../../../App/FeatureSet/Dashboard/src/Pages/PageComponentProps";
|
|
216
|
+
import Route from "../../../Types/API/Route";
|
|
217
|
+
|
|
218
|
+
const PAGE_PROPS: PageComponentProps = {
|
|
219
|
+
pageRoute: new Route("/dashboard/network-devices/view/settings"),
|
|
220
|
+
currentProject: null,
|
|
221
|
+
hasPaymentMethod: true,
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
async function renderPage(): Promise<Map<string, CapturedCardProps>> {
|
|
225
|
+
const Page: (props: PageComponentProps) => ReactElement =
|
|
226
|
+
NetworkDeviceSettingsPage as unknown as (
|
|
227
|
+
props: PageComponentProps,
|
|
228
|
+
) => ReactElement;
|
|
229
|
+
|
|
230
|
+
render(
|
|
231
|
+
<MemoryRouter>
|
|
232
|
+
<Page {...PAGE_PROPS} />
|
|
233
|
+
</MemoryRouter>,
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
await waitFor(() => {
|
|
237
|
+
expect(capturedCards.has("Device Settings")).toBe(true);
|
|
238
|
+
expect(capturedCards.has("Polling & Data Collection")).toBe(true);
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
return capturedCards;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function fieldFor(card: CapturedCardProps, key: string): CapturedFormField {
|
|
245
|
+
const match: CapturedFormField | undefined = (card.formFields || []).find(
|
|
246
|
+
(field: CapturedFormField): boolean => {
|
|
247
|
+
return (
|
|
248
|
+
Object.keys(field.field || {})[0] === key ||
|
|
249
|
+
field.overrideFieldKey === key
|
|
250
|
+
);
|
|
251
|
+
},
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
expect({ key: key, found: Boolean(match) }).toEqual({
|
|
255
|
+
key: key,
|
|
256
|
+
found: true,
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
return match!;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function isShown(field: CapturedFormField, values: FormValuesLike): boolean {
|
|
263
|
+
return field.showIf ? field.showIf(values) : true;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const PROBE_VALUES: FormValuesLike = {
|
|
267
|
+
monitoringMethod: NetworkDeviceMonitoringMethod.Probe,
|
|
268
|
+
};
|
|
269
|
+
const LEGACY_SNMP_VALUES: FormValuesLike = { monitoringMethod: "SNMP" };
|
|
270
|
+
const MONITOR_VALUES: FormValuesLike = {
|
|
271
|
+
monitoringMethod: NetworkDeviceMonitoringMethod.Monitor,
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
describe("the device Settings page", () => {
|
|
275
|
+
beforeEach(() => {
|
|
276
|
+
capturedCards.clear();
|
|
277
|
+
deviceMonitoringMethod = NetworkDeviceMonitoringMethod.Probe;
|
|
278
|
+
window.localStorage.clear();
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
afterEach(() => {
|
|
282
|
+
cleanup();
|
|
283
|
+
jest.clearAllMocks();
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
describe("the monitoring method", () => {
|
|
287
|
+
test("is offered as Probe (normal) versus Bound monitor (override), in those words", async () => {
|
|
288
|
+
const cards: Map<string, CapturedCardProps> = await renderPage();
|
|
289
|
+
const method: CapturedFormField = fieldFor(
|
|
290
|
+
cards.get("Device Settings")!,
|
|
291
|
+
"monitoringMethod",
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
const labels: Array<string> = (method.dropdownOptions || []).map(
|
|
295
|
+
(option: { label: string }): string => {
|
|
296
|
+
return option.label;
|
|
297
|
+
},
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
expect(
|
|
301
|
+
method.dropdownOptions?.map((option: DropdownOption): DropdownValue => {
|
|
302
|
+
return option.value;
|
|
303
|
+
}),
|
|
304
|
+
).toEqual([
|
|
305
|
+
NetworkDeviceMonitoringMethod.Probe,
|
|
306
|
+
NetworkDeviceMonitoringMethod.Monitor,
|
|
307
|
+
]);
|
|
308
|
+
expect(labels[0]).toMatch(/^Probe — /);
|
|
309
|
+
expect(labels[0]).toContain("pinged");
|
|
310
|
+
expect(labels[1]).toMatch(/^Bound monitor — /);
|
|
311
|
+
expect(labels[1]).toContain("override");
|
|
312
|
+
expect(method.description).toContain("Probe is the normal choice");
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
test("the bound-monitor field is shown only for the override", async () => {
|
|
316
|
+
const cards: Map<string, CapturedCardProps> = await renderPage();
|
|
317
|
+
const monitor: CapturedFormField = fieldFor(
|
|
318
|
+
cards.get("Device Settings")!,
|
|
319
|
+
"monitor",
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
expect(isShown(monitor, MONITOR_VALUES)).toBe(true);
|
|
323
|
+
expect(isShown(monitor, PROBE_VALUES)).toBe(false);
|
|
324
|
+
expect(isShown(monitor, LEGACY_SNMP_VALUES)).toBe(false);
|
|
325
|
+
expect(monitor.required).toBe(false);
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
describe("the SNMP step", () => {
|
|
330
|
+
test("is shown for a probe-polled device (including legacy SNMP rows) and hidden for a bound-monitor override", async () => {
|
|
331
|
+
const cards: Map<string, CapturedCardProps> = await renderPage();
|
|
332
|
+
const snmpStep: CapturedFormStep | undefined = cards
|
|
333
|
+
.get("Device Settings")!
|
|
334
|
+
.formSteps?.find((step: CapturedFormStep): boolean => {
|
|
335
|
+
return step.id === "snmp";
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
expect(snmpStep).toBeDefined();
|
|
339
|
+
expect(snmpStep!.showIf!(PROBE_VALUES)).toBe(true);
|
|
340
|
+
expect(snmpStep!.showIf!(LEGACY_SNMP_VALUES)).toBe(true);
|
|
341
|
+
expect(snmpStep!.showIf!({})).toBe(true);
|
|
342
|
+
expect(snmpStep!.showIf!(MONITOR_VALUES)).toBe(false);
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
test("offers a credential profile bound to the profile model, optional, and says the device's own credentials win", async () => {
|
|
346
|
+
const cards: Map<string, CapturedCardProps> = await renderPage();
|
|
347
|
+
const profile: CapturedFormField = fieldFor(
|
|
348
|
+
cards.get("Device Settings")!,
|
|
349
|
+
"snmpCredentialProfile",
|
|
350
|
+
);
|
|
351
|
+
|
|
352
|
+
expect(profile.stepId).toBe("snmp");
|
|
353
|
+
expect(profile.required).toBe(false);
|
|
354
|
+
expect(profile.dropdownModal?.type).toBe(NetworkSnmpCredentialProfile);
|
|
355
|
+
expect(profile.description).toContain("own credentials below win");
|
|
356
|
+
expect(profile.description).toContain("site can carry a default");
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
test("the Ping only box blanks the device's own credentials when ticked", async () => {
|
|
360
|
+
const cards: Map<string, CapturedCardProps> = await renderPage();
|
|
361
|
+
const pingOnly: CapturedFormField = fieldFor(
|
|
362
|
+
cards.get("Device Settings")!,
|
|
363
|
+
PING_ONLY_FIELD_KEY,
|
|
364
|
+
);
|
|
365
|
+
|
|
366
|
+
expect(pingOnly.fieldType).toBe(FormFieldSchemaType.Checkbox);
|
|
367
|
+
expect(pingOnly.stepId).toBe("snmp");
|
|
368
|
+
expect(pingOnly.field).toBeUndefined();
|
|
369
|
+
expect(pingOnly.overrideField).toEqual({ [PING_ONLY_FIELD_KEY]: true });
|
|
370
|
+
|
|
371
|
+
let next: FormValuesLike | null = null;
|
|
372
|
+
pingOnly.onChange!(
|
|
373
|
+
true,
|
|
374
|
+
{
|
|
375
|
+
...PROBE_VALUES,
|
|
376
|
+
snmpVersion: "V3",
|
|
377
|
+
snmpV3Username: "netops",
|
|
378
|
+
snmpV3AuthKey: "secret",
|
|
379
|
+
snmpV3PrivKey: "secret2",
|
|
380
|
+
snmpCommunityString: "public",
|
|
381
|
+
},
|
|
382
|
+
(values: FormValuesLike): void => {
|
|
383
|
+
next = values;
|
|
384
|
+
},
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
expect(next).not.toBeNull();
|
|
388
|
+
expect(next!["snmpCommunityString"]).toBe("");
|
|
389
|
+
expect(next!["snmpV3Username"]).toBe("");
|
|
390
|
+
expect(next!["snmpV3AuthKey"]).toBe("");
|
|
391
|
+
expect(next!["snmpV3PrivKey"]).toBe("");
|
|
392
|
+
// Everything else is left alone — the version in particular.
|
|
393
|
+
expect(next!["snmpVersion"]).toBe("V3");
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
test("the Ping only box does nothing when unticked", async () => {
|
|
397
|
+
const cards: Map<string, CapturedCardProps> = await renderPage();
|
|
398
|
+
const pingOnly: CapturedFormField = fieldFor(
|
|
399
|
+
cards.get("Device Settings")!,
|
|
400
|
+
PING_ONLY_FIELD_KEY,
|
|
401
|
+
);
|
|
402
|
+
|
|
403
|
+
let calls: number = 0;
|
|
404
|
+
pingOnly.onChange!(
|
|
405
|
+
false,
|
|
406
|
+
{ ...PROBE_VALUES, snmpCommunityString: "public" },
|
|
407
|
+
(): void => {
|
|
408
|
+
calls++;
|
|
409
|
+
},
|
|
410
|
+
);
|
|
411
|
+
|
|
412
|
+
expect(calls).toBe(0);
|
|
413
|
+
});
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
describe("the polling card", () => {
|
|
417
|
+
test("is editable for a probe-polled device", async () => {
|
|
418
|
+
deviceMonitoringMethod = NetworkDeviceMonitoringMethod.Probe;
|
|
419
|
+
|
|
420
|
+
const cards: Map<string, CapturedCardProps> = await renderPage();
|
|
421
|
+
const polling: CapturedCardProps = cards.get(
|
|
422
|
+
"Polling & Data Collection",
|
|
423
|
+
)!;
|
|
424
|
+
|
|
425
|
+
expect(polling.isEditable).toBe(true);
|
|
426
|
+
expect(polling.cardProps?.description).toContain("pings this device");
|
|
427
|
+
expect(fieldFor(polling, "probe").required).toBe(true);
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
test("is read-only, and says why, for a bound-monitor override", async () => {
|
|
431
|
+
deviceMonitoringMethod = NetworkDeviceMonitoringMethod.Monitor;
|
|
432
|
+
|
|
433
|
+
const cards: Map<string, CapturedCardProps> = await renderPage();
|
|
434
|
+
|
|
435
|
+
await waitFor(() => {
|
|
436
|
+
expect(cards.get("Polling & Data Collection")!.isEditable).toBe(false);
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
expect(
|
|
440
|
+
cards.get("Polling & Data Collection")!.cardProps?.description,
|
|
441
|
+
).toContain("nothing polls it");
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
test("a legacy SNMP row is treated as probe-polled", async () => {
|
|
445
|
+
deviceMonitoringMethod = "SNMP";
|
|
446
|
+
|
|
447
|
+
const cards: Map<string, CapturedCardProps> = await renderPage();
|
|
448
|
+
|
|
449
|
+
expect(cards.get("Polling & Data Collection")!.isEditable).toBe(true);
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
test("the Device Settings card re-reads the method after a save", async () => {
|
|
453
|
+
const cards: Map<string, CapturedCardProps> = await renderPage();
|
|
454
|
+
|
|
455
|
+
expect(cards.get("Device Settings")!.onSaveSuccess).toBeDefined();
|
|
456
|
+
});
|
|
457
|
+
});
|
|
458
|
+
});
|
|
@@ -209,6 +209,33 @@ const EXPECTED_SECTIONS: Array<ExpectedMenuSection> = [
|
|
|
209
209
|
"OID Collection Templates",
|
|
210
210
|
],
|
|
211
211
|
},
|
|
212
|
+
/*
|
|
213
|
+
* The named credential sets a device is walked WITH, beside the OID
|
|
214
|
+
* templates that say what it COLLECTS. Settings rather than Rules:
|
|
215
|
+
* nothing here runs on its own, it is a definition a device points at.
|
|
216
|
+
*/
|
|
217
|
+
{
|
|
218
|
+
title: "SNMP Credentials",
|
|
219
|
+
pageMapKey: PageMap.NETWORK_DEVICE_SETTINGS_SNMP_CREDENTIAL_PROFILES,
|
|
220
|
+
getBreadcrumbs: getNetworkDeviceBreadcrumbs,
|
|
221
|
+
breadcrumbTitles: [
|
|
222
|
+
"Project",
|
|
223
|
+
"Network",
|
|
224
|
+
"Settings",
|
|
225
|
+
"SNMP Credentials",
|
|
226
|
+
],
|
|
227
|
+
},
|
|
228
|
+
/*
|
|
229
|
+
* Alert policies are a definition too ("alert on devices like these"),
|
|
230
|
+
* which is why they sit here and not under Rules: the engine that
|
|
231
|
+
* provisions the monitors is what runs, and it has no page of its own.
|
|
232
|
+
*/
|
|
233
|
+
{
|
|
234
|
+
title: "Alert Policies",
|
|
235
|
+
pageMapKey: PageMap.NETWORK_DEVICE_SETTINGS_ALERT_POLICIES,
|
|
236
|
+
getBreadcrumbs: getNetworkDeviceBreadcrumbs,
|
|
237
|
+
breadcrumbTitles: ["Project", "Network", "Settings", "Alert Policies"],
|
|
238
|
+
},
|
|
212
239
|
{
|
|
213
240
|
title: "Site Types",
|
|
214
241
|
pageMapKey: PageMap.NETWORK_SITE_SETTINGS_SITE_TYPES,
|
|
@@ -260,7 +287,16 @@ function expectActiveLink(title: string): void {
|
|
|
260
287
|
|
|
261
288
|
expect(anchor).toHaveClass("text-indigo-700");
|
|
262
289
|
expect(anchor).not.toHaveClass("text-gray-600");
|
|
263
|
-
|
|
290
|
+
/*
|
|
291
|
+
* The rail beside an active row. Matched on its colour and its non-zero
|
|
292
|
+
* height rather than on an exact height class: the point of the assertion is
|
|
293
|
+
* that the rail is drawn at all, and pinning "h-5" made a restyle of the
|
|
294
|
+
* shared menu fail here rather than in the side-menu suite that owns it.
|
|
295
|
+
*/
|
|
296
|
+
const rail: Element | null = anchor.querySelector(".bg-indigo-600");
|
|
297
|
+
|
|
298
|
+
expect(rail).not.toBeNull();
|
|
299
|
+
expect(rail?.className).not.toContain("h-0");
|
|
264
300
|
}
|
|
265
301
|
|
|
266
302
|
function expectCompleteMenu(): void {
|
|
@@ -341,7 +377,7 @@ describe("Network side menu", () => {
|
|
|
341
377
|
await renderNetworkMenu();
|
|
342
378
|
|
|
343
379
|
expect(isExpanded("Settings")).toBe(false);
|
|
344
|
-
expect(linksIn("Settings")).toHaveLength(
|
|
380
|
+
expect(linksIn("Settings")).toHaveLength(5);
|
|
345
381
|
|
|
346
382
|
fireEvent.click(sectionToggle("Settings"));
|
|
347
383
|
expect(isExpanded("Settings")).toBe(true);
|
|
@@ -353,11 +389,11 @@ describe("Network side menu", () => {
|
|
|
353
389
|
});
|
|
354
390
|
|
|
355
391
|
describe("coverage", () => {
|
|
356
|
-
test("keeps all
|
|
392
|
+
test("keeps all twenty-one destinations reachable exactly once", async () => {
|
|
357
393
|
await renderNetworkMenu();
|
|
358
394
|
|
|
359
|
-
expect(EXPECTED_ENTRIES).toHaveLength(
|
|
360
|
-
expect(allLinks()).toHaveLength(
|
|
395
|
+
expect(EXPECTED_ENTRIES).toHaveLength(21);
|
|
396
|
+
expect(allLinks()).toHaveLength(21);
|
|
361
397
|
expect(hrefsInMenu().sort()).toEqual(
|
|
362
398
|
EXPECTED_ENTRIES.map(expectedHref).sort(),
|
|
363
399
|
);
|