@oneuptime/common 13.0.0 → 13.0.1
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/CloudResource.ts +45 -7
- package/Models/DatabaseModels/CodeRepository.ts +85 -0
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +57 -7
- package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +263 -0
- package/Models/DatabaseModels/Incident.ts +55 -0
- package/Models/DatabaseModels/Index.ts +16 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
- package/Models/DatabaseModels/User.ts +51 -2
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +43 -2
- package/Models/DatabaseModels/UserWebAuthn.ts +17 -0
- package/Models/DatabaseModels/VMwareResource.ts +1149 -0
- package/Models/DatabaseModels/VMwareVCenter.ts +1122 -0
- package/Models/DatabaseModels/VMwareVCenterFeed.ts +625 -0
- package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +514 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +596 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +485 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +484 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +22 -1
- package/Server/API/AIAgentDataAPI.ts +79 -4
- package/Server/API/AIAgentGitHubAPI.ts +523 -0
- package/Server/API/AIChatAPI.ts +20 -1
- package/Server/API/BillingAPI.ts +33 -0
- package/Server/API/DashboardAPI.ts +10 -0
- package/Server/API/GitHubAPI.ts +47 -5
- package/Server/API/GoogleSecOpsConnectionAPI.ts +79 -0
- package/Server/API/UserWebAuthnAPI.ts +21 -1
- package/Server/API/VMwareResourceAPI.ts +143 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.ts +68 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.ts +636 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.ts +83 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Middleware/IdentityRateLimit.ts +101 -0
- package/Server/Services/AIRunService.ts +13 -0
- package/Server/Services/BillingPaymentMethodService.ts +99 -28
- package/Server/Services/BillingService.ts +287 -20
- package/Server/Services/CloudResourceInstanceService.ts +70 -0
- package/Server/Services/ExceptionAggregationService.ts +1 -0
- package/Server/Services/GoogleSecOpsConnectionRunService.ts +10 -0
- package/Server/Services/GoogleSecOpsConnectionService.ts +12 -0
- package/Server/Services/Index.ts +16 -0
- package/Server/Services/LogAggregationService.ts +1 -0
- package/Server/Services/MetricAggregationService.ts +1 -0
- package/Server/Services/MobilePasskeyLoginService.ts +216 -0
- package/Server/Services/MonitorService.ts +51 -1
- package/Server/Services/MonitorTemplateService.ts +91 -29
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +132 -1
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +176 -2
- package/Server/Services/OpenTelemetryIngestService.ts +17 -0
- package/Server/Services/PayAsYouGoBillingService.ts +446 -0
- package/Server/Services/ProjectService.ts +46 -2
- package/Server/Services/ServerlessFunctionInstanceService.ts +71 -0
- package/Server/Services/TeamMemberService.ts +96 -36
- package/Server/Services/TelemetryIngestionKeyService.ts +80 -10
- package/Server/Services/TelemetryUsageBillingService.ts +95 -5
- package/Server/Services/TraceAggregationService.ts +5 -4
- package/Server/Services/UserWebAuthnService.ts +592 -133
- package/Server/Services/VMwareResourceService.ts +648 -0
- package/Server/Services/VMwareVCenterFeedService.ts +99 -0
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +240 -0
- package/Server/Services/VMwareVCenterLabelRuleService.ts +14 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +252 -0
- package/Server/Services/VMwareVCenterOwnerRuleService.ts +14 -0
- package/Server/Services/VMwareVCenterOwnerTeamService.ts +139 -0
- package/Server/Services/VMwareVCenterOwnerUserService.ts +133 -0
- package/Server/Services/VMwareVCenterService.ts +629 -0
- package/Server/Services/WorkflowVariableService.ts +203 -0
- package/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.ts +17 -0
- package/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.ts +31 -1
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +7 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.ts +341 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.ts +274 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.ts +375 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubConversation.ts +846 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.ts +360 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubRunReply.ts +421 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.ts +140 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.ts +906 -0
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +143 -0
- package/Server/Utils/DataSource/EgressGuard.ts +160 -15
- package/Server/Utils/Database/TruncateColumnValue.ts +1 -1
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +2 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +33 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +44 -0
- package/Server/Utils/LogRedaction.ts +2 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +302 -3
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +26 -4
- package/Server/Utils/Monitor/MonitorResourceContext.ts +5 -3
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +14 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +28 -5
- package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +3 -3
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +14 -9
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +116 -84
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +594 -195
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +466 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +5 -0
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +2 -1
- package/Server/Utils/Telemetry/TelemetryEntity.ts +181 -1
- package/Server/Utils/Telemetry/VMwareSnapshotScan.ts +1352 -0
- package/Tests/App/Accounts/LoginPasskey.test.tsx +529 -0
- package/Tests/App/Accounts/MobilePasskey.test.tsx +620 -0
- package/Tests/App/Accounts/PasswordRequirements.test.tsx +254 -0
- package/Tests/App/Accounts/RegisterPassword.test.tsx +553 -0
- package/Tests/App/Dashboard/AskAiAvailability.test.ts +224 -0
- package/Tests/App/Dashboard/AskAiDisabled.test.tsx +432 -0
- package/Tests/App/Dashboard/BackupCodes.test.tsx +414 -0
- package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +530 -0
- package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +195 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +199 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +198 -0
- package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +215 -0
- package/Tests/App/Dashboard/CloudFleetSummary.test.ts +183 -0
- package/Tests/App/Dashboard/CloudFleetSummaryComponent.test.tsx +248 -0
- package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +215 -0
- package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +3 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +441 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +458 -0
- package/Tests/App/Dashboard/DashboardToolbarPopupLayering.test.tsx +566 -0
- package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +376 -0
- package/Tests/App/Dashboard/DiscoveryScanLiveUpdates.test.tsx +642 -0
- package/Tests/App/Dashboard/DiscoveryScanProgress.test.tsx +267 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +69 -231
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +244 -0
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +724 -0
- package/Tests/App/Dashboard/MonitorTemplateSyncFields.test.tsx +539 -0
- package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +24 -7
- package/Tests/App/Dashboard/OnCallOverridePresentation.test.ts +496 -0
- package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +677 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +31 -3
- package/Tests/App/Dashboard/PaidUsageConsent.test.tsx +180 -0
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +1220 -0
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +176 -275
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +380 -233
- package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +3 -23
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +1 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +260 -0
- package/Tests/App/Dashboard/VMwareDashboardWidgets.test.ts +573 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
- package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +768 -0
- package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +532 -40
- package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +19 -2
- package/Tests/Fixtures/MobilePasskeyUser.json +8 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +25 -6
- package/Tests/Models/DatabaseModels/VMwareModels.test.ts +1134 -0
- package/Tests/Models/RunnerVersionLabel.test.ts +4 -2
- package/Tests/Server/API/AIChatProvidersAIEnabled.test.ts +259 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +31 -2
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +116 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +29 -1
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +13 -2
- package/Tests/Server/API/GitHubWebhookSignature.test.ts +368 -0
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +248 -0
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +330 -0
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +172 -0
- package/Tests/Server/API/VMwareResourceAPI.test.ts +546 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupMetadataMigration.test.ts +85 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +34 -3
- package/Tests/Server/Middleware/PasskeyRateLimit.test.ts +141 -0
- package/Tests/Server/Services/AutoImportRuleRearmRecentScans.test.ts +343 -0
- package/Tests/Server/Services/AutoImportRuleWriteRearmsScans.test.ts +381 -0
- package/Tests/Server/Services/BillingPaymentMethodServiceSync.test.ts +175 -0
- package/Tests/Server/Services/BillingService.test.ts +26 -11
- package/Tests/Server/Services/BillingServiceMeteredPaymentAuthorization.test.ts +245 -0
- package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +362 -0
- package/Tests/Server/Services/CloudResourceInstanceStalePrune.test.ts +188 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +16 -2
- package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +153 -0
- package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +13 -0
- package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +5 -0
- package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +36 -0
- package/Tests/Server/Services/InventoryUpsertTruncationGuard.test.ts +151 -0
- package/Tests/Server/Services/MobilePasskeyLoginIntegration.test.ts +231 -0
- package/Tests/Server/Services/MobilePasskeyLoginService.test.ts +315 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +302 -0
- package/Tests/Server/Services/MonitorTemplateServiceFieldSync.test.ts +994 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +22 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +857 -0
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +379 -0
- package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +99 -1
- package/Tests/Server/Services/ProjectServiceSubscriptionSeats.test.ts +134 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +3 -2
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +32 -6
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +363 -175
- package/Tests/Server/Services/ServerlessFunctionInstanceStalePrune.test.ts +200 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +3 -0
- package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +762 -0
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +3 -0
- package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +72 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +17 -4
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +355 -0
- package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +41 -4
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +37 -0
- package/Tests/Server/Services/UserWebAuthnPasskeyIntegration.test.ts +401 -0
- package/Tests/Server/Services/UserWebAuthnPasskeyService.test.ts +769 -0
- package/Tests/Server/Services/UserWebAuthnUserVerification.test.ts +649 -0
- package/Tests/Server/Services/VMwareResourceService.test.ts +945 -0
- package/Tests/Server/Services/VMwareVCenterService.test.ts +722 -0
- package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +842 -0
- package/Tests/Server/TestingUtils/PasskeyHttpIntegration.ts +102 -0
- package/Tests/Server/TestingUtils/SecurityKey.ts +464 -0
- package/Tests/Server/TestingUtils/WebAuthnServiceMocks.ts +60 -0
- package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +573 -0
- package/Tests/Server/Types/Database/Permissions/ProjectCustomerSupportAccessColumn.test.ts +261 -0
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +95 -0
- package/Tests/Server/Utils/CodeRepository/GitHubAgentTaskTrigger.test.ts +2101 -0
- package/Tests/Server/Utils/CodeRepository/GitHubCommandAuthorizer.test.ts +883 -0
- package/Tests/Server/Utils/CodeRepository/GitHubCommandParser.test.ts +1474 -0
- package/Tests/Server/Utils/CodeRepository/GitHubConversation.test.ts +1526 -0
- package/Tests/Server/Utils/CodeRepository/GitHubReplyComposer.test.ts +1389 -0
- package/Tests/Server/Utils/CodeRepository/GitHubRunReply.test.ts +1707 -0
- package/Tests/Server/Utils/CodeRepository/GitHubWebhookHandler.test.ts +2202 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +345 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +896 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupMetadataIntegration.test.ts +246 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +299 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +6 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +185 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +33 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +2 -1
- package/Tests/Server/Utils/Monitor/Criteria/TelemetryStepMetricAlias.test.ts +10 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +66 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +362 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +60 -1
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +60 -0
- package/Tests/Server/Utils/Monitor/MonitorRootCauseTargetResolution.test.ts +423 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +6 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +46 -2
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +81 -45
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +711 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClickhouseIntegration.test.ts +223 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +69 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +838 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsErrorHandling.test.ts +241 -28
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +651 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +11 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +13 -12
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +112 -127
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsRequestContract.test.ts +12 -18
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsResponseParsing.test.ts +43 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +580 -0
- package/Tests/Server/Utils/Telemetry/VMwareSnapshotScan.test.ts +1748 -0
- package/Tests/Types/Cloud/CloudPlatform.test.ts +574 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +2 -0
- package/Tests/Types/Monitor/MonitorCriteriaMetricVariables.test.ts +9 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +53 -8
- package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +97 -0
- package/Tests/Types/Monitor/MonitorStepMetricViewConfigUtil.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorStepTemplateSyncFields.test.ts +107 -0
- package/Tests/Types/Monitor/MonitorTemplateSyncField.test.ts +172 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +2 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +1 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +9 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +131 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +10 -0
- package/Tests/Types/Monitor/VMwareAlertTemplates.test.ts +1608 -0
- package/Tests/Types/Monitor/VMwareMetricCatalog.test.ts +488 -0
- package/Tests/Types/OnCallDutyPolicy/OverrideProvenance.test.ts +295 -0
- package/Tests/Types/Runner/RunnerLiveStatus.test.ts +2 -2
- package/Tests/Types/SignupPassword.test.ts +205 -0
- package/Tests/Types/StatusPage/StatusPageLanguage.test.ts +44 -0
- package/Tests/Types/SupportedLanguages.test.ts +119 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +19 -0
- package/Tests/UI/ColorPickerBuild.test.ts +86 -0
- package/Tests/UI/Components/Breadcrumbs.test.tsx +32 -0
- package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +937 -0
- package/Tests/UI/Components/Forms/ModelFormWriteOnlyColumnSelect.test.tsx +230 -0
- package/Tests/UI/Components/Forms/ValidationFormSteps.test.ts +3 -4
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +907 -0
- package/Tests/UI/Components/ModelTable/ModelTableCreateAfterEdit.test.tsx +514 -0
- package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +301 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +2 -1
- package/Tests/UI/Components/TooltipLazyContent.test.tsx +373 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsMessagingEndpointGuidance.test.tsx +43 -12
- package/Tests/UI/ReactDomBuild.test.ts +104 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +11 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +148 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +29 -0
- package/Tests/UI/Utils/DashboardStackingLayers.test.ts +197 -0
- package/Tests/UI/Utils/LabelRuleImportExport.test.ts +546 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +109 -2
- package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +7 -2
- package/Tests/UI/Utils/UserEmailRegistrationStatus.test.tsx +295 -0
- package/Tests/UI/Utils/WebAuthn.test.ts +265 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +5 -0
- package/Tests/Utils/Dashboard/Components/DashboardVMwareListComponents.test.ts +548 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +17 -3
- package/Tests/Utils/LabelRuleImportExport.test.ts +583 -0
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/MonitorTemplateSyncUtil.test.ts +590 -0
- package/Tests/Utils/RequestFailedDetails.test.ts +325 -0
- package/Tests/Utils/Telemetry/CloudInstanceIdentity.test.ts +255 -0
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +167 -0
- package/Tests/Utils/WebAuthnTestUtil.ts +79 -0
- package/Tests/__mocks__/simplewebauthn.js +33 -4
- package/Types/AI/CodeFixTaskContext.ts +122 -0
- package/Types/AI/CodeFixTaskType.ts +62 -0
- package/Types/Accounts/AccountsLanguage.ts +1 -0
- package/Types/AdminDashboard/AdminDashboardLanguage.ts +1 -0
- package/Types/Calendar/CalendarEvent.ts +16 -0
- package/Types/Cloud/CloudPlatform.ts +372 -0
- package/Types/CodeRepository/GitHubCommand.ts +69 -0
- package/Types/Dashboard/DashboardComponentType.ts +2 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.ts +23 -0
- package/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.ts +30 -0
- package/Types/Dashboard/DashboardLanguage.ts +1 -0
- package/Types/Dashboard/DashboardTemplates.ts +314 -0
- package/Types/Docs/DocsLanguage.ts +1 -0
- package/Types/Exception/EgressGuardException.ts +65 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +36 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +1 -0
- package/Types/Monitor/MonitorStep.ts +78 -17
- package/Types/Monitor/MonitorStepMetricViewConfigUtil.ts +1 -0
- package/Types/Monitor/MonitorStepVMwareMonitor.ts +127 -0
- package/Types/Monitor/MonitorTemplateSyncField.ts +291 -0
- package/Types/Monitor/MonitorType.ts +24 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +33 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +2 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +3 -0
- package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +158 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +61 -0
- package/Types/Monitor/VMwareAlertTemplates.ts +1070 -0
- package/Types/Monitor/VMwareMetricCatalog.ts +914 -0
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +29 -0
- package/Types/OnCallDutyPolicy/UserOverrideUtil.ts +16 -0
- package/Types/Password.ts +84 -5
- package/Types/Permission.ts +265 -0
- package/Types/Probe/RequestFailedDetails.ts +7 -0
- package/Types/Runner/RunnerLiveStatus.ts +1 -1
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -0
- package/Types/StatusPage/StatusPageLanguage.ts +1 -0
- package/Types/Telemetry/EntityType.ts +21 -0
- package/Types/Telemetry/ServiceType.ts +1 -0
- package/Typings/Index.d.ts +63 -0
- package/UI/Components/Breadcrumbs/Breadcrumbs.tsx +2 -2
- package/UI/Components/Calendar/Calendar.css +78 -0
- package/UI/Components/Calendar/Calendar.tsx +28 -3
- package/UI/Components/Forms/BasicForm.tsx +44 -2
- package/UI/Components/Forms/Fields/ColorPicker.tsx +2 -1
- package/UI/Components/Forms/Fields/FormField.tsx +16 -3
- package/UI/Components/Forms/ModelForm.tsx +159 -5
- package/UI/Components/Forms/Types/Field.ts +8 -1
- package/UI/Components/Graphs/DayUptimeGraph.tsx +8 -10
- package/UI/Components/Icon/Icon.tsx +16 -0
- package/UI/Components/Input/Input.tsx +42 -7
- package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +441 -0
- package/UI/Components/LabelRule/LabelRuleTable.tsx +142 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +22 -5
- package/UI/Components/ModelTable/ModelTable.tsx +14 -6
- package/UI/Components/MonitorGraphs/Uptime.tsx +17 -27
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +3 -1
- package/UI/Components/Tooltip/Tooltip.tsx +52 -6
- package/UI/Utils/DashboardStackingLayers.ts +85 -0
- package/UI/Utils/LabelRuleImportExport.ts +310 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +4 -3
- package/UI/Utils/TelemetryService.ts +4 -3
- package/UI/Utils/UseDashboardGridDnd.ts +4 -1
- package/UI/Utils/UserEmailRegistrationStatus.ts +33 -5
- package/UI/Utils/WebAuthn.ts +220 -0
- package/UI/esbuild-config.js +4 -0
- package/Utils/API.ts +34 -0
- package/Utils/Dashboard/Components/DashboardVMwareHostListComponent.ts +38 -0
- package/Utils/Dashboard/Components/DashboardVMwareResourceListShared.ts +70 -0
- package/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.ts +76 -0
- package/Utils/Dashboard/Components/Index.ts +16 -0
- package/Utils/LabelRuleImportExport.ts +496 -0
- package/Utils/Monitor/MonitorTemplateSyncUtil.ts +164 -0
- package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +8 -0
- package/Utils/Telemetry/CloudInstanceIdentity.ts +94 -0
- package/Utils/Telemetry/EntityKey.ts +19 -0
- package/Utils/Telemetry/EntityRelationship.ts +19 -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/CloudResource.js +44 -7
- package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +87 -0
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +60 -7
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +287 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.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/ScheduledMaintenance.js +54 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +57 -4
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +47 -2
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +18 -0
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareResource.js +1201 -0
- package/build/dist/Models/DatabaseModels/VMwareResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js +1149 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +22 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +63 -3
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentGitHubAPI.js +363 -0
- package/build/dist/Server/API/AIAgentGitHubAPI.js.map +1 -0
- package/build/dist/Server/API/AIChatAPI.js +19 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +22 -0
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +10 -0
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GitHubAPI.js +33 -5
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +56 -0
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -0
- package/build/dist/Server/API/UserWebAuthnAPI.js +17 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/VMwareResourceAPI.js +106 -0
- package/build/dist/Server/API/VMwareResourceAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js +241 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +80 -0
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +14 -1
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/BillingPaymentMethodService.js +71 -21
- package/build/dist/Server/Services/BillingPaymentMethodService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +210 -22
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceInstanceService.js +66 -0
- package/build/dist/Server/Services/CloudResourceInstanceService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +1 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +9 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +1 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +7 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.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/LogAggregationService.js +1 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +1 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MobilePasskeyLoginService.js +137 -0
- package/build/dist/Server/Services/MobilePasskeyLoginService.js.map +1 -0
- package/build/dist/Server/Services/MonitorService.js +34 -1
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +64 -26
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +124 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +142 -2
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +28 -13
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PayAsYouGoBillingService.js +297 -0
- package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -0
- package/build/dist/Server/Services/ProjectService.js +38 -2
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js +66 -0
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +85 -28
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +61 -10
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +62 -5
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +5 -4
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserWebAuthnService.js +345 -113
- package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
- package/build/dist/Server/Services/VMwareResourceService.js +395 -0
- package/build/dist/Server/Services/VMwareResourceService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterFeedService.js +89 -0
- package/build/dist/Server/Services/VMwareVCenterFeedService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +197 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js +13 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +214 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js +129 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js +122 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterService.js +533 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -0
- package/build/dist/Server/Services/WorkflowVariableService.js +169 -0
- package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js +12 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js +25 -2
- package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js +275 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js +226 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js +297 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js +582 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js +275 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js +365 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js +103 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js +661 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +113 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +99 -15
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +2 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +18 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +31 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +2 -1
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +219 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +12 -4
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +5 -3
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +22 -9
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +21 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +21 -6
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +3 -3
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +9 -9
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +92 -71
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +428 -143
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +376 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +136 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js +933 -0
- package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js +40 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskType.js +57 -0
- package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -1
- package/build/dist/Types/Accounts/AccountsLanguage.js +1 -0
- package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +1 -0
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
- package/build/dist/Types/Cloud/CloudPlatform.js +277 -0
- package/build/dist/Types/Cloud/CloudPlatform.js.map +1 -0
- package/build/dist/Types/CodeRepository/GitHubCommand.js +52 -0
- package/build/dist/Types/CodeRepository/GitHubCommand.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +286 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Docs/DocsLanguage.js +1 -0
- package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
- package/build/dist/Types/Exception/EgressGuardException.js +59 -0
- package/build/dist/Types/Exception/EgressGuardException.js.map +1 -0
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +61 -18
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js +1 -0
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js +71 -0
- package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorTemplateSyncField.js +211 -0
- package/build/dist/Types/Monitor/MonitorTemplateSyncField.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +23 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +28 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +2 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +120 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +60 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/Monitor/VMwareAlertTemplates.js +775 -0
- package/build/dist/Types/Monitor/VMwareAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/VMwareMetricCatalog.js +799 -0
- package/build/dist/Types/Monitor/VMwareMetricCatalog.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +25 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js +5 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js.map +1 -1
- package/build/dist/Types/Password.js +63 -5
- package/build/dist/Types/Password.js.map +1 -1
- package/build/dist/Types/Permission.js +234 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Probe/RequestFailedDetails.js +7 -0
- package/build/dist/Types/Probe/RequestFailedDetails.js.map +1 -1
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +2 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageLanguage.js +1 -0
- package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +21 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js +2 -2
- package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/build/dist/UI/Components/Calendar/Calendar.js +24 -4
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +28 -3
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -3
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +89 -6
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +5 -6
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +14 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +37 -8
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +228 -0
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -0
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +102 -0
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +15 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +13 -5
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +14 -15
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +2 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +33 -4
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/DashboardStackingLayers.js +44 -0
- package/build/dist/UI/Utils/DashboardStackingLayers.js.map +1 -0
- package/build/dist/UI/Utils/LabelRuleImportExport.js +195 -0
- package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -0
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +4 -4
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.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/UI/Utils/UseDashboardGridDnd.js +2 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -1
- package/build/dist/UI/Utils/UserEmailRegistrationStatus.js +21 -4
- package/build/dist/UI/Utils/UserEmailRegistrationStatus.js.map +1 -1
- package/build/dist/UI/Utils/WebAuthn.js +121 -0
- package/build/dist/UI/Utils/WebAuthn.js.map +1 -0
- package/build/dist/Utils/API.js +29 -0
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js +33 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js +54 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js +60 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +356 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js +110 -0
- package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +6 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -1
- package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js +88 -0
- package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +15 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityRelationship.js +13 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import GoogleSecOpsConnection from "../../../../Models/DatabaseModels/GoogleSecOpsConnection";
|
|
2
|
+
import GoogleSecOpsConnectionRun from "../../../../Models/DatabaseModels/GoogleSecOpsConnectionRun";
|
|
3
|
+
import Project from "../../../../Models/DatabaseModels/Project";
|
|
4
|
+
import Reseller from "../../../../Models/DatabaseModels/Reseller";
|
|
5
|
+
import Includes from "../../../../Types/BaseDatabase/Includes";
|
|
6
|
+
import LessThan from "../../../../Types/BaseDatabase/LessThan";
|
|
7
|
+
import LIMIT_MAX from "../../../../Types/Database/LimitMax";
|
|
8
|
+
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
9
|
+
import { JSONObject } from "../../../../Types/JSON";
|
|
10
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
11
|
+
import {
|
|
12
|
+
GoogleSecOpsRunOptions,
|
|
13
|
+
GoogleSecOpsRunResult,
|
|
14
|
+
} from "../../../../Types/SecurityEvent/GoogleSecOpsDiagnostics";
|
|
15
|
+
import Queue, { QueueName } from "../../../Infrastructure/Queue";
|
|
16
|
+
import Semaphore, {
|
|
17
|
+
SemaphoreLockTimeoutError,
|
|
18
|
+
SemaphoreMutex,
|
|
19
|
+
} from "../../../Infrastructure/Semaphore";
|
|
20
|
+
import GoogleSecOpsConnectionRunService from "../../../Services/GoogleSecOpsConnectionRunService";
|
|
21
|
+
import GoogleSecOpsConnectionService from "../../../Services/GoogleSecOpsConnectionService";
|
|
22
|
+
import ProjectService from "../../../Services/ProjectService";
|
|
23
|
+
import ResellerService from "../../../Services/ResellerService";
|
|
24
|
+
import logger from "../../Logger";
|
|
25
|
+
import { redactLogString } from "../../LogRedaction";
|
|
26
|
+
import ConnectorErrorMessage from "../ConnectorErrorMessage";
|
|
27
|
+
import GoogleSecOpsPoller from "./GoogleSecOpsPoller";
|
|
28
|
+
|
|
29
|
+
export const GOOGLE_SECOPS_RUN_JOB: string =
|
|
30
|
+
"SecurityEvents:RunGoogleSecOpsConnection";
|
|
31
|
+
export const GOOGLE_SECOPS_RUN_TIMEOUT_MS: number = 10 * 60 * 1000;
|
|
32
|
+
const STALE_RUN_MS: number = 20 * 60 * 1000;
|
|
33
|
+
const MAX_RANGE_MS: number = 7 * 24 * 60 * 60 * 1000;
|
|
34
|
+
const ACTIVE_STATUSES: Array<string> = ["queued", "running"];
|
|
35
|
+
|
|
36
|
+
export interface EnqueueGoogleSecOpsRun {
|
|
37
|
+
projectId: ObjectID;
|
|
38
|
+
connectionId: ObjectID;
|
|
39
|
+
options: GoogleSecOpsRunOptions;
|
|
40
|
+
requestedByUserId?: ObjectID | undefined;
|
|
41
|
+
scheduled?: boolean | undefined;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default class GoogleSecOpsRunExecutor {
|
|
45
|
+
public static validateOptions(value: unknown): GoogleSecOpsRunOptions {
|
|
46
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
47
|
+
throw new BadDataException("A connection operation is required.");
|
|
48
|
+
}
|
|
49
|
+
const body: JSONObject = value as JSONObject;
|
|
50
|
+
const type: unknown = body["type"];
|
|
51
|
+
if (
|
|
52
|
+
type !== "test" &&
|
|
53
|
+
type !== "poll" &&
|
|
54
|
+
type !== "preview" &&
|
|
55
|
+
type !== "backfill"
|
|
56
|
+
) {
|
|
57
|
+
throw new BadDataException("Choose test, poll, preview, or backfill.");
|
|
58
|
+
}
|
|
59
|
+
if (type === "test" || type === "poll") {
|
|
60
|
+
if (body["startTime"] !== undefined || body["endTime"] !== undefined) {
|
|
61
|
+
throw new BadDataException(
|
|
62
|
+
"Use preview or backfill to select a historical period.",
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
return { type };
|
|
66
|
+
}
|
|
67
|
+
const start: unknown = body["startTime"];
|
|
68
|
+
const end: unknown = body["endTime"];
|
|
69
|
+
const timestampPattern: RegExp =
|
|
70
|
+
/^\d{4}-\d\d-\d\dT\d\d:\d\d.*(?:Z|[+-]\d\d:\d\d)$/;
|
|
71
|
+
const isTimestamp: (value: unknown) => value is string = (
|
|
72
|
+
input: unknown,
|
|
73
|
+
): input is string => {
|
|
74
|
+
return (
|
|
75
|
+
typeof input === "string" &&
|
|
76
|
+
timestampPattern.test(input) &&
|
|
77
|
+
Number.isFinite(Date.parse(input))
|
|
78
|
+
);
|
|
79
|
+
};
|
|
80
|
+
if (!isTimestamp(start) || !isTimestamp(end)) {
|
|
81
|
+
throw new BadDataException(
|
|
82
|
+
"Valid startTime and endTime timestamps with timezones are required.",
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
const duration: number = Date.parse(end) - Date.parse(start);
|
|
86
|
+
if (
|
|
87
|
+
duration <= 0 ||
|
|
88
|
+
duration > MAX_RANGE_MS ||
|
|
89
|
+
Date.parse(end) > Date.now()
|
|
90
|
+
) {
|
|
91
|
+
throw new BadDataException(
|
|
92
|
+
"Choose a past time range of up to seven days, with start before end.",
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
type,
|
|
97
|
+
startTime: new Date(start).toISOString(),
|
|
98
|
+
endTime: new Date(end).toISOString(),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public static async assertTelemetryEnabled(
|
|
103
|
+
projectId: ObjectID,
|
|
104
|
+
): Promise<void> {
|
|
105
|
+
const project: Project | null = await ProjectService.findOneById({
|
|
106
|
+
id: projectId,
|
|
107
|
+
select: { _id: true, resellerId: true },
|
|
108
|
+
props: { isRoot: true },
|
|
109
|
+
});
|
|
110
|
+
if (!project) {
|
|
111
|
+
throw new BadDataException("The connection's project no longer exists.");
|
|
112
|
+
}
|
|
113
|
+
if (project.resellerId) {
|
|
114
|
+
const reseller: Reseller | null = await ResellerService.findOneById({
|
|
115
|
+
id: project.resellerId,
|
|
116
|
+
select: { _id: true, enableTelemetryFeatures: true },
|
|
117
|
+
props: { isRoot: true },
|
|
118
|
+
});
|
|
119
|
+
if (!reseller?.enableTelemetryFeatures) {
|
|
120
|
+
throw new BadDataException(
|
|
121
|
+
"Security events are unavailable for this project's reseller plan.",
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
public static async enqueue(data: EnqueueGoogleSecOpsRun): Promise<ObjectID> {
|
|
128
|
+
const options: GoogleSecOpsRunOptions = this.validateOptions(data.options);
|
|
129
|
+
await this.assertTelemetryEnabled(data.projectId);
|
|
130
|
+
const lock: SemaphoreMutex = await Semaphore.lock({
|
|
131
|
+
namespace: "GoogleSecOpsRunAdmission",
|
|
132
|
+
key: data.connectionId.toString(),
|
|
133
|
+
lockTimeout: 30_000,
|
|
134
|
+
acquireTimeout: 5_000,
|
|
135
|
+
});
|
|
136
|
+
try {
|
|
137
|
+
const active: GoogleSecOpsConnectionRun | null =
|
|
138
|
+
await GoogleSecOpsConnectionRunService.findOneBy({
|
|
139
|
+
query: {
|
|
140
|
+
projectId: data.projectId,
|
|
141
|
+
googleSecOpsConnectionId: data.connectionId,
|
|
142
|
+
status: new Includes(ACTIVE_STATUSES),
|
|
143
|
+
},
|
|
144
|
+
select: { _id: true, createdAt: true, updatedAt: true },
|
|
145
|
+
props: { isRoot: true },
|
|
146
|
+
});
|
|
147
|
+
if (active && !(await this.expireStaleRun(active))) {
|
|
148
|
+
throw new BadDataException(
|
|
149
|
+
"This connection already has a queued or running operation. Open run history for its progress.",
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
const run: GoogleSecOpsConnectionRun = new GoogleSecOpsConnectionRun();
|
|
153
|
+
run.projectId = data.projectId;
|
|
154
|
+
run.googleSecOpsConnectionId = data.connectionId;
|
|
155
|
+
run.type = options.type;
|
|
156
|
+
run.status = "queued";
|
|
157
|
+
if (data.requestedByUserId) {
|
|
158
|
+
run.requestedByUserId = data.requestedByUserId;
|
|
159
|
+
}
|
|
160
|
+
run.request = { ...options, scheduled: data.scheduled === true };
|
|
161
|
+
const created: GoogleSecOpsConnectionRun =
|
|
162
|
+
await GoogleSecOpsConnectionRunService.create({
|
|
163
|
+
data: run,
|
|
164
|
+
props: { isRoot: true },
|
|
165
|
+
});
|
|
166
|
+
const runId: ObjectID = created.id!;
|
|
167
|
+
try {
|
|
168
|
+
// The payload deliberately contains no connection settings or credentials.
|
|
169
|
+
await Queue.addJob(
|
|
170
|
+
QueueName.Worker,
|
|
171
|
+
runId.toString(),
|
|
172
|
+
GOOGLE_SECOPS_RUN_JOB,
|
|
173
|
+
{ runId: runId.toString() },
|
|
174
|
+
{ attempts: 3, backoffDelayInMs: 5000 },
|
|
175
|
+
);
|
|
176
|
+
} catch {
|
|
177
|
+
await this.failRun(
|
|
178
|
+
runId,
|
|
179
|
+
"The operation could not be queued. Please try again.",
|
|
180
|
+
);
|
|
181
|
+
throw new BadDataException(
|
|
182
|
+
"The operation could not be queued. Please try again.",
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
return runId;
|
|
186
|
+
} finally {
|
|
187
|
+
await this.release(lock);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
public static async executeRun(runId: ObjectID): Promise<void> {
|
|
192
|
+
const lock: SemaphoreMutex = await Semaphore.lock({
|
|
193
|
+
namespace: "GoogleSecOpsRun",
|
|
194
|
+
key: runId.toString(),
|
|
195
|
+
lockTimeout: 30_000,
|
|
196
|
+
acquireTimeout: 1000,
|
|
197
|
+
});
|
|
198
|
+
try {
|
|
199
|
+
const run: GoogleSecOpsConnectionRun | null =
|
|
200
|
+
await GoogleSecOpsConnectionRunService.findOneById({
|
|
201
|
+
id: runId,
|
|
202
|
+
select: {
|
|
203
|
+
_id: true,
|
|
204
|
+
projectId: true,
|
|
205
|
+
googleSecOpsConnectionId: true,
|
|
206
|
+
status: true,
|
|
207
|
+
type: true,
|
|
208
|
+
request: true,
|
|
209
|
+
},
|
|
210
|
+
props: { isRoot: true },
|
|
211
|
+
});
|
|
212
|
+
if (!run || !ACTIVE_STATUSES.includes(run.status || "")) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if (!run.projectId || !run.googleSecOpsConnectionId) {
|
|
216
|
+
await this.failRun(runId, "The connection is no longer available.");
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
let result: GoogleSecOpsRunResult;
|
|
220
|
+
try {
|
|
221
|
+
const options: GoogleSecOpsRunOptions = {
|
|
222
|
+
...this.validateOptions(run.request),
|
|
223
|
+
runId: runId.toString(),
|
|
224
|
+
};
|
|
225
|
+
await this.assertTelemetryEnabled(run.projectId);
|
|
226
|
+
const connection: GoogleSecOpsConnection | null =
|
|
227
|
+
await GoogleSecOpsConnectionService.findOneBy({
|
|
228
|
+
query: {
|
|
229
|
+
_id: run.googleSecOpsConnectionId.toString(),
|
|
230
|
+
projectId: run.projectId,
|
|
231
|
+
},
|
|
232
|
+
select: {
|
|
233
|
+
_id: true,
|
|
234
|
+
projectId: true,
|
|
235
|
+
name: true,
|
|
236
|
+
region: true,
|
|
237
|
+
instanceResourceName: true,
|
|
238
|
+
serviceAccountJson: true,
|
|
239
|
+
pollIntervalInMinutes: true,
|
|
240
|
+
lastPolledAt: true,
|
|
241
|
+
lastPollResult: true,
|
|
242
|
+
cursor: true,
|
|
243
|
+
isEnabled: true,
|
|
244
|
+
includeNonAlertingDetections: true,
|
|
245
|
+
},
|
|
246
|
+
props: { isRoot: true },
|
|
247
|
+
});
|
|
248
|
+
if (
|
|
249
|
+
!connection ||
|
|
250
|
+
(run.request?.["scheduled"] === true && !connection.isEnabled)
|
|
251
|
+
) {
|
|
252
|
+
throw new BadDataException(
|
|
253
|
+
"The connection was deleted or scheduled polling was disabled before this operation started.",
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
const recordedResult: GoogleSecOpsRunResult | null =
|
|
257
|
+
this.getRecordedPollResult(run, connection);
|
|
258
|
+
if (recordedResult) {
|
|
259
|
+
/*
|
|
260
|
+
* The poll's cursor and diagnostics were committed together. A
|
|
261
|
+
* retry after the run-history write failed must preserve those
|
|
262
|
+
* counts instead of polling the newly advanced cursor again.
|
|
263
|
+
*/
|
|
264
|
+
result = recordedResult;
|
|
265
|
+
} else {
|
|
266
|
+
await GoogleSecOpsConnectionRunService.updateOneById({
|
|
267
|
+
id: runId,
|
|
268
|
+
data: { status: "running", startedAt: new Date(), error: "" },
|
|
269
|
+
props: { isRoot: true },
|
|
270
|
+
});
|
|
271
|
+
result = await GoogleSecOpsPoller.executeConnection(
|
|
272
|
+
connection,
|
|
273
|
+
options,
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
} catch (error) {
|
|
277
|
+
await this.failRun(
|
|
278
|
+
runId,
|
|
279
|
+
redactLogString(ConnectorErrorMessage.toMessage(error)),
|
|
280
|
+
);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
/*
|
|
284
|
+
* Leave persistence errors retryable: query-before-insert deduplication
|
|
285
|
+
* makes re-running an interrupted import safe, including after a crash.
|
|
286
|
+
*/
|
|
287
|
+
await GoogleSecOpsConnectionRunService.updateOneById({
|
|
288
|
+
id: runId,
|
|
289
|
+
data: {
|
|
290
|
+
status: result.status,
|
|
291
|
+
completedAt: new Date(result.completedAt),
|
|
292
|
+
/*
|
|
293
|
+
* The result is a complete JSON document; expanding the database
|
|
294
|
+
* helper's recursive partial type for JSON exceeds TypeScript's depth.
|
|
295
|
+
*/
|
|
296
|
+
result: result as never,
|
|
297
|
+
error: result.error || "",
|
|
298
|
+
},
|
|
299
|
+
props: { isRoot: true },
|
|
300
|
+
});
|
|
301
|
+
} finally {
|
|
302
|
+
await this.release(lock);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
private static getRecordedPollResult(
|
|
307
|
+
run: GoogleSecOpsConnectionRun,
|
|
308
|
+
connection: GoogleSecOpsConnection,
|
|
309
|
+
): GoogleSecOpsRunResult | null {
|
|
310
|
+
const stored: JSONObject | undefined = connection.lastPollResult;
|
|
311
|
+
if (
|
|
312
|
+
run.status !== "running" ||
|
|
313
|
+
run.type !== "poll" ||
|
|
314
|
+
!stored ||
|
|
315
|
+
stored["runId"] !== run.id?.toString() ||
|
|
316
|
+
stored["type"] !== "poll" ||
|
|
317
|
+
typeof stored["status"] !== "string" ||
|
|
318
|
+
!["success", "empty", "partial", "failed"].includes(stored["status"]) ||
|
|
319
|
+
typeof stored["completedAt"] !== "string" ||
|
|
320
|
+
!Number.isFinite(Date.parse(stored["completedAt"]))
|
|
321
|
+
) {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
/*
|
|
325
|
+
* The worker supplies runId after validating the stored request; callers
|
|
326
|
+
* cannot forge a checkpoint by passing a runId in an API request.
|
|
327
|
+
*/
|
|
328
|
+
return stored as unknown as GoogleSecOpsRunResult;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
private static async failRun(runId: ObjectID, error: string): Promise<void> {
|
|
332
|
+
await GoogleSecOpsConnectionRunService.updateOneById({
|
|
333
|
+
id: runId,
|
|
334
|
+
data: { status: "failed", completedAt: new Date(), error },
|
|
335
|
+
props: { isRoot: true },
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
public static async expireStaleRun(
|
|
340
|
+
run: GoogleSecOpsConnectionRun,
|
|
341
|
+
): Promise<boolean> {
|
|
342
|
+
const updatedAt: Date | undefined = run.updatedAt || run.createdAt;
|
|
343
|
+
if (
|
|
344
|
+
!run.id ||
|
|
345
|
+
!updatedAt ||
|
|
346
|
+
updatedAt.getTime() > Date.now() - STALE_RUN_MS
|
|
347
|
+
) {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
let lock: SemaphoreMutex;
|
|
351
|
+
try {
|
|
352
|
+
lock = await Semaphore.lock({
|
|
353
|
+
namespace: "GoogleSecOpsRun",
|
|
354
|
+
key: run.id.toString(),
|
|
355
|
+
lockTimeout: 30_000,
|
|
356
|
+
acquireTimeout: 100,
|
|
357
|
+
acquireAttemptsLimit: 1,
|
|
358
|
+
});
|
|
359
|
+
} catch (error) {
|
|
360
|
+
if (error instanceof SemaphoreLockTimeoutError) {
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
throw error;
|
|
364
|
+
}
|
|
365
|
+
try {
|
|
366
|
+
// Conditional update cannot overwrite a completed run read before the lock.
|
|
367
|
+
const updated: number =
|
|
368
|
+
await GoogleSecOpsConnectionRunService.updateOneBy({
|
|
369
|
+
query: {
|
|
370
|
+
_id: run.id.toString(),
|
|
371
|
+
status: new Includes(ACTIVE_STATUSES),
|
|
372
|
+
updatedAt: new LessThan(new Date(Date.now() - STALE_RUN_MS)),
|
|
373
|
+
},
|
|
374
|
+
data: {
|
|
375
|
+
status: "failed",
|
|
376
|
+
completedAt: new Date(),
|
|
377
|
+
error:
|
|
378
|
+
"The worker did not finish this operation within twenty minutes. Check worker health and run it again.",
|
|
379
|
+
},
|
|
380
|
+
props: { isRoot: true },
|
|
381
|
+
});
|
|
382
|
+
if (updated > 0) {
|
|
383
|
+
return true;
|
|
384
|
+
}
|
|
385
|
+
const current: GoogleSecOpsConnectionRun | null =
|
|
386
|
+
await GoogleSecOpsConnectionRunService.findOneById({
|
|
387
|
+
id: run.id,
|
|
388
|
+
select: { _id: true, status: true },
|
|
389
|
+
props: { isRoot: true },
|
|
390
|
+
});
|
|
391
|
+
return !current || !ACTIVE_STATUSES.includes(current.status || "");
|
|
392
|
+
} finally {
|
|
393
|
+
await this.release(lock);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
public static async enqueueDueConnections(): Promise<void> {
|
|
398
|
+
const staleRuns: Array<GoogleSecOpsConnectionRun> =
|
|
399
|
+
await GoogleSecOpsConnectionRunService.findBy({
|
|
400
|
+
query: {
|
|
401
|
+
status: new Includes(ACTIVE_STATUSES),
|
|
402
|
+
updatedAt: new LessThan(new Date(Date.now() - STALE_RUN_MS)),
|
|
403
|
+
},
|
|
404
|
+
select: { _id: true, createdAt: true, updatedAt: true },
|
|
405
|
+
limit: LIMIT_MAX,
|
|
406
|
+
skip: 0,
|
|
407
|
+
props: { isRoot: true },
|
|
408
|
+
});
|
|
409
|
+
for (const run of staleRuns) {
|
|
410
|
+
try {
|
|
411
|
+
await this.expireStaleRun(run);
|
|
412
|
+
} catch {
|
|
413
|
+
logger.error(
|
|
414
|
+
"Google SecOps: could not recover an interrupted operation.",
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
const connections: Array<GoogleSecOpsConnection> =
|
|
419
|
+
await GoogleSecOpsConnectionService.findBy({
|
|
420
|
+
query: { isEnabled: true },
|
|
421
|
+
select: {
|
|
422
|
+
_id: true,
|
|
423
|
+
projectId: true,
|
|
424
|
+
pollIntervalInMinutes: true,
|
|
425
|
+
lastPolledAt: true,
|
|
426
|
+
},
|
|
427
|
+
limit: LIMIT_MAX,
|
|
428
|
+
skip: 0,
|
|
429
|
+
props: { isRoot: true },
|
|
430
|
+
});
|
|
431
|
+
for (const connection of connections) {
|
|
432
|
+
if (
|
|
433
|
+
!connection.id ||
|
|
434
|
+
!connection.projectId ||
|
|
435
|
+
(connection.lastPolledAt &&
|
|
436
|
+
connection.lastPolledAt.getTime() +
|
|
437
|
+
Math.max(1, connection.pollIntervalInMinutes || 5) * 60_000 >
|
|
438
|
+
Date.now())
|
|
439
|
+
) {
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
try {
|
|
443
|
+
await this.enqueue({
|
|
444
|
+
projectId: connection.projectId,
|
|
445
|
+
connectionId: connection.id,
|
|
446
|
+
options: { type: "poll" },
|
|
447
|
+
scheduled: true,
|
|
448
|
+
});
|
|
449
|
+
} catch (error) {
|
|
450
|
+
logger.debug(
|
|
451
|
+
`Google SecOps: skipped scheduled operation: ${redactLogString(ConnectorErrorMessage.toMessage(error))}`,
|
|
452
|
+
);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
private static async release(lock: SemaphoreMutex): Promise<void> {
|
|
458
|
+
try {
|
|
459
|
+
await Semaphore.release(lock);
|
|
460
|
+
} catch {
|
|
461
|
+
logger.error(
|
|
462
|
+
"Google SecOps: a run lock could not be released and will expire automatically.",
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
@@ -71,6 +71,11 @@ export const DEFAULT_ENTITY_BUDGET: ReadonlyMap<EntityType, number> = new Map<
|
|
|
71
71
|
[EntityType.ProxmoxNode, 1000],
|
|
72
72
|
[EntityType.ProxmoxGuest, 5000],
|
|
73
73
|
[EntityType.CephCluster, 10000],
|
|
74
|
+
[EntityType.VMwareVCenter, 10000],
|
|
75
|
+
[EntityType.VMwareCluster, 1000],
|
|
76
|
+
[EntityType.VMwareHost, 2000],
|
|
77
|
+
[EntityType.VMwareVirtualMachine, 10000],
|
|
78
|
+
[EntityType.VMwareDatastore, 2000],
|
|
74
79
|
]);
|
|
75
80
|
|
|
76
81
|
// For types not in the map (future promotions of high-churn types).
|
|
@@ -15,7 +15,8 @@ import logger from "../Logger";
|
|
|
15
15
|
* RumApplication, DockerSwarmCluster) each carried a hand-copied version of
|
|
16
16
|
* this: read a throttle key, compare a fingerprint, write it back, UPDATE the
|
|
17
17
|
* row. Copying it twelve times copied its defects twelve times, and one of
|
|
18
|
-
* those copies took production down.
|
|
18
|
+
* those copies took production down. Services added since (VMwareVCenter)
|
|
19
|
+
* were written against this helper from the start and never carried a copy.
|
|
19
20
|
*
|
|
20
21
|
* THE DEFECT. The throttle keyed on the row id but STORED a fingerprint of the
|
|
21
22
|
* incoming metadata, skipping only when the stored fingerprint matched. That
|
|
@@ -754,7 +754,7 @@ export default class InventoryItem {
|
|
|
754
754
|
|
|
755
755
|
/*
|
|
756
756
|
* docker.swarm.cluster — docker.swarm.cluster.name only, mirroring the
|
|
757
|
-
* proxmox/ceph
|
|
757
|
+
* proxmox/ceph/vmware root identity: the typed Postgres row
|
|
758
758
|
* (DockerSwarmCluster) and the read side
|
|
759
759
|
* (`EntityKey.keyForDockerSwarmCluster`) are name-based, and the agent
|
|
760
760
|
* stamps `docker.swarm.cluster.name` on every signal. Node/Service/Task
|
|
@@ -774,6 +774,149 @@ export default class InventoryItem {
|
|
|
774
774
|
: null;
|
|
775
775
|
},
|
|
776
776
|
|
|
777
|
+
/*
|
|
778
|
+
* ---- VMware vSphere ------------------------------------------------
|
|
779
|
+
*
|
|
780
|
+
* Identity for every vSphere object lives in RESOURCE attributes the
|
|
781
|
+
* OpenTelemetry Collector `vcenter` receiver emits (one OTLP resource
|
|
782
|
+
* per datacenter / cluster / host / VM / datastore / resource pool),
|
|
783
|
+
* plus the OneUptime-defined `vmware.vcenter.name` the agent's
|
|
784
|
+
* resource processor stamps on all of them. That root attribute is
|
|
785
|
+
* the only thing that says WHICH vCenter an object belongs to, so every
|
|
786
|
+
* resolver below requires it and folds it in (see
|
|
787
|
+
* vmwareVCenterIdentity) — a resource without it resolves to no VMware
|
|
788
|
+
* entity at all, rather than to a key that would collide across
|
|
789
|
+
* vCenters. Datacenters and resource pools are tracked as VMwareResource
|
|
790
|
+
* inventory rows but are deliberately not entities.
|
|
791
|
+
*/
|
|
792
|
+
|
|
793
|
+
// vmware.vcenter — vmware.vcenter.name only (see vmwareVCenterIdentity).
|
|
794
|
+
(attrs: EntityAttributes) => {
|
|
795
|
+
const id: Dictionary<string> | null =
|
|
796
|
+
InventoryItem.vmwareVCenterIdentity(attrs);
|
|
797
|
+
return id ? { entityType: EntityType.VMwareVCenter, id } : null;
|
|
798
|
+
},
|
|
799
|
+
|
|
800
|
+
/*
|
|
801
|
+
* vmware.cluster — vCenter + vcenter.datacenter.name +
|
|
802
|
+
* vcenter.cluster.name. Cluster names are unique only within a
|
|
803
|
+
* datacenter, so the datacenter is part of the identity. Emitted for
|
|
804
|
+
* every resource that carries a cluster name (a host in a cluster, a VM
|
|
805
|
+
* on such a host, the cluster's own resource), so the cluster entity is
|
|
806
|
+
* kept alive by all of them.
|
|
807
|
+
*/
|
|
808
|
+
(attrs: EntityAttributes) => {
|
|
809
|
+
const vcenter: Dictionary<string> | null =
|
|
810
|
+
InventoryItem.vmwareVCenterIdentity(attrs);
|
|
811
|
+
const datacenter: string | null = InventoryItem.str(
|
|
812
|
+
attrs,
|
|
813
|
+
"vcenter.datacenter.name",
|
|
814
|
+
);
|
|
815
|
+
const cluster: string | null = InventoryItem.str(
|
|
816
|
+
attrs,
|
|
817
|
+
"vcenter.cluster.name",
|
|
818
|
+
);
|
|
819
|
+
if (!vcenter || !datacenter || !cluster) {
|
|
820
|
+
return null;
|
|
821
|
+
}
|
|
822
|
+
return {
|
|
823
|
+
entityType: EntityType.VMwareCluster,
|
|
824
|
+
id: {
|
|
825
|
+
...vcenter,
|
|
826
|
+
"vcenter.datacenter.name": datacenter,
|
|
827
|
+
"vcenter.cluster.name": cluster,
|
|
828
|
+
},
|
|
829
|
+
};
|
|
830
|
+
},
|
|
831
|
+
|
|
832
|
+
/*
|
|
833
|
+
* vmware.host — vCenter + vcenter.datacenter.name + vcenter.host.name.
|
|
834
|
+
* The cluster is deliberately NOT identity: moving an ESXi host between
|
|
835
|
+
* clusters (or out of one into a standalone role) does not change which
|
|
836
|
+
* host it is, so folding the cluster in would fork the key. It is kept
|
|
837
|
+
* as a descriptive attribute instead. Emitted for the host's own
|
|
838
|
+
* resource and for every VM resource (which carries its parent host).
|
|
839
|
+
*/
|
|
840
|
+
(attrs: EntityAttributes) => {
|
|
841
|
+
const vcenter: Dictionary<string> | null =
|
|
842
|
+
InventoryItem.vmwareVCenterIdentity(attrs);
|
|
843
|
+
const datacenter: string | null = InventoryItem.str(
|
|
844
|
+
attrs,
|
|
845
|
+
"vcenter.datacenter.name",
|
|
846
|
+
);
|
|
847
|
+
const host: string | null = InventoryItem.str(attrs, "vcenter.host.name");
|
|
848
|
+
if (!vcenter || !datacenter || !host) {
|
|
849
|
+
return null;
|
|
850
|
+
}
|
|
851
|
+
return {
|
|
852
|
+
entityType: EntityType.VMwareHost,
|
|
853
|
+
id: {
|
|
854
|
+
...vcenter,
|
|
855
|
+
"vcenter.datacenter.name": datacenter,
|
|
856
|
+
"vcenter.host.name": host,
|
|
857
|
+
},
|
|
858
|
+
};
|
|
859
|
+
},
|
|
860
|
+
|
|
861
|
+
/*
|
|
862
|
+
* vmware.vm — vCenter + the VM's instance UUID. The receiver reports it
|
|
863
|
+
* as `vcenter.vm.id` on a virtual machine and as `vcenter.vm_template.id`
|
|
864
|
+
* on a template; a template IS a VM (converting one to the other keeps
|
|
865
|
+
* the instance UUID), so both are accepted and stored under the single
|
|
866
|
+
* identity key `vcenter.vm.id` — the key survives the conversion. The
|
|
867
|
+
* host name is deliberately NOT identity: a vMotion moves a VM between
|
|
868
|
+
* ESXi hosts without changing what it is, so folding the host in would
|
|
869
|
+
* fork the key on every migration. The VM name is not identity either
|
|
870
|
+
* (a VM can be renamed). Name, host, cluster, datacenter, resource pool
|
|
871
|
+
* and the template name are descriptive.
|
|
872
|
+
*/
|
|
873
|
+
(attrs: EntityAttributes) => {
|
|
874
|
+
const vcenter: Dictionary<string> | null =
|
|
875
|
+
InventoryItem.vmwareVCenterIdentity(attrs);
|
|
876
|
+
const vmId: string | null =
|
|
877
|
+
InventoryItem.str(attrs, "vcenter.vm.id") ||
|
|
878
|
+
InventoryItem.str(attrs, "vcenter.vm_template.id");
|
|
879
|
+
if (!vcenter || !vmId) {
|
|
880
|
+
return null;
|
|
881
|
+
}
|
|
882
|
+
return {
|
|
883
|
+
entityType: EntityType.VMwareVirtualMachine,
|
|
884
|
+
id: {
|
|
885
|
+
...vcenter,
|
|
886
|
+
"vcenter.vm.id": vmId,
|
|
887
|
+
},
|
|
888
|
+
};
|
|
889
|
+
},
|
|
890
|
+
|
|
891
|
+
/*
|
|
892
|
+
* vmware.datastore — vCenter + vcenter.datacenter.name +
|
|
893
|
+
* vcenter.datastore.name. Datastore names are unique within a
|
|
894
|
+
* datacenter (a datastore mounted by many hosts is still one object).
|
|
895
|
+
*/
|
|
896
|
+
(attrs: EntityAttributes) => {
|
|
897
|
+
const vcenter: Dictionary<string> | null =
|
|
898
|
+
InventoryItem.vmwareVCenterIdentity(attrs);
|
|
899
|
+
const datacenter: string | null = InventoryItem.str(
|
|
900
|
+
attrs,
|
|
901
|
+
"vcenter.datacenter.name",
|
|
902
|
+
);
|
|
903
|
+
const datastore: string | null = InventoryItem.str(
|
|
904
|
+
attrs,
|
|
905
|
+
"vcenter.datastore.name",
|
|
906
|
+
);
|
|
907
|
+
if (!vcenter || !datacenter || !datastore) {
|
|
908
|
+
return null;
|
|
909
|
+
}
|
|
910
|
+
return {
|
|
911
|
+
entityType: EntityType.VMwareDatastore,
|
|
912
|
+
id: {
|
|
913
|
+
...vcenter,
|
|
914
|
+
"vcenter.datacenter.name": datacenter,
|
|
915
|
+
"vcenter.datastore.name": datastore,
|
|
916
|
+
},
|
|
917
|
+
};
|
|
918
|
+
},
|
|
919
|
+
|
|
777
920
|
/*
|
|
778
921
|
* container — container.id. High-churn: flows as a membership key but
|
|
779
922
|
* is membership-only by default (not promoted to a registry row
|
|
@@ -906,6 +1049,22 @@ export default class InventoryItem {
|
|
|
906
1049
|
],
|
|
907
1050
|
[EntityType.ProxmoxGuest]: ["proxmox.guest.name", "proxmox.guest.type"],
|
|
908
1051
|
[EntityType.CephCluster]: ["ceph.cluster.fsid"],
|
|
1052
|
+
/*
|
|
1053
|
+
* VMware: the cluster an ESXi host sits in and the host / name / pool a
|
|
1054
|
+
* VM currently has are exactly the things vSphere moves or renames
|
|
1055
|
+
* (cluster membership changes, vMotion, rename, convert-to-template), so
|
|
1056
|
+
* they ride along as descriptive metadata and never enter the key — see
|
|
1057
|
+
* the vmware.host / vmware.vm resolvers.
|
|
1058
|
+
*/
|
|
1059
|
+
[EntityType.VMwareHost]: ["vcenter.cluster.name"],
|
|
1060
|
+
[EntityType.VMwareVirtualMachine]: [
|
|
1061
|
+
"vcenter.vm.name",
|
|
1062
|
+
"vcenter.vm_template.name",
|
|
1063
|
+
"vcenter.host.name",
|
|
1064
|
+
"vcenter.cluster.name",
|
|
1065
|
+
"vcenter.datacenter.name",
|
|
1066
|
+
"vcenter.resource_pool.name",
|
|
1067
|
+
],
|
|
909
1068
|
};
|
|
910
1069
|
|
|
911
1070
|
private static descriptiveAttributesFor(
|
|
@@ -1028,6 +1187,27 @@ export default class InventoryItem {
|
|
|
1028
1187
|
return null;
|
|
1029
1188
|
}
|
|
1030
1189
|
|
|
1190
|
+
/*
|
|
1191
|
+
* VMware vCenter identity — vmware.vcenter.name only, mirroring
|
|
1192
|
+
* proxmoxClusterIdentity above: the typed Postgres row (VMwareVCenter) and
|
|
1193
|
+
* the read side (`EntityKey.keyForVMwareVCenter`) are name-based, and the
|
|
1194
|
+
* attribute is the user-configured join key (`VMWARE_VCENTER_NAME`) the
|
|
1195
|
+
* VMware agent's resource processor stamps on every resource — the
|
|
1196
|
+
* OpenTelemetry Collector `vcenter` receiver itself emits nothing that
|
|
1197
|
+
* names the vCenter it scraped. This identity is folded into every
|
|
1198
|
+
* composite vmware cluster/host/vm/datastore identity, which must stay
|
|
1199
|
+
* name-based with it, and no VMware entity resolves without it.
|
|
1200
|
+
*/
|
|
1201
|
+
private static vmwareVCenterIdentity(
|
|
1202
|
+
attrs: EntityAttributes,
|
|
1203
|
+
): Dictionary<string> | null {
|
|
1204
|
+
const name: string | null = this.str(attrs, "vmware.vcenter.name");
|
|
1205
|
+
if (name) {
|
|
1206
|
+
return { "vmware.vcenter.name": name };
|
|
1207
|
+
}
|
|
1208
|
+
return null;
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1031
1211
|
/** Copy `key` from attrs into `id` (canonicalized) when scalar & present. */
|
|
1032
1212
|
private static addIfPresent(
|
|
1033
1213
|
id: Dictionary<string>,
|