@oneuptime/common 13.0.5 → 13.0.6
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/AuditLog.ts +81 -1
- package/Models/AnalyticsModels/SecurityEvent.ts +4 -4
- package/Models/DatabaseModels/Alert.ts +62 -0
- package/Models/DatabaseModels/GlobalConfig.ts +1 -1
- package/Models/DatabaseModels/Incident.ts +66 -0
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +74 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +74 -0
- package/Models/DatabaseModels/Index.ts +6 -4
- package/Models/DatabaseModels/NetworkDevice.ts +67 -0
- package/Models/DatabaseModels/NetworkDeviceDiagnostic.ts +746 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +151 -0
- package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +1 -1
- package/Models/DatabaseModels/Project.ts +41 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +74 -0
- package/Models/DatabaseModels/SecurityEventConnection.ts +11 -11
- package/Models/DatabaseModels/ServiceLevelObjective.ts +185 -8
- package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +746 -43
- package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +575 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +582 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +16 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +16 -0
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +75 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +1 -1
- package/Server/API/BaseAPI.ts +17 -0
- package/Server/API/BillingInvoiceAPI.ts +343 -30
- package/Server/API/BillingPaymentMethodAPI.ts +126 -5
- package/Server/API/DashboardAPI.ts +96 -2
- package/Server/API/SecurityEventConnectionAPI.ts +141 -11
- package/Server/API/StatusPageAPI.ts +308 -199
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.ts +83 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.ts +36 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.ts +516 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.ts +98 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.ts +97 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +138 -67
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +213 -84
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +112 -35
- package/Server/Services/AlertLabelRuleEngineService.ts +299 -217
- package/Server/Services/AlertOwnerRuleEngineService.ts +572 -396
- package/Server/Services/AlertPrivacyRuleEngineService.ts +116 -40
- package/Server/Services/AlertService.ts +111 -4
- package/Server/Services/AuditLogService.ts +612 -59
- package/Server/Services/BillingInvoiceService.ts +112 -102
- package/Server/Services/BillingService.ts +539 -11
- package/Server/Services/CephClusterLabelRuleEngineService.ts +170 -109
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +233 -115
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +163 -100
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +236 -115
- package/Server/Services/DashboardLabelRuleEngineService.ts +145 -84
- package/Server/Services/DashboardOwnerRuleEngineService.ts +213 -95
- package/Server/Services/DatabaseService.ts +171 -21
- package/Server/Services/DockerHostLabelRuleEngineService.ts +171 -110
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +233 -115
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +181 -112
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +243 -118
- package/Server/Services/HostLabelRuleEngineService.ts +167 -106
- package/Server/Services/HostOwnerRuleEngineService.ts +229 -111
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +141 -67
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +272 -72
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +112 -35
- package/Server/Services/IncidentEpisodePublicNoteService.ts +24 -0
- package/Server/Services/IncidentLabelRuleEngineService.ts +279 -204
- package/Server/Services/IncidentOwnerRuleEngineService.ts +595 -425
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +117 -44
- package/Server/Services/IncidentPublicNoteService.ts +24 -0
- package/Server/Services/IncidentService.ts +114 -3
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +147 -83
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +221 -100
- package/Server/Services/Index.ts +6 -4
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +145 -84
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +213 -95
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +181 -112
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +243 -118
- package/Server/Services/LabelService.ts +23 -28
- package/Server/Services/MonitorLabelRuleEngineService.ts +152 -92
- package/Server/Services/MonitorOwnerRuleEngineService.ts +220 -104
- package/Server/Services/MonitorProbeService.ts +20 -2
- package/Server/Services/MonitorService.ts +11 -9
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +376 -5
- package/Server/Services/NetworkDeviceDiagnosticService.ts +417 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +147 -83
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +218 -97
- package/Server/Services/NetworkDeviceService.ts +39 -2
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +151 -80
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +222 -97
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +154 -83
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +225 -100
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +171 -110
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +235 -115
- package/Server/Services/ProjectService.ts +111 -10
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +174 -110
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +239 -116
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +137 -73
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +200 -83
- package/Server/Services/RunbookLabelRuleEngineService.ts +146 -84
- package/Server/Services/RunbookOwnerRuleEngineService.ts +216 -95
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +324 -230
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +613 -428
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +24 -0
- package/Server/Services/ScheduledMaintenanceService.ts +43 -14
- package/Server/Services/SecurityEventConnectionService.ts +56 -4
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +143 -74
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +206 -85
- package/Server/Services/ServiceLabelRuleEngineService.ts +172 -110
- package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +1057 -18
- package/Server/Services/ServiceLevelObjectiveFeedService.ts +108 -0
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +793 -97
- package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +1069 -0
- package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +240 -1
- package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +257 -1
- package/Server/Services/ServiceLevelObjectiveService.ts +1356 -56
- package/Server/Services/ServiceOwnerRuleEngineService.ts +238 -116
- package/Server/Services/StatusPageAnnouncementService.ts +13 -0
- package/Server/Services/StatusPageLabelRuleEngineService.ts +146 -85
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +210 -99
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +28 -232
- package/Server/Services/StatusPageSubscriberService.ts +6 -0
- package/Server/Services/TelemetryUsageBillingService.ts +38 -7
- package/Server/Services/ThreatIntelFeedService.ts +1 -1
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +173 -110
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +238 -116
- package/Server/Services/WorkflowLabelRuleEngineService.ts +145 -84
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +215 -95
- package/Server/Types/Database/UpdateByID.ts +3 -0
- package/Server/Types/Database/UpdateOneBy.ts +7 -0
- package/Server/Utils/AI/AlertAIContextBuilder.ts +19 -0
- package/Server/Utils/AI/IncidentAIContextBuilder.ts +39 -0
- package/Server/Utils/AI/Toolbox/AlertTools.ts +37 -1
- package/Server/Utils/AI/Toolbox/IncidentTools.ts +22 -1
- package/Server/Utils/AI/Toolbox/SloTools.ts +416 -51
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +151 -13
- package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +17 -4
- package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +155 -8
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +16 -0
- package/Server/Utils/Database/RelationValueUtil.ts +106 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +6 -1
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +22 -27
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +3 -1
- package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +50 -20
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +13 -1
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +6 -11
- package/Server/Utils/Rules/MonitorRulePatternValidator.ts +51 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +110 -0
- package/Server/Utils/Rules/RuleRun/RuleApplication.ts +81 -0
- package/Server/Utils/Rules/RuleRun/RuleRunPermission.ts +188 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +803 -0
- package/Server/Utils/Rules/RuleRun/RuleRunner.ts +341 -0
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +3 -2
- package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +6 -4
- package/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.ts +263 -16
- package/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.ts +2101 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +194 -14
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +1 -2
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +38 -7
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +2 -0
- package/Server/Utils/SecurityEvent/Connectors/Types.ts +242 -2
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +1 -1
- package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +3 -3
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +2 -2
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +217 -56
- package/Server/Utils/Slo/SloFeedUtil.ts +200 -0
- package/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.ts +173 -0
- package/Server/Utils/Slo/SloMetricUtil.ts +327 -0
- package/Server/Utils/Slo/SloOwnerReferenceValidator.ts +208 -0
- package/Server/Utils/Slo/SloRecordReferenceValidator.ts +169 -0
- package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +6 -43
- package/Server/Utils/StatusPageResource.ts +50 -5
- package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +664 -15
- package/Tests/App/Dashboard/AddWidgetModal.test.tsx +4 -1
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +307 -0
- package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +289 -0
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +598 -0
- package/Tests/App/Dashboard/BillingDefaultPaymentMethod.test.tsx +1046 -0
- package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +3 -0
- package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +201 -7
- package/Tests/App/Dashboard/BooleanSeriesCriteriaFilterText.test.ts +82 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +16 -1
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +116 -8
- package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +168 -1
- package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +1 -1
- package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +20 -3
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +1095 -1
- package/Tests/App/Dashboard/CorrelateFilterChips.test.tsx +910 -0
- package/Tests/App/Dashboard/CorrelateGraph.test.tsx +3747 -25
- package/Tests/App/Dashboard/CorrelateGraphHelpers.test.ts +1085 -0
- package/Tests/App/Dashboard/CorrelateInspector.test.tsx +1534 -0
- package/Tests/App/Dashboard/CorrelateNodeCard.test.tsx +965 -0
- package/Tests/App/Dashboard/CorrelateResultSummary.test.tsx +1525 -0
- package/Tests/App/Dashboard/CorrelationGraph.test.ts +1030 -0
- package/Tests/App/Dashboard/CorrelationGraphLayout.test.ts +526 -0
- package/Tests/App/Dashboard/DeviceDiagnostics.test.tsx +787 -0
- package/Tests/App/Dashboard/DeviceLatencyTrend.test.tsx +278 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +279 -0
- package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +87 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +443 -8
- package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +340 -0
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +98 -2
- package/Tests/App/Dashboard/ExceptionSegmentedControl.test.tsx +1020 -0
- package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +268 -47
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1114 -76
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +124 -2
- package/Tests/App/Dashboard/InvestigationReportView.test.tsx +279 -176
- package/Tests/App/Dashboard/InvestigationRunDetails.test.tsx +1166 -0
- package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +437 -0
- package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +65 -0
- package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +5 -0
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +74 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +125 -5
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +1764 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1000 -64
- package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +448 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +739 -189
- package/Tests/App/Dashboard/SecurityEventSeverityPill.test.tsx +233 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +282 -0
- package/Tests/App/Dashboard/SloActiveBurnEventsCard.test.tsx +538 -0
- package/Tests/App/Dashboard/SloBulkActionsArchive.test.tsx +252 -0
- package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +322 -518
- package/Tests/App/Dashboard/SloElement.test.tsx +194 -0
- package/Tests/App/Dashboard/SloFeed.test.tsx +289 -0
- package/Tests/App/Dashboard/SloHistoryCharts.test.tsx +471 -0
- package/Tests/App/Dashboard/SloHistorySeries.test.tsx +607 -0
- package/Tests/App/Dashboard/SloListWidget.test.tsx +783 -0
- package/Tests/App/Dashboard/SloMetricsPage.test.tsx +346 -0
- package/Tests/App/Dashboard/SloMonitorsPage.test.tsx +661 -0
- package/Tests/App/Dashboard/SloMonitorsSummaryCard.test.tsx +489 -0
- package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +437 -0
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +305 -0
- package/Tests/App/Dashboard/SloOverviewData.test.tsx +563 -0
- package/Tests/App/Dashboard/SloOverviewHero.test.tsx +311 -0
- package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +426 -0
- package/Tests/App/Dashboard/SloOverviewSidebarCards.test.tsx +493 -0
- package/Tests/App/Dashboard/SloSettings.test.tsx +633 -0
- package/Tests/App/Dashboard/SloStatusSummaryCards.test.tsx +403 -0
- package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +373 -0
- package/Tests/App/Dashboard/SloWidgetVariableBinding.test.tsx +689 -0
- package/Tests/App/Dashboard/TopologyConnectivitySection.test.tsx +206 -0
- package/Tests/App/Dashboard/TracesEntityNames.test.tsx +47 -15
- package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +1312 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +9 -1
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +14 -16
- package/Tests/Models/DatabaseModels/AuditLogModelConfiguration.test.ts +442 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +9 -10
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +48 -1
- package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +835 -0
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +3 -2
- package/Tests/Models/DiscoveryScanNetbiosLookupColumn.test.ts +328 -0
- package/Tests/Models/DiscoveryScanShortDeviceNamesColumn.test.ts +335 -0
- package/Tests/Models/NetworkDeviceDiagnosticContract.test.ts +194 -0
- package/Tests/Models/NetworkDeviceDnsNameColumn.test.ts +321 -0
- package/Tests/Models/ProjectDataResidencyColumn.test.ts +154 -0
- package/Tests/Models/SecurityDomainAccessControl.test.ts +181 -50
- package/Tests/Server/API/BaseAPI.test.ts +6 -0
- package/Tests/Server/API/BaseAPIUpdateMiscDataProps.test.ts +217 -0
- package/Tests/Server/API/BillingInvoiceAPI.test.ts +7 -0
- package/Tests/Server/API/BillingInvoiceAPIPaymentStates.test.ts +990 -0
- package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +498 -0
- package/Tests/Server/API/DashboardPublicSloAPI.test.ts +405 -0
- package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +901 -7
- package/Tests/Server/API/SessionReplayAPI.test.ts +116 -0
- package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +857 -0
- package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +1084 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +33 -3
- package/Tests/Server/Infrastructure/Postgres/AddDataResidencyToProjectMigration.test.ts +202 -0
- package/Tests/Server/Infrastructure/Postgres/AddNetbiosLookupToNetworkDeviceDiscoveryScanMigration.test.ts +330 -0
- package/Tests/Server/Infrastructure/Postgres/AddNetworkDeviceDnsNameAndShortDeviceNamesMigration.test.ts +340 -0
- package/Tests/Server/Infrastructure/Postgres/BackfillSloMonitorRulesAndAffectedResourcesMigration.test.ts +343 -0
- package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +801 -0
- package/Tests/Server/Services/AddSubscriberUpdateNotificationStatusMigration.test.ts +307 -0
- package/Tests/Server/Services/AuditLogService.test.ts +1124 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +200 -1
- package/Tests/Server/Services/BillingInvoiceServiceMutexRelease.test.ts +254 -0
- package/Tests/Server/Services/BillingService.test.ts +70 -0
- package/Tests/Server/Services/BillingServicePayInvoiceStates.test.ts +723 -0
- package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +14 -2
- package/Tests/Server/Services/BillingServiceSubscriptionPaymentMethodSync.test.ts +1634 -0
- package/Tests/Server/Services/DatabaseServiceAuditRelationDiff.test.ts +492 -0
- package/Tests/Server/Services/DatabaseServicePasswordFieldSecrets.test.ts +629 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +431 -0
- package/Tests/Server/Services/IncidentAlertSloReferenceGuard.test.ts +358 -0
- package/Tests/Server/Services/MonitorProbeServicePastDueMonitoring.test.ts +362 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1460 -1
- package/Tests/Server/Services/NetworkDeviceDiagnosticService.test.ts +962 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +106 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +10 -1
- package/Tests/Server/Services/NetworkDeviceServicePastDueMonitoring.test.ts +335 -0
- package/Tests/Server/Services/NetworkDeviceSiteRuleDnsName.test.ts +568 -0
- package/Tests/Server/Services/ProjectDataResidencyPostgres.test.ts +344 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +187 -0
- package/Tests/Server/Services/ProjectServiceDataResidency.test.ts +369 -0
- package/Tests/Server/Services/ProjectServiceDataResidencySelfHosted.test.ts +176 -0
- package/Tests/Server/Services/ProjectServicePastDueMonitoring.test.ts +289 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +24 -8
- package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +1396 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupARun.test.ts +917 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +1262 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +902 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +1163 -0
- package/Tests/Server/Services/RuleRun/PrivacyRuleEnginesRun.test.ts +843 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +465 -0
- package/Tests/Server/Services/SecurityEventConnectionService.test.ts +525 -4
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +77 -23
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleFeedWrites.test.ts +777 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleOptions.test.ts +1399 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +67 -74
- package/Tests/Server/Services/ServiceLevelObjectiveChildRowTenancy.test.ts +906 -0
- package/Tests/Server/Services/ServiceLevelObjectiveDeleteTenancy.test.ts +1029 -0
- package/Tests/Server/Services/ServiceLevelObjectiveFeedService.test.ts +313 -0
- package/Tests/Server/Services/ServiceLevelObjectiveFeedWrites.test.ts +1214 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMarkdownLink.test.ts +289 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +1455 -430
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleLegacyLabelAdoption.test.ts +634 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +1193 -0
- package/Tests/Server/Services/{SloMonitorLabelRuleHooks.test.ts → ServiceLevelObjectiveMonitorRuleTriggers.test.ts} +135 -41
- package/Tests/Server/Services/ServiceLevelObjectiveOwnerFeedWrites.test.ts +671 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +180 -85
- package/Tests/Server/Services/ServiceLevelObjectiveServiceArchive.test.ts +537 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceLegacyMonitorLabelWrite.test.ts +870 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceMonitorRuleGuard.test.ts +343 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceReEvaluation.test.ts +246 -0
- package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +501 -0
- package/Tests/Server/Services/SloAffectedResourceLinkContract.test.ts +86 -0
- package/Tests/Server/Services/SloAffectedResourceMetricAttributes.test.ts +547 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +10 -4
- package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +7 -2
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +174 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateServiceVariables.test.ts +40 -0
- package/Tests/Server/Services/SubscriberUpdateNotificationHooks.test.ts +541 -0
- package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +288 -0
- package/Tests/Server/TestingUtils/PastDueMonitoringClaimSql.ts +177 -0
- package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +51 -10
- package/Tests/Server/TestingUtils/__mocks__/Stripe.mock.ts +16 -1
- package/Tests/Server/Types/Database/Permissions/ProjectDataResidencyColumn.test.ts +386 -0
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +26 -36
- package/Tests/Server/Utils/AI/SloAffectedResourceAIContext.test.ts +445 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +423 -1
- package/Tests/Server/Utils/AI/SloToolsArchive.test.ts +294 -0
- package/Tests/Server/Utils/AI/SloToolsRuleReadPermissions.test.ts +297 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +255 -10
- package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +404 -750
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +45 -0
- package/Tests/Server/Utils/Database/RelationValueUtil.test.ts +157 -0
- package/Tests/Server/Utils/Monitor/Criteria/BooleanSeriesEvaluateOverTime.test.ts +260 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +181 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +147 -30
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.test.ts +17 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +136 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidatorLoadOrder.test.ts +472 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +48 -2
- package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +435 -475
- package/Tests/Server/Utils/Rules/MonitorRulePatternValidator.test.ts +77 -0
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +177 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +365 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunRegistry.test.ts +173 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunner.test.ts +675 -0
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +8 -8
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorFetchSummary.test.ts +261 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +68 -13
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsAuth.test.ts → Connectors/GoogleSecOps/GoogleSecOpsAuth.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClient.test.ts → Connectors/GoogleSecOps/GoogleSecOpsClient.test.ts} +4 -4
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.test.ts +483 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorCuratedAndLateAlerts.test.ts +676 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFetchEvents.test.ts +1994 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFixtures.ts +332 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorHttpIntegration.test.ts +680 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorRequestContract.test.ts +1206 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorTestConnection.test.ts +1136 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsCuratedRuleCounts.test.ts +407 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsErrorHandling.test.ts → Connectors/GoogleSecOps/GoogleSecOpsErrorHandling.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingAdaptiveCatchUp.test.ts +730 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClickhouseIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts} +130 -35
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFailureTaxonomy.test.ts +772 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFixtures.ts +648 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsHttpIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingHttpIntegration.test.ts} +230 -225
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingIntegration.test.ts +1390 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingLoop.test.ts +981 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingNothingImportedRegression.test.ts +290 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsRequestContract.test.ts → Connectors/GoogleSecOps/GoogleSecOpsRequestContract.test.ts} +2 -2
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsResponseParsing.test.ts → Connectors/GoogleSecOps/GoogleSecOpsResponseParsing.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsSearchDetections.test.ts → Connectors/GoogleSecOps/GoogleSecOpsSearchDetections.test.ts} +38 -5
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsTesterIntegration.test.ts +421 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +1445 -3
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +14 -4
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +313 -4
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +352 -0
- package/Tests/Server/Utils/Slo/SloFeedUtil.test.ts +326 -0
- package/Tests/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.test.ts +260 -0
- package/Tests/Server/Utils/Slo/SloMetricUtil.test.ts +592 -0
- package/Tests/Server/Utils/Slo/SloRecordReferenceValidator.test.ts +311 -0
- package/Tests/Server/Utils/StatusPageResource.test.ts +91 -3
- package/Tests/Types/Billing/SubscriptionStatus.test.ts +176 -0
- package/Tests/Types/Billing/SubscriptionStatusPastDueMonitoring.test.ts +187 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +53 -7
- package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +816 -792
- package/Tests/Types/Monitor/CriteriaFilter.test.ts +216 -24
- package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepRetriesParsing.test.ts +201 -0
- package/Tests/Types/Rules/RuleRun.test.ts +315 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +60 -0
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +29 -4
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +217 -0
- package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +200 -0
- package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +141 -87
- package/Tests/UI/Components/AlertBanner.test.tsx +319 -0
- package/Tests/UI/Components/BulkArchiveActionsCopy.test.tsx +310 -0
- package/Tests/UI/Components/Detail/DetailIdIsUnique.test.tsx +87 -0
- package/Tests/UI/Components/Dropdown/DropdownClearable.test.tsx +393 -0
- package/Tests/UI/Components/Dropdown/DropdownMultiSelectChipAccessibleName.test.tsx +64 -0
- package/Tests/UI/Components/EmptyState/EmptyState.test.tsx +335 -4
- package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +337 -0
- package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +21 -20
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +15 -2
- package/Tests/UI/Components/LockedFilterChip.test.tsx +281 -144
- package/Tests/UI/Components/MoreMenu.test.tsx +133 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +84 -3
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/RuleRun/RuleDetailFields.test.tsx +336 -0
- package/Tests/UI/Components/RuleRun/RuleTable.test.tsx +304 -0
- package/Tests/UI/Components/RuleRun/RunRuleNowModal.test.tsx +231 -0
- package/Tests/UI/Components/RuleRun/RunRulesBulkAction.test.ts +213 -0
- package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +124 -61
- package/Tests/UI/Rum/ReplayEngine.test.ts +154 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +234 -123
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +122 -0
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +245 -0
- package/Tests/UI/Rum/ReplayRail.test.tsx +294 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +213 -1
- package/Tests/UI/Rum/ReplayStage.test.tsx +565 -172
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +260 -3
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +1391 -0
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +222 -0
- package/Tests/UI/Utils/DashboardStackingLayers.test.ts +8 -1
- package/Tests/UI/Utils/RuleRunClient.test.ts +303 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +1 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +2 -0
- package/Tests/Utils/Dashboard/Components/DashboardSloListComponent.test.ts +206 -0
- package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +36 -2
- package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +409 -588
- package/Tests/Utils/Dashboard/SloWidgetSource.test.ts +351 -0
- package/Tests/Utils/Markdown/MarkdownEscape.test.ts +361 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +1425 -118
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +188 -3
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +661 -13
- package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +349 -0
- package/Tests/Utils/NetworkDiscovery/RunImportedDeviceNaming.test.ts +656 -0
- package/Tests/Utils/NetworkDiscovery/ShortDeviceNamePlanner.test.ts +1020 -0
- package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +619 -0
- package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +317 -0
- package/Tests/Utils/Project/DataResidency.test.ts +198 -0
- package/Tests/Utils/Rules/RuleRunSummary.test.ts +394 -0
- package/Tests/Utils/Slo/SloAffectedResourceMarkdown.test.ts +302 -0
- package/Tests/Utils/Slo/SloBurnRateTemplate.test.ts +468 -0
- package/Tests/Utils/Slo/SloEvaluation.test.ts +20 -4
- package/Tests/Utils/Slo/SloFeedMarkdown.test.ts +1185 -0
- package/Tests/Utils/Slo/SloHealth.test.ts +262 -0
- package/Tests/Utils/Slo/SloHistoryMetricName.test.ts +102 -0
- package/Tests/Utils/Slo/SloListWidgetFormat.test.ts +522 -0
- package/Tests/Utils/Slo/SloMetricType.test.ts +355 -0
- package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +387 -0
- package/Tests/Utils/Slo/SloMonitorStatusSummary.test.ts +210 -0
- package/Tests/Utils/Slo/SloOverviewText.test.ts +226 -0
- package/Tests/Utils/Slo/SloProjection.test.ts +1039 -0
- package/Tests/Utils/Slo/SloWidgetFormat.test.ts +47 -0
- package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +1 -80
- package/Types/BaseDatabase/EnableAuditLogOn.ts +41 -0
- package/Types/Billing/SubscriptionStatus.ts +39 -4
- package/Types/Dashboard/DashboardComponentType.ts +1 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +5 -0
- package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +10 -0
- package/Types/Dashboard/DashboardComponents/DashboardSloListComponent.ts +29 -0
- package/Types/Dashboard/DashboardTemplates.ts +290 -297
- package/Types/Database/EnableAuditLog.ts +23 -1
- package/Types/Email/EmailTemplateType.ts +4 -0
- package/Types/Monitor/CriteriaFilter.ts +55 -8
- package/Types/Monitor/MonitorStep.ts +5 -2
- package/Types/Monitor/MonitorStepDnsMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepDnssecMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepDomainMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepExternalStatusPageMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepRetries.ts +59 -0
- package/Types/Monitor/MonitorStepSnmpMonitor.ts +9 -2
- package/Types/NetworkDevice/NetworkDeviceDiagnosticResult.ts +104 -0
- package/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.ts +47 -0
- package/Types/NetworkDevice/NetworkDeviceDiagnosticType.ts +47 -0
- package/Types/NetworkDevice/NetworkDevicePingMetricNames.ts +20 -0
- package/Types/Permission.ts +127 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +5 -0
- package/Types/Rules/RuleRun.ts +518 -0
- package/Types/Rum/SessionReplayApi.ts +18 -0
- package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +6 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +30 -4
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +108 -1
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +6 -2
- package/Types/ServiceLevelObjective/SloHistoryMetricName.ts +25 -0
- package/Types/ServiceLevelObjective/SloMetricType.ts +49 -0
- package/Types/StatusPage/StatusPageSubscriberNotificationEventType.ts +4 -0
- package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +331 -0
- package/Types/StatusPage/SubscriberNotificationTrigger.ts +12 -0
- package/Types/StatusPage/SubscriberUpdateNotification.ts +89 -0
- package/Types/Telemetry/LockedFilterDetail.ts +7 -28
- package/Types/Telemetry/ServiceType.ts +7 -0
- package/Typings/Index.d.ts +53 -3
- package/UI/Components/AlertBanner/AlertBanner.tsx +85 -27
- package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +21 -2
- package/UI/Components/Detail/Detail.tsx +9 -2
- package/UI/Components/Dropdown/Dropdown.tsx +64 -1
- package/UI/Components/EmptyState/EmptyState.tsx +27 -3
- package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +124 -0
- package/UI/Components/Forms/ModelForm.tsx +6 -5
- package/UI/Components/LabelRule/LabelRuleTable.tsx +8 -2
- package/UI/Components/LogsViewer/LogsViewer.tsx +2 -6
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +2 -13
- package/UI/Components/LogsViewer/types.ts +2 -2
- package/UI/Components/MoreMenu/MoreMenu.tsx +14 -3
- package/UI/Components/RuleRun/RuleDetailFields.tsx +359 -0
- package/UI/Components/RuleRun/RuleTable.tsx +183 -0
- package/UI/Components/RuleRun/RuleView.tsx +170 -0
- package/UI/Components/RuleRun/RunRuleNowModal.tsx +147 -0
- package/UI/Components/RuleRun/RunRulesBulkAction.ts +103 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +2 -6
- package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +38 -104
- package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +2 -18
- package/UI/Components/TelemetryViewer/types.ts +2 -2
- package/UI/Utils/Rules/RuleRunClient.ts +178 -0
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +8 -0
- package/Utils/Dashboard/Components/DashboardSloComponent.ts +19 -2
- package/Utils/Dashboard/Components/DashboardSloListComponent.ts +126 -0
- package/Utils/Dashboard/Components/Index.ts +7 -0
- package/Utils/Dashboard/SloWidgetSource.ts +188 -0
- package/Utils/Markdown/MarkdownEscape.ts +63 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +161 -36
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +25 -0
- package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +146 -0
- package/Utils/NetworkDiscovery/RunImportedDeviceNaming.ts +390 -0
- package/Utils/NetworkDiscovery/ShortDeviceNamePlanner.ts +291 -0
- package/Utils/NetworkDiscovery/ShortHostnameUtil.ts +91 -0
- package/Utils/NetworkSite/CidrMatchUtil.ts +37 -12
- package/Utils/Project/DataResidency.ts +63 -0
- package/Utils/Rules/RuleRunSummary.ts +323 -0
- package/Utils/Slo/SloAffectedResourceMarkdown.ts +123 -0
- package/Utils/Slo/SloBurnRateTemplate.ts +373 -0
- package/Utils/Slo/SloFeedMarkdown.ts +1507 -0
- package/Utils/Slo/SloHealth.ts +96 -9
- package/Utils/Slo/SloListWidgetFormat.ts +370 -0
- package/Utils/Slo/SloMetricType.ts +237 -0
- package/Utils/Slo/SloMonitorRuleCriteria.ts +364 -0
- package/Utils/Slo/SloMonitorStatusSummary.ts +210 -0
- package/Utils/Slo/SloOverviewText.ts +265 -0
- package/Utils/Slo/SloProjection.ts +967 -0
- package/Utils/Slo/SloWidgetFormat.ts +12 -2
- package/Utils/Telemetry/LockedFilterSearch.ts +3 -49
- package/build/dist/Models/AnalyticsModels/AuditLog.js +70 -1
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +4 -4
- package/build/dist/Models/DatabaseModels/Alert.js +60 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +64 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +6 -4
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +68 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js +772 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +140 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +42 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +11 -11
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +192 -10
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +798 -96
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +596 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +590 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +16 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +16 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +75 -0
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +1 -1
- package/build/dist/Server/API/BaseAPI.js +14 -0
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +233 -19
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/BillingPaymentMethodAPI.js +86 -5
- package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +72 -2
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/SecurityEventConnectionAPI.js +102 -10
- package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +236 -154
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js +21 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js +207 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js +72 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js +46 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +112 -56
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +167 -68
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +87 -26
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +270 -203
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +498 -354
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +97 -34
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +91 -8
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AuditLogService.js +408 -44
- package/build/dist/Server/Services/AuditLogService.js.map +1 -1
- package/build/dist/Server/Services/BillingInvoiceService.js +94 -85
- package/build/dist/Server/Services/BillingInvoiceService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +406 -14
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +135 -86
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +189 -100
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +125 -18
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +145 -91
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +191 -101
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +190 -102
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +112 -56
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +220 -63
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +87 -26
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +258 -192
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +519 -376
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +95 -32
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +90 -5
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +113 -65
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +6 -4
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +145 -91
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +191 -101
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +20 -25
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +123 -77
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +167 -82
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +18 -2
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +11 -9
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +287 -5
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js +333 -0
- package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +36 -2
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +117 -64
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +173 -83
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +116 -65
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +82 -10
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +111 -63
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +161 -77
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +280 -209
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +521 -376
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +24 -0
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +24 -8
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventConnectionService.js +43 -3
- package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +115 -62
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +163 -77
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +769 -18
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js +96 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +614 -87
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +844 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +207 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +221 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +997 -50
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +191 -102
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageAnnouncementService.js +12 -0
- package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +118 -70
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +158 -76
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +19 -215
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +6 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +27 -5
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/ThreatIntelFeedService.js +1 -1
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js +17 -0
- package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +31 -0
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +24 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +21 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +337 -53
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +108 -15
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +2 -2
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +115 -6
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +13 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/Database/RelationValueUtil.js +82 -0
- package/build/dist/Server/Utils/Database/RelationValueUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +10 -6
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +17 -21
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +5 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +50 -10
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +13 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +6 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js +34 -0
- package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +69 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js +25 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js +128 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +746 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js +221 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +3 -2
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +6 -4
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.js +174 -14
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js +1417 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +138 -18
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +1 -2
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +23 -18
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +2 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +95 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +3 -3
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +2 -2
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +118 -40
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/Slo/SloFeedUtil.js +150 -0
- package/build/dist/Server/Utils/Slo/SloFeedUtil.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js +136 -0
- package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloMetricUtil.js +269 -0
- package/build/dist/Server/Utils/Slo/SloMetricUtil.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js +134 -0
- package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js +137 -0
- package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +6 -26
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageResource.js +31 -5
- package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
- package/build/dist/Types/Billing/SubscriptionStatus.js +37 -3
- package/build/dist/Types/Billing/SubscriptionStatus.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +5 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +275 -286
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Database/EnableAuditLog.js +19 -1
- package/build/dist/Types/Database/EnableAuditLog.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +4 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -6
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +2 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepRetries.js +47 -0
- package/build/dist/Types/Monitor/MonitorStepRetries.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js.map +1 -1
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js +29 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js +37 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js +42 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js +20 -0
- package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js.map +1 -0
- package/build/dist/Types/Permission.js +114 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +5 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +267 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +16 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +65 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +6 -2
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -1
- package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js +26 -0
- package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js.map +1 -0
- package/build/dist/Types/ServiceLevelObjective/SloMetricType.js +45 -0
- package/build/dist/Types/ServiceLevelObjective/SloMetricType.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js +4 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js.map +1 -1
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +295 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js +13 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +67 -0
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js +7 -7
- package/build/dist/Types/Telemetry/ServiceType.js +7 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/AlertBanner/AlertBanner.js +48 -19
- package/build/dist/UI/Components/AlertBanner/AlertBanner.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +10 -2
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +12 -3
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -5
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js +3 -3
- package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +47 -0
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +1 -0
- package/build/dist/UI/Components/Forms/ModelForm.js +6 -5
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +6 -2
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +0 -2
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +3 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/RuleRun/RuleDetailFields.js +226 -0
- package/build/dist/UI/Components/RuleRun/RuleDetailFields.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RuleTable.js +97 -0
- package/build/dist/UI/Components/RuleRun/RuleTable.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RuleView.js +83 -0
- package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js +74 -0
- package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js +78 -0
- package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +24 -50
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +0 -4
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Utils/Rules/RuleRunClient.js +98 -0
- package/build/dist/UI/Utils/Rules/RuleRunClient.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +8 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +16 -2
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js +94 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Dashboard/SloWidgetSource.js +125 -0
- package/build/dist/Utils/Dashboard/SloWidgetSource.js.map +1 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js +49 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +112 -34
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +22 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +129 -0
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js +255 -0
- package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js +184 -0
- package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js +79 -0
- package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +21 -12
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
- package/build/dist/Utils/Project/DataResidency.js +51 -0
- package/build/dist/Utils/Project/DataResidency.js.map +1 -0
- package/build/dist/Utils/Rules/RuleRunSummary.js +197 -0
- package/build/dist/Utils/Rules/RuleRunSummary.js.map +1 -0
- package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js +51 -0
- package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js.map +1 -0
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js +228 -0
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js.map +1 -0
- package/build/dist/Utils/Slo/SloFeedMarkdown.js +934 -0
- package/build/dist/Utils/Slo/SloFeedMarkdown.js.map +1 -0
- package/build/dist/Utils/Slo/SloHealth.js +75 -9
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/Slo/SloListWidgetFormat.js +217 -0
- package/build/dist/Utils/Slo/SloListWidgetFormat.js.map +1 -0
- package/build/dist/Utils/Slo/SloMetricType.js +212 -0
- package/build/dist/Utils/Slo/SloMetricType.js.map +1 -0
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +216 -0
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -0
- package/build/dist/Utils/Slo/SloMonitorStatusSummary.js +129 -0
- package/build/dist/Utils/Slo/SloMonitorStatusSummary.js.map +1 -0
- package/build/dist/Utils/Slo/SloOverviewText.js +110 -0
- package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -0
- package/build/dist/Utils/Slo/SloProjection.js +448 -0
- package/build/dist/Utils/Slo/SloProjection.js.map +1 -0
- package/build/dist/Utils/Slo/SloWidgetFormat.js +4 -2
- package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -1
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js +1 -26
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -1
- package/package.json +1 -1
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +0 -447
- package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +0 -263
- package/Server/API/GoogleSecOpsConnectionAPI.ts +0 -320
- package/Server/Services/GoogleSecOpsConnectionRunService.ts +0 -10
- package/Server/Services/GoogleSecOpsConnectionService.ts +0 -116
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +0 -777
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +0 -1373
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +0 -512
- package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +0 -838
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +0 -441
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +0 -1001
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +0 -657
- package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +0 -153
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +0 -784
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +0 -823
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +0 -918
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +0 -738
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +0 -874
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +0 -1297
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +0 -1577
- package/Tests/UI/Components/LockedFilterActions.test.tsx +0 -396
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +0 -111
- package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +0 -205
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +0 -478
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +0 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +0 -287
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +0 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +0 -231
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +0 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +0 -9
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +0 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +0 -70
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +0 -537
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +0 -1034
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +0 -410
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +0 -1
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +0 -2
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +0 -1
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +0 -88
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +0 -1
|
@@ -1,100 +1,90 @@
|
|
|
1
1
|
import PublicDashboardResourceListPolicy, {
|
|
2
2
|
PublicDashboardResourceListPolicyResult,
|
|
3
3
|
} from "../../../../Server/Utils/Dashboard/PublicDashboardResourceListPolicy";
|
|
4
|
-
import
|
|
5
|
-
|
|
4
|
+
import PublicDashboardSloHistoryPolicy, {
|
|
5
|
+
PublicDashboardSloHistoryPolicyResult,
|
|
6
|
+
} from "../../../../Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy";
|
|
7
|
+
import {
|
|
8
|
+
PUBLIC_SLO_WIDGET_NO_SELECTION_MESSAGE,
|
|
9
|
+
PublicDashboardSloWidgetTargetKind,
|
|
6
10
|
} from "../../../../Server/Utils/Dashboard/PublicDashboardSloWidget";
|
|
7
11
|
import PublicDashboardViewConfig from "../../../../Server/Utils/Dashboard/PublicDashboardViewConfig";
|
|
8
|
-
import Alert from "../../../../Models/DatabaseModels/Alert";
|
|
9
12
|
import DatabaseBaseModel from "../../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
10
|
-
import Incident from "../../../../Models/DatabaseModels/Incident";
|
|
11
|
-
import Monitor from "../../../../Models/DatabaseModels/Monitor";
|
|
12
13
|
import ServiceLevelObjective from "../../../../Models/DatabaseModels/ServiceLevelObjective";
|
|
14
|
+
import Includes from "../../../../Types/BaseDatabase/Includes";
|
|
13
15
|
import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
|
|
14
16
|
import { LIMIT_PER_PROJECT } from "../../../../Types/Database/LimitMax";
|
|
15
17
|
import DashboardBaseComponent from "../../../../Types/Dashboard/DashboardComponents/DashboardBaseComponent";
|
|
16
|
-
import {
|
|
17
|
-
SloWidgetDisplayType,
|
|
18
|
-
SloWidgetMetric,
|
|
19
|
-
} from "../../../../Types/Dashboard/DashboardComponents/DashboardSloComponent";
|
|
18
|
+
import { SloWidgetDisplayType } from "../../../../Types/Dashboard/DashboardComponents/DashboardSloComponent";
|
|
20
19
|
import DashboardComponentType from "../../../../Types/Dashboard/DashboardComponentType";
|
|
21
20
|
import {
|
|
22
21
|
DashboardTemplateType,
|
|
23
22
|
getTemplateConfig,
|
|
24
23
|
} from "../../../../Types/Dashboard/DashboardTemplates";
|
|
25
|
-
import DashboardVariable
|
|
26
|
-
DashboardVariableType,
|
|
27
|
-
} from "../../../../Types/Dashboard/DashboardVariable";
|
|
24
|
+
import DashboardVariable from "../../../../Types/Dashboard/DashboardVariable";
|
|
28
25
|
import DashboardViewConfig from "../../../../Types/Dashboard/DashboardViewConfig";
|
|
29
26
|
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
30
27
|
import { JSONObject } from "../../../../Types/JSON";
|
|
31
28
|
import ObjectID from "../../../../Types/ObjectID";
|
|
29
|
+
import SloStatus from "../../../../Types/ServiceLevelObjective/SloStatus";
|
|
30
|
+
import { SLO_LIST_DEFAULT_MAX_ROWS } from "../../../../Utils/Slo/SloListWidgetFormat";
|
|
32
31
|
import { describe, expect, it } from "@jest/globals";
|
|
33
32
|
|
|
34
33
|
/*
|
|
35
|
-
* The SLO template's own stored config, driven through the server
|
|
36
|
-
*
|
|
34
|
+
* The SLO template's own stored config, driven through the server policies
|
|
35
|
+
* that stand between an ANONYMOUS public-dashboard viewer and the project's
|
|
36
|
+
* data.
|
|
37
37
|
*
|
|
38
|
-
* The editorial suite
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* their author picked.
|
|
38
|
+
* The editorial suite pins what the template SAYS. This one pins what it can
|
|
39
|
+
* be made to DO once a dashboard created from it is published: which rows the
|
|
40
|
+
* unauthenticated routes read, which columns travel to the viewer, what the
|
|
41
|
+
* viewer's toolbar selection is allowed to change, and which widgets fail
|
|
42
|
+
* closed.
|
|
44
43
|
*
|
|
45
|
-
* Written against the template rather than
|
|
46
|
-
*
|
|
47
|
-
* dashboards, so the two files have to agree about the same JSON, and a
|
|
48
|
-
* change to either one that breaks that agreement fails here.
|
|
44
|
+
* Written against the template rather than hand-built widgets: a widget the
|
|
45
|
+
* template ships is a widget that exists on real public dashboards.
|
|
49
46
|
*/
|
|
50
47
|
|
|
51
48
|
// -- Fixtures --------------------------------------------------------------
|
|
52
49
|
|
|
53
50
|
/*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* modelled here rather than assumed.
|
|
51
|
+
* DashboardAPI stamps the owning dashboard's project over every policy query
|
|
52
|
+
* as the LAST word before the root read, so it is modelled rather than assumed.
|
|
57
53
|
*/
|
|
58
54
|
const DASHBOARD_PROJECT_ID: ObjectID = ObjectID.generate();
|
|
59
55
|
|
|
60
|
-
|
|
61
|
-
const PICKED_SLO_ID: ObjectID = ObjectID.generate();
|
|
56
|
+
const PICKED_SLO: string = "Checkout API";
|
|
62
57
|
|
|
63
58
|
/*
|
|
64
|
-
* Everything a caller of the public endpoint controls
|
|
65
|
-
*
|
|
66
|
-
* another row set, an unbounded page. None of it may reach the query.
|
|
59
|
+
* Everything a caller of the public endpoint controls that names something the
|
|
60
|
+
* dashboard never published. None of it may reach the query.
|
|
67
61
|
*/
|
|
68
62
|
const HOSTILE_QUERY: JSONObject = {
|
|
69
63
|
_id: ObjectID.generate().toString(),
|
|
70
64
|
projectId: ObjectID.generate().toString(),
|
|
71
65
|
name: "probe",
|
|
72
|
-
|
|
73
|
-
|
|
66
|
+
isArchived: true,
|
|
67
|
+
description: "leak",
|
|
74
68
|
limit: 100000,
|
|
75
69
|
skip: 500,
|
|
76
70
|
};
|
|
77
71
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
* are pinned as literals: they are what an operator reads when a public page
|
|
81
|
-
* shows an error, and they say two DIFFERENT things — "nobody picked an
|
|
82
|
-
* objective yet" versus "this kind of widget has no public list at all".
|
|
83
|
-
*/
|
|
84
|
-
const NO_OBJECTIVE_MESSAGE: string =
|
|
85
|
-
"This dashboard widget has no Service Level Objective selected.";
|
|
72
|
+
const UNSUPPORTED_MESSAGE_PREFIX: string =
|
|
73
|
+
"Unsupported public dashboard resource widget: ";
|
|
86
74
|
|
|
87
75
|
/*
|
|
88
|
-
* The
|
|
89
|
-
*
|
|
90
|
-
* fall-through walk at the bottom of the file.
|
|
76
|
+
* The seven display fields (plus the row id) both SLO widgets render. Pinned
|
|
77
|
+
* as a literal: this IS what an anonymous viewer can read.
|
|
91
78
|
*/
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
79
|
+
const PUBLISHED_SLO_SELECT: JSONObject = {
|
|
80
|
+
_id: true,
|
|
81
|
+
name: true,
|
|
82
|
+
targetPercentage: true,
|
|
83
|
+
currentSliPercentage: true,
|
|
84
|
+
errorBudgetRemainingPercentage: true,
|
|
85
|
+
errorBudgetRemainingSeconds: true,
|
|
86
|
+
currentBurnRate: true,
|
|
87
|
+
sloStatus: true,
|
|
98
88
|
};
|
|
99
89
|
|
|
100
90
|
type WidgetArguments = Record<string, unknown>;
|
|
@@ -104,8 +94,6 @@ type WidgetArguments = Record<string, unknown>;
|
|
|
104
94
|
/*
|
|
105
95
|
* The config exactly as the public route reads it back: sanitized for
|
|
106
96
|
* anonymous viewers, then through JSON, because it lives in a JSONB column.
|
|
107
|
-
* Anything the template puts in a widget argument that does not survive that
|
|
108
|
-
* round trip is not what the policy parses.
|
|
109
97
|
*/
|
|
110
98
|
function storedConfig(): DashboardViewConfig {
|
|
111
99
|
const sanitized: DashboardViewConfig | null =
|
|
@@ -129,31 +117,10 @@ function componentsOfType(
|
|
|
129
117
|
);
|
|
130
118
|
}
|
|
131
119
|
|
|
132
|
-
// Fails loudly (rather than returning undefined) when the widget is gone.
|
|
133
|
-
function onlyComponentOfType(
|
|
134
|
-
config: DashboardViewConfig,
|
|
135
|
-
componentType: DashboardComponentType,
|
|
136
|
-
): DashboardBaseComponent {
|
|
137
|
-
const matches: Array<DashboardBaseComponent> = componentsOfType(
|
|
138
|
-
config,
|
|
139
|
-
componentType,
|
|
140
|
-
);
|
|
141
|
-
|
|
142
|
-
expect(matches).toHaveLength(1);
|
|
143
|
-
|
|
144
|
-
return matches[0] as DashboardBaseComponent;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
120
|
function argumentsOf(component: DashboardBaseComponent): WidgetArguments {
|
|
148
121
|
return (component.arguments as WidgetArguments | undefined) || {};
|
|
149
122
|
}
|
|
150
123
|
|
|
151
|
-
/*
|
|
152
|
-
* Widget titles are the only stable handle on a template widget — component
|
|
153
|
-
* ids are regenerated on every getTemplateConfig() call and row positions
|
|
154
|
-
* move whenever a band is inserted. Each family stores its title under its
|
|
155
|
-
* own key; the Slo widget uses `widgetTitle`, which no other family does.
|
|
156
|
-
*/
|
|
157
124
|
function titleOf(component: DashboardBaseComponent): string {
|
|
158
125
|
const args: WidgetArguments = argumentsOf(component);
|
|
159
126
|
|
|
@@ -168,24 +135,29 @@ function titleOf(component: DashboardBaseComponent): string {
|
|
|
168
135
|
return "(untitled)";
|
|
169
136
|
}
|
|
170
137
|
|
|
171
|
-
// Every assertion below is labelled with this, so a failure names the widget.
|
|
172
138
|
function labelOf(component: DashboardBaseComponent): string {
|
|
173
139
|
return `${component.componentType} "${titleOf(component)}"`;
|
|
174
140
|
}
|
|
175
141
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
142
|
+
function sloVariableOf(config: DashboardViewConfig): DashboardVariable {
|
|
143
|
+
const variables: Array<DashboardVariable> = config.variables || [];
|
|
144
|
+
|
|
145
|
+
expect(variables).toHaveLength(1);
|
|
146
|
+
return variables[0] as DashboardVariable;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// What the browser sends for a single-select toolbar pick.
|
|
150
|
+
function selectionOf(
|
|
151
|
+
config: DashboardViewConfig,
|
|
152
|
+
selectedValue: string,
|
|
153
|
+
): Array<JSONObject> {
|
|
154
|
+
return [
|
|
155
|
+
{
|
|
156
|
+
id: sloVariableOf(config).id,
|
|
157
|
+
selectedValue: selectedValue,
|
|
158
|
+
selectedValues: [],
|
|
159
|
+
},
|
|
160
|
+
];
|
|
189
161
|
}
|
|
190
162
|
|
|
191
163
|
function buildPolicy(data: {
|
|
@@ -202,31 +174,20 @@ function buildPolicy(data: {
|
|
|
202
174
|
});
|
|
203
175
|
}
|
|
204
176
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
*/
|
|
210
|
-
function routeQuery(policy: PublicDashboardResourceListPolicyResult): {
|
|
211
|
-
[key: string]: unknown;
|
|
212
|
-
} {
|
|
177
|
+
// The query the route actually executes: the policy's, with the project stamped last.
|
|
178
|
+
function routeQuery(
|
|
179
|
+
policy: PublicDashboardResourceListPolicyResult,
|
|
180
|
+
): Record<string, unknown> {
|
|
213
181
|
return { ...policy.query, projectId: DASHBOARD_PROJECT_ID };
|
|
214
182
|
}
|
|
215
183
|
|
|
216
|
-
/*
|
|
217
|
-
* What the policy did with one stored widget, as a single comparable string:
|
|
218
|
-
* either the resource it will list, or the refusal it answered with. A widget
|
|
219
|
-
* that resolves where it should be refused reads as a plain diff rather than
|
|
220
|
-
* as a missing throw.
|
|
221
|
-
*/
|
|
222
184
|
function outcomeOf(data: {
|
|
223
185
|
config: DashboardViewConfig;
|
|
224
186
|
component: DashboardBaseComponent;
|
|
187
|
+
requestedVariables?: Array<JSONObject> | undefined;
|
|
225
188
|
}): string {
|
|
226
189
|
try {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
return `lists ${policy.resourceType}`;
|
|
190
|
+
return `lists ${buildPolicy(data).resourceType}`;
|
|
230
191
|
} catch (error) {
|
|
231
192
|
if (error instanceof BadDataException) {
|
|
232
193
|
return `refused: ${error.message}`;
|
|
@@ -236,146 +197,93 @@ function outcomeOf(data: {
|
|
|
236
197
|
}
|
|
237
198
|
}
|
|
238
199
|
|
|
239
|
-
function
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
* the one reason that is not a bug.
|
|
250
|
-
*/
|
|
251
|
-
if (component.componentType === DashboardComponentType.Slo) {
|
|
252
|
-
return `refused: ${NO_OBJECTIVE_MESSAGE}`;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/*
|
|
256
|
-
* Text, Value and Chart widgets read the metric store, not a Postgres list,
|
|
257
|
-
* so the public list endpoint has nothing to serve them — and says which
|
|
258
|
-
* widget kind it is turning away.
|
|
259
|
-
*/
|
|
260
|
-
return `refused: Unsupported public dashboard resource widget: ${component.componentType}`;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/*
|
|
264
|
-
* The columns the model declares that a widget's public select does NOT
|
|
265
|
-
* publish. Derived from the model itself so it cannot go stale as the model
|
|
266
|
-
* grows.
|
|
267
|
-
*/
|
|
268
|
-
function withheldColumnsOf(data: {
|
|
269
|
-
model: DatabaseBaseModel;
|
|
270
|
-
select: JSONObject;
|
|
271
|
-
}): Array<string> {
|
|
272
|
-
const published: Array<string> = Object.keys(data.select);
|
|
273
|
-
|
|
274
|
-
return data.model
|
|
275
|
-
.getTableColumns()
|
|
276
|
-
.columns.filter((column: string): boolean => {
|
|
277
|
-
return !published.includes(column);
|
|
200
|
+
function buildHistoryPolicy(data: {
|
|
201
|
+
config: DashboardViewConfig;
|
|
202
|
+
component: DashboardBaseComponent;
|
|
203
|
+
requestedVariables?: Array<JSONObject> | undefined;
|
|
204
|
+
}): PublicDashboardSloHistoryPolicyResult {
|
|
205
|
+
// The route resolves the viewer's selections exactly like this before building.
|
|
206
|
+
const variables: Array<DashboardVariable> =
|
|
207
|
+
PublicDashboardResourceListPolicy.resolveDashboardVariableSelections({
|
|
208
|
+
dashboardViewConfig: data.config,
|
|
209
|
+
requestedVariables: data.requestedVariables || [],
|
|
278
210
|
});
|
|
211
|
+
|
|
212
|
+
return PublicDashboardSloHistoryPolicy.build({
|
|
213
|
+
widget: data.component,
|
|
214
|
+
requestedAggregateBy: {
|
|
215
|
+
startTimestamp: new Date("2026-08-09T00:00:00.000Z"),
|
|
216
|
+
endTimestamp: new Date("2026-08-09T06:00:00.000Z"),
|
|
217
|
+
},
|
|
218
|
+
variables,
|
|
219
|
+
});
|
|
279
220
|
}
|
|
280
221
|
|
|
281
222
|
/*
|
|
282
|
-
*
|
|
283
|
-
*
|
|
284
|
-
*
|
|
285
|
-
* pinned select cannot quietly drift onto a field that no longer exists;
|
|
286
|
-
* - every column named as sensitive is a real column of the model AND is
|
|
287
|
-
* withheld. Checking that the name is real is what stops this list from
|
|
288
|
-
* rotting into a set of no-op assertions after a column rename.
|
|
223
|
+
* Columns the model declares that a select does NOT publish, derived from the
|
|
224
|
+
* model so each sensitive name is checked to be a real column before it is
|
|
225
|
+
* checked to be withheld — a rename cannot make an assertion vacuous.
|
|
289
226
|
*/
|
|
290
227
|
function expectSelectPublishesNothingSensitive(data: {
|
|
291
|
-
modelName: string;
|
|
292
228
|
model: DatabaseBaseModel;
|
|
293
229
|
select: JSONObject;
|
|
294
230
|
sensitiveColumns: Array<string>;
|
|
295
231
|
}): void {
|
|
296
232
|
const declared: Array<string> = data.model.getTableColumns().columns;
|
|
297
|
-
const
|
|
298
|
-
model: data.model,
|
|
299
|
-
select: data.select,
|
|
300
|
-
});
|
|
301
|
-
|
|
302
|
-
expect(declared.length).toBeGreaterThan(0);
|
|
303
|
-
expect(withheld.length).toBeGreaterThan(0);
|
|
304
|
-
expect(data.sensitiveColumns.length).toBeGreaterThan(0);
|
|
233
|
+
const published: Array<string> = Object.keys(data.select);
|
|
305
234
|
|
|
306
|
-
for (const column of
|
|
235
|
+
for (const column of published) {
|
|
307
236
|
expect(
|
|
308
|
-
`${
|
|
309
|
-
|
|
310
|
-
}`,
|
|
311
|
-
).toBe(`${data.modelName}.${column} is a column`);
|
|
237
|
+
`${column} is ${declared.includes(column) ? "a column" : "NOT A COLUMN"}`,
|
|
238
|
+
).toBe(`${column} is a column`);
|
|
312
239
|
}
|
|
313
240
|
|
|
314
241
|
for (const column of data.sensitiveColumns) {
|
|
315
242
|
expect(
|
|
316
|
-
`${
|
|
317
|
-
|
|
318
|
-
}`,
|
|
319
|
-
).toBe(`${data.modelName}.${column} is a column`);
|
|
320
|
-
|
|
243
|
+
`${column} is ${declared.includes(column) ? "a column" : "NOT A COLUMN"}`,
|
|
244
|
+
).toBe(`${column} is a column`);
|
|
321
245
|
expect(
|
|
322
|
-
`${
|
|
323
|
-
|
|
324
|
-
}`,
|
|
325
|
-
).toBe(`${data.modelName}.${column} is withheld`);
|
|
246
|
+
`${column} is ${published.includes(column) ? "PUBLISHED" : "withheld"}`,
|
|
247
|
+
).toBe(`${column} is withheld`);
|
|
326
248
|
}
|
|
327
249
|
}
|
|
328
250
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
selectedValues: ["a variable this dashboard never stored"],
|
|
357
|
-
},
|
|
358
|
-
];
|
|
359
|
-
}
|
|
251
|
+
const SENSITIVE_SLO_COLUMNS: Array<string> = [
|
|
252
|
+
"description",
|
|
253
|
+
"slug",
|
|
254
|
+
"labels",
|
|
255
|
+
"monitors",
|
|
256
|
+
"monitorLabels",
|
|
257
|
+
"autoAddedMonitors",
|
|
258
|
+
"downtimeMonitorStatuses",
|
|
259
|
+
"multiMonitorMode",
|
|
260
|
+
"metricQueryConfig",
|
|
261
|
+
"sliType",
|
|
262
|
+
"windowType",
|
|
263
|
+
"windowDays",
|
|
264
|
+
"timezone",
|
|
265
|
+
"atRiskThresholdPercentage",
|
|
266
|
+
"errorBudgetTotalSeconds",
|
|
267
|
+
"isEnabled",
|
|
268
|
+
"isArchived",
|
|
269
|
+
"archivedAt",
|
|
270
|
+
"archivedByUserId",
|
|
271
|
+
"lastEvaluatedAt",
|
|
272
|
+
"nextEvaluationAt",
|
|
273
|
+
"lastAccumulatedBucketEndAt",
|
|
274
|
+
"statusChangeNotificationSentAt",
|
|
275
|
+
"createdByUserId",
|
|
276
|
+
"projectId",
|
|
277
|
+
];
|
|
360
278
|
|
|
361
279
|
// -- Tests -----------------------------------------------------------------
|
|
362
280
|
|
|
363
281
|
describe("SLO dashboard template on a public dashboard", () => {
|
|
364
282
|
describe("the config an anonymous viewer is served", () => {
|
|
365
|
-
|
|
366
|
-
* The sanitizer drops Data Source widgets outright, because their stored
|
|
367
|
-
* config IS a query against an internal system. This template ships none,
|
|
368
|
-
* so publishing it must cost it no widgets — if a later revision reaches
|
|
369
|
-
* for a Data Source widget, the public page would silently lose it.
|
|
370
|
-
*/
|
|
371
|
-
it("keeps every widget the template ships", () => {
|
|
283
|
+
it("keeps every widget and the SLO variable the template ships", () => {
|
|
372
284
|
const template: DashboardViewConfig = getTemplateConfig(
|
|
373
285
|
DashboardTemplateType.Slo,
|
|
374
286
|
) as DashboardViewConfig;
|
|
375
|
-
|
|
376
|
-
expect(template).not.toBeNull();
|
|
377
|
-
expect(template.components.length).toBeGreaterThan(0);
|
|
378
|
-
|
|
379
287
|
const published: DashboardViewConfig = storedConfig();
|
|
380
288
|
|
|
381
289
|
expect(
|
|
@@ -389,91 +297,72 @@ describe("SLO dashboard template on a public dashboard", () => {
|
|
|
389
297
|
return component.componentType;
|
|
390
298
|
}),
|
|
391
299
|
);
|
|
300
|
+
expect(published.variables).toHaveLength(1);
|
|
392
301
|
});
|
|
393
302
|
});
|
|
394
303
|
|
|
395
|
-
describe("
|
|
304
|
+
describe("every component on the template", () => {
|
|
396
305
|
/*
|
|
397
|
-
* The
|
|
398
|
-
*
|
|
399
|
-
*
|
|
400
|
-
*
|
|
401
|
-
* closed: the one thing it must never do is resolve to "whichever SLO the
|
|
402
|
-
* query finds", which on a project-scoped read means any of them.
|
|
306
|
+
* The fall-through guard. As published and before any pick, the SLO List
|
|
307
|
+
* serves its resource, the SLO widgets refuse for the one reason that is
|
|
308
|
+
* not a bug (nobody has picked an SLO), and the metric and text widgets are
|
|
309
|
+
* turned away from the list endpoint entirely. There is no fourth outcome.
|
|
403
310
|
*/
|
|
404
|
-
it("
|
|
311
|
+
it("either lists a known resource or is refused, with nothing in between", () => {
|
|
405
312
|
const config: DashboardViewConfig = storedConfig();
|
|
406
|
-
const sloWidgets: Array<DashboardBaseComponent> = componentsOfType(
|
|
407
|
-
config,
|
|
408
|
-
DashboardComponentType.Slo,
|
|
409
|
-
);
|
|
410
313
|
|
|
411
|
-
expect(
|
|
412
|
-
|
|
413
|
-
const outcomes: Array<string> = sloWidgets.map(
|
|
414
|
-
(component: DashboardBaseComponent): string => {
|
|
314
|
+
expect(
|
|
315
|
+
config.components.map((component: DashboardBaseComponent): string => {
|
|
415
316
|
return `${labelOf(component)} -> ${outcomeOf({ config, component })}`;
|
|
416
|
-
},
|
|
417
|
-
)
|
|
317
|
+
}),
|
|
318
|
+
).toEqual(
|
|
319
|
+
config.components.map((component: DashboardBaseComponent): string => {
|
|
320
|
+
if (component.componentType === DashboardComponentType.SloList) {
|
|
321
|
+
return `${labelOf(component)} -> lists slo-list`;
|
|
322
|
+
}
|
|
418
323
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
324
|
+
if (component.componentType === DashboardComponentType.Slo) {
|
|
325
|
+
return `${labelOf(component)} -> refused: ${PUBLIC_SLO_WIDGET_NO_SELECTION_MESSAGE}`;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return `${labelOf(component)} -> refused: ${UNSUPPORTED_MESSAGE_PREFIX}${component.componentType}`;
|
|
422
329
|
}),
|
|
423
330
|
);
|
|
424
331
|
});
|
|
425
332
|
|
|
426
|
-
|
|
427
|
-
* The same stored widget also drives the SloHistory aggregation route,
|
|
428
|
-
* which is a second unauthenticated surface reading a different store.
|
|
429
|
-
* Both parse the id through PublicDashboardSloWidget, so both have to
|
|
430
|
-
* refuse the unconfigured widget — a template whose widgets failed closed
|
|
431
|
-
* on one route and open on the other would be worse than either.
|
|
432
|
-
*/
|
|
433
|
-
it("refuses the same widgets on the SLO history route too", () => {
|
|
333
|
+
it("lists the SLO widgets' objective once a pick is sent, and nothing else changes", () => {
|
|
434
334
|
const config: DashboardViewConfig = storedConfig();
|
|
435
|
-
const
|
|
335
|
+
const requestedVariables: Array<JSONObject> = selectionOf(
|
|
436
336
|
config,
|
|
437
|
-
|
|
337
|
+
PICKED_SLO,
|
|
438
338
|
);
|
|
439
339
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
return `${labelOf(component)} -> read ${parsed.serviceLevelObjectiveId.toString()}`;
|
|
449
|
-
} catch (error) {
|
|
450
|
-
if (error instanceof BadDataException) {
|
|
451
|
-
return `${labelOf(component)} -> refused: ${error.message}`;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
return `${labelOf(component)} -> threw a non-BadDataException: ${String(
|
|
455
|
-
error,
|
|
456
|
-
)}`;
|
|
457
|
-
}
|
|
458
|
-
},
|
|
459
|
-
);
|
|
340
|
+
for (const component of config.components) {
|
|
341
|
+
const expected: string =
|
|
342
|
+
component.componentType === DashboardComponentType.SloList
|
|
343
|
+
? "lists slo-list"
|
|
344
|
+
: component.componentType === DashboardComponentType.Slo
|
|
345
|
+
? "lists slo"
|
|
346
|
+
: `refused: ${UNSUPPORTED_MESSAGE_PREFIX}${component.componentType}`;
|
|
460
347
|
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
348
|
+
expect(
|
|
349
|
+
`${labelOf(component)} -> ${outcomeOf({
|
|
350
|
+
config,
|
|
351
|
+
component,
|
|
352
|
+
requestedVariables,
|
|
353
|
+
})}`,
|
|
354
|
+
).toBe(`${labelOf(component)} -> ${expected}`);
|
|
355
|
+
}
|
|
466
356
|
});
|
|
467
357
|
});
|
|
468
358
|
|
|
469
|
-
describe("
|
|
359
|
+
describe("the SLO widgets", () => {
|
|
470
360
|
/*
|
|
471
|
-
*
|
|
472
|
-
*
|
|
473
|
-
*
|
|
474
|
-
* cannot be walked across the project's other objectives.
|
|
361
|
+
* Unpicked, every SLO widget fails closed on BOTH unauthenticated routes.
|
|
362
|
+
* What it must never do is resolve to "whichever SLO the query finds",
|
|
363
|
+
* which on a project-scoped read means any of them.
|
|
475
364
|
*/
|
|
476
|
-
it("
|
|
365
|
+
it("refuse on the resource and history routes until an SLO is picked", () => {
|
|
477
366
|
const config: DashboardViewConfig = storedConfig();
|
|
478
367
|
const sloWidgets: Array<DashboardBaseComponent> = componentsOfType(
|
|
479
368
|
config,
|
|
@@ -482,561 +371,326 @@ describe("SLO dashboard template on a public dashboard", () => {
|
|
|
482
371
|
|
|
483
372
|
expect(sloWidgets.length).toBeGreaterThan(0);
|
|
484
373
|
|
|
485
|
-
const
|
|
486
|
-
(
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
)}`;
|
|
499
|
-
},
|
|
500
|
-
);
|
|
501
|
-
|
|
502
|
-
expect(resolved).toEqual(
|
|
503
|
-
sloWidgets.map((component: DashboardBaseComponent): string => {
|
|
504
|
-
return `${labelOf(component)} -> slo ${JSON.stringify({
|
|
505
|
-
_id: PICKED_SLO_ID,
|
|
506
|
-
projectId: DASHBOARD_PROJECT_ID,
|
|
507
|
-
})}`;
|
|
508
|
-
}),
|
|
509
|
-
);
|
|
374
|
+
for (const component of sloWidgets) {
|
|
375
|
+
expect(() => {
|
|
376
|
+
return buildPolicy({ config, component });
|
|
377
|
+
}).toThrow(PUBLIC_SLO_WIDGET_NO_SELECTION_MESSAGE);
|
|
378
|
+
|
|
379
|
+
if (
|
|
380
|
+
argumentsOf(component)["displayType"] === SloWidgetDisplayType.Chart
|
|
381
|
+
) {
|
|
382
|
+
expect(() => {
|
|
383
|
+
return buildHistoryPolicy({ config, component });
|
|
384
|
+
}).toThrow(PUBLIC_SLO_WIDGET_NO_SELECTION_MESSAGE);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
510
387
|
});
|
|
511
388
|
|
|
512
389
|
/*
|
|
513
|
-
*
|
|
514
|
-
*
|
|
515
|
-
*
|
|
516
|
-
*
|
|
390
|
+
* With a pick, the read is an exact-match NAME within the dashboard's
|
|
391
|
+
* project, among ACTIVE objectives only, two rows at most (one to show,
|
|
392
|
+
* one to detect a shared name) — and nothing in the request's own query
|
|
393
|
+
* survives.
|
|
517
394
|
*/
|
|
518
|
-
it("
|
|
395
|
+
it("read the picked SLO by exact name, active only, at most two rows, whatever the query says", () => {
|
|
519
396
|
const config: DashboardViewConfig = storedConfig();
|
|
520
|
-
|
|
397
|
+
|
|
398
|
+
for (const component of componentsOfType(
|
|
521
399
|
config,
|
|
522
400
|
DashboardComponentType.Slo,
|
|
523
|
-
)
|
|
524
|
-
|
|
525
|
-
expect(sloWidgets.length).toBeGreaterThan(0);
|
|
526
|
-
|
|
527
|
-
for (const component of sloWidgets) {
|
|
401
|
+
)) {
|
|
528
402
|
const policy: PublicDashboardResourceListPolicyResult = buildPolicy({
|
|
529
403
|
config,
|
|
530
|
-
component
|
|
531
|
-
serviceLevelObjectiveId: PICKED_SLO_ID.toString(),
|
|
532
|
-
}),
|
|
404
|
+
component,
|
|
533
405
|
requestedQuery: HOSTILE_QUERY,
|
|
534
|
-
requestedVariables:
|
|
406
|
+
requestedVariables: selectionOf(config, PICKED_SLO),
|
|
535
407
|
});
|
|
536
408
|
|
|
537
|
-
expect(`${labelOf(component)}
|
|
538
|
-
`${labelOf(component)}
|
|
409
|
+
expect(`${labelOf(component)} -> ${policy.resourceType}`).toBe(
|
|
410
|
+
`${labelOf(component)} -> slo`,
|
|
539
411
|
);
|
|
540
|
-
expect(
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
412
|
+
expect(routeQuery(policy)).toEqual({
|
|
413
|
+
name: PICKED_SLO,
|
|
414
|
+
isArchived: false,
|
|
415
|
+
projectId: DASHBOARD_PROJECT_ID,
|
|
416
|
+
});
|
|
417
|
+
expect(policy.limit).toBe(2);
|
|
545
418
|
expect(policy.sort).toEqual({ name: SortOrder.Ascending });
|
|
419
|
+
expect(policy.select).toEqual(PUBLISHED_SLO_SELECT);
|
|
546
420
|
}
|
|
547
421
|
});
|
|
548
422
|
|
|
549
423
|
/*
|
|
550
|
-
*
|
|
551
|
-
*
|
|
552
|
-
*
|
|
553
|
-
* key in the template would leave the server silently defaulting to the
|
|
554
|
-
* SLI tile on six widgets that draw three different numbers.
|
|
424
|
+
* A viewer's value is used as a literal equality, never compiled into a
|
|
425
|
+
* search or an IN-list: a string that looks like SQL is just a name no SLO
|
|
426
|
+
* has.
|
|
555
427
|
*/
|
|
556
|
-
it("
|
|
428
|
+
it("treat a hostile pick as a literal name, never as a pattern", () => {
|
|
557
429
|
const config: DashboardViewConfig = storedConfig();
|
|
558
|
-
const
|
|
430
|
+
const component: DashboardBaseComponent = componentsOfType(
|
|
559
431
|
config,
|
|
560
432
|
DashboardComponentType.Slo,
|
|
561
|
-
);
|
|
562
|
-
|
|
563
|
-
expect(sloWidgets.length).toBeGreaterThan(0);
|
|
564
|
-
|
|
565
|
-
const parsed: Array<string> = sloWidgets.map(
|
|
566
|
-
(component: DashboardBaseComponent): string => {
|
|
567
|
-
const config2: PublicDashboardSloWidgetConfig =
|
|
568
|
-
PublicDashboardSloWidget.readConfig(
|
|
569
|
-
withArguments(component, {
|
|
570
|
-
serviceLevelObjectiveId: PICKED_SLO_ID.toString(),
|
|
571
|
-
}),
|
|
572
|
-
);
|
|
573
|
-
|
|
574
|
-
return `${labelOf(component)} -> ${config2.sloMetric}/${config2.displayType}`;
|
|
575
|
-
},
|
|
576
|
-
);
|
|
577
|
-
|
|
578
|
-
expect(parsed).toEqual(
|
|
579
|
-
sloWidgets.map((component: DashboardBaseComponent): string => {
|
|
580
|
-
const args: WidgetArguments = argumentsOf(component);
|
|
581
|
-
|
|
582
|
-
return `${labelOf(component)} -> ${String(args["sloMetric"])}/${String(
|
|
583
|
-
args["displayType"],
|
|
584
|
-
)}`;
|
|
585
|
-
}),
|
|
586
|
-
);
|
|
587
|
-
|
|
588
|
-
// ...and what came back is a real member of each enum, not a free string.
|
|
589
|
-
for (const entry of parsed) {
|
|
590
|
-
const [metric, display] = (entry.split(" -> ")[1] as string).split("/");
|
|
591
|
-
|
|
592
|
-
expect(Object.values(SloWidgetMetric) as Array<string>).toContain(
|
|
593
|
-
metric as string,
|
|
594
|
-
);
|
|
595
|
-
expect(Object.values(SloWidgetDisplayType) as Array<string>).toContain(
|
|
596
|
-
display as string,
|
|
597
|
-
);
|
|
598
|
-
}
|
|
599
|
-
});
|
|
600
|
-
});
|
|
433
|
+
)[0] as DashboardBaseComponent;
|
|
434
|
+
const hostile: string = "' OR 1=1 --%";
|
|
601
435
|
|
|
602
|
-
|
|
603
|
-
function sloSelect(): JSONObject {
|
|
604
|
-
const config: DashboardViewConfig = storedConfig();
|
|
605
|
-
const sloWidgets: Array<DashboardBaseComponent> = componentsOfType(
|
|
436
|
+
const policy: PublicDashboardResourceListPolicyResult = buildPolicy({
|
|
606
437
|
config,
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
expect(sloWidgets.length).toBeGreaterThan(0);
|
|
611
|
-
|
|
612
|
-
return buildPolicy({
|
|
613
|
-
config,
|
|
614
|
-
component: withArguments(sloWidgets[0] as DashboardBaseComponent, {
|
|
615
|
-
serviceLevelObjectiveId: PICKED_SLO_ID.toString(),
|
|
616
|
-
}),
|
|
617
|
-
requestedQuery: HOSTILE_QUERY,
|
|
618
|
-
}).select;
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
it("publishes the row id and the seven display numbers, and nothing else", () => {
|
|
622
|
-
expect(sloSelect()).toEqual({
|
|
623
|
-
_id: true,
|
|
624
|
-
name: true,
|
|
625
|
-
targetPercentage: true,
|
|
626
|
-
currentSliPercentage: true,
|
|
627
|
-
errorBudgetRemainingPercentage: true,
|
|
628
|
-
errorBudgetRemainingSeconds: true,
|
|
629
|
-
currentBurnRate: true,
|
|
630
|
-
sloStatus: true,
|
|
438
|
+
component,
|
|
439
|
+
requestedVariables: selectionOf(config, hostile),
|
|
631
440
|
});
|
|
441
|
+
|
|
442
|
+
expect(policy.query["name"]).toBe(hostile);
|
|
443
|
+
expect(policy.query["name"]).not.toBeInstanceOf(Includes);
|
|
632
444
|
});
|
|
633
445
|
|
|
634
446
|
/*
|
|
635
|
-
*
|
|
636
|
-
*
|
|
637
|
-
*
|
|
638
|
-
* public status page has no business reading out of it.
|
|
639
|
-
*
|
|
640
|
-
* Driven from ServiceLevelObjective's own column list so that each name
|
|
641
|
-
* below is checked to be a real column before it is checked to be
|
|
642
|
-
* withheld — a rename that made one of these assertions vacuous fails
|
|
643
|
-
* here instead of passing quietly.
|
|
447
|
+
* Only the STORED variable's selection counts. A selection for a variable
|
|
448
|
+
* id this dashboard never stored, or a multi-value array sent against the
|
|
449
|
+
* stored single-select, is dropped — leaving the widget unpicked.
|
|
644
450
|
*/
|
|
645
|
-
it("
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
"metricQueryConfig",
|
|
660
|
-
"sliType",
|
|
661
|
-
"windowType",
|
|
662
|
-
"windowDays",
|
|
663
|
-
"timezone",
|
|
664
|
-
"lastEvaluatedAt",
|
|
665
|
-
"nextEvaluationAt",
|
|
666
|
-
"lastAccumulatedBucketEndAt",
|
|
667
|
-
"statusChangeNotificationSentAt",
|
|
668
|
-
"createdByUser",
|
|
669
|
-
"createdByUserId",
|
|
670
|
-
"projectId",
|
|
451
|
+
it("ignore selections the stored variable could not have produced", () => {
|
|
452
|
+
const config: DashboardViewConfig = storedConfig();
|
|
453
|
+
const component: DashboardBaseComponent = componentsOfType(
|
|
454
|
+
config,
|
|
455
|
+
DashboardComponentType.Slo,
|
|
456
|
+
)[0] as DashboardBaseComponent;
|
|
457
|
+
|
|
458
|
+
for (const requestedVariables of [
|
|
459
|
+
[{ id: ObjectID.generate().toString(), selectedValue: PICKED_SLO }],
|
|
460
|
+
[
|
|
461
|
+
{
|
|
462
|
+
id: sloVariableOf(config).id,
|
|
463
|
+
selectedValues: [PICKED_SLO, "Search API"],
|
|
464
|
+
},
|
|
671
465
|
],
|
|
672
|
-
|
|
466
|
+
] as Array<Array<JSONObject>>) {
|
|
467
|
+
expect(() => {
|
|
468
|
+
return buildPolicy({ config, component, requestedVariables });
|
|
469
|
+
}).toThrow(PUBLIC_SLO_WIDGET_NO_SELECTION_MESSAGE);
|
|
470
|
+
}
|
|
673
471
|
});
|
|
674
|
-
});
|
|
675
472
|
|
|
676
|
-
|
|
677
|
-
/*
|
|
678
|
-
* These three read Postgres and carry no stored filter at all — the
|
|
679
|
-
* template deliberately pre-filters none of them to a lifecycle state, a
|
|
680
|
-
* severity, or a monitor type. So the ONLY thing narrowing the read is
|
|
681
|
-
* the project the dashboard belongs to, and that has to hold even when
|
|
682
|
-
* the caller supplies a query naming another project.
|
|
683
|
-
*/
|
|
684
|
-
it("scopes each list to the dashboard's project and to nothing else", () => {
|
|
473
|
+
it("refuse an oversized pick before it can become a query parameter", () => {
|
|
685
474
|
const config: DashboardViewConfig = storedConfig();
|
|
686
|
-
const
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
];
|
|
691
|
-
|
|
692
|
-
expect(listWidgets.length).toBeGreaterThan(0);
|
|
475
|
+
const component: DashboardBaseComponent = componentsOfType(
|
|
476
|
+
config,
|
|
477
|
+
DashboardComponentType.Slo,
|
|
478
|
+
)[0] as DashboardBaseComponent;
|
|
693
479
|
|
|
694
|
-
|
|
695
|
-
|
|
480
|
+
expect(() => {
|
|
481
|
+
return buildPolicy({
|
|
696
482
|
config,
|
|
697
483
|
component,
|
|
698
|
-
|
|
699
|
-
requestedVariables: hostileVariableSelections(config),
|
|
484
|
+
requestedVariables: selectionOf(config, "x".repeat(2000)),
|
|
700
485
|
});
|
|
486
|
+
}).toThrow(BadDataException);
|
|
487
|
+
});
|
|
701
488
|
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
.sort()
|
|
709
|
-
.join(", ")}]`,
|
|
710
|
-
).toBe(`${labelOf(component)} filters on []`);
|
|
489
|
+
it("chart history for the picked SLO by name, and only for Chart widgets", () => {
|
|
490
|
+
const config: DashboardViewConfig = storedConfig();
|
|
491
|
+
const requestedVariables: Array<JSONObject> = selectionOf(
|
|
492
|
+
config,
|
|
493
|
+
PICKED_SLO,
|
|
494
|
+
);
|
|
711
495
|
|
|
712
|
-
|
|
713
|
-
|
|
496
|
+
for (const component of componentsOfType(
|
|
497
|
+
config,
|
|
498
|
+
DashboardComponentType.Slo,
|
|
499
|
+
)) {
|
|
500
|
+
const isChart: boolean =
|
|
501
|
+
argumentsOf(component)["displayType"] === SloWidgetDisplayType.Chart;
|
|
502
|
+
|
|
503
|
+
if (!isChart) {
|
|
504
|
+
// A tile publishes current numbers, never 400 days of history.
|
|
505
|
+
expect(() => {
|
|
506
|
+
return buildHistoryPolicy({
|
|
507
|
+
config,
|
|
508
|
+
component,
|
|
509
|
+
requestedVariables,
|
|
510
|
+
});
|
|
511
|
+
}).toThrow(BadDataException);
|
|
512
|
+
continue;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
const policy: PublicDashboardSloHistoryPolicyResult =
|
|
516
|
+
buildHistoryPolicy({ config, component, requestedVariables });
|
|
517
|
+
|
|
518
|
+
expect(policy.target).toEqual({
|
|
519
|
+
kind: PublicDashboardSloWidgetTargetKind.Selected,
|
|
520
|
+
serviceLevelObjectiveName: PICKED_SLO,
|
|
714
521
|
});
|
|
522
|
+
expect(policy.limit).toBe(LIMIT_PER_PROJECT);
|
|
715
523
|
}
|
|
716
524
|
});
|
|
717
525
|
|
|
718
|
-
|
|
719
|
-
* The dashboard's Monitor variable is a TelemetryAttribute bound to the
|
|
720
|
-
* bare `monitorName` key, which these three widgets cannot read: they
|
|
721
|
-
* query Postgres, and MonitorList's only variable binding is a
|
|
722
|
-
* ProjectLabel one this template does not ship. A selection therefore has
|
|
723
|
-
* to leave the query untouched rather than become an IN-list on it.
|
|
724
|
-
*/
|
|
725
|
-
it("lets no variable selection become a filter on those lists", () => {
|
|
526
|
+
it("keep every other ServiceLevelObjective column behind the session", () => {
|
|
726
527
|
const config: DashboardViewConfig = storedConfig();
|
|
727
|
-
const variable: DashboardVariable = monitorVariableOf(config);
|
|
728
528
|
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
DashboardComponentType.IncidentList,
|
|
733
|
-
DashboardComponentType.AlertList,
|
|
734
|
-
DashboardComponentType.MonitorList,
|
|
735
|
-
]) {
|
|
736
|
-
const component: DashboardBaseComponent = onlyComponentOfType(
|
|
529
|
+
expectSelectPublishesNothingSensitive({
|
|
530
|
+
model: new ServiceLevelObjective(),
|
|
531
|
+
select: buildPolicy({
|
|
737
532
|
config,
|
|
738
|
-
|
|
739
|
-
);
|
|
740
|
-
const withSelection: PublicDashboardResourceListPolicyResult =
|
|
741
|
-
buildPolicy({
|
|
533
|
+
component: componentsOfType(
|
|
742
534
|
config,
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
],
|
|
750
|
-
});
|
|
751
|
-
const withoutSelection: PublicDashboardResourceListPolicyResult =
|
|
752
|
-
buildPolicy({ config, component });
|
|
753
|
-
|
|
754
|
-
expect(
|
|
755
|
-
`${labelOf(component)} with a monitor picked: ${JSON.stringify(
|
|
756
|
-
withSelection.query,
|
|
757
|
-
)}`,
|
|
758
|
-
).toBe(
|
|
759
|
-
`${labelOf(component)} with a monitor picked: ${JSON.stringify(
|
|
760
|
-
withoutSelection.query,
|
|
761
|
-
)}`,
|
|
762
|
-
);
|
|
763
|
-
}
|
|
535
|
+
DashboardComponentType.Slo,
|
|
536
|
+
)[0] as DashboardBaseComponent,
|
|
537
|
+
requestedVariables: selectionOf(config, PICKED_SLO),
|
|
538
|
+
}).select,
|
|
539
|
+
sensitiveColumns: SENSITIVE_SLO_COLUMNS,
|
|
540
|
+
});
|
|
764
541
|
});
|
|
542
|
+
});
|
|
765
543
|
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
*/
|
|
773
|
-
it("maps each list to its own resource, order and stored row cap", () => {
|
|
774
|
-
const config: DashboardViewConfig = storedConfig();
|
|
775
|
-
|
|
776
|
-
const expectations: Array<{
|
|
777
|
-
componentType: DashboardComponentType;
|
|
778
|
-
resourceType: string;
|
|
779
|
-
sort: JSONObject;
|
|
780
|
-
}> = [
|
|
781
|
-
{
|
|
782
|
-
componentType: DashboardComponentType.IncidentList,
|
|
783
|
-
resourceType: "incident",
|
|
784
|
-
sort: { createdAt: SortOrder.Descending },
|
|
785
|
-
},
|
|
786
|
-
{
|
|
787
|
-
componentType: DashboardComponentType.AlertList,
|
|
788
|
-
resourceType: "alert",
|
|
789
|
-
sort: { createdAt: SortOrder.Descending },
|
|
790
|
-
},
|
|
791
|
-
{
|
|
792
|
-
componentType: DashboardComponentType.MonitorList,
|
|
793
|
-
resourceType: "monitor",
|
|
794
|
-
sort: { name: SortOrder.Ascending },
|
|
795
|
-
},
|
|
796
|
-
];
|
|
797
|
-
|
|
798
|
-
for (const expectation of expectations) {
|
|
799
|
-
const component: DashboardBaseComponent = onlyComponentOfType(
|
|
800
|
-
config,
|
|
801
|
-
expectation.componentType,
|
|
802
|
-
);
|
|
803
|
-
const policy: PublicDashboardResourceListPolicyResult = buildPolicy({
|
|
804
|
-
config,
|
|
805
|
-
component,
|
|
806
|
-
requestedQuery: HOSTILE_QUERY,
|
|
807
|
-
});
|
|
808
|
-
|
|
809
|
-
expect(`${labelOf(component)} lists ${policy.resourceType}`).toBe(
|
|
810
|
-
`${labelOf(component)} lists ${expectation.resourceType}`,
|
|
811
|
-
);
|
|
812
|
-
expect(policy.sort).toEqual(expectation.sort);
|
|
544
|
+
describe("the SLO List", () => {
|
|
545
|
+
function sloList(config: DashboardViewConfig): DashboardBaseComponent {
|
|
546
|
+
const lists: Array<DashboardBaseComponent> = componentsOfType(
|
|
547
|
+
config,
|
|
548
|
+
DashboardComponentType.SloList,
|
|
549
|
+
);
|
|
813
550
|
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
argumentsOf(component)["maxRows"],
|
|
818
|
-
)} rows`,
|
|
819
|
-
);
|
|
820
|
-
expect(policy.limit).toBeGreaterThan(0);
|
|
821
|
-
expect(policy.limit).toBeLessThanOrEqual(LIMIT_PER_PROJECT);
|
|
822
|
-
}
|
|
823
|
-
});
|
|
551
|
+
expect(lists).toHaveLength(1);
|
|
552
|
+
return lists[0] as DashboardBaseComponent;
|
|
553
|
+
}
|
|
824
554
|
|
|
825
|
-
|
|
555
|
+
/*
|
|
556
|
+
* The fleet as published: every ACTIVE objective in the dashboard's
|
|
557
|
+
* project, least budget first, capped by the widget's own stored maxRows.
|
|
558
|
+
* Archived objectives are not evaluated and never reach a public page.
|
|
559
|
+
*/
|
|
560
|
+
it("lists every active SLO in the dashboard's project and nothing the request names", () => {
|
|
826
561
|
const config: DashboardViewConfig = storedConfig();
|
|
827
|
-
const
|
|
562
|
+
const policy: PublicDashboardResourceListPolicyResult = buildPolicy({
|
|
828
563
|
config,
|
|
829
|
-
component:
|
|
830
|
-
|
|
831
|
-
DashboardComponentType.IncidentList,
|
|
832
|
-
),
|
|
833
|
-
}).select;
|
|
834
|
-
|
|
835
|
-
expect(select).toEqual({
|
|
836
|
-
_id: true,
|
|
837
|
-
title: true,
|
|
838
|
-
createdAt: true,
|
|
839
|
-
currentIncidentState: { name: true, color: true },
|
|
840
|
-
incidentSeverity: { name: true, color: true },
|
|
564
|
+
component: sloList(config),
|
|
565
|
+
requestedQuery: HOSTILE_QUERY,
|
|
841
566
|
});
|
|
842
567
|
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
* monitor bindings describe the project's topology.
|
|
848
|
-
*/
|
|
849
|
-
expectSelectPublishesNothingSensitive({
|
|
850
|
-
modelName: "Incident",
|
|
851
|
-
model: new Incident(),
|
|
852
|
-
select,
|
|
853
|
-
sensitiveColumns: [
|
|
854
|
-
"description",
|
|
855
|
-
"rootCause",
|
|
856
|
-
"remediationNotes",
|
|
857
|
-
"postmortemNote",
|
|
858
|
-
"postmortemAttachments",
|
|
859
|
-
"telemetryQuery",
|
|
860
|
-
"customFields",
|
|
861
|
-
"monitors",
|
|
862
|
-
"monitorSummary",
|
|
863
|
-
"labels",
|
|
864
|
-
"onCallDutyPolicies",
|
|
865
|
-
"isPrivate",
|
|
866
|
-
"createdByUserId",
|
|
867
|
-
"seriesLabels",
|
|
868
|
-
],
|
|
568
|
+
expect(policy.resourceType).toBe("slo-list");
|
|
569
|
+
expect(routeQuery(policy)).toEqual({
|
|
570
|
+
isArchived: false,
|
|
571
|
+
projectId: DASHBOARD_PROJECT_ID,
|
|
869
572
|
});
|
|
573
|
+
// Enabled first: a disabled SLO's frozen budget never tops the list.
|
|
574
|
+
expect(policy.sort).toEqual({
|
|
575
|
+
isEnabled: SortOrder.Descending,
|
|
576
|
+
errorBudgetRemainingPercentage: SortOrder.Ascending,
|
|
577
|
+
name: SortOrder.Ascending,
|
|
578
|
+
});
|
|
579
|
+
expect(Object.keys(policy.sort)).toEqual([
|
|
580
|
+
"isEnabled",
|
|
581
|
+
"errorBudgetRemainingPercentage",
|
|
582
|
+
"name",
|
|
583
|
+
]);
|
|
584
|
+
expect(policy.limit).toBe(SLO_LIST_DEFAULT_MAX_ROWS);
|
|
585
|
+
expect(policy.limit).toBeLessThanOrEqual(LIMIT_PER_PROJECT);
|
|
870
586
|
});
|
|
871
587
|
|
|
872
|
-
it("
|
|
588
|
+
it("narrows to the picked SLO's row, still active only", () => {
|
|
873
589
|
const config: DashboardViewConfig = storedConfig();
|
|
874
|
-
const select: JSONObject = buildPolicy({
|
|
875
|
-
config,
|
|
876
|
-
component: onlyComponentOfType(
|
|
877
|
-
config,
|
|
878
|
-
DashboardComponentType.AlertList,
|
|
879
|
-
),
|
|
880
|
-
}).select;
|
|
881
|
-
|
|
882
|
-
expect(select).toEqual({
|
|
883
|
-
_id: true,
|
|
884
|
-
title: true,
|
|
885
|
-
createdAt: true,
|
|
886
|
-
currentAlertState: { name: true, color: true },
|
|
887
|
-
alertSeverity: { name: true, color: true },
|
|
888
|
-
});
|
|
889
590
|
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
"monitorSummary",
|
|
903
|
-
"labels",
|
|
904
|
-
"onCallDutyPolicies",
|
|
905
|
-
"isPrivate",
|
|
906
|
-
"createdByUserId",
|
|
907
|
-
"seriesLabels",
|
|
908
|
-
],
|
|
591
|
+
expect(
|
|
592
|
+
routeQuery(
|
|
593
|
+
buildPolicy({
|
|
594
|
+
config,
|
|
595
|
+
component: sloList(config),
|
|
596
|
+
requestedVariables: selectionOf(config, PICKED_SLO),
|
|
597
|
+
}),
|
|
598
|
+
),
|
|
599
|
+
).toEqual({
|
|
600
|
+
isArchived: false,
|
|
601
|
+
name: PICKED_SLO,
|
|
602
|
+
projectId: DASHBOARD_PROJECT_ID,
|
|
909
603
|
});
|
|
910
604
|
});
|
|
911
605
|
|
|
912
|
-
|
|
606
|
+
/*
|
|
607
|
+
* The SLO widget's seven display fields plus `isEnabled`. A disabled SLO
|
|
608
|
+
* keeps the status it was frozen at, so without the flag the public list
|
|
609
|
+
* published that status as live (regression). The flag is withheld from
|
|
610
|
+
* the single-SLO widget, which has no use for it.
|
|
611
|
+
*/
|
|
612
|
+
it("publishes the SLO widget's seven display fields plus isEnabled, and nothing else", () => {
|
|
913
613
|
const config: DashboardViewConfig = storedConfig();
|
|
914
614
|
const select: JSONObject = buildPolicy({
|
|
915
615
|
config,
|
|
916
|
-
component:
|
|
917
|
-
config,
|
|
918
|
-
DashboardComponentType.MonitorList,
|
|
919
|
-
),
|
|
616
|
+
component: sloList(config),
|
|
920
617
|
}).select;
|
|
921
618
|
|
|
922
|
-
expect(select).toEqual({
|
|
923
|
-
_id: true,
|
|
924
|
-
name: true,
|
|
925
|
-
monitorType: true,
|
|
926
|
-
currentMonitorStatus: { name: true, color: true },
|
|
927
|
-
});
|
|
928
|
-
|
|
929
|
-
/*
|
|
930
|
-
* The monitor list is the one on this dashboard with credentials behind
|
|
931
|
-
* it. A monitor's steps carry the request it makes — URLs, headers,
|
|
932
|
-
* bodies — and three columns are literally secret keys that let a
|
|
933
|
-
* caller post as that monitor.
|
|
934
|
-
*/
|
|
619
|
+
expect(select).toEqual({ ...PUBLISHED_SLO_SELECT, isEnabled: true });
|
|
935
620
|
expectSelectPublishesNothingSensitive({
|
|
936
|
-
|
|
937
|
-
model: new Monitor(),
|
|
621
|
+
model: new ServiceLevelObjective(),
|
|
938
622
|
select,
|
|
939
|
-
sensitiveColumns:
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
"incomingMonitorRequest",
|
|
945
|
-
"incomingEmailMonitorRequest",
|
|
946
|
-
"serverMonitorResponse",
|
|
947
|
-
"customFields",
|
|
948
|
-
"description",
|
|
949
|
-
"labels",
|
|
950
|
-
"slug",
|
|
951
|
-
"dependsOnMonitors",
|
|
952
|
-
"monitoringInterval",
|
|
953
|
-
"createdByUserId",
|
|
954
|
-
],
|
|
623
|
+
sensitiveColumns: SENSITIVE_SLO_COLUMNS.filter(
|
|
624
|
+
(column: string): boolean => {
|
|
625
|
+
return column !== "isEnabled";
|
|
626
|
+
},
|
|
627
|
+
),
|
|
955
628
|
});
|
|
956
629
|
});
|
|
957
|
-
});
|
|
958
630
|
|
|
959
|
-
|
|
960
|
-
/*
|
|
961
|
-
* The fall-through guard. Walking the whole config — not just the widgets
|
|
962
|
-
* this file has an opinion about — is what proves that no widget kind the
|
|
963
|
-
* template ships reaches the public list endpoint by accident. A widget
|
|
964
|
-
* added to the template later either appears in the expected map above,
|
|
965
|
-
* or it must be refused; there is no third outcome, and "silently built a
|
|
966
|
-
* policy nobody reviewed" is exactly the one worth failing on.
|
|
967
|
-
*/
|
|
968
|
-
it("either lists a known resource or is refused, with nothing in between", () => {
|
|
631
|
+
it("applies a stored status filter, and refuses one that is not a real status", () => {
|
|
969
632
|
const config: DashboardViewConfig = storedConfig();
|
|
970
|
-
const
|
|
971
|
-
|
|
972
|
-
expect(components.length).toBeGreaterThan(0);
|
|
973
|
-
|
|
974
|
-
const outcomes: Array<string> = components.map(
|
|
975
|
-
(component: DashboardBaseComponent): string => {
|
|
976
|
-
return `${labelOf(component)} -> ${outcomeOf({ config, component })}`;
|
|
977
|
-
},
|
|
978
|
-
);
|
|
633
|
+
const list: DashboardBaseComponent = sloList(config);
|
|
979
634
|
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
635
|
+
const filtered: PublicDashboardResourceListPolicyResult = buildPolicy({
|
|
636
|
+
config,
|
|
637
|
+
component: {
|
|
638
|
+
...list,
|
|
639
|
+
arguments: {
|
|
640
|
+
...argumentsOf(list),
|
|
641
|
+
sloStatuses: [SloStatus.AtRisk, SloStatus.BudgetExhausted],
|
|
642
|
+
},
|
|
643
|
+
} as DashboardBaseComponent,
|
|
644
|
+
});
|
|
985
645
|
|
|
646
|
+
expect(filtered.query["sloStatus"]).toBeInstanceOf(Includes);
|
|
647
|
+
expect((filtered.query["sloStatus"] as Includes).values).toEqual([
|
|
648
|
+
SloStatus.AtRisk,
|
|
649
|
+
SloStatus.BudgetExhausted,
|
|
650
|
+
]);
|
|
986
651
|
/*
|
|
987
|
-
*
|
|
988
|
-
*
|
|
652
|
+
* A disabled SLO's status is frozen, so a status filter matches enabled
|
|
653
|
+
* SLOs only — the same predicate the browser list sends.
|
|
989
654
|
*/
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
);
|
|
995
|
-
const refused: Array<string> = outcomes.filter(
|
|
996
|
-
(outcome: string): boolean => {
|
|
997
|
-
return outcome.includes(" -> refused: ");
|
|
998
|
-
},
|
|
999
|
-
);
|
|
655
|
+
expect(filtered.query["isEnabled"]).toBe(true);
|
|
656
|
+
expect(routeQuery(buildPolicy({ config, component: list }))).toEqual({
|
|
657
|
+
isArchived: false,
|
|
658
|
+
projectId: DASHBOARD_PROJECT_ID,
|
|
659
|
+
});
|
|
1000
660
|
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
661
|
+
for (const brokenStatuses of [["Everything"], "At Risk", [3]]) {
|
|
662
|
+
expect(() => {
|
|
663
|
+
return buildPolicy({
|
|
664
|
+
config,
|
|
665
|
+
component: {
|
|
666
|
+
...list,
|
|
667
|
+
arguments: { ...argumentsOf(list), sloStatuses: brokenStatuses },
|
|
668
|
+
} as DashboardBaseComponent,
|
|
669
|
+
});
|
|
670
|
+
}).toThrow(BadDataException);
|
|
671
|
+
}
|
|
1006
672
|
});
|
|
1007
673
|
|
|
1008
|
-
|
|
1009
|
-
* Nothing that does resolve may resolve to an empty policy: a blank
|
|
1010
|
-
* resource type would fail the route's resource check for the wrong
|
|
1011
|
-
* reason, and a blank select would hand the serializer a whole row.
|
|
1012
|
-
*/
|
|
1013
|
-
it("gives every widget that does resolve a complete policy", () => {
|
|
674
|
+
it("takes its row cap from the stored widget, clamped to the project ceiling", () => {
|
|
1014
675
|
const config: DashboardViewConfig = storedConfig();
|
|
1015
|
-
const
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
expect(listWidgets.length).toBeGreaterThan(0);
|
|
1025
|
-
|
|
1026
|
-
for (const component of listWidgets) {
|
|
1027
|
-
const policy: PublicDashboardResourceListPolicyResult = buildPolicy({
|
|
1028
|
-
config,
|
|
1029
|
-
component,
|
|
1030
|
-
});
|
|
1031
|
-
|
|
1032
|
-
expect(
|
|
1033
|
-
`${labelOf(component)} resource "${policy.resourceType}"`,
|
|
1034
|
-
).not.toBe(`${labelOf(component)} resource ""`);
|
|
676
|
+
const list: DashboardBaseComponent = sloList(config);
|
|
677
|
+
|
|
678
|
+
for (const [maxRows, expected] of [
|
|
679
|
+
[10, 10],
|
|
680
|
+
[LIMIT_PER_PROJECT * 10, LIMIT_PER_PROJECT],
|
|
681
|
+
[0, SLO_LIST_DEFAULT_MAX_ROWS],
|
|
682
|
+
[undefined, SLO_LIST_DEFAULT_MAX_ROWS],
|
|
683
|
+
] as Array<[number | undefined, number]>) {
|
|
1035
684
|
expect(
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
685
|
+
buildPolicy({
|
|
686
|
+
config,
|
|
687
|
+
component: {
|
|
688
|
+
...list,
|
|
689
|
+
arguments: { ...argumentsOf(list), maxRows },
|
|
690
|
+
} as DashboardBaseComponent,
|
|
691
|
+
requestedQuery: { limit: 100000 },
|
|
692
|
+
}).limit,
|
|
693
|
+
).toBe(expected);
|
|
1040
694
|
}
|
|
1041
695
|
});
|
|
1042
696
|
});
|