@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,501 @@
|
|
|
1
|
+
import { Service as NetworkDeviceServiceType } from "../../../Server/Services/NetworkDeviceService";
|
|
2
|
+
import NetworkSnmpCredentialProfileService from "../../../Server/Services/NetworkSnmpCredentialProfileService";
|
|
3
|
+
import ProbeService from "../../../Server/Services/ProbeService";
|
|
4
|
+
import CreateBy from "../../../Server/Types/Database/CreateBy";
|
|
5
|
+
import UpdateBy from "../../../Server/Types/Database/UpdateBy";
|
|
6
|
+
import { OnCreate, OnUpdate } from "../../../Server/Types/Database/Hooks";
|
|
7
|
+
import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
|
|
8
|
+
import NetworkSnmpCredentialProfile from "../../../Models/DatabaseModels/NetworkSnmpCredentialProfile";
|
|
9
|
+
import Probe from "../../../Models/DatabaseModels/Probe";
|
|
10
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
11
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
12
|
+
import { EntityManager } from "typeorm";
|
|
13
|
+
import { beforeEach, describe, expect, jest, test } from "@jest/globals";
|
|
14
|
+
|
|
15
|
+
/*
|
|
16
|
+
* WHAT THIS FILE IS DEFENDING
|
|
17
|
+
*
|
|
18
|
+
* The two references that make device polling a tenancy boundary:
|
|
19
|
+
*
|
|
20
|
+
* probeId - WHO reaches into the customer's network for this device. A
|
|
21
|
+
* probe that can claim a device reads its hostname and its SNMP
|
|
22
|
+
* credentials, walks it, and reports status back.
|
|
23
|
+
* snmpCredentialProfileId - WHAT is put on the wire when it gets there.
|
|
24
|
+
*
|
|
25
|
+
* Neither foreign key requires the referenced row to belong to the device's
|
|
26
|
+
* project, and both ids arrive from the browser (the create form, the
|
|
27
|
+
* settings page, the device-list bulk actions). So each has to be checked at
|
|
28
|
+
* the point it is written, on BOTH hooks — a device created clean and then
|
|
29
|
+
* re-pointed with a plain update is the same breach as one created that way.
|
|
30
|
+
*
|
|
31
|
+
* The failure this file exists to catch is not "the check is wrong". It is
|
|
32
|
+
* "the check never runs". onBeforeUpdate returns early for any write that
|
|
33
|
+
* touches neither site nor identity, and assigning a probe or a profile is
|
|
34
|
+
* exactly such a write — the shape the settings form actually posts — so a
|
|
35
|
+
* guard placed below that return is dead code on the only path it exists
|
|
36
|
+
* for. Nothing fails; the guard is simply skipped, which is the worst shape
|
|
37
|
+
* a security check can take. Every update case below therefore goes through
|
|
38
|
+
* the real hook on a payload that trips the early return, in both spellings
|
|
39
|
+
* the UI posts.
|
|
40
|
+
*
|
|
41
|
+
* The last describe covers the DB backstop: rows written before these guards
|
|
42
|
+
* existed are still on disk, so the claim query must refuse them too.
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
46
|
+
"11111111-1111-4111-8111-111111111111",
|
|
47
|
+
);
|
|
48
|
+
const OTHER_PROJECT_ID: ObjectID = new ObjectID(
|
|
49
|
+
"22222222-2222-4222-8222-222222222222",
|
|
50
|
+
);
|
|
51
|
+
const PROBE_ID: ObjectID = new ObjectID("33333333-3333-4333-8333-333333333333");
|
|
52
|
+
const PROFILE_ID: ObjectID = new ObjectID(
|
|
53
|
+
"44444444-4444-4444-8444-444444444444",
|
|
54
|
+
);
|
|
55
|
+
const DEVICE_ID: ObjectID = new ObjectID(
|
|
56
|
+
"55555555-5555-4555-8555-555555555555",
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
type DeviceServiceInternals = {
|
|
60
|
+
onBeforeCreate: (
|
|
61
|
+
createBy: CreateBy<NetworkDevice>,
|
|
62
|
+
) => Promise<OnCreate<NetworkDevice>>;
|
|
63
|
+
onBeforeUpdate: (
|
|
64
|
+
updateBy: UpdateBy<NetworkDevice>,
|
|
65
|
+
) => Promise<OnUpdate<NetworkDevice>>;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
function buildDeviceService(): {
|
|
69
|
+
service: NetworkDeviceServiceType;
|
|
70
|
+
internals: DeviceServiceInternals;
|
|
71
|
+
} {
|
|
72
|
+
const service: NetworkDeviceServiceType = new NetworkDeviceServiceType();
|
|
73
|
+
return {
|
|
74
|
+
service,
|
|
75
|
+
internals: service as unknown as DeviceServiceInternals,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// The device the update matches; its projectId is what the guards compare against.
|
|
80
|
+
function matchedDevice(): NetworkDevice {
|
|
81
|
+
const device: NetworkDevice = new NetworkDevice(DEVICE_ID);
|
|
82
|
+
device.projectId = PROJECT_ID;
|
|
83
|
+
return device;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function probeInProject(projectId: ObjectID | undefined): Probe {
|
|
87
|
+
const probe: Probe = new Probe(PROBE_ID);
|
|
88
|
+
if (projectId) {
|
|
89
|
+
probe.projectId = projectId;
|
|
90
|
+
}
|
|
91
|
+
return probe;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function profileInProject(projectId: ObjectID): NetworkSnmpCredentialProfile {
|
|
95
|
+
const profile: NetworkSnmpCredentialProfile =
|
|
96
|
+
new NetworkSnmpCredentialProfile(PROFILE_ID);
|
|
97
|
+
profile.projectId = projectId;
|
|
98
|
+
profile.name = "Branch v2c";
|
|
99
|
+
return profile;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/*
|
|
103
|
+
* A payload that assigns ONLY a probe (or only a profile) — no site, no
|
|
104
|
+
* hostname, no name, no sysName. This is what the settings page and the bulk
|
|
105
|
+
* actions post, and it is precisely the shape that trips onBeforeUpdate's
|
|
106
|
+
* early return.
|
|
107
|
+
*/
|
|
108
|
+
function probeOnlyUpdate(spelling: "id" | "relation"): UpdateBy<NetworkDevice> {
|
|
109
|
+
return {
|
|
110
|
+
query: { _id: DEVICE_ID.toString() },
|
|
111
|
+
data:
|
|
112
|
+
spelling === "id"
|
|
113
|
+
? { probeId: PROBE_ID }
|
|
114
|
+
: { probe: probeInProject(PROJECT_ID) },
|
|
115
|
+
props: { isRoot: true },
|
|
116
|
+
} as unknown as UpdateBy<NetworkDevice>;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function profileOnlyUpdate(
|
|
120
|
+
spelling: "id" | "relation",
|
|
121
|
+
): UpdateBy<NetworkDevice> {
|
|
122
|
+
return {
|
|
123
|
+
query: { _id: DEVICE_ID.toString() },
|
|
124
|
+
data:
|
|
125
|
+
spelling === "id"
|
|
126
|
+
? { snmpCredentialProfileId: PROFILE_ID }
|
|
127
|
+
: { snmpCredentialProfile: profileInProject(PROJECT_ID) },
|
|
128
|
+
props: { isRoot: true },
|
|
129
|
+
} as unknown as UpdateBy<NetworkDevice>;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/*
|
|
133
|
+
* The real predicate, stubbed at its own boundary: a probe is attachable
|
|
134
|
+
* when it is global (no project of its own) or belongs to the project. That
|
|
135
|
+
* rule lives in ProbeService and is tested there; what matters here is that
|
|
136
|
+
* the device service asks.
|
|
137
|
+
*/
|
|
138
|
+
function stubProbeAttachability(probeProjectId: ObjectID | undefined): {
|
|
139
|
+
mock: { calls: Array<Array<unknown>> };
|
|
140
|
+
} {
|
|
141
|
+
const spy: unknown = jest
|
|
142
|
+
.spyOn(ProbeService, "getProbesAttachableToProject")
|
|
143
|
+
.mockImplementation(
|
|
144
|
+
async (data: {
|
|
145
|
+
probeIds: Array<ObjectID>;
|
|
146
|
+
projectId: ObjectID;
|
|
147
|
+
}): Promise<Array<Probe>> => {
|
|
148
|
+
const isAttachable: boolean =
|
|
149
|
+
probeProjectId === undefined ||
|
|
150
|
+
probeProjectId.toString() === data.projectId.toString();
|
|
151
|
+
|
|
152
|
+
return isAttachable ? [probeInProject(probeProjectId)] : [];
|
|
153
|
+
},
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
return spy as { mock: { calls: Array<Array<unknown>> } };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
describe("assigning a probe to a device is tenant-checked", () => {
|
|
160
|
+
beforeEach(() => {
|
|
161
|
+
jest.restoreAllMocks();
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
/*
|
|
165
|
+
* THE regression test. If the guard drifts back below the early return,
|
|
166
|
+
* this resolves cleanly and another project's probe is persisted onto the
|
|
167
|
+
* device — and that probe claims it on its next poll. The assertion has to
|
|
168
|
+
* be that the hook REJECTS, not merely that some code path exists.
|
|
169
|
+
*/
|
|
170
|
+
test.each(["id", "relation"] as const)(
|
|
171
|
+
"refuses a probe from another project when the payload writes only the %s",
|
|
172
|
+
async (spelling: "id" | "relation") => {
|
|
173
|
+
const { service, internals } = buildDeviceService();
|
|
174
|
+
|
|
175
|
+
jest
|
|
176
|
+
.spyOn(service, "findBy")
|
|
177
|
+
.mockResolvedValue([matchedDevice()] as never);
|
|
178
|
+
stubProbeAttachability(OTHER_PROJECT_ID);
|
|
179
|
+
|
|
180
|
+
await expect(
|
|
181
|
+
internals.onBeforeUpdate(probeOnlyUpdate(spelling)),
|
|
182
|
+
).rejects.toThrow(/does not belong to this project/);
|
|
183
|
+
},
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
test("allows a probe from the device's own project", async () => {
|
|
187
|
+
const { service, internals } = buildDeviceService();
|
|
188
|
+
|
|
189
|
+
jest.spyOn(service, "findBy").mockResolvedValue([matchedDevice()] as never);
|
|
190
|
+
stubProbeAttachability(PROJECT_ID);
|
|
191
|
+
|
|
192
|
+
await expect(
|
|
193
|
+
internals.onBeforeUpdate(probeOnlyUpdate("id")),
|
|
194
|
+
).resolves.toBeDefined();
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
/*
|
|
198
|
+
* A global probe has no project at all. Refusing it would break the
|
|
199
|
+
* default deployment, where the only probe there is is global.
|
|
200
|
+
*/
|
|
201
|
+
test("allows a global probe, which belongs to no project", async () => {
|
|
202
|
+
const { service, internals } = buildDeviceService();
|
|
203
|
+
|
|
204
|
+
jest.spyOn(service, "findBy").mockResolvedValue([matchedDevice()] as never);
|
|
205
|
+
stubProbeAttachability(undefined);
|
|
206
|
+
|
|
207
|
+
await expect(
|
|
208
|
+
internals.onBeforeUpdate(probeOnlyUpdate("id")),
|
|
209
|
+
).resolves.toBeDefined();
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
/*
|
|
213
|
+
* A hook that returned early looks identical to a hook that passed, so the
|
|
214
|
+
* lookup itself is asserted: the guard must actually reach ProbeService.
|
|
215
|
+
*/
|
|
216
|
+
test("actually asks ProbeService, rather than returning early", async () => {
|
|
217
|
+
const { service, internals } = buildDeviceService();
|
|
218
|
+
|
|
219
|
+
jest.spyOn(service, "findBy").mockResolvedValue([matchedDevice()] as never);
|
|
220
|
+
const probeLookup: { mock: { calls: Array<Array<unknown>> } } =
|
|
221
|
+
stubProbeAttachability(PROJECT_ID);
|
|
222
|
+
|
|
223
|
+
await internals.onBeforeUpdate(probeOnlyUpdate("id"));
|
|
224
|
+
|
|
225
|
+
expect(probeLookup.mock.calls.length).toBeGreaterThan(0);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
test("checks the probe on create too", async () => {
|
|
229
|
+
const { internals } = buildDeviceService();
|
|
230
|
+
|
|
231
|
+
stubProbeAttachability(OTHER_PROJECT_ID);
|
|
232
|
+
|
|
233
|
+
const device: NetworkDevice = new NetworkDevice();
|
|
234
|
+
device.projectId = PROJECT_ID;
|
|
235
|
+
device.probeId = PROBE_ID;
|
|
236
|
+
|
|
237
|
+
await expect(
|
|
238
|
+
internals.onBeforeCreate({
|
|
239
|
+
data: device,
|
|
240
|
+
props: { isRoot: true },
|
|
241
|
+
} as CreateBy<NetworkDevice>),
|
|
242
|
+
).rejects.toThrow(/does not belong to this project/);
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
/*
|
|
246
|
+
* DatabaseService stamps the tenant column AFTER onBeforeCreate runs, so a
|
|
247
|
+
* device created from the dashboard reaches the hook with projectId unset
|
|
248
|
+
* and only props.tenantId to go on. Reading only data.projectId would skip
|
|
249
|
+
* this guard for every UI create — i.e. for the only path a browser can
|
|
250
|
+
* take.
|
|
251
|
+
*/
|
|
252
|
+
test("checks the probe on a dashboard create, where the tenant is only on props", async () => {
|
|
253
|
+
const { internals } = buildDeviceService();
|
|
254
|
+
|
|
255
|
+
stubProbeAttachability(OTHER_PROJECT_ID);
|
|
256
|
+
|
|
257
|
+
const device: NetworkDevice = new NetworkDevice();
|
|
258
|
+
device.probeId = PROBE_ID;
|
|
259
|
+
|
|
260
|
+
await expect(
|
|
261
|
+
internals.onBeforeCreate({
|
|
262
|
+
data: device,
|
|
263
|
+
props: { tenantId: PROJECT_ID },
|
|
264
|
+
} as CreateBy<NetworkDevice>),
|
|
265
|
+
).rejects.toThrow(/does not belong to this project/);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
/*
|
|
269
|
+
* TypeORM's precedence between the FK column and the relation object is not
|
|
270
|
+
* a security boundary: whichever one is validated, the OTHER may be the one
|
|
271
|
+
* persisted. The contradiction is refused rather than picked from.
|
|
272
|
+
*/
|
|
273
|
+
test("refuses a payload that points probeId and probe at different rows", async () => {
|
|
274
|
+
const { service, internals } = buildDeviceService();
|
|
275
|
+
|
|
276
|
+
jest.spyOn(service, "findBy").mockResolvedValue([matchedDevice()] as never);
|
|
277
|
+
stubProbeAttachability(PROJECT_ID);
|
|
278
|
+
|
|
279
|
+
const conflicting: UpdateBy<NetworkDevice> = {
|
|
280
|
+
query: { _id: DEVICE_ID.toString() },
|
|
281
|
+
data: {
|
|
282
|
+
probeId: PROBE_ID,
|
|
283
|
+
probe: new Probe(new ObjectID("66666666-6666-4666-8666-666666666666")),
|
|
284
|
+
},
|
|
285
|
+
props: { isRoot: true },
|
|
286
|
+
} as unknown as UpdateBy<NetworkDevice>;
|
|
287
|
+
|
|
288
|
+
await expect(internals.onBeforeUpdate(conflicting)).rejects.toThrow(
|
|
289
|
+
/Conflicting Probe references/,
|
|
290
|
+
);
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
test("does no probe lookup for an update that assigns none", async () => {
|
|
294
|
+
const { internals } = buildDeviceService();
|
|
295
|
+
const probeLookup: { mock: { calls: Array<Array<unknown>> } } =
|
|
296
|
+
stubProbeAttachability(PROJECT_ID);
|
|
297
|
+
|
|
298
|
+
await internals.onBeforeUpdate({
|
|
299
|
+
query: { _id: DEVICE_ID.toString() },
|
|
300
|
+
data: { pollingIntervalInMinutes: 10 },
|
|
301
|
+
props: { isRoot: true },
|
|
302
|
+
} as unknown as UpdateBy<NetworkDevice>);
|
|
303
|
+
|
|
304
|
+
expect(probeLookup.mock.calls).toHaveLength(0);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
describe("assigning an SNMP credential profile to a device is tenant-checked", () => {
|
|
309
|
+
let profileFindSpy: {
|
|
310
|
+
mockResolvedValue: (value: never) => unknown;
|
|
311
|
+
mock: { calls: Array<Array<unknown>> };
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
beforeEach(() => {
|
|
315
|
+
jest.restoreAllMocks();
|
|
316
|
+
profileFindSpy = jest.spyOn(
|
|
317
|
+
NetworkSnmpCredentialProfileService,
|
|
318
|
+
"findOneById",
|
|
319
|
+
) as unknown as typeof profileFindSpy;
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
/*
|
|
323
|
+
* The same early-return hazard as the probe, and a worse consequence: a
|
|
324
|
+
* profile is read LIVE at poll time, so a cross-project reference puts
|
|
325
|
+
* another project's community string on this project's probe's wire.
|
|
326
|
+
*/
|
|
327
|
+
test.each(["id", "relation"] as const)(
|
|
328
|
+
"refuses a profile from another project when the payload writes only the %s",
|
|
329
|
+
async (spelling: "id" | "relation") => {
|
|
330
|
+
const { service, internals } = buildDeviceService();
|
|
331
|
+
|
|
332
|
+
jest
|
|
333
|
+
.spyOn(service, "findBy")
|
|
334
|
+
.mockResolvedValue([matchedDevice()] as never);
|
|
335
|
+
profileFindSpy.mockResolvedValue(
|
|
336
|
+
profileInProject(OTHER_PROJECT_ID) as never,
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
await expect(
|
|
340
|
+
internals.onBeforeUpdate(profileOnlyUpdate(spelling)),
|
|
341
|
+
).rejects.toThrow(/must belong to the same project/);
|
|
342
|
+
},
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
test("allows a profile from the device's own project", async () => {
|
|
346
|
+
const { service, internals } = buildDeviceService();
|
|
347
|
+
|
|
348
|
+
jest.spyOn(service, "findBy").mockResolvedValue([matchedDevice()] as never);
|
|
349
|
+
profileFindSpy.mockResolvedValue(profileInProject(PROJECT_ID) as never);
|
|
350
|
+
|
|
351
|
+
await expect(
|
|
352
|
+
internals.onBeforeUpdate(profileOnlyUpdate("id")),
|
|
353
|
+
).resolves.toBeDefined();
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
test("actually looks the profile up, rather than returning early", async () => {
|
|
357
|
+
const { service, internals } = buildDeviceService();
|
|
358
|
+
|
|
359
|
+
jest.spyOn(service, "findBy").mockResolvedValue([matchedDevice()] as never);
|
|
360
|
+
profileFindSpy.mockResolvedValue(profileInProject(PROJECT_ID) as never);
|
|
361
|
+
|
|
362
|
+
await internals.onBeforeUpdate(profileOnlyUpdate("id"));
|
|
363
|
+
|
|
364
|
+
expect(profileFindSpy.mock.calls.length).toBeGreaterThan(0);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
test("refuses a profile that does not exist at all", async () => {
|
|
368
|
+
const { service, internals } = buildDeviceService();
|
|
369
|
+
|
|
370
|
+
jest.spyOn(service, "findBy").mockResolvedValue([matchedDevice()] as never);
|
|
371
|
+
profileFindSpy.mockResolvedValue(null as never);
|
|
372
|
+
|
|
373
|
+
await expect(
|
|
374
|
+
internals.onBeforeUpdate(profileOnlyUpdate("id")),
|
|
375
|
+
).rejects.toThrow(BadDataException);
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
test("checks the profile on create too", async () => {
|
|
379
|
+
const { internals } = buildDeviceService();
|
|
380
|
+
|
|
381
|
+
profileFindSpy.mockResolvedValue(
|
|
382
|
+
profileInProject(OTHER_PROJECT_ID) as never,
|
|
383
|
+
);
|
|
384
|
+
|
|
385
|
+
const device: NetworkDevice = new NetworkDevice();
|
|
386
|
+
device.projectId = PROJECT_ID;
|
|
387
|
+
device.snmpCredentialProfileId = PROFILE_ID;
|
|
388
|
+
|
|
389
|
+
await expect(
|
|
390
|
+
internals.onBeforeCreate({
|
|
391
|
+
data: device,
|
|
392
|
+
props: { isRoot: true },
|
|
393
|
+
} as CreateBy<NetworkDevice>),
|
|
394
|
+
).rejects.toThrow(/must belong to the same project/);
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
test("refuses a payload that points the two profile spellings at different rows", async () => {
|
|
398
|
+
const { service, internals } = buildDeviceService();
|
|
399
|
+
|
|
400
|
+
jest.spyOn(service, "findBy").mockResolvedValue([matchedDevice()] as never);
|
|
401
|
+
profileFindSpy.mockResolvedValue(profileInProject(PROJECT_ID) as never);
|
|
402
|
+
|
|
403
|
+
const conflicting: UpdateBy<NetworkDevice> = {
|
|
404
|
+
query: { _id: DEVICE_ID.toString() },
|
|
405
|
+
data: {
|
|
406
|
+
snmpCredentialProfileId: PROFILE_ID,
|
|
407
|
+
snmpCredentialProfile: new NetworkSnmpCredentialProfile(
|
|
408
|
+
new ObjectID("77777777-7777-4777-8777-777777777777"),
|
|
409
|
+
),
|
|
410
|
+
},
|
|
411
|
+
props: { isRoot: true },
|
|
412
|
+
} as unknown as UpdateBy<NetworkDevice>;
|
|
413
|
+
|
|
414
|
+
await expect(internals.onBeforeUpdate(conflicting)).rejects.toThrow(
|
|
415
|
+
/Conflicting SNMP Credential Profile references/,
|
|
416
|
+
);
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
test("does no profile lookup for an update that assigns none", async () => {
|
|
420
|
+
const { internals } = buildDeviceService();
|
|
421
|
+
|
|
422
|
+
await internals.onBeforeUpdate({
|
|
423
|
+
query: { _id: DEVICE_ID.toString() },
|
|
424
|
+
data: { pollingIntervalInMinutes: 10 },
|
|
425
|
+
props: { isRoot: true },
|
|
426
|
+
} as unknown as UpdateBy<NetworkDevice>);
|
|
427
|
+
|
|
428
|
+
expect(profileFindSpy.mock.calls).toHaveLength(0);
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
/*
|
|
433
|
+
* The DB backstop.
|
|
434
|
+
*
|
|
435
|
+
* The write guards above are the half that gives an operator an error at the
|
|
436
|
+
* point of the mistake. This is the half that makes a row written BEFORE
|
|
437
|
+
* they existed unpollable rather than merely unwritable — without it, a
|
|
438
|
+
* device already pointed at another project's probe keeps being claimed by
|
|
439
|
+
* it forever, because nothing ever rewrites that row.
|
|
440
|
+
*
|
|
441
|
+
* Asserted against the SQL text because the predicate cannot be exercised
|
|
442
|
+
* without a live Postgres, and its absence is otherwise completely invisible:
|
|
443
|
+
* the query still runs, still returns rows, and simply hands out devices it
|
|
444
|
+
* should not.
|
|
445
|
+
*/
|
|
446
|
+
describe("the polling claim query refuses a probe from another project", () => {
|
|
447
|
+
beforeEach(() => {
|
|
448
|
+
jest.restoreAllMocks();
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
async function capturedClaimSql(): Promise<string> {
|
|
452
|
+
const { service } = buildDeviceService();
|
|
453
|
+
const statements: Array<string> = [];
|
|
454
|
+
|
|
455
|
+
jest
|
|
456
|
+
.spyOn(service, "executeTransaction")
|
|
457
|
+
.mockImplementation(
|
|
458
|
+
async <TResult>(
|
|
459
|
+
runInTransaction: (entityManager: EntityManager) => Promise<TResult>,
|
|
460
|
+
): Promise<TResult> => {
|
|
461
|
+
const entityManager: {
|
|
462
|
+
query: (sql: string) => Promise<Array<never>>;
|
|
463
|
+
} = {
|
|
464
|
+
query: async (sql: string): Promise<Array<never>> => {
|
|
465
|
+
statements.push(sql);
|
|
466
|
+
return [];
|
|
467
|
+
},
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
return await runInTransaction(
|
|
471
|
+
entityManager as unknown as EntityManager,
|
|
472
|
+
);
|
|
473
|
+
},
|
|
474
|
+
);
|
|
475
|
+
|
|
476
|
+
await service.claimDevicesForPolling({ probeId: PROBE_ID, limit: 10 });
|
|
477
|
+
|
|
478
|
+
return statements.join("\n").replace(/\s+/g, " ");
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
test("joins Probe and requires it to be global or in the device's project", async () => {
|
|
482
|
+
const sql: string = await capturedClaimSql();
|
|
483
|
+
|
|
484
|
+
expect(sql).toContain('INNER JOIN "Probe" pr ON nd."probeId" = pr."_id"');
|
|
485
|
+
expect(sql).toContain(
|
|
486
|
+
'AND (pr."isGlobalProbe" = true OR pr."projectId" = nd."projectId")',
|
|
487
|
+
);
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
/*
|
|
491
|
+
* The row lock must stay on the device rows alone. Widening it to the
|
|
492
|
+
* joined tables would take FOR UPDATE locks on Probe and Project rows that
|
|
493
|
+
* every other probe's claim also touches, turning SKIP LOCKED contention
|
|
494
|
+
* between unrelated probes into serialisation across the whole fleet.
|
|
495
|
+
*/
|
|
496
|
+
test("still locks only the device rows", async () => {
|
|
497
|
+
const sql: string = await capturedClaimSql();
|
|
498
|
+
|
|
499
|
+
expect(sql).toContain("FOR UPDATE OF nd SKIP LOCKED");
|
|
500
|
+
});
|
|
501
|
+
});
|