@oneuptime/common 14.0.3 → 14.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/DatabaseModels/Alert.ts +55 -0
- package/Models/DatabaseModels/DatabaseServer.ts +1650 -0
- package/Models/DatabaseModels/DatabaseServerEndpoint.ts +540 -0
- package/Models/DatabaseModels/DatabaseServerFeed.ts +625 -0
- package/Models/DatabaseModels/DatabaseServerLabelRule.ts +514 -0
- package/Models/DatabaseModels/DatabaseServerOwnerRule.ts +596 -0
- package/Models/DatabaseModels/DatabaseServerOwnerTeam.ts +491 -0
- package/Models/DatabaseModels/DatabaseServerOwnerUser.ts +490 -0
- package/Models/DatabaseModels/Incident.ts +55 -0
- package/Models/DatabaseModels/Index.ts +16 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +26 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
- package/Models/DatabaseModels/TelemetryException.ts +2 -0
- package/Models/DatabaseModels/UserProjectSsoConsent.ts +146 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.ts +673 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Middleware/MultipartFormData.ts +1 -1
- package/Server/Middleware/TelemetryIngest.ts +15 -8
- package/Server/Services/AlertReminderRuleService.ts +100 -24
- package/Server/Services/DatabaseServerEndpointService.ts +895 -0
- package/Server/Services/DatabaseServerFeedService.ts +128 -0
- package/Server/Services/DatabaseServerLabelRuleEngineService.ts +340 -0
- package/Server/Services/DatabaseServerLabelRuleService.ts +14 -0
- package/Server/Services/DatabaseServerOwnerRuleEngineService.ts +425 -0
- package/Server/Services/DatabaseServerOwnerRuleService.ts +14 -0
- package/Server/Services/DatabaseServerOwnerTeamService.ts +180 -0
- package/Server/Services/DatabaseServerOwnerUserService.ts +173 -0
- package/Server/Services/DatabaseServerService.ts +4546 -0
- package/Server/Services/DatabaseService.ts +14 -8
- package/Server/Services/DockerResourceService.ts +43 -2
- package/Server/Services/IncidentReminderRuleService.ts +103 -23
- package/Server/Services/Index.ts +16 -0
- package/Server/Services/InventoryItemService.ts +113 -5
- package/Server/Services/IoTDeviceService.ts +145 -37
- package/Server/Services/MetricService.ts +1 -1
- package/Server/Services/OpenTelemetryIngestService.ts +19 -0
- package/Server/Services/PodmanResourceService.ts +43 -2
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +107 -23
- package/Server/Services/ServiceService.ts +1 -1
- package/Server/Services/TelemetryUsageBillingService.ts +29 -2
- package/Server/Services/UserProjectSsoConsentService.ts +74 -0
- package/Server/Services/UserService.ts +14 -1
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +18 -0
- package/Server/Types/Database/QueryHelper.ts +84 -2
- package/Server/Utils/AI/Toolbox/MetricTools.ts +13 -2
- package/Server/Utils/AI/Toolbox/ResourceTools.ts +81 -2
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +1 -1
- package/Server/Utils/Database/AffectedResourceRelations.ts +6 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +33 -0
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +192 -9
- package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +2264 -755
- package/Server/Utils/Monitor/MonitorIncident.ts +28 -1
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +268 -6
- package/Server/Utils/Monitor/MonitorResource.ts +47 -11
- package/Server/Utils/Monitor/MonitorResourceContext.ts +1 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +239 -21
- package/Server/Utils/Monitor/PerSeriesResolutionRootCause.ts +43 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +291 -0
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +111 -12
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
- package/Server/Utils/StartServer.ts +26 -6
- package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
- package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +688 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +5 -1
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +18 -1
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +175 -12
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +12 -0
- package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +606 -36
- package/Server/Utils/Telemetry/Telemetry.ts +16 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -22
- package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +16 -10
- package/Tests/App/Accounts/SignedInRedirect.test.tsx +241 -0
- package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +221 -4
- package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +42 -0
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +100 -0
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +86 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +2 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +19 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +14 -0
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +26 -1
- package/Tests/App/Dashboard/DashboardAppSsoError.test.tsx +501 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +64 -1
- package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +178 -18
- package/Tests/App/Dashboard/DashboardMasterPageSsoRedirect.test.tsx +444 -0
- package/Tests/App/Dashboard/DashboardNavBarForeignHiddenRule.test.tsx +573 -0
- package/Tests/App/Dashboard/DatabaseChartAxes.test.tsx +431 -0
- package/Tests/App/Dashboard/DatabaseContainerDetailBadge.test.tsx +249 -0
- package/Tests/App/Dashboard/DatabaseDashboardE2EFixes.test.ts +681 -0
- package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +1801 -0
- package/Tests/App/Dashboard/DatabaseFleetSummaryRefresh.test.tsx +280 -0
- package/Tests/App/Dashboard/DatabaseFormHelpers.test.tsx +321 -0
- package/Tests/App/Dashboard/DatabaseMetricMonitorLink.test.tsx +795 -0
- package/Tests/App/Dashboard/DatabaseOverviewHeader.test.tsx +580 -0
- package/Tests/App/Dashboard/DatabaseRecommendationsEngineMetrics.test.ts +270 -0
- package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +1486 -0
- package/Tests/App/Dashboard/DatabaseServerEngineMetricsFilter.test.ts +223 -0
- package/Tests/App/Dashboard/DatabaseServerPresentation.test.ts +435 -0
- package/Tests/App/Dashboard/DatabaseServerSummary.test.ts +186 -0
- package/Tests/App/Dashboard/DatabaseServerTelemetryQueries.test.ts +1553 -0
- package/Tests/App/Dashboard/DatabaseTableTruncation.test.tsx +326 -0
- package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +512 -0
- package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +774 -0
- package/Tests/App/Dashboard/DatabaseViewLayout.test.tsx +233 -0
- package/Tests/App/Dashboard/DatabaseWorkloadBadge.test.tsx +972 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +5 -0
- package/Tests/App/Dashboard/DiscoveryReviewUnnamedHostHint.test.tsx +1061 -0
- package/Tests/App/Dashboard/EventOverlayScope.test.ts +147 -0
- package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +1 -0
- package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +1 -0
- package/Tests/App/Dashboard/MetricsViewerDrillDown.test.tsx +310 -0
- package/Tests/App/Dashboard/MetricsViewerEntityScopedRows.test.tsx +495 -0
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +132 -1
- package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +5 -0
- package/Tests/App/Dashboard/NetworkTopologyExplorerSearch.test.tsx +1267 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +4 -3
- package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +349 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +62 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +14 -0
- package/Tests/App/Dashboard/ResourceOverviewTileTooltips.test.tsx +4 -1
- package/Tests/App/Dashboard/RumOverviewPage.test.tsx +127 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +2 -0
- package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +1085 -0
- package/Tests/App/Dashboard/SiteSearchBox.test.tsx +2110 -0
- package/Tests/App/Dashboard/TelemetryMetricsSignals.test.ts +168 -8
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +10 -0
- package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +2 -1
- package/Tests/App/StatusPage/StatusPageHeaderForeignHiddenRule.test.tsx +284 -0
- package/Tests/ClassStrings.ts +178 -0
- package/Tests/Fixtures/MobilePasskeyUser.json +1 -2
- package/Tests/ForeignHiddenRuleGuard.ts +2152 -0
- package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +2250 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +24 -5
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/RenderedMarkup.ts +518 -0
- package/Tests/ResponsiveVisibility.test.ts +490 -4
- package/Tests/ResponsiveVisibility.ts +505 -52
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +541 -0
- package/Tests/Server/Infrastructure/Postgres/AddUserProjectSsoConsentMigration.test.ts +234 -0
- package/Tests/Server/Services/ContainerSnapshotUpsertPostgres.test.ts +319 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +13 -0
- package/Tests/Server/Services/DatabaseServerEndpointService.test.ts +2033 -0
- package/Tests/Server/Services/DatabaseServerFeedAndOwnerServices.test.ts +529 -0
- package/Tests/Server/Services/DatabaseServerLifecycle.test.ts +3302 -0
- package/Tests/Server/Services/DatabaseServerRegistries.test.ts +603 -0
- package/Tests/Server/Services/DatabaseServerRuleEngines.test.ts +754 -0
- package/Tests/Server/Services/DatabaseServerService.test.ts +3558 -0
- package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +2045 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedPostgres.test.ts +362 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedReply.test.ts +210 -0
- package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +18 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +2 -0
- package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +225 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +280 -2
- package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +8 -2
- package/Tests/Server/Services/IoTDeviceLatestMetricsPostgres.test.ts +689 -0
- package/Tests/Server/Services/IoTDeviceService.test.ts +379 -0
- package/Tests/Server/Services/LatestMetricsValuesShape.test.ts +360 -0
- package/Tests/Server/Services/LlmModelPriceService.test.ts +402 -0
- package/Tests/Server/Services/MetricServiceAggregate.test.ts +12 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
- package/Tests/Server/Services/OwnerRowUniqueness.test.ts +61 -9
- package/Tests/Server/Services/ReminderRuleLookupPostgres.test.ts +2250 -0
- package/Tests/Server/Services/ReminderRuleRefreshOpenSubjectsPaging.test.ts +653 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +68 -20
- package/Tests/Server/Services/SavedViewDefaults.test.ts +325 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
- package/Tests/Server/Services/StatusPageCertificateService.test.ts +169 -0
- package/Tests/Server/Services/TeamComplianceSettingService.test.ts +191 -0
- package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +9 -0
- package/Tests/Server/Services/UserProjectSsoConsentPostgres.test.ts +153 -0
- package/Tests/Server/Services/UserProjectSsoConsentService.test.ts +192 -0
- package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +71 -0
- package/Tests/Server/Services/UserSignupIdTakeoverPostgres.test.ts +238 -0
- package/Tests/Server/Services/WorkspaceNotificationSummaryHelpers.test.ts +592 -0
- package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +3 -0
- package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +1 -0
- package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +11 -0
- package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +8 -0
- package/Tests/Server/Types/Database/QueryHelperBooleanForCriteriaBackedRule.test.ts +1094 -0
- package/Tests/Server/Types/Database/QueryHelperSearchAllWords.test.ts +651 -0
- package/Tests/Server/Utils/AI/AlertWriteTools.test.ts +256 -0
- package/Tests/Server/Utils/AI/IncidentWriteTools.test.ts +482 -0
- package/Tests/Server/Utils/AI/ResourceTools.test.ts +134 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +54 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +41 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +279 -9
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaDisplayContext.test.ts +933 -0
- package/Tests/Server/Utils/Monitor/DatabaseMaintenanceSuppression.test.ts +582 -0
- package/Tests/Server/Utils/Monitor/DatabaseServerMonitorLinking.test.ts +753 -0
- package/Tests/Server/Utils/Monitor/MetricDecimalThreshold.test.ts +417 -0
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +119 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +60 -25
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorAffectedResourceEdgeCases.test.ts +1815 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesAffectedResources.test.ts +1447 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesRatioEmail.test.ts +352 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformMetricUnits.test.ts +717 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformRawScan.test.ts +2125 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformSeriesAffectedResources.test.ts +1288 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +88 -0
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +205 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +62 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceDatabaseMaintenance.test.ts +803 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +133 -3
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +472 -1
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +236 -2
- package/Tests/Server/Utils/SeriesResourceLabels.test.ts +70 -0
- package/Tests/Server/Utils/StartServerProtobufContentType.test.ts +54 -0
- package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +1895 -0
- package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +7 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractorSeverityGate.test.ts +90 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +570 -0
- package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +97 -2
- package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +1337 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +295 -0
- package/Tests/Types/AI/AIResourceContext.test.ts +30 -0
- package/Tests/Types/BaseDatabase/AggregationType.test.ts +5 -1
- package/Tests/Types/Dashboard/KubernetesDashboardTemplate.test.ts +184 -0
- package/Tests/Types/Dashboard/KubernetesDashboardTemplates.test.ts +107 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerClassifier.test.ts +3644 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommand.test.ts +340 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommandCorpus.ts +826 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommandPostgres.test.ts +150 -0
- package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +2657 -0
- package/Tests/Types/DatabaseServer/DatabaseServerDiscoverySource.test.ts +64 -0
- package/Tests/Types/DatabaseServer/DatabaseServerEntityKeys.test.ts +952 -0
- package/Tests/Types/DatabaseServer/DatabaseServerMetricCatalog.test.ts +1161 -0
- package/Tests/Types/DatabaseServer/DatabaseSystem.test.ts +1514 -0
- package/Tests/Types/DatabaseServer/DatabaseTelemetryResolver.test.ts +1558 -0
- package/Tests/Types/Monitor/CephAlertTemplates.test.ts +255 -6
- package/Tests/Types/Monitor/DatabaseAlertTemplates.test.ts +2254 -0
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +292 -0
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +272 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +253 -9
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +13 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +4 -2
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +111 -2
- package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +61 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +114 -0
- package/Tests/Types/Monitor/Utils/KubernetesAgentEmittedMetrics.ts +202 -0
- package/Tests/Types/NetworkDevice/DiscoveredHostNamingStatus.test.ts +401 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +4 -1
- package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +24 -2
- package/Tests/UI/Components/Card.test.tsx +93 -2
- package/Tests/UI/Components/FeedOptions.test.ts +6 -0
- package/Tests/UI/Components/FeedOptionsButton.test.tsx +8 -1
- package/Tests/UI/Components/ForeignHiddenRuleResilience.test.tsx +1147 -0
- package/Tests/UI/Components/HeaderRightRail.test.tsx +41 -1
- package/Tests/UI/Components/LogsEntityNames.test.ts +16 -1
- package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +7 -3
- package/Tests/UI/Components/ResourceFacetConfigs.test.ts +2 -1
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +994 -0
- package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +34 -1
- package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +4 -1
- package/Tests/UI/ForeignHiddenRuleGuard.test.ts +1951 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +76 -0
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +19 -1
- package/Tests/UI/Rum/ReplayRailDetail.test.tsx +53 -0
- package/Tests/UI/Rum/ReplaySignals.test.ts +54 -0
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +19 -1
- package/Tests/UI/TailwindPlayCdnForeignHiddenRule.test.ts +1005 -0
- package/Tests/UI/ThemeGroupHoverReveal.test.ts +847 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +70 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +21 -0
- package/Tests/UI/Utils/ModelAPISsoRedirect.test.ts +127 -0
- package/Tests/UI/Utils/Navigation.test.ts +102 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +23 -0
- package/Tests/Utils/Dashboard/KubernetesClusterCpuTileRepair.test.ts +370 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
- package/Tests/Utils/MetricUnitUtil.test.ts +227 -2
- package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +288 -2
- package/Tests/Utils/Monitor/PlatformResourceIdentityAndUnits.test.ts +1559 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.test.ts +2546 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +315 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +336 -1
- package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +244 -0
- package/Tests/Utils/Rules/MonitorTypeRuleCriteria.test.ts +181 -0
- package/Tests/Utils/ValueFormatter.test.ts +50 -0
- package/Tests/tsconfig.json +16 -0
- package/Types/AI/AIResourceContext.ts +7 -0
- package/Types/BaseDatabase/AggregationType.ts +7 -0
- package/Types/Dashboard/DashboardTemplates.ts +22 -8
- package/Types/DatabaseServer/DatabaseConnectionSpan.ts +77 -0
- package/Types/DatabaseServer/DatabaseContainerClassifier.ts +2068 -0
- package/Types/DatabaseServer/DatabaseContainerCommand.ts +801 -0
- package/Types/DatabaseServer/DatabaseEndpoint.ts +1943 -0
- package/Types/DatabaseServer/DatabaseServerDiscoverySource.ts +68 -0
- package/Types/DatabaseServer/DatabaseServerMetricCatalog.ts +966 -0
- package/Types/DatabaseServer/DatabaseSystem.ts +2124 -0
- package/Types/DatabaseServer/DatabaseTelemetryResolver.ts +555 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/CephAlertTemplates.ts +18 -0
- package/Types/Monitor/DatabaseAlertTemplates.ts +2020 -0
- package/Types/Monitor/KubernetesAlertTemplates.ts +64 -24
- package/Types/Monitor/KubernetesMetricCatalog.ts +118 -19
- package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +14 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +93 -10
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +109 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +36 -7
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +43 -2
- package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +41 -6
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +26 -0
- package/Types/NetworkDevice/DiscoveredHostNamingStatus.ts +147 -0
- package/Types/Permission.ts +267 -0
- package/Types/Probe/ProbeApiIngestResponse.ts +8 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +10 -0
- package/Types/Rules/RuleRun.ts +12 -0
- package/Types/Rum/SessionReplayCustomEvents.ts +29 -3
- package/Types/Rum/WebVitals.ts +13 -0
- package/Types/Telemetry/EntityType.ts +23 -0
- package/Types/Telemetry/ResourceFacetCatalog.ts +14 -0
- package/Types/Telemetry/ServiceType.ts +8 -0
- package/UI/Components/Banner/Banner.tsx +1 -1
- package/UI/Components/Card/Card.tsx +1 -1
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -2
- package/UI/Components/Charts/Line/LineChart.tsx +7 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +1 -1
- package/UI/Components/Date/StartAndEndDate.tsx +5 -5
- package/UI/Components/Diagram/HorizontalStepChain.tsx +1 -1
- package/UI/Components/Feed/FeedOptionsButton.tsx +1 -1
- package/UI/Components/Forms/BasicForm.tsx +1 -1
- package/UI/Components/Header/Header.tsx +1 -1
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -1
- package/UI/Components/HeaderAlert/HeaderAlert.tsx +1 -1
- package/UI/Components/Input/Input.tsx +11 -0
- package/UI/Components/LogsViewer/components/FacetValueRow.tsx +1 -1
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +1 -1
- package/UI/Components/Modal/ModalFooter.tsx +1 -1
- package/UI/Components/ModelDetail/CardModelDetail.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +4 -4
- package/UI/Components/Navbar/NavBar.tsx +9 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -2
- package/UI/Components/Page/Page.tsx +1 -1
- package/UI/Components/Pagination/Pagination.tsx +3 -3
- package/UI/Components/ProgressButtons/ProgressButtonItem.tsx +1 -1
- package/UI/Components/SideMenu/SideMenu.tsx +4 -1
- package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +4 -2
- package/UI/Components/StatusPage/ResourceList.tsx +6 -6
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +1 -1
- package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +1 -1
- package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +1 -1
- package/UI/Components/Workflow/ComponentsModal.tsx +2 -2
- package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
- package/UI/Styles/Theme.css +8 -1
- package/UI/Utils/Navigation.ts +89 -42
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +7 -0
- package/UI/Utils/TelemetryService.ts +4 -3
- package/Utils/Dashboard/KubernetesClusterCpuTileRepair.ts +147 -0
- package/Utils/LabelRuleImportExport.ts +2 -0
- package/Utils/MetricUnitUtil.ts +103 -11
- package/Utils/Monitor/MetricValueFormatter.ts +66 -13
- package/Utils/Monitor/PlatformMetricUnitUtil.ts +215 -0
- package/Utils/Monitor/PlatformResourceIdentity.ts +514 -0
- package/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.ts +425 -0
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +32 -0
- package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +73 -0
- package/Utils/Telemetry/DatabaseServerEntityKeys.ts +275 -0
- package/Utils/Telemetry/EntityKey.ts +176 -0
- package/Utils/ValueFormatter.ts +16 -0
- package/build/dist/Models/DatabaseModels/Alert.js +54 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseServer.js +1683 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +559 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js +506 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js +505 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +54 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +16 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js +162 -0
- package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js +240 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +15 -8
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +72 -23
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseServerEndpointService.js +694 -0
- package/build/dist/Server/Services/DatabaseServerEndpointService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerFeedService.js +110 -0
- package/build/dist/Server/Services/DatabaseServerFeedService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js +272 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleService.js +13 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js +340 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js +160 -0
- package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerUserService.js +153 -0
- package/build/dist/Server/Services/DatabaseServerOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerService.js +3272 -0
- package/build/dist/Server/Services/DatabaseServerService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseService.js +8 -4
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerResourceService.js +30 -3
- package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +73 -23
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +16 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +88 -5
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/IoTDeviceService.js +111 -24
- package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
- package/build/dist/Server/Services/MetricService.js +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +24 -9
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PodmanResourceService.js +30 -3
- package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +75 -23
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +1 -1
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +23 -2
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/UserProjectSsoConsentService.js +79 -0
- package/build/dist/Server/Services/UserProjectSsoConsentService.js.map +1 -0
- package/build/dist/Server/Services/UserService.js +13 -1
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +18 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +73 -2
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js +13 -2
- package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +58 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +1 -1
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +6 -0
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +31 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +135 -14
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1489 -524
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +196 -6
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +36 -9
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +175 -17
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js +29 -0
- package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +211 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +82 -10
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +20 -4
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +442 -0
- package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +15 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +121 -5
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +12 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +438 -36
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +12 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -18
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +16 -10
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -1
- package/build/dist/Types/AI/AIResourceContext.js +7 -0
- package/build/dist/Types/AI/AIResourceContext.js.map +1 -1
- package/build/dist/Types/BaseDatabase/AggregationType.js +7 -0
- package/build/dist/Types/BaseDatabase/AggregationType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +22 -8
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js +71 -0
- package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js +1462 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js +691 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +1407 -0
- package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js +60 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js +804 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseSystem.js +1860 -0
- package/build/dist/Types/DatabaseServer/DatabaseSystem.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js +406 -0
- package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/CephAlertTemplates.js +18 -0
- package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseAlertTemplates.js +1518 -0
- package/build/dist/Types/Monitor/DatabaseAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +57 -24
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +104 -18
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +80 -3
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +10 -3
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +29 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +21 -6
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +25 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js +136 -0
- package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js.map +1 -0
- package/build/dist/Types/Permission.js +234 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +10 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -1
- package/build/dist/Types/Rum/WebVitals.js +12 -0
- package/build/dist/Types/Rum/WebVitals.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +23 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +14 -0
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +8 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Banner/Banner.js +1 -1
- package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +1 -1
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +1 -1
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/Date/StartAndEndDate.js +5 -5
- package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
- package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +1 -1
- package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js +1 -1
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +1 -1
- package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +1 -1
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +2 -2
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -4
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +9 -2
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/Page/Page.js +1 -1
- package/build/dist/UI/Components/Page/Page.js.map +1 -1
- package/build/dist/UI/Components/Pagination/Pagination.js +3 -3
- package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
- package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js +1 -1
- package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +3 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceList.js +6 -6
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +1 -1
- package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +2 -2
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +66 -33
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +7 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +3 -2
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/Utils/Dashboard/KubernetesClusterCpuTileRepair.js +110 -0
- package/build/dist/Utils/Dashboard/KubernetesClusterCpuTileRepair.js.map +1 -0
- package/build/dist/Utils/LabelRuleImportExport.js +2 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/MetricUnitUtil.js +77 -13
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +58 -13
- package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -1
- package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js +161 -0
- package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/PlatformResourceIdentity.js +323 -0
- package/build/dist/Utils/Monitor/PlatformResourceIdentity.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js +270 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +23 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +61 -0
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js +178 -0
- package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +133 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/ValueFormatter.js +15 -0
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/package.json +1 -1
- package/tsconfig.tests.json +7 -5
|
@@ -20,6 +20,7 @@ jest.mock("../../../Server/Utils/PasswordHash", () => {
|
|
|
20
20
|
|
|
21
21
|
import CephClusterService from "../../../Server/Services/CephClusterService";
|
|
22
22
|
import CloudResourceService from "../../../Server/Services/CloudResourceService";
|
|
23
|
+
import DatabaseServerService from "../../../Server/Services/DatabaseServerService";
|
|
23
24
|
import DockerHostService from "../../../Server/Services/DockerHostService";
|
|
24
25
|
import DockerSwarmClusterService from "../../../Server/Services/DockerSwarmClusterService";
|
|
25
26
|
import GlobalCache from "../../../Server/Infrastructure/GlobalCache";
|
|
@@ -46,9 +47,10 @@ import {
|
|
|
46
47
|
/*
|
|
47
48
|
* Every resource type's liveness heartbeat, pinned together.
|
|
48
49
|
*
|
|
49
|
-
*
|
|
50
|
-
* otelCollectorStatus
|
|
51
|
-
* OpenTelemetry resource attributes, and
|
|
50
|
+
* Thirteen services write the same two liveness columns (lastSeenAt +
|
|
51
|
+
* otelCollectorStatus; a database adds collectorLastSeenAt) alongside
|
|
52
|
+
* optional columns harvested from OpenTelemetry resource attributes, and
|
|
53
|
+
* each has its own markDisconnected*
|
|
52
54
|
* job that flips the resource to "disconnected" 15 minutes after lastSeenAt
|
|
53
55
|
* stops advancing. They now share one implementation — ResourceHeartbeat —
|
|
54
56
|
* because eleven hand-copied versions meant eleven copies of the same defect
|
|
@@ -109,11 +111,49 @@ type ServiceCase = {
|
|
|
109
111
|
* These are what defeated the old throttle — see the header.
|
|
110
112
|
*/
|
|
111
113
|
churningExtras?: Array<Record<string, unknown>>;
|
|
114
|
+
/**
|
|
115
|
+
* The columns every heartbeat writes, when not just lastSeenAt +
|
|
116
|
+
* otelCollectorStatus. A database also stamps collectorLastSeenAt: an
|
|
117
|
+
* application querying it moves lastSeenAt too, so only that column says
|
|
118
|
+
* the COLLECTOR is alive.
|
|
119
|
+
*/
|
|
120
|
+
livenessColumns?: Array<string>;
|
|
112
121
|
};
|
|
113
122
|
|
|
114
123
|
/** Longer than any bounded column on any of these models. */
|
|
115
124
|
const OVERSIZED: string = "x".repeat(5000);
|
|
116
125
|
|
|
126
|
+
const DEFAULT_LIVENESS_COLUMNS: Array<string> = [
|
|
127
|
+
"lastSeenAt",
|
|
128
|
+
"otelCollectorStatus",
|
|
129
|
+
];
|
|
130
|
+
|
|
131
|
+
/*
|
|
132
|
+
* The database heartbeat is recordCollectorHeartbeat (a CLIENT span calling
|
|
133
|
+
* the database is a separate, sighting-only heartbeat). This view of the real
|
|
134
|
+
* service gives it the updateLastSeen shape the table drives - `this` stays
|
|
135
|
+
* the view, so the write spies below still see every UPDATE - and answers
|
|
136
|
+
* the one read the heartbeat makes afterwards (the auto-archive restore
|
|
137
|
+
* check) with "no row", so the suite still never reaches Postgres.
|
|
138
|
+
*/
|
|
139
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
140
|
+
const databaseServerHeartbeat: any = Object.assign(
|
|
141
|
+
Object.create(DatabaseServerService),
|
|
142
|
+
{
|
|
143
|
+
updateLastSeen: function (
|
|
144
|
+
this: typeof DatabaseServerService,
|
|
145
|
+
id: ObjectID,
|
|
146
|
+
extra?: { agentVersion?: string; dbVersion?: string },
|
|
147
|
+
): Promise<void> {
|
|
148
|
+
return this.recordCollectorHeartbeat(id, extra);
|
|
149
|
+
},
|
|
150
|
+
findOneById: async (): Promise<null> => {
|
|
151
|
+
return null;
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
);
|
|
155
|
+
/* eslint-enable @typescript-eslint/no-explicit-any */
|
|
156
|
+
|
|
117
157
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
118
158
|
const SERVICE_CASES: Array<ServiceCase> = [
|
|
119
159
|
{
|
|
@@ -257,6 +297,19 @@ const SERVICE_CASES: Array<ServiceCase> = [
|
|
|
257
297
|
{ osType: "linux", processCount: 413, totalMemoryBytes: 17179869184 },
|
|
258
298
|
],
|
|
259
299
|
},
|
|
300
|
+
{
|
|
301
|
+
name: "DatabaseServerService",
|
|
302
|
+
service: databaseServerHeartbeat,
|
|
303
|
+
namespace: "database-server-last-seen",
|
|
304
|
+
extra: { agentVersion: "0.118.0" },
|
|
305
|
+
otherExtra: { agentVersion: "0.119.0" },
|
|
306
|
+
oversizedExtra: { dbVersion: OVERSIZED },
|
|
307
|
+
livenessColumns: [
|
|
308
|
+
"collectorLastSeenAt",
|
|
309
|
+
"lastSeenAt",
|
|
310
|
+
"otelCollectorStatus",
|
|
311
|
+
],
|
|
312
|
+
},
|
|
260
313
|
];
|
|
261
314
|
/* eslint-enable @typescript-eslint/no-explicit-any */
|
|
262
315
|
|
|
@@ -269,7 +322,11 @@ describe.each(SERVICE_CASES)(
|
|
|
269
322
|
otherExtra,
|
|
270
323
|
oversizedExtra,
|
|
271
324
|
churningExtras,
|
|
325
|
+
livenessColumns,
|
|
272
326
|
}: ServiceCase) => {
|
|
327
|
+
const liveness: Array<string> = [
|
|
328
|
+
...(livenessColumns || DEFAULT_LIVENESS_COLUMNS),
|
|
329
|
+
].sort();
|
|
273
330
|
let writes: Array<WriteCall>;
|
|
274
331
|
let cache: Map<string, string>;
|
|
275
332
|
let deletedCacheKeys: Array<string>;
|
|
@@ -329,8 +386,8 @@ describe.each(SERVICE_CASES)(
|
|
|
329
386
|
}
|
|
330
387
|
|
|
331
388
|
/**
|
|
332
|
-
* Fails any write carrying more than the
|
|
333
|
-
*
|
|
389
|
+
* Fails any write carrying more than the liveness columns — the shape
|
|
390
|
+
* of a Postgres rejection caused by one bad optional column.
|
|
334
391
|
*/
|
|
335
392
|
function mockEnrichedWriteFailing(): void {
|
|
336
393
|
jest
|
|
@@ -340,7 +397,7 @@ describe.each(SERVICE_CASES)(
|
|
|
340
397
|
...(input.data as Record<string, unknown>),
|
|
341
398
|
};
|
|
342
399
|
writes.push({ id: input.id, data: data });
|
|
343
|
-
if (Object.keys(data).length >
|
|
400
|
+
if (Object.keys(data).length > liveness.length) {
|
|
344
401
|
throw new Error("value too long for type character varying(100)");
|
|
345
402
|
}
|
|
346
403
|
return true;
|
|
@@ -505,10 +562,7 @@ describe.each(SERVICE_CASES)(
|
|
|
505
562
|
await service.updateLastSeen(RESOURCE_ID, oversizedExtra as never);
|
|
506
563
|
|
|
507
564
|
expect(writes).toHaveLength(2);
|
|
508
|
-
expect(Object.keys(lastWrite()).sort()).toEqual(
|
|
509
|
-
"lastSeenAt",
|
|
510
|
-
"otelCollectorStatus",
|
|
511
|
-
]);
|
|
565
|
+
expect(Object.keys(lastWrite()).sort()).toEqual(liveness);
|
|
512
566
|
expect(lastWrite()["otelCollectorStatus"]).toBe("connected");
|
|
513
567
|
expect(lastWrite()["lastSeenAt"]).toBeInstanceOf(Date);
|
|
514
568
|
});
|
|
@@ -553,10 +607,7 @@ describe.each(SERVICE_CASES)(
|
|
|
553
607
|
|
|
554
608
|
await service.updateLastSeen(RESOURCE_ID, oversizedExtra as never);
|
|
555
609
|
|
|
556
|
-
expect(Object.keys(lastWrite()).sort()).toEqual(
|
|
557
|
-
"lastSeenAt",
|
|
558
|
-
"otelCollectorStatus",
|
|
559
|
-
]);
|
|
610
|
+
expect(Object.keys(lastWrite()).sort()).toEqual(liveness);
|
|
560
611
|
});
|
|
561
612
|
|
|
562
613
|
test("surfaces a genuinely broken database instead of hiding it", async () => {
|
|
@@ -617,10 +668,7 @@ describe.each(SERVICE_CASES)(
|
|
|
617
668
|
await service.updateLastSeen(RESOURCE_ID, extra as never);
|
|
618
669
|
|
|
619
670
|
expect(writes).toHaveLength(1);
|
|
620
|
-
expect(Object.keys(lastWrite()).sort()).toEqual(
|
|
621
|
-
"lastSeenAt",
|
|
622
|
-
"otelCollectorStatus",
|
|
623
|
-
]);
|
|
671
|
+
expect(Object.keys(lastWrite()).sort()).toEqual(liveness);
|
|
624
672
|
});
|
|
625
673
|
});
|
|
626
674
|
|
|
@@ -668,11 +716,11 @@ describe.each(SERVICE_CASES)(
|
|
|
668
716
|
describe("liveness fallback coverage", () => {
|
|
669
717
|
test("covers every service that writes liveness on the hook-free path", () => {
|
|
670
718
|
/*
|
|
671
|
-
* If a
|
|
719
|
+
* If a fourteenth resource type grows an updateLastSeen, it belongs in
|
|
672
720
|
* SERVICE_CASES — that is the whole point of this suite. Bumping this
|
|
673
721
|
* number without adding the case defeats it.
|
|
674
722
|
*/
|
|
675
|
-
expect(SERVICE_CASES).toHaveLength(
|
|
723
|
+
expect(SERVICE_CASES).toHaveLength(13);
|
|
676
724
|
});
|
|
677
725
|
|
|
678
726
|
test("no service is listed twice", () => {
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import LogSavedViewService from "../../../Server/Services/LogSavedViewService";
|
|
2
|
+
import MetricSavedViewService from "../../../Server/Services/MetricSavedViewService";
|
|
3
|
+
import TraceSavedViewService from "../../../Server/Services/TraceSavedViewService";
|
|
4
|
+
import CreateBy from "../../../Server/Types/Database/CreateBy";
|
|
5
|
+
import UpdateBy from "../../../Server/Types/Database/UpdateBy";
|
|
6
|
+
import { OnCreate, OnUpdate } from "../../../Server/Types/Database/Hooks";
|
|
7
|
+
import LogSavedView from "../../../Models/DatabaseModels/LogSavedView";
|
|
8
|
+
import MetricSavedView from "../../../Models/DatabaseModels/MetricSavedView";
|
|
9
|
+
import TraceSavedView from "../../../Models/DatabaseModels/TraceSavedView";
|
|
10
|
+
import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
11
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
12
|
+
import { afterEach, describe, expect, test } from "@jest/globals";
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
* Telemetry saved views (logs, traces and metrics) each promise a project
|
|
16
|
+
* exactly one default: the first view a project saves becomes its default, and
|
|
17
|
+
* marking another one default clears whichever view held it. Three services
|
|
18
|
+
* carry the same hooks, so the suite runs against all three -- a change made
|
|
19
|
+
* to one of them and not the others shows up here rather than as a project
|
|
20
|
+
* whose telemetry page opens two default views, or none.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
type SavedViewModel = LogSavedView | MetricSavedView | TraceSavedView;
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
* The two hooks under test, reached past `protected`. Typed over the union of
|
|
27
|
+
* the three models so one set of cases can drive all three services.
|
|
28
|
+
*/
|
|
29
|
+
type SavedViewService = {
|
|
30
|
+
onBeforeCreate: (
|
|
31
|
+
createBy: CreateBy<SavedViewModel>,
|
|
32
|
+
) => Promise<OnCreate<SavedViewModel>>;
|
|
33
|
+
onBeforeUpdate: (
|
|
34
|
+
updateBy: UpdateBy<SavedViewModel>,
|
|
35
|
+
) => Promise<OnUpdate<SavedViewModel>>;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
type ServiceCase = {
|
|
39
|
+
label: string;
|
|
40
|
+
service: SavedViewService;
|
|
41
|
+
buildModel: () => SavedViewModel;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
45
|
+
"11111111-1111-4111-8111-111111111111",
|
|
46
|
+
);
|
|
47
|
+
const VIEW_ID: ObjectID = new ObjectID("22222222-2222-4222-8222-222222222222");
|
|
48
|
+
|
|
49
|
+
const cases: Array<ServiceCase> = [
|
|
50
|
+
{
|
|
51
|
+
label: "LogSavedViewService",
|
|
52
|
+
service: LogSavedViewService as unknown as SavedViewService,
|
|
53
|
+
buildModel: (): SavedViewModel => {
|
|
54
|
+
return new LogSavedView();
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
label: "TraceSavedViewService",
|
|
59
|
+
service: TraceSavedViewService as unknown as SavedViewService,
|
|
60
|
+
buildModel: (): SavedViewModel => {
|
|
61
|
+
return new TraceSavedView();
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
label: "MetricSavedViewService",
|
|
66
|
+
service: MetricSavedViewService as unknown as SavedViewService,
|
|
67
|
+
buildModel: (): SavedViewModel => {
|
|
68
|
+
return new MetricSavedView();
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
|
|
73
|
+
afterEach(() => {
|
|
74
|
+
jest.restoreAllMocks();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe.each(cases)(
|
|
78
|
+
"$label default-view hooks",
|
|
79
|
+
({ service, buildModel }: ServiceCase) => {
|
|
80
|
+
function mockFindOneBy(existing: SavedViewModel | null): jest.SpyInstance {
|
|
81
|
+
return jest
|
|
82
|
+
.spyOn(service as never, "findOneBy")
|
|
83
|
+
.mockResolvedValue(existing as never);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function mockFindBy(items: Array<SavedViewModel>): jest.SpyInstance {
|
|
87
|
+
return jest
|
|
88
|
+
.spyOn(service as never, "findBy")
|
|
89
|
+
.mockResolvedValue(items as never);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function mockUpdateBy(): jest.SpyInstance {
|
|
93
|
+
return jest
|
|
94
|
+
.spyOn(service as never, "updateBy")
|
|
95
|
+
.mockResolvedValue(undefined as never);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
describe("onBeforeCreate", () => {
|
|
99
|
+
test("the first view a project saves becomes its default", async () => {
|
|
100
|
+
mockFindOneBy(null);
|
|
101
|
+
const updateSpy: jest.SpyInstance = mockUpdateBy();
|
|
102
|
+
|
|
103
|
+
const view: SavedViewModel = buildModel();
|
|
104
|
+
view.projectId = PROJECT_ID;
|
|
105
|
+
|
|
106
|
+
const result: OnCreate<SavedViewModel> = await service.onBeforeCreate({
|
|
107
|
+
data: view,
|
|
108
|
+
} as CreateBy<SavedViewModel>);
|
|
109
|
+
|
|
110
|
+
expect(result.createBy.data.isDefault).toBe(true);
|
|
111
|
+
/*
|
|
112
|
+
* Nothing else held the default, but the sweep still runs and is a no-op
|
|
113
|
+
* against an empty project.
|
|
114
|
+
*/
|
|
115
|
+
expect(updateSpy).toHaveBeenCalledTimes(1);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("a later view is not made default while one already exists", async () => {
|
|
119
|
+
const existing: SavedViewModel = buildModel();
|
|
120
|
+
existing._id = VIEW_ID.toString();
|
|
121
|
+
mockFindOneBy(existing);
|
|
122
|
+
const updateSpy: jest.SpyInstance = mockUpdateBy();
|
|
123
|
+
|
|
124
|
+
const view: SavedViewModel = buildModel();
|
|
125
|
+
view.projectId = PROJECT_ID;
|
|
126
|
+
|
|
127
|
+
const result: OnCreate<SavedViewModel> = await service.onBeforeCreate({
|
|
128
|
+
data: view,
|
|
129
|
+
} as CreateBy<SavedViewModel>);
|
|
130
|
+
|
|
131
|
+
expect(result.createBy.data.isDefault).toBe(false);
|
|
132
|
+
// Not default, so nothing is unset.
|
|
133
|
+
expect(updateSpy).not.toHaveBeenCalled();
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test("an explicit isDefault=true clears whichever view held it", async () => {
|
|
137
|
+
const findOneSpy: jest.SpyInstance = mockFindOneBy(null);
|
|
138
|
+
const updateSpy: jest.SpyInstance = mockUpdateBy();
|
|
139
|
+
|
|
140
|
+
const view: SavedViewModel = buildModel();
|
|
141
|
+
view.projectId = PROJECT_ID;
|
|
142
|
+
view.isDefault = true;
|
|
143
|
+
|
|
144
|
+
await service.onBeforeCreate({
|
|
145
|
+
data: view,
|
|
146
|
+
} as CreateBy<SavedViewModel>);
|
|
147
|
+
|
|
148
|
+
// The caller said so, so the service does not go looking.
|
|
149
|
+
expect(findOneSpy).not.toHaveBeenCalled();
|
|
150
|
+
expect(updateSpy).toHaveBeenCalledTimes(1);
|
|
151
|
+
const updateArgs: Record<string, unknown> = updateSpy.mock
|
|
152
|
+
.calls[0]?.[0] as Record<string, unknown>;
|
|
153
|
+
const query: Record<string, unknown> = updateArgs["query"] as Record<
|
|
154
|
+
string,
|
|
155
|
+
unknown
|
|
156
|
+
>;
|
|
157
|
+
expect(query["projectId"]).toBe(PROJECT_ID);
|
|
158
|
+
expect(query["isDefault"]).toBe(true);
|
|
159
|
+
expect(updateArgs["data"]).toEqual({ isDefault: false });
|
|
160
|
+
/*
|
|
161
|
+
* The sweep runs as root: a member may only see their own views, and
|
|
162
|
+
* leaving the others default would break the one-default promise.
|
|
163
|
+
*/
|
|
164
|
+
expect(updateArgs["props"]).toEqual({ isRoot: true });
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
test("an explicit isDefault=false is kept, and unsets nothing", async () => {
|
|
168
|
+
const findOneSpy: jest.SpyInstance = mockFindOneBy(null);
|
|
169
|
+
const updateSpy: jest.SpyInstance = mockUpdateBy();
|
|
170
|
+
|
|
171
|
+
const view: SavedViewModel = buildModel();
|
|
172
|
+
view.projectId = PROJECT_ID;
|
|
173
|
+
view.isDefault = false;
|
|
174
|
+
|
|
175
|
+
const result: OnCreate<SavedViewModel> = await service.onBeforeCreate({
|
|
176
|
+
data: view,
|
|
177
|
+
} as CreateBy<SavedViewModel>);
|
|
178
|
+
|
|
179
|
+
expect(result.createBy.data.isDefault).toBe(false);
|
|
180
|
+
expect(findOneSpy).not.toHaveBeenCalled();
|
|
181
|
+
expect(updateSpy).not.toHaveBeenCalled();
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test("a view with no project is left alone", async () => {
|
|
185
|
+
const findOneSpy: jest.SpyInstance = mockFindOneBy(null);
|
|
186
|
+
const updateSpy: jest.SpyInstance = mockUpdateBy();
|
|
187
|
+
|
|
188
|
+
const view: SavedViewModel = buildModel();
|
|
189
|
+
|
|
190
|
+
const result: OnCreate<SavedViewModel> = await service.onBeforeCreate({
|
|
191
|
+
data: view,
|
|
192
|
+
} as CreateBy<SavedViewModel>);
|
|
193
|
+
|
|
194
|
+
expect(result.createBy.data.isDefault).toBeUndefined();
|
|
195
|
+
expect(findOneSpy).not.toHaveBeenCalled();
|
|
196
|
+
expect(updateSpy).not.toHaveBeenCalled();
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
test("the lookup for an existing default is scoped to the same project", async () => {
|
|
200
|
+
const findOneSpy: jest.SpyInstance = mockFindOneBy(null);
|
|
201
|
+
mockUpdateBy();
|
|
202
|
+
|
|
203
|
+
const view: SavedViewModel = buildModel();
|
|
204
|
+
view.projectId = PROJECT_ID;
|
|
205
|
+
|
|
206
|
+
await service.onBeforeCreate({
|
|
207
|
+
data: view,
|
|
208
|
+
} as CreateBy<SavedViewModel>);
|
|
209
|
+
|
|
210
|
+
const findArgs: Record<string, unknown> = findOneSpy.mock
|
|
211
|
+
.calls[0]?.[0] as Record<string, unknown>;
|
|
212
|
+
expect(findArgs["query"]).toEqual({
|
|
213
|
+
projectId: PROJECT_ID,
|
|
214
|
+
isDefault: true,
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
describe("onBeforeUpdate", () => {
|
|
220
|
+
test("promoting a view to default demotes the others, but not itself", async () => {
|
|
221
|
+
const item: SavedViewModel = buildModel();
|
|
222
|
+
item._id = VIEW_ID.toString();
|
|
223
|
+
item.projectId = PROJECT_ID;
|
|
224
|
+
mockFindBy([item]);
|
|
225
|
+
const updateSpy: jest.SpyInstance = mockUpdateBy();
|
|
226
|
+
|
|
227
|
+
await service.onBeforeUpdate({
|
|
228
|
+
query: { _id: VIEW_ID.toString() },
|
|
229
|
+
data: { isDefault: true },
|
|
230
|
+
} as unknown as UpdateBy<SavedViewModel>);
|
|
231
|
+
|
|
232
|
+
expect(updateSpy).toHaveBeenCalledTimes(1);
|
|
233
|
+
const query: Record<string, unknown> = (
|
|
234
|
+
updateSpy.mock.calls[0]?.[0] as Record<string, unknown>
|
|
235
|
+
)["query"] as Record<string, unknown>;
|
|
236
|
+
expect(query["projectId"]).toBe(PROJECT_ID);
|
|
237
|
+
expect(query["isDefault"]).toBe(true);
|
|
238
|
+
/*
|
|
239
|
+
* The view being promoted is excluded, so the same statement cannot
|
|
240
|
+
* demote it again.
|
|
241
|
+
*/
|
|
242
|
+
expect(query["_id"]).toBeDefined();
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
test("an update that does not set isDefault=true touches nothing", async () => {
|
|
246
|
+
const findSpy: jest.SpyInstance = mockFindBy([]);
|
|
247
|
+
const updateSpy: jest.SpyInstance = mockUpdateBy();
|
|
248
|
+
|
|
249
|
+
for (const data of [{ name: "Renamed" }, { isDefault: false }] as Array<
|
|
250
|
+
Partial<SavedViewModel>
|
|
251
|
+
>) {
|
|
252
|
+
await service.onBeforeUpdate({
|
|
253
|
+
query: { _id: VIEW_ID.toString() },
|
|
254
|
+
data: data,
|
|
255
|
+
} as unknown as UpdateBy<SavedViewModel>);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
expect(findSpy).not.toHaveBeenCalled();
|
|
259
|
+
expect(updateSpy).not.toHaveBeenCalled();
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test("a bulk promotion demotes the others in each affected project", async () => {
|
|
263
|
+
const otherProjectId: ObjectID = new ObjectID(
|
|
264
|
+
"33333333-3333-4333-8333-333333333333",
|
|
265
|
+
);
|
|
266
|
+
const first: SavedViewModel = buildModel();
|
|
267
|
+
first._id = VIEW_ID.toString();
|
|
268
|
+
first.projectId = PROJECT_ID;
|
|
269
|
+
const second: SavedViewModel = buildModel();
|
|
270
|
+
second._id = "44444444-4444-4444-8444-444444444444";
|
|
271
|
+
second.projectId = otherProjectId;
|
|
272
|
+
mockFindBy([first, second]);
|
|
273
|
+
const updateSpy: jest.SpyInstance = mockUpdateBy();
|
|
274
|
+
|
|
275
|
+
await service.onBeforeUpdate({
|
|
276
|
+
query: { isDefault: false },
|
|
277
|
+
data: { isDefault: true },
|
|
278
|
+
} as unknown as UpdateBy<SavedViewModel>);
|
|
279
|
+
|
|
280
|
+
expect(updateSpy).toHaveBeenCalledTimes(2);
|
|
281
|
+
const projectIds: Array<unknown> = updateSpy.mock.calls.map(
|
|
282
|
+
(call: Array<unknown>) => {
|
|
283
|
+
return (
|
|
284
|
+
(call[0] as Record<string, unknown>)["query"] as Record<
|
|
285
|
+
string,
|
|
286
|
+
unknown
|
|
287
|
+
>
|
|
288
|
+
)["projectId"];
|
|
289
|
+
},
|
|
290
|
+
);
|
|
291
|
+
expect(projectIds).toEqual([PROJECT_ID, otherProjectId]);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
test("a matched view with no project is skipped rather than swept globally", async () => {
|
|
295
|
+
const orphan: SavedViewModel = buildModel();
|
|
296
|
+
orphan._id = VIEW_ID.toString();
|
|
297
|
+
mockFindBy([orphan]);
|
|
298
|
+
const updateSpy: jest.SpyInstance = mockUpdateBy();
|
|
299
|
+
|
|
300
|
+
await service.onBeforeUpdate({
|
|
301
|
+
query: { _id: VIEW_ID.toString() },
|
|
302
|
+
data: { isDefault: true },
|
|
303
|
+
} as unknown as UpdateBy<SavedViewModel>);
|
|
304
|
+
|
|
305
|
+
expect(updateSpy).not.toHaveBeenCalled();
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
},
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
describe("the three saved-view services", () => {
|
|
312
|
+
test("are distinct services over distinct models", () => {
|
|
313
|
+
const models: Array<string> = cases.map(({ buildModel }: ServiceCase) => {
|
|
314
|
+
return (buildModel() as BaseModel).tableName as string;
|
|
315
|
+
});
|
|
316
|
+
expect(new Set(models).size).toBe(3);
|
|
317
|
+
expect(
|
|
318
|
+
new Set([
|
|
319
|
+
LogSavedViewService,
|
|
320
|
+
TraceSavedViewService,
|
|
321
|
+
MetricSavedViewService,
|
|
322
|
+
]).size,
|
|
323
|
+
).toBe(3);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
@@ -196,9 +196,9 @@ describe("static rule criteria runtime coverage", () => {
|
|
|
196
196
|
discoverStaticRuleForms();
|
|
197
197
|
const inheritedRuleModelNames: Array<string> = getInheritedRuleModelNames();
|
|
198
198
|
|
|
199
|
-
test("all
|
|
200
|
-
expect(formFiles).toHaveLength(
|
|
201
|
-
expect(formsByModel.size).toBe(
|
|
199
|
+
test("all 66 static match-criteria forms route their 78 rule models through ModelForm", () => {
|
|
200
|
+
expect(formFiles).toHaveLength(66);
|
|
201
|
+
expect(formsByModel.size).toBe(78);
|
|
202
202
|
expect([...formsByModel.keys()].sort()).toEqual(inheritedRuleModelNames);
|
|
203
203
|
expect(Object.keys(RULE_CRITERIA_FIELDS_BY_MODEL).sort()).toEqual(
|
|
204
204
|
inheritedRuleModelNames,
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import StatusPageCertificateService from "../../../Server/Services/StatusPageCertificateService";
|
|
2
|
+
import DatabaseConfig from "../../../Server/DatabaseConfig";
|
|
3
|
+
import { AppApiHostname } from "../../../Server/EnvironmentConfig";
|
|
4
|
+
import API from "../../../Utils/API";
|
|
5
|
+
import Protocol from "../../../Types/API/Protocol";
|
|
6
|
+
import URL from "../../../Types/API/URL";
|
|
7
|
+
import { afterEach, describe, expect, test } from "@jest/globals";
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
* Custom status page domains get their TLS certificate from the cert worker,
|
|
11
|
+
* and this service is the only caller. Nothing about it is visible until a
|
|
12
|
+
* customer's domain fails to serve HTTPS, so what these tests hold is the
|
|
13
|
+
* request itself: the verb, the worker route, the domain in the body, and the
|
|
14
|
+
* protocol taken from the instance's own configuration rather than assumed.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const WORKER_ROUTE: string = "/api/workers/cert";
|
|
18
|
+
const DOMAIN: string = "status.example.com";
|
|
19
|
+
|
|
20
|
+
type ApiCall = { url: URL; data: Record<string, unknown> };
|
|
21
|
+
|
|
22
|
+
function lastCall(spy: jest.SpyInstance): ApiCall {
|
|
23
|
+
return spy.mock.calls[spy.mock.calls.length - 1]?.[0] as ApiCall;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
jest.restoreAllMocks();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe.each([
|
|
31
|
+
{ label: "https", protocol: Protocol.HTTPS },
|
|
32
|
+
{ label: "http", protocol: Protocol.HTTP },
|
|
33
|
+
])(
|
|
34
|
+
"StatusPageCertificateService over $label",
|
|
35
|
+
({ protocol }: { protocol: Protocol }) => {
|
|
36
|
+
function mockProtocol(): jest.SpyInstance {
|
|
37
|
+
return jest
|
|
38
|
+
.spyOn(DatabaseConfig, "getHttpProtocol")
|
|
39
|
+
.mockResolvedValue(protocol as never);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
test("add posts the domain to the cert worker", async () => {
|
|
43
|
+
mockProtocol();
|
|
44
|
+
const postSpy: jest.SpyInstance = jest
|
|
45
|
+
.spyOn(API, "post")
|
|
46
|
+
.mockResolvedValue({} as never);
|
|
47
|
+
|
|
48
|
+
await StatusPageCertificateService.add(DOMAIN);
|
|
49
|
+
|
|
50
|
+
expect(postSpy).toHaveBeenCalledTimes(1);
|
|
51
|
+
const call: ApiCall = lastCall(postSpy);
|
|
52
|
+
expect(call.data).toEqual({ domain: DOMAIN });
|
|
53
|
+
expect(call.url.protocol).toBe(protocol);
|
|
54
|
+
expect(call.url.hostname.toString()).toBe(AppApiHostname.toString());
|
|
55
|
+
expect(call.url.route.toString()).toBe(WORKER_ROUTE);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("remove deletes the domain at the same route", async () => {
|
|
59
|
+
mockProtocol();
|
|
60
|
+
const deleteSpy: jest.SpyInstance = jest
|
|
61
|
+
.spyOn(API, "delete")
|
|
62
|
+
.mockResolvedValue({} as never);
|
|
63
|
+
|
|
64
|
+
await StatusPageCertificateService.remove(DOMAIN);
|
|
65
|
+
|
|
66
|
+
expect(deleteSpy).toHaveBeenCalledTimes(1);
|
|
67
|
+
const call: ApiCall = lastCall(deleteSpy);
|
|
68
|
+
expect(call.data).toEqual({ domain: DOMAIN });
|
|
69
|
+
expect(call.url.protocol).toBe(protocol);
|
|
70
|
+
expect(call.url.route.toString()).toBe(WORKER_ROUTE);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test("get reads the domain's certificate from the same route", async () => {
|
|
74
|
+
mockProtocol();
|
|
75
|
+
const getSpy: jest.SpyInstance = jest
|
|
76
|
+
.spyOn(API, "get")
|
|
77
|
+
.mockResolvedValue({} as never);
|
|
78
|
+
|
|
79
|
+
await StatusPageCertificateService.get(DOMAIN);
|
|
80
|
+
|
|
81
|
+
expect(getSpy).toHaveBeenCalledTimes(1);
|
|
82
|
+
const call: ApiCall = lastCall(getSpy);
|
|
83
|
+
expect(call.data).toEqual({ domain: DOMAIN });
|
|
84
|
+
expect(call.url.protocol).toBe(protocol);
|
|
85
|
+
expect(call.url.route.toString()).toBe(WORKER_ROUTE);
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
describe("StatusPageCertificateService", () => {
|
|
91
|
+
test("each verb reads the protocol fresh rather than caching the first answer", async () => {
|
|
92
|
+
const protocolSpy: jest.SpyInstance = jest
|
|
93
|
+
.spyOn(DatabaseConfig, "getHttpProtocol")
|
|
94
|
+
.mockResolvedValueOnce(Protocol.HTTP as never)
|
|
95
|
+
.mockResolvedValueOnce(Protocol.HTTPS as never);
|
|
96
|
+
const postSpy: jest.SpyInstance = jest
|
|
97
|
+
.spyOn(API, "post")
|
|
98
|
+
.mockResolvedValue({} as never);
|
|
99
|
+
|
|
100
|
+
await StatusPageCertificateService.add(DOMAIN);
|
|
101
|
+
await StatusPageCertificateService.add(DOMAIN);
|
|
102
|
+
|
|
103
|
+
expect(protocolSpy).toHaveBeenCalledTimes(2);
|
|
104
|
+
expect((postSpy.mock.calls[0]?.[0] as ApiCall).url.protocol).toBe(
|
|
105
|
+
Protocol.HTTP,
|
|
106
|
+
);
|
|
107
|
+
expect((postSpy.mock.calls[1]?.[0] as ApiCall).url.protocol).toBe(
|
|
108
|
+
Protocol.HTTPS,
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test("the three verbs do not call one another", async () => {
|
|
113
|
+
jest
|
|
114
|
+
.spyOn(DatabaseConfig, "getHttpProtocol")
|
|
115
|
+
.mockResolvedValue(Protocol.HTTPS as never);
|
|
116
|
+
const postSpy: jest.SpyInstance = jest
|
|
117
|
+
.spyOn(API, "post")
|
|
118
|
+
.mockResolvedValue({} as never);
|
|
119
|
+
const deleteSpy: jest.SpyInstance = jest
|
|
120
|
+
.spyOn(API, "delete")
|
|
121
|
+
.mockResolvedValue({} as never);
|
|
122
|
+
const getSpy: jest.SpyInstance = jest
|
|
123
|
+
.spyOn(API, "get")
|
|
124
|
+
.mockResolvedValue({} as never);
|
|
125
|
+
|
|
126
|
+
await StatusPageCertificateService.get(DOMAIN);
|
|
127
|
+
|
|
128
|
+
expect(getSpy).toHaveBeenCalledTimes(1);
|
|
129
|
+
expect(postSpy).not.toHaveBeenCalled();
|
|
130
|
+
expect(deleteSpy).not.toHaveBeenCalled();
|
|
131
|
+
|
|
132
|
+
await StatusPageCertificateService.remove(DOMAIN);
|
|
133
|
+
|
|
134
|
+
expect(deleteSpy).toHaveBeenCalledTimes(1);
|
|
135
|
+
expect(postSpy).not.toHaveBeenCalled();
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
test("the domain is passed through untouched, punycode and all", async () => {
|
|
139
|
+
jest
|
|
140
|
+
.spyOn(DatabaseConfig, "getHttpProtocol")
|
|
141
|
+
.mockResolvedValue(Protocol.HTTPS as never);
|
|
142
|
+
const postSpy: jest.SpyInstance = jest
|
|
143
|
+
.spyOn(API, "post")
|
|
144
|
+
.mockResolvedValue({} as never);
|
|
145
|
+
|
|
146
|
+
for (const domain of [
|
|
147
|
+
"status.example.com",
|
|
148
|
+
"xn--80ak6aa92e.example.com",
|
|
149
|
+
"STATUS.EXAMPLE.COM",
|
|
150
|
+
"status.example.co.uk",
|
|
151
|
+
]) {
|
|
152
|
+
await StatusPageCertificateService.add(domain);
|
|
153
|
+
expect(lastCall(postSpy).data).toEqual({ domain: domain });
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
test("a failing worker call is surfaced, not swallowed", async () => {
|
|
158
|
+
jest
|
|
159
|
+
.spyOn(DatabaseConfig, "getHttpProtocol")
|
|
160
|
+
.mockResolvedValue(Protocol.HTTPS as never);
|
|
161
|
+
jest
|
|
162
|
+
.spyOn(API, "post")
|
|
163
|
+
.mockRejectedValue(new Error("cert worker unreachable") as never);
|
|
164
|
+
|
|
165
|
+
await expect(StatusPageCertificateService.add(DOMAIN)).rejects.toThrow(
|
|
166
|
+
"cert worker unreachable",
|
|
167
|
+
);
|
|
168
|
+
});
|
|
169
|
+
});
|