@oneuptime/common 12.0.25 → 12.0.27
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/Index.ts +2 -0
- package/Models/AnalyticsModels/ThreatIntelIndicator.ts +413 -0
- package/Models/DatabaseModels/AlertSeverity.ts +4 -1
- package/Models/DatabaseModels/CephClusterFeed.ts +625 -0
- package/Models/DatabaseModels/CloudResourceFeed.ts +625 -0
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +13 -0
- package/Models/DatabaseModels/DetectionRule.ts +9 -3
- package/Models/DatabaseModels/DockerHostFeed.ts +625 -0
- package/Models/DatabaseModels/DockerSwarmClusterFeed.ts +628 -0
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +9 -3
- package/Models/DatabaseModels/HostFeed.ts +625 -0
- package/Models/DatabaseModels/IncidentSeverity.ts +4 -1
- package/Models/DatabaseModels/Index.ts +22 -0
- package/Models/DatabaseModels/KubernetesClusterFeed.ts +628 -0
- package/Models/DatabaseModels/Monitor.ts +87 -0
- package/Models/DatabaseModels/NetworkDevice.ts +96 -5
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +92 -6
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +301 -31
- package/Models/DatabaseModels/NetworkSite.ts +120 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +1 -0
- package/Models/DatabaseModels/PodmanHostFeed.ts +625 -0
- package/Models/DatabaseModels/ProxmoxClusterFeed.ts +626 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +67 -0
- package/Models/DatabaseModels/ServiceFeed.ts +625 -0
- package/Models/DatabaseModels/TelemetrySourceMap.ts +474 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +758 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +1 -0
- package/Models/DatabaseModels/UserTotpAuth.ts +1 -0
- package/Models/DatabaseModels/UserWebAuthn.ts +1 -0
- package/Server/API/AlertAPI.ts +23 -1
- package/Server/API/BaseAPI.ts +14 -3
- package/Server/API/IncidentAPI.ts +41 -1
- package/Server/API/IncidentEpisodeAPI.ts +23 -1
- package/Server/API/MicrosoftTeamsAPI.ts +31 -2
- package/Server/API/ScheduledMaintenanceAPI.ts +23 -1
- package/Server/API/SlackAPI.ts +48 -0
- package/Server/API/TelemetryAPI.ts +167 -42
- package/Server/API/UserOnCallLogTimelineAPI.ts +75 -61
- package/Server/API/UserTotpAuthAPI.ts +67 -1
- package/Server/API/UserWebAuthnAPI.ts +44 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.ts +57 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.ts +54 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.ts +489 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +18 -0
- package/Server/Middleware/IdentityRateLimit.ts +53 -3
- package/Server/Services/AIService.ts +181 -41
- package/Server/Services/CephClusterFeedService.ts +99 -0
- package/Server/Services/CephClusterLabelRuleEngineService.ts +29 -0
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/CephClusterOwnerTeamService.ts +129 -0
- package/Server/Services/CephClusterOwnerUserService.ts +123 -0
- package/Server/Services/CephClusterService.ts +223 -2
- package/Server/Services/CloudResourceFeedService.ts +99 -0
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +30 -0
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +33 -0
- package/Server/Services/CloudResourceOwnerTeamService.ts +129 -0
- package/Server/Services/CloudResourceOwnerUserService.ts +123 -0
- package/Server/Services/CloudResourceService.ts +227 -2
- package/Server/Services/DatabaseService.ts +265 -0
- package/Server/Services/DockerHostFeedService.ts +99 -0
- package/Server/Services/DockerHostLabelRuleEngineService.ts +29 -0
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/DockerHostOwnerTeamService.ts +129 -0
- package/Server/Services/DockerHostOwnerUserService.ts +123 -0
- package/Server/Services/DockerHostService.ts +227 -2
- package/Server/Services/DockerSwarmClusterFeedService.ts +102 -0
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +133 -0
- package/Server/Services/DockerSwarmClusterOwnerUserService.ts +127 -0
- package/Server/Services/DockerSwarmClusterService.ts +229 -2
- package/Server/Services/EnterpriseLicenseService.ts +15 -7
- package/Server/Services/ExceptionAggregationService.ts +12 -2
- package/Server/Services/HostFeedService.ts +99 -0
- package/Server/Services/HostLabelRuleEngineService.ts +29 -0
- package/Server/Services/HostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/HostOwnerTeamService.ts +129 -0
- package/Server/Services/HostOwnerUserService.ts +123 -0
- package/Server/Services/HostService.ts +215 -2
- package/Server/Services/IncidentService.ts +11 -0
- package/Server/Services/Index.ts +24 -0
- package/Server/Services/KubernetesClusterFeedService.ts +99 -0
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/KubernetesClusterOwnerTeamService.ts +133 -0
- package/Server/Services/KubernetesClusterOwnerUserService.ts +127 -0
- package/Server/Services/KubernetesClusterService.ts +231 -2
- package/Server/Services/LogAggregationService.ts +23 -280
- package/Server/Services/MetricAggregationService.ts +98 -1
- package/Server/Services/MonitorService.ts +177 -13
- package/Server/Services/MonitorTemplateService.ts +111 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +777 -86
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +199 -16
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +1055 -14
- package/Server/Services/NetworkDeviceService.ts +750 -4
- package/Server/Services/NetworkInterfaceService.ts +415 -0
- package/Server/Services/NetworkSiteService.ts +485 -52
- package/Server/Services/PodmanHostFeedService.ts +99 -0
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +29 -0
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/PodmanHostOwnerTeamService.ts +129 -0
- package/Server/Services/PodmanHostOwnerUserService.ts +123 -0
- package/Server/Services/PodmanHostService.ts +227 -2
- package/Server/Services/ProjectService.ts +16 -10
- package/Server/Services/ProxmoxClusterFeedService.ts +99 -0
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/ProxmoxClusterOwnerTeamService.ts +131 -0
- package/Server/Services/ProxmoxClusterOwnerUserService.ts +124 -0
- package/Server/Services/ProxmoxClusterService.ts +225 -2
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +61 -0
- package/Server/Services/ServiceFeedService.ts +99 -0
- package/Server/Services/ServiceLabelRuleEngineService.ts +29 -0
- package/Server/Services/ServiceOwnerRuleEngineService.ts +26 -0
- package/Server/Services/ServiceOwnerTeamService.ts +129 -0
- package/Server/Services/ServiceOwnerUserService.ts +123 -0
- package/Server/Services/ServiceService.ts +227 -3
- package/Server/Services/StatusPageSubscriberService.ts +7 -0
- package/Server/Services/TelemetryAttributeService.ts +13 -3
- package/Server/Services/TelemetrySourceMapService.ts +307 -0
- package/Server/Services/ThreatIntelFeedService.ts +222 -0
- package/Server/Services/ThreatIntelIndicatorService.ts +428 -0
- package/Server/Services/TraceAggregationService.ts +101 -11
- package/Server/Services/UserService.ts +13 -6
- package/Server/Services/UserTwoFactorBackupCodeService.ts +127 -0
- package/Server/Services/UserWebhookService.ts +11 -2
- package/Server/Static/Brand/README.md +38 -0
- package/Server/Static/Brand/favicons/apple-touch-icon.png +0 -0
- package/Server/Static/Brand/favicons/favicon-16x16.png +0 -0
- package/Server/Static/Brand/favicons/favicon-32x32.png +0 -0
- package/Server/Static/Brand/favicons/favicon.ico +0 -0
- package/Server/Static/Brand/favicons/safari-pinned-tab.svg +31 -0
- package/Server/Static/Brand/hou-wb.svg +1 -0
- package/Server/Static/Brand/oneuptime-logo.svg +1 -0
- package/Server/Static/Brand/ou-wb.svg +1 -0
- package/Server/Static/Vendor/README.md +4 -0
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +13 -3
- package/Server/Types/Database/AggregateBy.ts +83 -0
- package/Server/Types/Database/AggregateResultUtil.ts +126 -0
- package/Server/Types/Database/JSONColumnQuery.ts +18 -0
- package/Server/Types/Database/QueryHelper.ts +40 -0
- package/Server/Types/Database/QueryUtil.ts +26 -0
- package/Server/Types/Workflow/Components/API/Utils.ts +10 -1
- package/Server/Types/Workflow/Components/JavaScript.ts +8 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +9 -0
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +18 -0
- package/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.ts +422 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +176 -0
- package/Server/Utils/DataSource/HttpFetch.ts +18 -0
- package/Server/Utils/Database/RelationIdUtil.ts +42 -0
- package/Server/Utils/Marketing/MarketingEventUtil.ts +38 -9
- package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +34 -3
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +9 -1
- package/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts +28 -10
- package/Server/Utils/Monitor/MonitorAlert.ts +541 -332
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +330 -64
- package/Server/Utils/Monitor/MonitorIncident.ts +640 -434
- package/Server/Utils/Monitor/MonitorResource.ts +226 -49
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +46 -3
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +23 -102
- package/Server/Utils/Monitor/PerEntityCriteriaFanOut.ts +329 -0
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +427 -0
- package/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.ts +310 -0
- package/Server/Utils/OnCallNotificationContext.ts +686 -0
- package/Server/Utils/PrivateNetworkWebhookConfig.ts +549 -0
- package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +139 -0
- package/Server/Utils/Response.ts +11 -1
- package/Server/Utils/SSRFProtection.ts +230 -60
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +106 -0
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +84 -284
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +47 -20
- package/Server/Utils/SecurityEvent/SecurityEventAlerting.ts +318 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.ts +199 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.ts +252 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +739 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +533 -0
- package/Server/Utils/StartServer.ts +83 -56
- package/Server/Utils/StatusPageSubscriberWebhook.ts +3 -0
- package/Server/Utils/Telemetry/SourceMapResolver.ts +480 -0
- package/Server/Utils/TwoFactorBackupCodeNotification.ts +106 -0
- package/Server/Utils/VM/VMAPI.ts +3 -0
- package/Server/Utils/VM/VMRunner.ts +27 -1
- package/Server/Utils/VendorAssets.ts +42 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +136 -6
- package/Server/Views/AcknowledgeUserOnCallNotification.ejs +11 -9
- package/Server/Views/Partials/Head.ejs +9 -9
- package/Server/Views/Partials/OnCallNotificationDetails.ejs +48 -0
- package/Server/Views/ViewMessage.ejs +11 -9
- package/Tests/App/Accounts/LoginTwoFactorRecovery.test.tsx +972 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +401 -0
- package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +707 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +1908 -18
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +230 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +216 -0
- package/Tests/App/Dashboard/TopologyAddToMonitoring.test.tsx +192 -0
- package/Tests/App/Dashboard/WorkspaceNotificationRuleConditions.test.tsx +439 -0
- package/Tests/Models/DatabaseModels/DateColumnDeserialization.test.ts +182 -0
- package/Tests/Models/DatabaseModels/RelationColumnModelTypeCoverage.test.ts +82 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +398 -0
- package/Tests/Models/DiscoveryScanNameColumn.test.ts +151 -16
- package/Tests/Models/DiscoveryScanSnmpEnabledColumn.test.ts +593 -0
- package/Tests/Models/NetworkDeviceCreateContract.test.ts +102 -0
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +607 -0
- package/Tests/Server/API/AIGenerationRequestBudget.test.ts +355 -0
- package/Tests/Server/API/AIKillSwitchBackstop.test.ts +602 -0
- package/Tests/Server/API/BaseAPIUpdateDateColumns.test.ts +154 -0
- package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +335 -0
- package/Tests/Server/API/UserOnCallLogTimelineAcknowledgePage.test.ts +611 -0
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +498 -4
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +682 -0
- package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +595 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +9 -0
- package/Tests/Server/Services/AIServiceProjectAccess.test.ts +6 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +18 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +590 -0
- package/Tests/Server/Services/DatabaseServiceUpdateWriteRouting.test.ts +12 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +162 -26
- package/Tests/Server/Services/EnterpriseLicenseServiceCreate.test.ts +292 -0
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +119 -12
- package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +109 -0
- package/Tests/Server/Services/MetricAggregationAttributeOperators.test.ts +170 -0
- package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +383 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +997 -3
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +830 -0
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +528 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +3141 -1
- package/Tests/Server/Services/NetworkDeviceRegisteredHostnames.test.ts +1023 -0
- package/Tests/Server/Services/NetworkDeviceSiteAssignmentRuleSkip.test.ts +728 -0
- package/Tests/Server/Services/NetworkInterfaceServiceUpsert.test.ts +795 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +903 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +165 -24
- package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +5 -3
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +5 -2
- package/Tests/Server/Services/ResourceCreationFeedWrites.test.ts +304 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +269 -0
- package/Tests/Server/Services/ResourceOwnerFeedWrites.test.ts +245 -0
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +792 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +483 -0
- package/Tests/Server/Services/ThreatIntelFeedService.test.ts +351 -0
- package/Tests/Server/Services/ThreatIntelIndicatorService.test.ts +366 -0
- package/Tests/Server/Services/TraceAggregationAttributeOperators.test.ts +507 -0
- package/Tests/Server/Services/UserTwoFactorBackupCodeGenerateIfNone.test.ts +705 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleOnCallDutyPolicy.test.ts +306 -0
- package/Tests/Server/Types/Database/AggregateResultUtil.test.ts +386 -0
- package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +424 -0
- package/Tests/Server/Types/Database/QueryHelperWildcard.test.ts +142 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentPrivateNetwork.test.ts +163 -0
- package/Tests/Server/Types/Workflow/Components/JavaScriptPrivateNetwork.test.ts +124 -0
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +5 -0
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +39 -1
- package/Tests/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.test.ts +338 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWildcard.test.ts +383 -0
- package/Tests/Server/Utils/Marketing/EmittedMarketingEvent.ts +23 -0
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +51 -0
- package/Tests/Server/Utils/Monitor/Criteria/SyntheticMonitorCriteria.test.ts +259 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +557 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +12 -2
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +404 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +8 -2
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +125 -98
- package/Tests/Server/Utils/Monitor/PerEntityCriteriaFanOut.test.ts +444 -0
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1112 -0
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +717 -0
- package/Tests/Server/Utils/NetworkDevice/RulePatternValidator.test.ts +78 -0
- package/Tests/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.test.ts +363 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +35 -0
- package/Tests/Server/Utils/OnCallNotificationContext.test.ts +908 -0
- package/Tests/Server/Utils/PrivateNetworkWebhookConfig.test.ts +423 -0
- package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +191 -0
- package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +597 -0
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +819 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +381 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +417 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +819 -0
- package/Tests/Server/Utils/SecurityEvent/SecurityEventAlerting.test.ts +246 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.test.ts +282 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.test.ts +312 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.test.ts +854 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.test.ts +437 -0
- package/Tests/Server/Utils/StartServerErrorStatus.test.ts +225 -0
- package/Tests/Server/Utils/StatusPage/MonitorRulePatternValidator.test.ts +62 -0
- package/Tests/Server/Utils/StatusPageSubscriberWebhookPrivateNetwork.test.ts +119 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +542 -0
- package/Tests/Server/Utils/TwoFactorBackupCodeNotification.test.ts +272 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +111 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +117 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +101 -4
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstallStateDiagnostics.test.ts +922 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsRosterDiagnosticMessages.test.ts +642 -0
- package/Tests/Server/Views/OnCallAcknowledgePage.test.ts +430 -0
- package/Tests/Types/API/HostnameAuthorityParsing.test.ts +1 -0
- package/Tests/Types/API/URLMailtoQueryString.test.ts +439 -0
- package/Tests/Types/API/URLQueryString.test.ts +481 -0
- package/Tests/Types/API/URLRouteQuerySeparation.test.ts +491 -0
- package/Tests/Types/BaseDatabase/Wildcard.test.ts +163 -0
- package/Tests/Types/BaseDatabase/WildcardPattern.test.ts +149 -0
- package/Tests/Types/Database/DateColumnValue.test.ts +265 -0
- package/Tests/Types/DateToIsoStringOrNull.test.ts +67 -0
- package/Tests/Types/Log/LogQueryToFilter.test.ts +218 -43
- package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +225 -0
- package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +296 -0
- package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +102 -0
- package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +145 -0
- package/Tests/Types/NetworkSite/SiteHealthRollupPolicy.test.ts +58 -0
- package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +15 -0
- package/Tests/Types/Telemetry/TelemetrySearchQuery.test.ts +620 -0
- package/Tests/Types/WhatsApp/WhatsAppTemplates.test.ts +110 -0
- package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +76 -6
- package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +16 -4
- package/Tests/Types/Workspace/NotificationRules/OnCallDutyPolicyConditions.test.ts +669 -0
- package/Tests/UI/Components/DictionaryFilterOperatorWildcard.test.ts +175 -0
- package/Tests/UI/Components/IconOpticalSize.test.tsx +377 -0
- package/Tests/UI/Components/LogsHistogramDragTooltip.test.tsx +393 -0
- package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +248 -0
- package/Tests/UI/Components/TelemetryHistogramDragTooltip.test.tsx +205 -0
- package/Tests/UI/Components/UseHistogramZoom.test.tsx +262 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +332 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsInstallGuidanceContent.test.tsx +643 -0
- package/Tests/Utils/Monitor/InterfaceInventoryUtil.test.ts +824 -0
- package/Tests/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.test.ts +626 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +718 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +59 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +287 -2
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +73 -0
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilder.test.ts +317 -0
- package/Tests/Utils/NetworkDiscovery/RescanIntervalUtil.test.ts +262 -0
- package/Tests/Utils/NetworkDiscovery/ScanModeUtil.test.ts +474 -0
- package/Tests/Utils/NetworkDiscovery/SnmpScanConfigUtil.test.ts +2442 -0
- package/Tests/Utils/NetworkSite/SiteMaintenanceUtil.test.ts +188 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +522 -0
- package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +694 -0
- package/Tests/Utils/SecurityEvent/ThreatIntel/StixPatternParser.test.ts +281 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +87 -67
- package/Types/API/URL.ts +100 -28
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +8 -0
- package/Types/BaseDatabase/NotWildcard.ts +86 -0
- package/Types/BaseDatabase/Wildcard.ts +89 -0
- package/Types/BaseDatabase/WildcardPattern.ts +176 -0
- package/Types/Database/DateColumnValue.ts +184 -0
- package/Types/Database/TableColumn.ts +40 -5
- package/Types/Date.ts +37 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/JSON.ts +8 -0
- package/Types/Log/LogQueryToFilter.ts +167 -129
- package/Types/Monitor/DockerAlertTemplates.ts +43 -12
- package/Types/Monitor/HostAlertTemplates.ts +31 -3
- package/Types/Monitor/KubernetesAlertTemplates.ts +98 -0
- package/Types/Monitor/MonitorStep.ts +49 -0
- package/Types/Monitor/PodmanAlertTemplates.ts +39 -12
- package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +14 -0
- package/Types/Monitor/SnmpMonitor/LldpNeighbor.ts +11 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +11 -4
- package/Types/NetworkAutomation/RuleRunResult.ts +191 -2
- package/Types/NetworkSite/SiteHealthRollupPolicy.ts +96 -0
- package/Types/Permission.ts +411 -0
- package/Types/Probe/ProbeApiIngestResponse.ts +42 -0
- package/Types/SecurityEvent/ThreatIntelConstants.ts +118 -0
- package/Types/SerializableObjectDictionary.ts +8 -0
- package/Types/Telemetry/SourceMap.ts +56 -0
- package/Types/Telemetry/TelemetrySearchQuery.ts +949 -0
- package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +12 -1
- package/UI/Components/Charts/Utils/useHistogramZoom.ts +101 -0
- package/UI/Components/Dictionary/DictionaryFilterOperator.ts +83 -0
- package/UI/Components/Icon/Icon.tsx +28 -1
- package/UI/Components/LogsViewer/LogsViewer.tsx +19 -3
- package/UI/Components/LogsViewer/components/LogSearchBar.tsx +26 -4
- package/UI/Components/LogsViewer/components/LogSearchHelp.tsx +34 -16
- package/UI/Components/LogsViewer/components/LogsHistogram.tsx +52 -1
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +18 -2
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +52 -1
- package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +15 -2
- package/Utils/Metrics/MetricExplorerUrl.ts +77 -15
- package/Utils/Monitor/InterfaceInventoryUtil.ts +251 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +333 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +249 -28
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +14 -6
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +2 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +49 -18
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +215 -0
- package/Utils/NetworkDiscovery/RescanIntervalUtil.ts +148 -0
- package/Utils/NetworkDiscovery/ScanModeUtil.ts +105 -0
- package/Utils/NetworkDiscovery/SnmpScanConfigUtil.ts +827 -0
- package/Utils/NetworkSite/SiteMaintenanceUtil.ts +110 -0
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +350 -19
- package/Utils/NetworkSite/SiteUptimeUtil.ts +422 -21
- package/Utils/SecurityEvent/ThreatIntel/StixPatternParser.ts +383 -0
- package/Utils/Telemetry/CrossSignalScope.ts +37 -39
- package/build/dist/Models/AnalyticsModels/Index.js +2 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +325 -0
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +4 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/CephClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/CloudResourceFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +11 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +9 -3
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DockerHostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +9 -3
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/HostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +4 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +22 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Monitor.js +81 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +103 -7
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +91 -6
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +276 -31
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +124 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/PodmanHostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +66 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/ServiceFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js +496 -0
- package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +800 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js +1 -0
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +1 -0
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +18 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +8 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +35 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +18 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +30 -2
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +18 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +45 -0
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +100 -35
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +64 -59
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +65 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +42 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js +88 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js +61 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js +179 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +40 -3
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +177 -30
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterFeedService.js +89 -0
- package/build/dist/Server/Services/CephClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +175 -1
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceFeedService.js +89 -0
- package/build/dist/Server/Services/CloudResourceFeedService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +28 -3
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js +113 -0
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +177 -1
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +201 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostFeedService.js +89 -0
- package/build/dist/Server/Services/DockerHostFeedService.js.map +1 -0
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/DockerHostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +177 -1
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterFeedService.js +90 -0
- package/build/dist/Server/Services/DockerSwarmClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +175 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +40 -30
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +8 -2
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/HostFeedService.js +89 -0
- package/build/dist/Server/Services/HostFeedService.js.map +1 -0
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/HostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/HostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +175 -1
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +10 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +24 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterFeedService.js +89 -0
- package/build/dist/Server/Services/KubernetesClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +177 -1
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +19 -196
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +59 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +115 -13
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +86 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +561 -67
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +130 -16
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +850 -8
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +594 -5
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkInterfaceService.js +306 -0
- package/build/dist/Server/Services/NetworkInterfaceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +408 -47
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostFeedService.js +89 -0
- package/build/dist/Server/Services/PodmanHostFeedService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +177 -1
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +40 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterFeedService.js +89 -0
- package/build/dist/Server/Services/ProxmoxClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +175 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +56 -0
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceFeedService.js +89 -0
- package/build/dist/Server/Services/ServiceFeedService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +24 -0
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/ServiceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerUserService.js +113 -0
- package/build/dist/Server/Services/ServiceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +173 -2
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +7 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryAttributeService.js +9 -3
- package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +265 -0
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -0
- package/build/dist/Server/Services/ThreatIntelFeedService.js +157 -0
- package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -0
- package/build/dist/Server/Services/ThreatIntelIndicatorService.js +276 -0
- package/build/dist/Server/Services/ThreatIntelIndicatorService.js.map +1 -0
- package/build/dist/Server/Services/TraceAggregationService.js +62 -6
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +22 -13
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js +120 -0
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +11 -2
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +12 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/AggregateBy.js +2 -0
- package/build/dist/Server/Types/Database/AggregateBy.js.map +1 -0
- package/build/dist/Server/Types/Database/AggregateResultUtil.js +90 -0
- package/build/dist/Server/Types/Database/AggregateResultUtil.js.map +1 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js +14 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +42 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +18 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js +10 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +8 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +15 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js +266 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +134 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +8 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/Database/RelationIdUtil.js +31 -0
- package/build/dist/Server/Utils/Database/RelationIdUtil.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +26 -8
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +42 -17
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +9 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js +15 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +386 -271
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +278 -64
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +469 -350
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +183 -44
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +46 -3
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +18 -91
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js +194 -0
- package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js.map +1 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +332 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js +279 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js.map +1 -0
- package/build/dist/Server/Utils/OnCallNotificationContext.js +415 -0
- package/build/dist/Server/Utils/OnCallNotificationContext.js.map +1 -0
- package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js +424 -0
- package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js.map +1 -0
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +108 -0
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +12 -1
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +160 -58
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +89 -0
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +75 -234
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +41 -16
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js +217 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js +103 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js +168 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +527 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +376 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +70 -44
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +3 -0
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +327 -0
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +84 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +10 -1
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +29 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +121 -6
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/API/URL.js +88 -27
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +8 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/BaseDatabase/NotWildcard.js +72 -0
- package/build/dist/Types/BaseDatabase/NotWildcard.js.map +1 -0
- package/build/dist/Types/BaseDatabase/Wildcard.js +75 -0
- package/build/dist/Types/BaseDatabase/Wildcard.js.map +1 -0
- package/build/dist/Types/BaseDatabase/WildcardPattern.js +137 -0
- package/build/dist/Types/BaseDatabase/WildcardPattern.js.map +1 -0
- package/build/dist/Types/Database/DateColumnValue.js +125 -0
- package/build/dist/Types/Database/DateColumnValue.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +18 -2
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Date.js +31 -0
- package/build/dist/Types/Date.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/JSON.js +2 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/Log/LogQueryToFilter.js +111 -108
- package/build/dist/Types/Log/LogQueryToFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DockerAlertTemplates.js +40 -16
- package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/HostAlertTemplates.js +29 -7
- package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +98 -4
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +40 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js +36 -16
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +90 -0
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js +84 -0
- package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +354 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +100 -0
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -0
- package/build/dist/Types/SerializableObjectDictionary.js +8 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/SourceMap.js +9 -0
- package/build/dist/Types/Telemetry/SourceMap.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetrySearchQuery.js +661 -0
- package/build/dist/Types/Telemetry/TelemetrySearchQuery.js.map +1 -0
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +12 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js +47 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js.map +1 -0
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +67 -0
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +28 -1
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +15 -3
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +25 -4
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js +36 -16
- package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +33 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +14 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +33 -5
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +14 -2
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js +54 -9
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
- package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js +128 -0
- package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +190 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +206 -28
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +14 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +34 -18
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +163 -0
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js +99 -0
- package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js +85 -0
- package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js +560 -0
- package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js +56 -0
- package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +185 -10
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +248 -21
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js +255 -0
- package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js.map +1 -0
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +27 -30
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/package.json +2 -1
- package/Tests/Types/Log/LogQueryParser.test.ts +0 -186
- package/Types/Log/LogQueryParser.ts +0 -252
- package/build/dist/Types/Log/LogQueryParser.js +0 -200
- package/build/dist/Types/Log/LogQueryParser.js.map +0 -1
|
@@ -0,0 +1,728 @@
|
|
|
1
|
+
import NetworkDeviceService, {
|
|
2
|
+
EmptySiteAssignmentRuleCache,
|
|
3
|
+
EMPTY_SITE_ASSIGNMENT_RULE_CACHE_TTL_IN_MS,
|
|
4
|
+
} from "../../../Server/Services/NetworkDeviceService";
|
|
5
|
+
import NetworkSiteAssignmentRuleService from "../../../Server/Services/NetworkSiteAssignmentRuleService";
|
|
6
|
+
import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
|
|
7
|
+
import NetworkSiteAssignmentRule from "../../../Models/DatabaseModels/NetworkSiteAssignmentRule";
|
|
8
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
9
|
+
import UpdateBy from "../../../Server/Types/Database/UpdateBy";
|
|
10
|
+
import { OnUpdate } from "../../../Server/Types/Database/Hooks";
|
|
11
|
+
import { afterEach, beforeEach, describe, expect, it } from "@jest/globals";
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* Contract under test — what a poll costs when a project has no
|
|
15
|
+
* site-assignment rules.
|
|
16
|
+
*
|
|
17
|
+
* Every successful SNMP walk writes `sysName`, an identity column, so
|
|
18
|
+
* onUpdateSuccess re-evaluates the assignment rules for every device that has
|
|
19
|
+
* no site. That rule is correct and stays: rules are usually written after the
|
|
20
|
+
* estate was imported, and the walk is the only thing that ever touches such a
|
|
21
|
+
* device again. What was wasteful is HOW it concluded nothing — a findOneById
|
|
22
|
+
* plus an uncached findBy of the same empty rule set, per device, per poll. On
|
|
23
|
+
* a project mid-rollout that is every device in the fleet.
|
|
24
|
+
*
|
|
25
|
+
* The fix is a negative cache: "this project had zero rules" is remembered for
|
|
26
|
+
* EMPTY_SITE_ASSIGNMENT_RULE_CACHE_TTL_IN_MS. Only the negative answer is
|
|
27
|
+
* cached — a stale rule SET would assign a device by a rule that was edited or
|
|
28
|
+
* deleted seconds ago, which nothing moves back, while a stale "no rules" only
|
|
29
|
+
* defers work the polling interval already defers by minutes.
|
|
30
|
+
*
|
|
31
|
+
* These tests count queries rather than reading the implementation, and they
|
|
32
|
+
* drive the freshness guarantee (TTL expiry, and observation of a first rule)
|
|
33
|
+
* rather than asserting it from the source.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
37
|
+
"22222222-2222-4222-8222-222222222222",
|
|
38
|
+
);
|
|
39
|
+
const OTHER_PROJECT_ID: ObjectID = new ObjectID(
|
|
40
|
+
"44444444-4444-4444-8444-444444444444",
|
|
41
|
+
);
|
|
42
|
+
const DEVICE_ID: ObjectID = new ObjectID(
|
|
43
|
+
"cccccccc-cccc-4ccc-8ccc-cccccccccccc",
|
|
44
|
+
);
|
|
45
|
+
const SITE_A_ID: ObjectID = new ObjectID(
|
|
46
|
+
"11111111-1111-4111-8111-111111111111",
|
|
47
|
+
);
|
|
48
|
+
const RULE_ID: ObjectID = new ObjectID("55555555-5555-4555-8555-555555555555");
|
|
49
|
+
|
|
50
|
+
/*
|
|
51
|
+
* The TTL this suite drives the clock by, written out rather than imported so
|
|
52
|
+
* that changing the service constant fails HERE. The number is a promise —
|
|
53
|
+
* "a rule saved on another replica takes effect within ten seconds" — and a
|
|
54
|
+
* promise nobody asserts is not a promise. The service's own value is checked
|
|
55
|
+
* against this literal below.
|
|
56
|
+
*/
|
|
57
|
+
const CACHE_TTL_IN_MS: number = 10 * 1000;
|
|
58
|
+
|
|
59
|
+
function fakeDevice(overrides: Record<string, unknown>): NetworkDevice {
|
|
60
|
+
return {
|
|
61
|
+
id: DEVICE_ID,
|
|
62
|
+
_id: DEVICE_ID.toString(),
|
|
63
|
+
projectId: PROJECT_ID,
|
|
64
|
+
hostname: "10.0.5.9",
|
|
65
|
+
...overrides,
|
|
66
|
+
} as unknown as NetworkDevice;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function fakeRule(data: {
|
|
70
|
+
siteId: ObjectID;
|
|
71
|
+
subnetCidr?: string;
|
|
72
|
+
hostnamePattern?: string;
|
|
73
|
+
priority?: number;
|
|
74
|
+
}): NetworkSiteAssignmentRule {
|
|
75
|
+
return {
|
|
76
|
+
_id: RULE_ID.toString(),
|
|
77
|
+
...data,
|
|
78
|
+
} as unknown as NetworkSiteAssignmentRule;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const MATCHING_RULE: NetworkSiteAssignmentRule = fakeRule({
|
|
82
|
+
siteId: SITE_A_ID,
|
|
83
|
+
subnetCidr: "10.0.0.0/8",
|
|
84
|
+
priority: 1,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
interface ServiceSpies {
|
|
88
|
+
deviceRead: jest.SpyInstance;
|
|
89
|
+
ruleRead: jest.SpyInstance;
|
|
90
|
+
assign: jest.SpyInstance;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/*
|
|
94
|
+
* The three statements the rule path can issue: the device read, the rule read
|
|
95
|
+
* and the assignment write. Counting them is the only honest way to prove a
|
|
96
|
+
* short-circuit actually short-circuits.
|
|
97
|
+
*/
|
|
98
|
+
function mockServices(
|
|
99
|
+
rules: Array<NetworkSiteAssignmentRule>,
|
|
100
|
+
device: NetworkDevice = fakeDevice({}),
|
|
101
|
+
): ServiceSpies {
|
|
102
|
+
return {
|
|
103
|
+
deviceRead: jest
|
|
104
|
+
.spyOn(NetworkDeviceService, "findOneById")
|
|
105
|
+
.mockResolvedValue(device),
|
|
106
|
+
ruleRead: jest
|
|
107
|
+
.spyOn(NetworkSiteAssignmentRuleService, "findBy")
|
|
108
|
+
.mockResolvedValue(rules),
|
|
109
|
+
assign: jest
|
|
110
|
+
.spyOn(NetworkDeviceService, "updateOneById")
|
|
111
|
+
.mockResolvedValue(1 as never),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// One SNMP-walk-shaped update: the same sysName the walk rewrites every poll.
|
|
116
|
+
function walkUpdate(
|
|
117
|
+
previousDevices: Array<NetworkDevice>,
|
|
118
|
+
): OnUpdate<NetworkDevice> {
|
|
119
|
+
return {
|
|
120
|
+
updateBy: {
|
|
121
|
+
query: {},
|
|
122
|
+
data: { sysName: "UN0664LANSWI03" },
|
|
123
|
+
props: { isRoot: true },
|
|
124
|
+
} as unknown as UpdateBy<NetworkDevice>,
|
|
125
|
+
carryForward: {
|
|
126
|
+
previousDevices: previousDevices,
|
|
127
|
+
},
|
|
128
|
+
} as unknown as OnUpdate<NetworkDevice>;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
let currentTimeInMs: number = 1767225600000;
|
|
132
|
+
|
|
133
|
+
beforeEach(() => {
|
|
134
|
+
currentTimeInMs = 1767225600000;
|
|
135
|
+
jest.spyOn(Date, "now").mockImplementation((): number => {
|
|
136
|
+
return currentTimeInMs;
|
|
137
|
+
});
|
|
138
|
+
// The service singleton is process-wide; every case starts cold.
|
|
139
|
+
NetworkDeviceService.emptySiteAssignmentRuleCache.clear();
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
afterEach(() => {
|
|
143
|
+
jest.restoreAllMocks();
|
|
144
|
+
NetworkDeviceService.emptySiteAssignmentRuleCache.clear();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
describe("EmptySiteAssignmentRuleCache", () => {
|
|
148
|
+
function buildCache(options?: {
|
|
149
|
+
ttlInMs?: number | undefined;
|
|
150
|
+
maxProjects?: number | undefined;
|
|
151
|
+
}): EmptySiteAssignmentRuleCache {
|
|
152
|
+
return new EmptySiteAssignmentRuleCache({
|
|
153
|
+
ttlInMs: options?.ttlInMs,
|
|
154
|
+
maxProjects: options?.maxProjects,
|
|
155
|
+
now: (): number => {
|
|
156
|
+
return currentTimeInMs;
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/*
|
|
162
|
+
* The staleness budget itself. Ten seconds is what bounds a rule saved on
|
|
163
|
+
* another replica, which no in-process invalidation can hear about; raising
|
|
164
|
+
* it silently would lengthen that window for every project.
|
|
165
|
+
*/
|
|
166
|
+
it("trusts a known-empty answer for ten seconds and no longer", () => {
|
|
167
|
+
expect(EMPTY_SITE_ASSIGNMENT_RULE_CACHE_TTL_IN_MS).toBe(CACHE_TTL_IN_MS);
|
|
168
|
+
|
|
169
|
+
const cache: EmptySiteAssignmentRuleCache =
|
|
170
|
+
new EmptySiteAssignmentRuleCache({
|
|
171
|
+
now: (): number => {
|
|
172
|
+
return currentTimeInMs;
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: true });
|
|
177
|
+
|
|
178
|
+
currentTimeInMs += CACHE_TTL_IN_MS - 1;
|
|
179
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(true);
|
|
180
|
+
|
|
181
|
+
currentTimeInMs += 1;
|
|
182
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(false);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it("knows nothing about a project it has never seen", () => {
|
|
186
|
+
expect(buildCache().isKnownEmpty(PROJECT_ID)).toBe(false);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("remembers a project that had no rules", () => {
|
|
190
|
+
const cache: EmptySiteAssignmentRuleCache = buildCache();
|
|
191
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: true });
|
|
192
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(true);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
/*
|
|
196
|
+
* The boundary is what bounds staleness for a rule saved on ANOTHER replica,
|
|
197
|
+
* which no in-process invalidation can ever hear about.
|
|
198
|
+
*/
|
|
199
|
+
it("stops trusting the answer exactly at the TTL", () => {
|
|
200
|
+
const cache: EmptySiteAssignmentRuleCache = buildCache({ ttlInMs: 1000 });
|
|
201
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: true });
|
|
202
|
+
|
|
203
|
+
currentTimeInMs += 999;
|
|
204
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(true);
|
|
205
|
+
|
|
206
|
+
currentTimeInMs += 1;
|
|
207
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(false);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it("re-recording refreshes the expiry", () => {
|
|
211
|
+
const cache: EmptySiteAssignmentRuleCache = buildCache({ ttlInMs: 1000 });
|
|
212
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: true });
|
|
213
|
+
|
|
214
|
+
currentTimeInMs += 900;
|
|
215
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: true });
|
|
216
|
+
|
|
217
|
+
currentTimeInMs += 900;
|
|
218
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(true);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
/*
|
|
222
|
+
* The in-process half of the invalidation story: the moment anything sees
|
|
223
|
+
* that the project does have rules, the skip is gone — no TTL wait.
|
|
224
|
+
*/
|
|
225
|
+
it("forgets the project the moment a non-empty rule set is observed", () => {
|
|
226
|
+
const cache: EmptySiteAssignmentRuleCache = buildCache();
|
|
227
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: true });
|
|
228
|
+
|
|
229
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: false });
|
|
230
|
+
|
|
231
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(false);
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
it("recording a non-empty answer for an unknown project changes nothing", () => {
|
|
235
|
+
const cache: EmptySiteAssignmentRuleCache = buildCache();
|
|
236
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: false });
|
|
237
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(false);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
// Tenancy: one project's emptiness must never answer for another's.
|
|
241
|
+
it("keeps projects independent", () => {
|
|
242
|
+
const cache: EmptySiteAssignmentRuleCache = buildCache();
|
|
243
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: true });
|
|
244
|
+
|
|
245
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(true);
|
|
246
|
+
expect(cache.isKnownEmpty(OTHER_PROJECT_ID)).toBe(false);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it("clear() drops every project", () => {
|
|
250
|
+
const cache: EmptySiteAssignmentRuleCache = buildCache();
|
|
251
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: true });
|
|
252
|
+
cache.record({ projectId: OTHER_PROJECT_ID, isEmpty: true });
|
|
253
|
+
|
|
254
|
+
cache.clear();
|
|
255
|
+
|
|
256
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(false);
|
|
257
|
+
expect(cache.isKnownEmpty(OTHER_PROJECT_ID)).toBe(false);
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
/*
|
|
261
|
+
* An instance serving many projects must not grow this map forever; the
|
|
262
|
+
* oldest entry goes, and losing one only costs a re-read.
|
|
263
|
+
*/
|
|
264
|
+
it("evicts the oldest project once it is full", () => {
|
|
265
|
+
const cache: EmptySiteAssignmentRuleCache = buildCache({ maxProjects: 2 });
|
|
266
|
+
const thirdProjectId: ObjectID = new ObjectID(
|
|
267
|
+
"66666666-6666-4666-8666-666666666666",
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: true });
|
|
271
|
+
cache.record({ projectId: OTHER_PROJECT_ID, isEmpty: true });
|
|
272
|
+
cache.record({ projectId: thirdProjectId, isEmpty: true });
|
|
273
|
+
|
|
274
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(false);
|
|
275
|
+
expect(cache.isKnownEmpty(OTHER_PROJECT_ID)).toBe(true);
|
|
276
|
+
expect(cache.isKnownEmpty(thirdProjectId)).toBe(true);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
it("refreshing a project already in a full cache evicts nothing", () => {
|
|
280
|
+
const cache: EmptySiteAssignmentRuleCache = buildCache({ maxProjects: 2 });
|
|
281
|
+
|
|
282
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: true });
|
|
283
|
+
cache.record({ projectId: OTHER_PROJECT_ID, isEmpty: true });
|
|
284
|
+
cache.record({ projectId: OTHER_PROJECT_ID, isEmpty: true });
|
|
285
|
+
|
|
286
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(true);
|
|
287
|
+
expect(cache.isKnownEmpty(OTHER_PROJECT_ID)).toBe(true);
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
it("is usable again after an entry expires", () => {
|
|
291
|
+
const cache: EmptySiteAssignmentRuleCache = buildCache({ ttlInMs: 1000 });
|
|
292
|
+
|
|
293
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: true });
|
|
294
|
+
currentTimeInMs += 5000;
|
|
295
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(false);
|
|
296
|
+
|
|
297
|
+
cache.record({ projectId: PROJECT_ID, isEmpty: true });
|
|
298
|
+
expect(cache.isKnownEmpty(PROJECT_ID)).toBe(true);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
describe("NetworkDeviceService.applySiteAssignmentRulesToDevice — the no-rules skip", () => {
|
|
303
|
+
/*
|
|
304
|
+
* The headline: on a project with no rules, the second and every later poll
|
|
305
|
+
* of an unattached device issues NO statements at all. Before this, each one
|
|
306
|
+
* cost a device read plus a rule read to reach the same conclusion.
|
|
307
|
+
*/
|
|
308
|
+
it("reads once for the project, then skips both queries entirely", async () => {
|
|
309
|
+
const spies: ServiceSpies = mockServices([]);
|
|
310
|
+
|
|
311
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
312
|
+
DEVICE_ID,
|
|
313
|
+
PROJECT_ID,
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
expect(spies.deviceRead).toHaveBeenCalledTimes(1);
|
|
317
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(1);
|
|
318
|
+
|
|
319
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
320
|
+
DEVICE_ID,
|
|
321
|
+
PROJECT_ID,
|
|
322
|
+
);
|
|
323
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
324
|
+
DEVICE_ID,
|
|
325
|
+
PROJECT_ID,
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
expect(spies.deviceRead).toHaveBeenCalledTimes(1);
|
|
329
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(1);
|
|
330
|
+
expect(spies.assign).not.toHaveBeenCalled();
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
/*
|
|
334
|
+
* The bug a cache like this can introduce, driven rather than argued: a rule
|
|
335
|
+
* saved on another replica (which cannot invalidate anything here) has to
|
|
336
|
+
* take effect on its own. The TTL is what promises that.
|
|
337
|
+
*/
|
|
338
|
+
it("re-reads after the TTL, so a rule saved elsewhere applies on the next poll", async () => {
|
|
339
|
+
const spies: ServiceSpies = mockServices([]);
|
|
340
|
+
|
|
341
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
342
|
+
DEVICE_ID,
|
|
343
|
+
PROJECT_ID,
|
|
344
|
+
);
|
|
345
|
+
expect(spies.assign).not.toHaveBeenCalled();
|
|
346
|
+
|
|
347
|
+
// Somebody saves a rule on another replica.
|
|
348
|
+
spies.ruleRead.mockResolvedValue([MATCHING_RULE]);
|
|
349
|
+
|
|
350
|
+
currentTimeInMs += CACHE_TTL_IN_MS;
|
|
351
|
+
|
|
352
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
353
|
+
DEVICE_ID,
|
|
354
|
+
PROJECT_ID,
|
|
355
|
+
);
|
|
356
|
+
|
|
357
|
+
expect(spies.deviceRead).toHaveBeenCalledTimes(2);
|
|
358
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(2);
|
|
359
|
+
expect(spies.assign).toHaveBeenCalledTimes(1);
|
|
360
|
+
expect(spies.assign.mock.calls[0]![0].data.siteId.toString()).toBe(
|
|
361
|
+
SITE_A_ID.toString(),
|
|
362
|
+
);
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it("still skips one millisecond before the TTL is up", async () => {
|
|
366
|
+
const spies: ServiceSpies = mockServices([]);
|
|
367
|
+
|
|
368
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
369
|
+
DEVICE_ID,
|
|
370
|
+
PROJECT_ID,
|
|
371
|
+
);
|
|
372
|
+
|
|
373
|
+
currentTimeInMs += CACHE_TTL_IN_MS - 1;
|
|
374
|
+
|
|
375
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
376
|
+
DEVICE_ID,
|
|
377
|
+
PROJECT_ID,
|
|
378
|
+
);
|
|
379
|
+
|
|
380
|
+
expect(spies.deviceRead).toHaveBeenCalledTimes(1);
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
/*
|
|
384
|
+
* The behaviour the skip must not damage. A device with no site is the
|
|
385
|
+
* self-healing case: it is how an estate imported before the rules existed
|
|
386
|
+
* ever gets placed.
|
|
387
|
+
*/
|
|
388
|
+
it("assigns a device with no site when the project does have rules", async () => {
|
|
389
|
+
const spies: ServiceSpies = mockServices([MATCHING_RULE]);
|
|
390
|
+
|
|
391
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
392
|
+
DEVICE_ID,
|
|
393
|
+
PROJECT_ID,
|
|
394
|
+
);
|
|
395
|
+
|
|
396
|
+
expect(spies.assign).toHaveBeenCalledTimes(1);
|
|
397
|
+
expect(spies.assign.mock.calls[0]![0].data.siteId.toString()).toBe(
|
|
398
|
+
SITE_A_ID.toString(),
|
|
399
|
+
);
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
/*
|
|
403
|
+
* Only the NEGATIVE answer is cached. Reusing a rule SET would let a rule
|
|
404
|
+
* that was edited or deleted seconds ago still place a device somewhere
|
|
405
|
+
* nothing will move it back from.
|
|
406
|
+
*/
|
|
407
|
+
it("never caches a non-empty rule set — every poll re-reads the rules", async () => {
|
|
408
|
+
const spies: ServiceSpies = mockServices([MATCHING_RULE]);
|
|
409
|
+
|
|
410
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
411
|
+
DEVICE_ID,
|
|
412
|
+
PROJECT_ID,
|
|
413
|
+
);
|
|
414
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
415
|
+
DEVICE_ID,
|
|
416
|
+
PROJECT_ID,
|
|
417
|
+
);
|
|
418
|
+
|
|
419
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(2);
|
|
420
|
+
expect(spies.deviceRead).toHaveBeenCalledTimes(2);
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
/*
|
|
424
|
+
* Device creation deliberately passes no project: a rule saved moments ago
|
|
425
|
+
* must apply to the device being imported right now, TTL or no TTL.
|
|
426
|
+
*/
|
|
427
|
+
it("never skips when the caller gives no project (the create path)", async () => {
|
|
428
|
+
const spies: ServiceSpies = mockServices([]);
|
|
429
|
+
|
|
430
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
431
|
+
DEVICE_ID,
|
|
432
|
+
PROJECT_ID,
|
|
433
|
+
);
|
|
434
|
+
expect(spies.deviceRead).toHaveBeenCalledTimes(1);
|
|
435
|
+
|
|
436
|
+
spies.ruleRead.mockResolvedValue([MATCHING_RULE]);
|
|
437
|
+
|
|
438
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(DEVICE_ID);
|
|
439
|
+
|
|
440
|
+
expect(spies.deviceRead).toHaveBeenCalledTimes(2);
|
|
441
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(2);
|
|
442
|
+
expect(spies.assign).toHaveBeenCalledTimes(1);
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
// Tenancy: an empty project must never answer for a busy one.
|
|
446
|
+
it("one project's emptiness never skips another project's device", async () => {
|
|
447
|
+
const spies: ServiceSpies = mockServices([]);
|
|
448
|
+
|
|
449
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
450
|
+
DEVICE_ID,
|
|
451
|
+
PROJECT_ID,
|
|
452
|
+
);
|
|
453
|
+
|
|
454
|
+
spies.ruleRead.mockResolvedValue([MATCHING_RULE]);
|
|
455
|
+
spies.deviceRead.mockResolvedValue(
|
|
456
|
+
fakeDevice({ projectId: OTHER_PROJECT_ID }),
|
|
457
|
+
);
|
|
458
|
+
|
|
459
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
460
|
+
DEVICE_ID,
|
|
461
|
+
OTHER_PROJECT_ID,
|
|
462
|
+
);
|
|
463
|
+
|
|
464
|
+
expect(spies.deviceRead).toHaveBeenCalledTimes(2);
|
|
465
|
+
expect(spies.assign).toHaveBeenCalledTimes(1);
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
/*
|
|
469
|
+
* The other direction of self-healing: a project whose last rule was deleted
|
|
470
|
+
* starts being skipped again on the next poll, without a restart.
|
|
471
|
+
*/
|
|
472
|
+
it("starts skipping again once the project's last rule is deleted", async () => {
|
|
473
|
+
const spies: ServiceSpies = mockServices([MATCHING_RULE]);
|
|
474
|
+
|
|
475
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
476
|
+
DEVICE_ID,
|
|
477
|
+
PROJECT_ID,
|
|
478
|
+
);
|
|
479
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(1);
|
|
480
|
+
|
|
481
|
+
spies.ruleRead.mockResolvedValue([]);
|
|
482
|
+
|
|
483
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
484
|
+
DEVICE_ID,
|
|
485
|
+
PROJECT_ID,
|
|
486
|
+
);
|
|
487
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(2);
|
|
488
|
+
|
|
489
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
490
|
+
DEVICE_ID,
|
|
491
|
+
PROJECT_ID,
|
|
492
|
+
);
|
|
493
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(2);
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
/*
|
|
497
|
+
* A device row that vanished between the poll and here must not teach the
|
|
498
|
+
* cache anything — there was no project to answer for.
|
|
499
|
+
*/
|
|
500
|
+
it("records nothing when the device cannot be read", async () => {
|
|
501
|
+
const spies: ServiceSpies = mockServices([]);
|
|
502
|
+
spies.deviceRead.mockResolvedValue(null);
|
|
503
|
+
|
|
504
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
505
|
+
DEVICE_ID,
|
|
506
|
+
PROJECT_ID,
|
|
507
|
+
);
|
|
508
|
+
|
|
509
|
+
expect(spies.ruleRead).not.toHaveBeenCalled();
|
|
510
|
+
expect(
|
|
511
|
+
NetworkDeviceService.emptySiteAssignmentRuleCache.isKnownEmpty(
|
|
512
|
+
PROJECT_ID,
|
|
513
|
+
),
|
|
514
|
+
).toBe(false);
|
|
515
|
+
});
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
describe("NetworkDeviceService.applySiteAssignmentRuleToExistingDevices — the manual run", () => {
|
|
519
|
+
/*
|
|
520
|
+
* "Run now" is pressed right after saving a rule. It must never consult the
|
|
521
|
+
* negative cache, and running it lifts the skip immediately — this is the
|
|
522
|
+
* in-process invalidation that saves the operator the TTL wait.
|
|
523
|
+
*/
|
|
524
|
+
it("runs on fresh rules even while the project is cached as empty, and lifts the skip", async () => {
|
|
525
|
+
const spies: ServiceSpies = mockServices([]);
|
|
526
|
+
|
|
527
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
528
|
+
DEVICE_ID,
|
|
529
|
+
PROJECT_ID,
|
|
530
|
+
);
|
|
531
|
+
expect(
|
|
532
|
+
NetworkDeviceService.emptySiteAssignmentRuleCache.isKnownEmpty(
|
|
533
|
+
PROJECT_ID,
|
|
534
|
+
),
|
|
535
|
+
).toBe(true);
|
|
536
|
+
|
|
537
|
+
// The rule the operator just saved.
|
|
538
|
+
spies.ruleRead.mockResolvedValue([MATCHING_RULE]);
|
|
539
|
+
// No devices to page over: the run only has to read the rules.
|
|
540
|
+
jest.spyOn(NetworkDeviceService, "findBy").mockResolvedValue([]);
|
|
541
|
+
|
|
542
|
+
await NetworkDeviceService.applySiteAssignmentRuleToExistingDevices({
|
|
543
|
+
ruleId: RULE_ID,
|
|
544
|
+
projectId: PROJECT_ID,
|
|
545
|
+
reassignDevicesAlreadyInASite: false,
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(2);
|
|
549
|
+
expect(
|
|
550
|
+
NetworkDeviceService.emptySiteAssignmentRuleCache.isKnownEmpty(
|
|
551
|
+
PROJECT_ID,
|
|
552
|
+
),
|
|
553
|
+
).toBe(false);
|
|
554
|
+
|
|
555
|
+
// And the very next poll re-reads instead of skipping.
|
|
556
|
+
await NetworkDeviceService.applySiteAssignmentRulesToDevice(
|
|
557
|
+
DEVICE_ID,
|
|
558
|
+
PROJECT_ID,
|
|
559
|
+
);
|
|
560
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(3);
|
|
561
|
+
});
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
describe("NetworkDeviceService.onUpdateSuccess — what an SNMP walk costs", () => {
|
|
565
|
+
async function runWalkUpdate(
|
|
566
|
+
previousDevices: Array<NetworkDevice>,
|
|
567
|
+
): Promise<void> {
|
|
568
|
+
await (NetworkDeviceService as any).onUpdateSuccess(
|
|
569
|
+
walkUpdate(previousDevices),
|
|
570
|
+
[DEVICE_ID],
|
|
571
|
+
);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
/*
|
|
575
|
+
* The end-to-end number this change exists for. A project mid-rollout has
|
|
576
|
+
* every device unattached; each poll used to cost two extra statements per
|
|
577
|
+
* device and now costs none once the project's answer is known.
|
|
578
|
+
*/
|
|
579
|
+
it("costs two queries for the first unattached device and none for later polls", async () => {
|
|
580
|
+
const spies: ServiceSpies = mockServices([], fakeDevice({}));
|
|
581
|
+
|
|
582
|
+
await runWalkUpdate([fakeDevice({})]);
|
|
583
|
+
|
|
584
|
+
expect(spies.deviceRead).toHaveBeenCalledTimes(1);
|
|
585
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(1);
|
|
586
|
+
|
|
587
|
+
await runWalkUpdate([fakeDevice({})]);
|
|
588
|
+
await runWalkUpdate([fakeDevice({})]);
|
|
589
|
+
|
|
590
|
+
expect(spies.deviceRead).toHaveBeenCalledTimes(1);
|
|
591
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(1);
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
/*
|
|
595
|
+
* The skip lives behind shouldReapplySiteAssignmentRules, which must keep
|
|
596
|
+
* deciding first: a device someone placed by hand is not dragged back to
|
|
597
|
+
* whatever a rule prefers just because the walk rewrote the same sysName.
|
|
598
|
+
*/
|
|
599
|
+
it("a placed device whose sysName did not change never reaches the rule path", async () => {
|
|
600
|
+
const spies: ServiceSpies = mockServices([MATCHING_RULE]);
|
|
601
|
+
|
|
602
|
+
await runWalkUpdate([
|
|
603
|
+
fakeDevice({ siteId: SITE_A_ID, sysName: "UN0664LANSWI03" }),
|
|
604
|
+
]);
|
|
605
|
+
|
|
606
|
+
expect(spies.deviceRead).not.toHaveBeenCalled();
|
|
607
|
+
expect(spies.ruleRead).not.toHaveBeenCalled();
|
|
608
|
+
expect(spies.assign).not.toHaveBeenCalled();
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
it("a placed device whose sysName really changed still re-evaluates", async () => {
|
|
612
|
+
const spies: ServiceSpies = mockServices([MATCHING_RULE]);
|
|
613
|
+
|
|
614
|
+
await runWalkUpdate([fakeDevice({ siteId: SITE_A_ID, sysName: "sw-01" })]);
|
|
615
|
+
|
|
616
|
+
expect(spies.deviceRead).toHaveBeenCalledTimes(1);
|
|
617
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(1);
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
/*
|
|
621
|
+
* The skip is only ever a DEFERRAL, and this is what makes that true.
|
|
622
|
+
*
|
|
623
|
+
* An unattached device is re-evaluated on every single poll, so skipping it
|
|
624
|
+
* costs one cycle and the next poll picks it up. A device that already has a
|
|
625
|
+
* site is re-evaluated only when its identity actually CHANGED — a one-shot
|
|
626
|
+
* event. Skipping that is not a deferral, it is a loss: the rename never
|
|
627
|
+
* happens again, so on every later poll `shouldReapplySiteAssignmentRules`
|
|
628
|
+
* returns false, the device keeps its old site indefinitely, and nothing
|
|
629
|
+
* anywhere says so.
|
|
630
|
+
*
|
|
631
|
+
* The window is narrow — the project must gain its FIRST rule inside the
|
|
632
|
+
* ten seconds after a poll found none — but it is silent and permanent when
|
|
633
|
+
* it opens, which is exactly the trade the cache must not make. So the
|
|
634
|
+
* identity path never consults it.
|
|
635
|
+
*/
|
|
636
|
+
it("a renamed placed device is never skipped by the empty-rules cache", async () => {
|
|
637
|
+
// A poll of an unattached device arms the skip for this project.
|
|
638
|
+
const armSpies: ServiceSpies = mockServices([], fakeDevice({}));
|
|
639
|
+
await runWalkUpdate([fakeDevice({})]);
|
|
640
|
+
expect(armSpies.ruleRead).toHaveBeenCalledTimes(1);
|
|
641
|
+
expect(
|
|
642
|
+
NetworkDeviceService.emptySiteAssignmentRuleCache.isKnownEmpty(
|
|
643
|
+
PROJECT_ID,
|
|
644
|
+
),
|
|
645
|
+
).toBe(true);
|
|
646
|
+
|
|
647
|
+
jest.restoreAllMocks();
|
|
648
|
+
jest.spyOn(Date, "now").mockImplementation((): number => {
|
|
649
|
+
return currentTimeInMs;
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
// The operator saves the project's first rule a second later...
|
|
653
|
+
currentTimeInMs += 1000;
|
|
654
|
+
const spies: ServiceSpies = mockServices([MATCHING_RULE]);
|
|
655
|
+
|
|
656
|
+
// ...and a device that ALREADY HAS A SITE is renamed on the box.
|
|
657
|
+
await runWalkUpdate([fakeDevice({ siteId: SITE_A_ID, sysName: "sw-01" })]);
|
|
658
|
+
|
|
659
|
+
// The rules were read despite the armed skip, and the rename was applied.
|
|
660
|
+
expect(spies.ruleRead).toHaveBeenCalledTimes(1);
|
|
661
|
+
expect(spies.assign).toHaveBeenCalledTimes(1);
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
/*
|
|
665
|
+
* ...and the deferral it IS allowed to make still happens, or the change
|
|
666
|
+
* would have bought nothing. Same armed cache, same window — an UNATTACHED
|
|
667
|
+
* device is skipped, because its next poll retries unconditionally.
|
|
668
|
+
*/
|
|
669
|
+
it("an unattached device is still skipped in that same window", async () => {
|
|
670
|
+
const armSpies: ServiceSpies = mockServices([], fakeDevice({}));
|
|
671
|
+
await runWalkUpdate([fakeDevice({})]);
|
|
672
|
+
expect(armSpies.ruleRead).toHaveBeenCalledTimes(1);
|
|
673
|
+
|
|
674
|
+
jest.restoreAllMocks();
|
|
675
|
+
jest.spyOn(Date, "now").mockImplementation((): number => {
|
|
676
|
+
return currentTimeInMs;
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
currentTimeInMs += 1000;
|
|
680
|
+
const spies: ServiceSpies = mockServices([MATCHING_RULE]);
|
|
681
|
+
|
|
682
|
+
await runWalkUpdate([fakeDevice({ sysName: "UN0664LANSWI03" })]);
|
|
683
|
+
|
|
684
|
+
expect(spies.deviceRead).not.toHaveBeenCalled();
|
|
685
|
+
expect(spies.ruleRead).not.toHaveBeenCalled();
|
|
686
|
+
});
|
|
687
|
+
|
|
688
|
+
it("an unattached device is still assigned when the project has rules", async () => {
|
|
689
|
+
const spies: ServiceSpies = mockServices([MATCHING_RULE]);
|
|
690
|
+
|
|
691
|
+
await runWalkUpdate([fakeDevice({ sysName: "UN0664LANSWI03" })]);
|
|
692
|
+
|
|
693
|
+
expect(spies.assign).toHaveBeenCalledTimes(1);
|
|
694
|
+
expect(spies.assign.mock.calls[0]![0].data.siteId.toString()).toBe(
|
|
695
|
+
SITE_A_ID.toString(),
|
|
696
|
+
);
|
|
697
|
+
});
|
|
698
|
+
|
|
699
|
+
/*
|
|
700
|
+
* The project has to come from the PREVIOUS snapshot, which the hook already
|
|
701
|
+
* loaded — reading it from the device row would need the very query the skip
|
|
702
|
+
* is trying to avoid.
|
|
703
|
+
*/
|
|
704
|
+
it("hands the previous snapshot's project down so the skip can run before any read", async () => {
|
|
705
|
+
const applySpy: jest.SpyInstance = jest
|
|
706
|
+
.spyOn(NetworkDeviceService, "applySiteAssignmentRulesToDevice")
|
|
707
|
+
.mockResolvedValue(undefined as never);
|
|
708
|
+
|
|
709
|
+
await runWalkUpdate([fakeDevice({})]);
|
|
710
|
+
|
|
711
|
+
expect(applySpy).toHaveBeenCalledTimes(1);
|
|
712
|
+
expect(applySpy.mock.calls[0]![0].toString()).toBe(DEVICE_ID.toString());
|
|
713
|
+
expect(applySpy.mock.calls[0]![1].toString()).toBe(PROJECT_ID.toString());
|
|
714
|
+
});
|
|
715
|
+
|
|
716
|
+
/*
|
|
717
|
+
* With no snapshot there is no project to key the skip on, so the device is
|
|
718
|
+
* re-evaluated unconditionally — the safe direction.
|
|
719
|
+
*/
|
|
720
|
+
it("re-evaluates unconditionally when no previous snapshot exists", async () => {
|
|
721
|
+
const spies: ServiceSpies = mockServices([]);
|
|
722
|
+
|
|
723
|
+
await runWalkUpdate([]);
|
|
724
|
+
await runWalkUpdate([]);
|
|
725
|
+
|
|
726
|
+
expect(spies.deviceRead).toHaveBeenCalledTimes(2);
|
|
727
|
+
});
|
|
728
|
+
});
|