@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
|
@@ -0,0 +1,694 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import DatabaseService from "./DatabaseService";
|
|
11
|
+
import DatabaseServerFeedService from "./DatabaseServerFeedService";
|
|
12
|
+
import DatabaseServerService from "./DatabaseServerService";
|
|
13
|
+
import Model from "../../Models/DatabaseModels/DatabaseServerEndpoint";
|
|
14
|
+
import DatabaseServer from "../../Models/DatabaseModels/DatabaseServer";
|
|
15
|
+
import { DatabaseServerFeedEventType } from "../../Models/DatabaseModels/DatabaseServerFeed";
|
|
16
|
+
import ModelPermission from "../Types/Database/Permissions/Index";
|
|
17
|
+
import RelationIdUtil from "../Utils/Database/RelationIdUtil";
|
|
18
|
+
import logger from "../Utils/Logger";
|
|
19
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
20
|
+
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
21
|
+
import { Gray500, Red500 } from "../../Types/BrandColors";
|
|
22
|
+
import ColumnLength from "../../Types/Database/ColumnLength";
|
|
23
|
+
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
24
|
+
import OneUptimeDate from "../../Types/Date";
|
|
25
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
26
|
+
import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
|
|
27
|
+
import ObjectID from "../../Types/ObjectID";
|
|
28
|
+
import { formatDatabaseEndpoint, parseManualDatabaseEndpoint, } from "../../Types/DatabaseServer/DatabaseEndpoint";
|
|
29
|
+
/*
|
|
30
|
+
* "Last matched" is refreshed at most this often per endpoint: often enough
|
|
31
|
+
* that a stale alias stands out on the Endpoints tab, rarely enough that a
|
|
32
|
+
* busy endpoint costs one write an hour, not one per lookup.
|
|
33
|
+
*/
|
|
34
|
+
export const ENDPOINT_MATCH_REFRESH_SECONDS = 60 * 60;
|
|
35
|
+
// What an alias looks like, for the refusal of an empty one.
|
|
36
|
+
const ENDPOINT_EXAMPLE = "Enter the host name or IP address applications use to reach this database, with an optional port, for example orders-db.example.com:5432.";
|
|
37
|
+
/*
|
|
38
|
+
* The endpoints a database is reached at. Every endpoint belongs to at most
|
|
39
|
+
* one database per project: the (projectId, endpoint) unique index enforces
|
|
40
|
+
* it, and this service turns a collision into a message naming the database
|
|
41
|
+
* that already owns the endpoint instead of a raw constraint error.
|
|
42
|
+
*
|
|
43
|
+
* Endpoints are stored canonical (formatDatabaseEndpoint), because the
|
|
44
|
+
* telemetry entity key of a database is derived from the endpoint string -
|
|
45
|
+
* a person typing "Orders-DB.example.com" must land on the same key ingest
|
|
46
|
+
* computes for `server.address=orders-db.example.com`.
|
|
47
|
+
*/
|
|
48
|
+
export class Service extends DatabaseService {
|
|
49
|
+
constructor() {
|
|
50
|
+
super(Model);
|
|
51
|
+
}
|
|
52
|
+
/*
|
|
53
|
+
* A person adding an alias. Root writes (the discovery paths, through
|
|
54
|
+
* claimEndpoint) pass through untouched: they already hold a canonical
|
|
55
|
+
* endpoint and handle ownership themselves.
|
|
56
|
+
*
|
|
57
|
+
* Adding an endpoint is an EDIT of the database it is added to: it decides
|
|
58
|
+
* which traffic that database's pages show and - one owner per endpoint -
|
|
59
|
+
* that no other database can claim it. So the caller must be allowed to
|
|
60
|
+
* edit that very row, label and Owned scopes included. DatabaseService
|
|
61
|
+
* checks the create permission only after this hook, and never scopes a
|
|
62
|
+
* create to the parent row, so both happen here - the create permission
|
|
63
|
+
* FIRST, so a caller without it learns nothing about which databases exist
|
|
64
|
+
* or who owns an endpoint.
|
|
65
|
+
*/
|
|
66
|
+
async onBeforeCreate(createBy) {
|
|
67
|
+
var _a;
|
|
68
|
+
if (createBy.props.isRoot) {
|
|
69
|
+
return { createBy: createBy, carryForward: null };
|
|
70
|
+
}
|
|
71
|
+
const data = createBy.data;
|
|
72
|
+
ModelPermission.checkCreatePermissions(Model, data, createBy.props);
|
|
73
|
+
/*
|
|
74
|
+
* The tenant column is stamped from props.tenantId only after this hook,
|
|
75
|
+
* so read the request tenant first - it is the only project the caller
|
|
76
|
+
* was checked in.
|
|
77
|
+
*/
|
|
78
|
+
const projectId = createBy.props.tenantId || data.projectId || undefined;
|
|
79
|
+
if (!projectId) {
|
|
80
|
+
throw new BadDataException("Project ID is required to add a database endpoint.");
|
|
81
|
+
}
|
|
82
|
+
/*
|
|
83
|
+
* The reference arrives as the FK column or as a relation object, and
|
|
84
|
+
* TypeORM persists the relation object's id over the column's. Read both
|
|
85
|
+
* spellings, refuse a payload whose two spellings disagree, and leave the
|
|
86
|
+
* validated column as the only one that can reach the insert.
|
|
87
|
+
*/
|
|
88
|
+
const databaseServerId = RelationIdUtil.readConsistent(data, ["databaseServerId", "databaseServer"], "database");
|
|
89
|
+
data.setColumnValue("databaseServer", undefined);
|
|
90
|
+
if (!databaseServerId) {
|
|
91
|
+
throw new BadDataException("Select the database this endpoint belongs to.");
|
|
92
|
+
}
|
|
93
|
+
const databaseServer = await this.findEditableDatabaseServer({
|
|
94
|
+
projectId: projectId,
|
|
95
|
+
databaseServerId: databaseServerId,
|
|
96
|
+
props: createBy.props,
|
|
97
|
+
});
|
|
98
|
+
/*
|
|
99
|
+
* One answer for "no such database in this project" and "a database you
|
|
100
|
+
* may not edit", so the refusal is not a way to probe for ids.
|
|
101
|
+
*/
|
|
102
|
+
if (!databaseServer) {
|
|
103
|
+
throw new NotAuthorizedException("Database not found, or you do not have permission to edit it. Adding an endpoint to a database needs permission to edit that database.");
|
|
104
|
+
}
|
|
105
|
+
/*
|
|
106
|
+
* Canonicalize with the database's own context: its engine supplies the
|
|
107
|
+
* default port, and for a database discovered on Kubernetes its
|
|
108
|
+
* namespace expands a bare service name (and `<service>.<namespace>` to
|
|
109
|
+
* the Service's full name) and its cluster qualifies a cluster-local
|
|
110
|
+
* name - exactly what ingest does for the pods calling it. A value that
|
|
111
|
+
* cannot be used - `user@host`, a cluster qualifier on a public host, a
|
|
112
|
+
* loopback name, a port outside 1-65535 - is refused with a message
|
|
113
|
+
* saying what to change, never read as something else or quietly given
|
|
114
|
+
* the engine's default port.
|
|
115
|
+
*/
|
|
116
|
+
const manual = parseManualDatabaseEndpoint(data.endpoint, {
|
|
117
|
+
system: databaseServer.dbSystem || "",
|
|
118
|
+
kubernetesClusterName: (_a = databaseServer.kubernetesCluster) === null || _a === void 0 ? void 0 : _a.clusterIdentifier,
|
|
119
|
+
kubernetesNamespace: databaseServer.kubernetesNamespace,
|
|
120
|
+
});
|
|
121
|
+
const endpoint = manual.endpoint;
|
|
122
|
+
if (!endpoint) {
|
|
123
|
+
throw new BadDataException(typeof data.endpoint !== "string" || !data.endpoint.trim()
|
|
124
|
+
? `Endpoint is required. ${ENDPOINT_EXAMPLE}`
|
|
125
|
+
: manual.error || `This is not a valid endpoint. ${ENDPOINT_EXAMPLE}`);
|
|
126
|
+
}
|
|
127
|
+
const formatted = formatDatabaseEndpoint(endpoint);
|
|
128
|
+
if (formatted.length > ColumnLength.LongText) {
|
|
129
|
+
throw new BadDataException(`This endpoint is too long. Endpoints can be at most ${ColumnLength.LongText} characters.`);
|
|
130
|
+
}
|
|
131
|
+
const owner = await this.findOwnerByEndpoint(projectId, formatted);
|
|
132
|
+
if (owner) {
|
|
133
|
+
if (owner.databaseServerId.toString() === databaseServerId.toString()) {
|
|
134
|
+
throw new BadDataException(`${formatted} is already an endpoint of this database.`);
|
|
135
|
+
}
|
|
136
|
+
throw new BadDataException(await getOwnedByOtherDatabaseMessage(formatted, owner, createBy.props));
|
|
137
|
+
}
|
|
138
|
+
data.databaseServerId = databaseServerId;
|
|
139
|
+
data.endpoint = formatted;
|
|
140
|
+
/*
|
|
141
|
+
* Forced, whatever the caller sent: a person only ever adds a removable
|
|
142
|
+
* alias. The primary endpoint is written by whichever path created the
|
|
143
|
+
* database, as root.
|
|
144
|
+
*/
|
|
145
|
+
data.source = "user";
|
|
146
|
+
data.isPrimary = false;
|
|
147
|
+
return { createBy: createBy, carryForward: null };
|
|
148
|
+
}
|
|
149
|
+
/*
|
|
150
|
+
* A person removing endpoints. Removing one is an EDIT of the database it
|
|
151
|
+
* belongs to, exactly like adding one (onBeforeCreate): it decides which
|
|
152
|
+
* traffic that database's pages show, and frees the endpoint for another
|
|
153
|
+
* database to claim. DatabaseService scopes a delete to the project only -
|
|
154
|
+
* the endpoint has no labels of its own, and the parent's label and Owned
|
|
155
|
+
* scopes never reach a delete - so the caller must be allowed to edit
|
|
156
|
+
* every database the delete would touch, checked here: the delete
|
|
157
|
+
* permission FIRST (so a caller without it learns nothing), then the
|
|
158
|
+
* parents, and only then the primary guard, whose refusal names the
|
|
159
|
+
* endpoint.
|
|
160
|
+
*
|
|
161
|
+
* The primary endpoint is what the database was created from; discovery
|
|
162
|
+
* would claim it straight back, and a manually added database would lose
|
|
163
|
+
* the only endpoint its telemetry is keyed by. Aliases can be removed.
|
|
164
|
+
*/
|
|
165
|
+
async onBeforeDelete(deleteBy) {
|
|
166
|
+
var _a;
|
|
167
|
+
if (deleteBy.props.isRoot) {
|
|
168
|
+
return { deleteBy: deleteBy, carryForward: null };
|
|
169
|
+
}
|
|
170
|
+
// The project the caller was checked in, whatever project the query named.
|
|
171
|
+
const query = await ModelPermission.checkDeleteQueryPermission(Model, deleteBy.query, deleteBy.props);
|
|
172
|
+
const matched = await this.findBy({
|
|
173
|
+
query: query,
|
|
174
|
+
select: {
|
|
175
|
+
_id: true,
|
|
176
|
+
projectId: true,
|
|
177
|
+
databaseServerId: true,
|
|
178
|
+
endpoint: true,
|
|
179
|
+
isPrimary: true,
|
|
180
|
+
},
|
|
181
|
+
limit: LIMIT_MAX,
|
|
182
|
+
skip: 0,
|
|
183
|
+
props: {
|
|
184
|
+
isRoot: true,
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
const checked = new Set();
|
|
188
|
+
for (const endpoint of matched) {
|
|
189
|
+
const databaseServerId = (_a = endpoint.databaseServerId) === null || _a === void 0 ? void 0 : _a.toString();
|
|
190
|
+
const projectId = deleteBy.props.tenantId || endpoint.projectId || undefined;
|
|
191
|
+
if (!databaseServerId || !projectId || checked.has(databaseServerId)) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const databaseServer = await this.findEditableDatabaseServer({
|
|
195
|
+
projectId: projectId,
|
|
196
|
+
databaseServerId: new ObjectID(databaseServerId),
|
|
197
|
+
props: deleteBy.props,
|
|
198
|
+
});
|
|
199
|
+
// The same answer onBeforeCreate gives: no probing for ids.
|
|
200
|
+
if (!databaseServer) {
|
|
201
|
+
throw new NotAuthorizedException("Database not found, or you do not have permission to edit it. Removing an endpoint from a database needs permission to edit that database.");
|
|
202
|
+
}
|
|
203
|
+
checked.add(databaseServerId);
|
|
204
|
+
}
|
|
205
|
+
const primary = matched.find((endpoint) => {
|
|
206
|
+
return Boolean(endpoint.isPrimary);
|
|
207
|
+
});
|
|
208
|
+
if (primary) {
|
|
209
|
+
const endpoint = primary.endpoint || "The primary endpoint";
|
|
210
|
+
throw new BadDataException(`${endpoint} is the primary endpoint of this database and cannot be removed. Add another endpoint as an alias instead, or delete the database.`);
|
|
211
|
+
}
|
|
212
|
+
// The rows are gone by onDeleteSuccess: its feed items are built from these.
|
|
213
|
+
const carryForward = {
|
|
214
|
+
endpointsToDelete: matched,
|
|
215
|
+
};
|
|
216
|
+
return { deleteBy: deleteBy, carryForward: carryForward };
|
|
217
|
+
}
|
|
218
|
+
/*
|
|
219
|
+
* A person added an alias: that is an edit of the database (it decides
|
|
220
|
+
* which traffic the database's pages show), so it goes on the database's
|
|
221
|
+
* Feed like any other edit, naming the endpoint and who added it. A
|
|
222
|
+
* discovery claim is root and never gets here.
|
|
223
|
+
*/
|
|
224
|
+
async onCreateSuccess(onCreate, createdItem) {
|
|
225
|
+
if (onCreate.createBy.props.isRoot) {
|
|
226
|
+
return createdItem;
|
|
227
|
+
}
|
|
228
|
+
await this.writeEndpointFeedItem({
|
|
229
|
+
change: "added",
|
|
230
|
+
endpoint: createdItem,
|
|
231
|
+
projectId: createdItem.projectId || onCreate.createBy.props.tenantId || undefined,
|
|
232
|
+
userId: createdItem.createdByUserId ||
|
|
233
|
+
onCreate.createBy.props.userId ||
|
|
234
|
+
undefined,
|
|
235
|
+
});
|
|
236
|
+
return createdItem;
|
|
237
|
+
}
|
|
238
|
+
/*
|
|
239
|
+
* A person removed aliases: one feed item per endpoint actually removed,
|
|
240
|
+
* on its own database. Discovery's releases and moves are root writes and
|
|
241
|
+
* never get here.
|
|
242
|
+
*/
|
|
243
|
+
async onDeleteSuccess(onDelete, itemIdsBeforeDelete) {
|
|
244
|
+
var _a;
|
|
245
|
+
const carried = onDelete.carryForward || null;
|
|
246
|
+
if (onDelete.deleteBy.props.isRoot || !carried) {
|
|
247
|
+
return onDelete;
|
|
248
|
+
}
|
|
249
|
+
const deletedIds = new Set((itemIdsBeforeDelete || []).map((id) => {
|
|
250
|
+
return id.toString();
|
|
251
|
+
}));
|
|
252
|
+
const userId = ((_a = onDelete.deleteBy.deletedByUser) === null || _a === void 0 ? void 0 : _a.id) ||
|
|
253
|
+
onDelete.deleteBy.props.userId ||
|
|
254
|
+
undefined;
|
|
255
|
+
for (const endpoint of carried.endpointsToDelete || []) {
|
|
256
|
+
if (!endpoint._id || !deletedIds.has(endpoint._id.toString())) {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
await this.writeEndpointFeedItem({
|
|
260
|
+
change: "removed",
|
|
261
|
+
endpoint: endpoint,
|
|
262
|
+
projectId: endpoint.projectId || onDelete.deleteBy.props.tenantId || undefined,
|
|
263
|
+
userId: userId,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
return onDelete;
|
|
267
|
+
}
|
|
268
|
+
// One "endpoint added / removed" item on the database's Feed. Never throws.
|
|
269
|
+
async writeEndpointFeedItem(data) {
|
|
270
|
+
const databaseServerId = data.endpoint.databaseServerId || undefined;
|
|
271
|
+
const endpoint = (data.endpoint.endpoint || "").trim();
|
|
272
|
+
if (!databaseServerId || !data.projectId || !endpoint) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
try {
|
|
276
|
+
const link = await DatabaseServerService.getDatabaseServerMarkdownLink(data.projectId, databaseServerId);
|
|
277
|
+
const added = data.change === "added";
|
|
278
|
+
await DatabaseServerFeedService.createDatabaseServerFeedItem({
|
|
279
|
+
databaseServerId: databaseServerId,
|
|
280
|
+
projectId: data.projectId,
|
|
281
|
+
databaseServerFeedEventType: DatabaseServerFeedEventType.DatabaseServerUpdated,
|
|
282
|
+
displayColor: added ? Gray500 : Red500,
|
|
283
|
+
feedInfoInMarkdown: added
|
|
284
|
+
? `🔗 Added the endpoint \`${endpoint}\` to ${link}.`
|
|
285
|
+
: `🔗 Removed the endpoint \`${endpoint}\` from ${link}.`,
|
|
286
|
+
moreInformationInMarkdown: added
|
|
287
|
+
? `**Endpoint**: \`${endpoint}\`\n\nCalls applications make to this endpoint now count as this database's traffic, and no other database can claim it.`
|
|
288
|
+
: `**Endpoint**: \`${endpoint}\`\n\nCalls to this endpoint no longer count as this database's traffic, and another database may claim it.`,
|
|
289
|
+
userId: data.userId,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
logger.warn(`DatabaseServerEndpointService: could not write the feed item for endpoint ${endpoint} ${data.change}: ${error instanceof Error ? error.message : String(error)}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* The database that owns this canonical (formatDatabaseEndpoint) endpoint
|
|
298
|
+
* in the project, or null when no database lists it.
|
|
299
|
+
*/
|
|
300
|
+
async findOwnerByEndpoint(projectId, formattedEndpoint) {
|
|
301
|
+
const endpoint = (formattedEndpoint || "").trim();
|
|
302
|
+
if (!endpoint) {
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
const row = await this.findOneBy({
|
|
306
|
+
query: {
|
|
307
|
+
projectId: projectId,
|
|
308
|
+
endpoint: endpoint,
|
|
309
|
+
},
|
|
310
|
+
select: {
|
|
311
|
+
_id: true,
|
|
312
|
+
databaseServerId: true,
|
|
313
|
+
isPrimary: true,
|
|
314
|
+
source: true,
|
|
315
|
+
lastMatchedAt: true,
|
|
316
|
+
},
|
|
317
|
+
props: {
|
|
318
|
+
isRoot: true,
|
|
319
|
+
},
|
|
320
|
+
});
|
|
321
|
+
if (!row || !row.databaseServerId) {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
databaseServerId: new ObjectID(row.databaseServerId.toString()),
|
|
326
|
+
isPrimary: Boolean(row.isPrimary),
|
|
327
|
+
endpointId: row._id ? new ObjectID(row._id.toString()) : undefined,
|
|
328
|
+
source: row.source || undefined,
|
|
329
|
+
lastMatchedAt: row.lastMatchedAt || undefined,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Record that telemetry just matched this endpoint to its database: moves
|
|
334
|
+
* lastMatchedAt to now, at most once per ENDPOINT_MATCH_REFRESH_SECONDS
|
|
335
|
+
* (decided from the lastMatchedAt the owner lookup already read, so a
|
|
336
|
+
* fresh endpoint costs nothing). A "workload" endpoint is left alone: its
|
|
337
|
+
* lastMatchedAt says when the workload last produced it, which is what
|
|
338
|
+
* decides whether discovery may release it. Never throws.
|
|
339
|
+
*/
|
|
340
|
+
async markEndpointMatched(owner) {
|
|
341
|
+
if (!owner || !owner.endpointId || owner.source === "workload") {
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
const now = OneUptimeDate.getCurrentDate();
|
|
345
|
+
if (owner.lastMatchedAt &&
|
|
346
|
+
OneUptimeDate.isAfter(owner.lastMatchedAt, OneUptimeDate.addRemoveSeconds(now, -ENDPOINT_MATCH_REFRESH_SECONDS))) {
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
try {
|
|
350
|
+
await this.updateColumnsByIdWithoutHooks({
|
|
351
|
+
id: owner.endpointId,
|
|
352
|
+
data: {
|
|
353
|
+
lastMatchedAt: now,
|
|
354
|
+
},
|
|
355
|
+
skipUpdateDateColumn: true,
|
|
356
|
+
});
|
|
357
|
+
owner.lastMatchedAt = now;
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
logger.warn(`DatabaseServerEndpointService: could not record a match of endpoint ${owner.endpointId.toString()}: ${error instanceof Error ? error.message : String(error)}`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Move lastMatchedAt to `now` on those of `endpoints` this database owns
|
|
365
|
+
* whose lastMatchedAt is empty or older than `staleBefore` - one
|
|
366
|
+
* statement, however many endpoints. The workload path calls it for the
|
|
367
|
+
* aliases a discovery run produced again.
|
|
368
|
+
*/
|
|
369
|
+
async refreshMatchedEndpoints(data) {
|
|
370
|
+
if (data.endpoints.length === 0) {
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
await this.getRepository().manager.query(`UPDATE "DatabaseServerEndpoint"
|
|
374
|
+
SET "lastMatchedAt" = $1
|
|
375
|
+
WHERE "projectId" = $2
|
|
376
|
+
AND "databaseServerId" = $3
|
|
377
|
+
AND "endpoint" = ANY($4::text[])
|
|
378
|
+
AND ("lastMatchedAt" IS NULL OR "lastMatchedAt" < $5)
|
|
379
|
+
AND "deletedAt" IS NULL`, [
|
|
380
|
+
data.now,
|
|
381
|
+
data.projectId.toString(),
|
|
382
|
+
data.databaseServerId.toString(),
|
|
383
|
+
data.endpoints,
|
|
384
|
+
data.staleBefore,
|
|
385
|
+
]);
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Hand a discovered endpoint to another database: the workload that now
|
|
389
|
+
* serves it. A compare-and-set on the current owner, and never a "user"
|
|
390
|
+
* endpoint - those only a person moves. The endpoint becomes a "workload"
|
|
391
|
+
* endpoint of its new owner, matched now. True when it moved.
|
|
392
|
+
*/
|
|
393
|
+
async transferEndpoint(data) {
|
|
394
|
+
/*
|
|
395
|
+
* Wrapped in a CTE so the statement is a SELECT: TypeORM answers a bare
|
|
396
|
+
* UPDATE with [rows, rowCount], which would read as "moved" every time.
|
|
397
|
+
*/
|
|
398
|
+
const moved = await this.getRepository().manager.query(`WITH "moved" AS (
|
|
399
|
+
UPDATE "DatabaseServerEndpoint"
|
|
400
|
+
SET "databaseServerId" = $1,
|
|
401
|
+
"source" = 'workload',
|
|
402
|
+
"isPrimary" = $2,
|
|
403
|
+
"lastMatchedAt" = $3,
|
|
404
|
+
"updatedAt" = CURRENT_TIMESTAMP
|
|
405
|
+
WHERE "_id" = $4
|
|
406
|
+
AND "projectId" = $5
|
|
407
|
+
AND "databaseServerId" = $6
|
|
408
|
+
AND COALESCE("source", '') <> 'user'
|
|
409
|
+
AND "deletedAt" IS NULL
|
|
410
|
+
RETURNING "_id"
|
|
411
|
+
)
|
|
412
|
+
SELECT "_id" FROM "moved"`, [
|
|
413
|
+
data.toDatabaseServerId.toString(),
|
|
414
|
+
data.isPrimary,
|
|
415
|
+
data.now,
|
|
416
|
+
data.endpointId.toString(),
|
|
417
|
+
data.projectId.toString(),
|
|
418
|
+
data.fromDatabaseServerId.toString(),
|
|
419
|
+
]);
|
|
420
|
+
return Array.isArray(moved) && moved.length > 0;
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Release the "workload" endpoints of one database that its workload no
|
|
424
|
+
* longer produces: not in `keepEndpoints` and not matched since
|
|
425
|
+
* `staleBefore` (so one partial discovery run releases nothing). Never the
|
|
426
|
+
* primary endpoint, never an "auto" or "user" one. Returns the endpoints
|
|
427
|
+
* released.
|
|
428
|
+
*/
|
|
429
|
+
async releaseUnproducedWorkloadEndpoints(data) {
|
|
430
|
+
// A CTE for the same reason as transferEndpoint: a SELECT's rows come back.
|
|
431
|
+
const released = await this.getRepository().manager.query(`WITH "released" AS (
|
|
432
|
+
DELETE FROM "DatabaseServerEndpoint"
|
|
433
|
+
WHERE "projectId" = $1
|
|
434
|
+
AND "databaseServerId" = $2
|
|
435
|
+
AND "source" = 'workload'
|
|
436
|
+
AND "isPrimary" = false
|
|
437
|
+
AND NOT ("endpoint" = ANY($3::text[]))
|
|
438
|
+
AND ("lastMatchedAt" IS NULL OR "lastMatchedAt" < $4)
|
|
439
|
+
RETURNING "endpoint"
|
|
440
|
+
)
|
|
441
|
+
SELECT "endpoint" FROM "released"`, [
|
|
442
|
+
data.projectId.toString(),
|
|
443
|
+
data.databaseServerId.toString(),
|
|
444
|
+
data.keepEndpoints,
|
|
445
|
+
data.staleBefore,
|
|
446
|
+
]);
|
|
447
|
+
if (!Array.isArray(released)) {
|
|
448
|
+
return [];
|
|
449
|
+
}
|
|
450
|
+
return released
|
|
451
|
+
.map((row) => {
|
|
452
|
+
const endpoint = row === null || row === void 0 ? void 0 : row.endpoint;
|
|
453
|
+
return typeof endpoint === "string" ? endpoint : "";
|
|
454
|
+
})
|
|
455
|
+
.filter((endpoint) => {
|
|
456
|
+
return endpoint.length > 0;
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
// True when the database has a primary endpoint.
|
|
460
|
+
async hasPrimaryEndpoint(data) {
|
|
461
|
+
const primary = await this.findOneBy({
|
|
462
|
+
query: {
|
|
463
|
+
projectId: data.projectId,
|
|
464
|
+
databaseServerId: data.databaseServerId,
|
|
465
|
+
isPrimary: true,
|
|
466
|
+
},
|
|
467
|
+
select: {
|
|
468
|
+
_id: true,
|
|
469
|
+
},
|
|
470
|
+
props: {
|
|
471
|
+
isRoot: true,
|
|
472
|
+
},
|
|
473
|
+
});
|
|
474
|
+
return Boolean(primary);
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Make a canonical endpoint this database's, as root. Never takes an
|
|
478
|
+
* endpoint away from another database: that answers "owned-by-other" and
|
|
479
|
+
* the caller decides what to do (discovery logs and skips it).
|
|
480
|
+
*
|
|
481
|
+
* Two discovery writers can race to claim the same endpoint. The unique
|
|
482
|
+
* index lets exactly one insert through; the loser re-reads the owner and
|
|
483
|
+
* reports the winner rather than throwing.
|
|
484
|
+
*/
|
|
485
|
+
async claimEndpoint(data) {
|
|
486
|
+
const endpoint = (data.endpoint || "").trim();
|
|
487
|
+
if (!endpoint) {
|
|
488
|
+
throw new BadDataException("Endpoint is required to claim it.");
|
|
489
|
+
}
|
|
490
|
+
const existingOwner = await this.findOwnerByEndpoint(data.projectId, endpoint);
|
|
491
|
+
if (existingOwner) {
|
|
492
|
+
const result = classifyOwner(existingOwner, data.databaseServerId);
|
|
493
|
+
// Re-reported by the database that owns it: that is a match.
|
|
494
|
+
if (result === "already-owned-by-this") {
|
|
495
|
+
await this.markEndpointMatched(existingOwner);
|
|
496
|
+
}
|
|
497
|
+
return result;
|
|
498
|
+
}
|
|
499
|
+
try {
|
|
500
|
+
const row = new Model();
|
|
501
|
+
row.projectId = data.projectId;
|
|
502
|
+
row.databaseServerId = data.databaseServerId;
|
|
503
|
+
row.endpoint = endpoint;
|
|
504
|
+
row.isPrimary = data.isPrimary;
|
|
505
|
+
row.source = data.source;
|
|
506
|
+
row.lastMatchedAt = OneUptimeDate.getCurrentDate();
|
|
507
|
+
await this.create({
|
|
508
|
+
data: row,
|
|
509
|
+
props: {
|
|
510
|
+
isRoot: true,
|
|
511
|
+
},
|
|
512
|
+
});
|
|
513
|
+
return "claimed";
|
|
514
|
+
}
|
|
515
|
+
catch (error) {
|
|
516
|
+
const racedOwner = await this.findOwnerByEndpoint(data.projectId, endpoint);
|
|
517
|
+
if (racedOwner) {
|
|
518
|
+
return classifyOwner(racedOwner, data.databaseServerId);
|
|
519
|
+
}
|
|
520
|
+
// Not a lost race (a foreign key, a dead connection): surface it.
|
|
521
|
+
throw error;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Every endpoint of one database, primary first then alphabetical - the
|
|
526
|
+
* input getDatabaseServerSignalEntityKeys turns into the database's
|
|
527
|
+
* telemetry key set.
|
|
528
|
+
*/
|
|
529
|
+
async listEndpoints(databaseServerId) {
|
|
530
|
+
const rows = await this.findBy({
|
|
531
|
+
query: {
|
|
532
|
+
databaseServerId: databaseServerId,
|
|
533
|
+
},
|
|
534
|
+
select: {
|
|
535
|
+
_id: true,
|
|
536
|
+
endpoint: true,
|
|
537
|
+
isPrimary: true,
|
|
538
|
+
},
|
|
539
|
+
sort: {
|
|
540
|
+
isPrimary: SortOrder.Descending,
|
|
541
|
+
endpoint: SortOrder.Ascending,
|
|
542
|
+
},
|
|
543
|
+
limit: LIMIT_MAX,
|
|
544
|
+
skip: 0,
|
|
545
|
+
props: {
|
|
546
|
+
isRoot: true,
|
|
547
|
+
},
|
|
548
|
+
});
|
|
549
|
+
const endpoints = [];
|
|
550
|
+
for (const row of rows) {
|
|
551
|
+
if (row.endpoint && !endpoints.includes(row.endpoint)) {
|
|
552
|
+
endpoints.push(row.endpoint);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
return endpoints;
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* The database a caller adds an endpoint to, read only if the caller may
|
|
559
|
+
* EDIT it: the update permission check scopes the lookup exactly the way
|
|
560
|
+
* an update of that row would be scoped (project, label-scoped and
|
|
561
|
+
* Owned-scoped grants, block permissions). Null when the row does not
|
|
562
|
+
* exist in the project or the caller may not edit it - deliberately the
|
|
563
|
+
* same answer.
|
|
564
|
+
*/
|
|
565
|
+
async findEditableDatabaseServer(data) {
|
|
566
|
+
const editableQuery = await ModelPermission.checkUpdateQueryPermissions(DatabaseServer, {
|
|
567
|
+
_id: data.databaseServerId.toString(),
|
|
568
|
+
projectId: data.projectId,
|
|
569
|
+
}, {}, data.props);
|
|
570
|
+
return await DatabaseServerService.findOneBy({
|
|
571
|
+
query: editableQuery,
|
|
572
|
+
select: {
|
|
573
|
+
_id: true,
|
|
574
|
+
dbSystem: true,
|
|
575
|
+
kubernetesNamespace: true,
|
|
576
|
+
kubernetesCluster: {
|
|
577
|
+
clusterIdentifier: true,
|
|
578
|
+
},
|
|
579
|
+
},
|
|
580
|
+
props: {
|
|
581
|
+
isRoot: true,
|
|
582
|
+
},
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
__decorate([
|
|
587
|
+
CaptureSpan(),
|
|
588
|
+
__metadata("design:type", Function),
|
|
589
|
+
__metadata("design:paramtypes", [Object]),
|
|
590
|
+
__metadata("design:returntype", Promise)
|
|
591
|
+
], Service.prototype, "onBeforeCreate", null);
|
|
592
|
+
__decorate([
|
|
593
|
+
CaptureSpan(),
|
|
594
|
+
__metadata("design:type", Function),
|
|
595
|
+
__metadata("design:paramtypes", [Object]),
|
|
596
|
+
__metadata("design:returntype", Promise)
|
|
597
|
+
], Service.prototype, "onBeforeDelete", null);
|
|
598
|
+
__decorate([
|
|
599
|
+
CaptureSpan(),
|
|
600
|
+
__metadata("design:type", Function),
|
|
601
|
+
__metadata("design:paramtypes", [Object, Model]),
|
|
602
|
+
__metadata("design:returntype", Promise)
|
|
603
|
+
], Service.prototype, "onCreateSuccess", null);
|
|
604
|
+
__decorate([
|
|
605
|
+
CaptureSpan(),
|
|
606
|
+
__metadata("design:type", Function),
|
|
607
|
+
__metadata("design:paramtypes", [Object, Array]),
|
|
608
|
+
__metadata("design:returntype", Promise)
|
|
609
|
+
], Service.prototype, "onDeleteSuccess", null);
|
|
610
|
+
__decorate([
|
|
611
|
+
CaptureSpan(),
|
|
612
|
+
__metadata("design:type", Function),
|
|
613
|
+
__metadata("design:paramtypes", [ObjectID, String]),
|
|
614
|
+
__metadata("design:returntype", Promise)
|
|
615
|
+
], Service.prototype, "findOwnerByEndpoint", null);
|
|
616
|
+
__decorate([
|
|
617
|
+
CaptureSpan(),
|
|
618
|
+
__metadata("design:type", Function),
|
|
619
|
+
__metadata("design:paramtypes", [Object]),
|
|
620
|
+
__metadata("design:returntype", Promise)
|
|
621
|
+
], Service.prototype, "markEndpointMatched", null);
|
|
622
|
+
__decorate([
|
|
623
|
+
CaptureSpan(),
|
|
624
|
+
__metadata("design:type", Function),
|
|
625
|
+
__metadata("design:paramtypes", [Object]),
|
|
626
|
+
__metadata("design:returntype", Promise)
|
|
627
|
+
], Service.prototype, "refreshMatchedEndpoints", null);
|
|
628
|
+
__decorate([
|
|
629
|
+
CaptureSpan(),
|
|
630
|
+
__metadata("design:type", Function),
|
|
631
|
+
__metadata("design:paramtypes", [Object]),
|
|
632
|
+
__metadata("design:returntype", Promise)
|
|
633
|
+
], Service.prototype, "transferEndpoint", null);
|
|
634
|
+
__decorate([
|
|
635
|
+
CaptureSpan(),
|
|
636
|
+
__metadata("design:type", Function),
|
|
637
|
+
__metadata("design:paramtypes", [Object]),
|
|
638
|
+
__metadata("design:returntype", Promise)
|
|
639
|
+
], Service.prototype, "releaseUnproducedWorkloadEndpoints", null);
|
|
640
|
+
__decorate([
|
|
641
|
+
CaptureSpan(),
|
|
642
|
+
__metadata("design:type", Function),
|
|
643
|
+
__metadata("design:paramtypes", [Object]),
|
|
644
|
+
__metadata("design:returntype", Promise)
|
|
645
|
+
], Service.prototype, "hasPrimaryEndpoint", null);
|
|
646
|
+
__decorate([
|
|
647
|
+
CaptureSpan(),
|
|
648
|
+
__metadata("design:type", Function),
|
|
649
|
+
__metadata("design:paramtypes", [Object]),
|
|
650
|
+
__metadata("design:returntype", Promise)
|
|
651
|
+
], Service.prototype, "claimEndpoint", null);
|
|
652
|
+
__decorate([
|
|
653
|
+
CaptureSpan(),
|
|
654
|
+
__metadata("design:type", Function),
|
|
655
|
+
__metadata("design:paramtypes", [ObjectID]),
|
|
656
|
+
__metadata("design:returntype", Promise)
|
|
657
|
+
], Service.prototype, "listEndpoints", null);
|
|
658
|
+
__decorate([
|
|
659
|
+
CaptureSpan(),
|
|
660
|
+
__metadata("design:type", Function),
|
|
661
|
+
__metadata("design:paramtypes", [Object]),
|
|
662
|
+
__metadata("design:returntype", Promise)
|
|
663
|
+
], Service.prototype, "findEditableDatabaseServer", null);
|
|
664
|
+
function classifyOwner(owner, databaseServerId) {
|
|
665
|
+
return owner.databaseServerId.toString() === databaseServerId.toString()
|
|
666
|
+
? "already-owned-by-this"
|
|
667
|
+
: "owned-by-other";
|
|
668
|
+
}
|
|
669
|
+
/*
|
|
670
|
+
* "orders-db.example.com:5432 already belongs to the database "PostgreSQL
|
|
671
|
+
* orders-db.example.com:5432"" - naming the owner is the only way a person can
|
|
672
|
+
* find and fix the conflict. But only a database the caller can READ is
|
|
673
|
+
* named: with label- or Owned-scoped permissions the owner may be a row they
|
|
674
|
+
* are not allowed to see, and then it is just "another database". Without
|
|
675
|
+
* props (a root path) the name is read as root.
|
|
676
|
+
*/
|
|
677
|
+
export async function getOwnedByOtherDatabaseMessage(formattedEndpoint, owner, props) {
|
|
678
|
+
let ownerName = "";
|
|
679
|
+
try {
|
|
680
|
+
ownerName = await DatabaseServerService.getDatabaseServerNameIfReadable({
|
|
681
|
+
databaseServerId: owner.databaseServerId,
|
|
682
|
+
props: props,
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
catch (_a) {
|
|
686
|
+
// The name only decorates the message; the refusal stands without it.
|
|
687
|
+
}
|
|
688
|
+
const ownerLabel = ownerName
|
|
689
|
+
? `the database "${ownerName}"`
|
|
690
|
+
: "another database";
|
|
691
|
+
return `${formattedEndpoint} already belongs to ${ownerLabel}. An endpoint can belong to only one database in a project - remove it from that database first.`;
|
|
692
|
+
}
|
|
693
|
+
export default new Service();
|
|
694
|
+
//# sourceMappingURL=DatabaseServerEndpointService.js.map
|