@oneuptime/common 14.0.13 → 14.0.14
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/AlertGroupingRule.ts +10 -6
- package/Models/DatabaseModels/File.ts +41 -2
- package/Models/DatabaseModels/Form.ts +126 -0
- package/Models/DatabaseModels/IncidentGroupingRule.ts +10 -6
- package/Models/DatabaseModels/LogDropFilter.ts +1 -0
- package/Models/DatabaseModels/LogPipeline.ts +1 -0
- package/Models/DatabaseModels/LogScrubRule.ts +14 -8
- package/Models/DatabaseModels/MetricRecordingRule.ts +2 -1
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.ts +4 -2
- package/Models/DatabaseModels/OnCallDutyPolicyUserOverride.ts +22 -9
- package/Models/DatabaseModels/ProjectCallSMSConfig.ts +6 -1
- package/Models/DatabaseModels/StatusPage.ts +8 -4
- package/Models/DatabaseModels/TraceDropFilter.ts +1 -0
- package/Models/DatabaseModels/TracePipeline.ts +1 -0
- package/Models/DatabaseModels/TraceRecordingRule.ts +2 -1
- package/Models/DatabaseModels/TraceScrubRule.ts +14 -8
- package/Models/DatabaseModels/UserOnCallLog.ts +4 -2
- package/Server/API/CustomDomainRoutes.ts +251 -0
- package/Server/API/DashboardAPI.ts +33 -4
- package/Server/API/DashboardDomainAPI.ts +63 -93
- package/Server/API/StatusPageAPI.ts +92 -0
- package/Server/API/StatusPageDomainAPI.ts +59 -96
- package/Server/Infrastructure/GlobalCache.ts +84 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Services/AlertGroupingEngineService.ts +48 -70
- package/Server/Services/AlertGroupingRuleService.ts +38 -0
- package/Server/Services/CephClusterService.ts +25 -0
- package/Server/Services/CloudResourceService.ts +42 -0
- package/Server/Services/DashboardDomainService.ts +640 -214
- package/Server/Services/DashboardService.ts +30 -8
- package/Server/Services/DatabaseService.ts +143 -12
- package/Server/Services/DockerHostService.ts +60 -0
- package/Server/Services/DockerSwarmClusterService.ts +25 -0
- package/Server/Services/FileService.ts +60 -0
- package/Server/Services/FormService.ts +212 -2
- package/Server/Services/GlobalOidcService.ts +10 -0
- package/Server/Services/GlobalSsoService.ts +10 -0
- package/Server/Services/HostService.ts +58 -0
- package/Server/Services/IncidentGroupingEngineService.ts +48 -70
- package/Server/Services/IncidentGroupingRuleService.ts +38 -0
- package/Server/Services/IoTFleetService.ts +26 -0
- package/Server/Services/KubernetesClusterService.ts +64 -0
- package/Server/Services/LabelService.ts +6 -17
- package/Server/Services/LogScrubRuleService.ts +50 -0
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +264 -0
- package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +9 -1
- package/Server/Services/OnCallNotificationAlertingService.ts +24 -29
- package/Server/Services/OnCallSetupReminderService.ts +41 -40
- package/Server/Services/PodmanHostService.ts +60 -0
- package/Server/Services/ProfileAggregationService.ts +38 -0
- package/Server/Services/ProjectCallSMSConfigService.ts +76 -3
- package/Server/Services/ProjectOidcService.ts +20 -0
- package/Server/Services/ProjectSsoService.ts +20 -0
- package/Server/Services/ProxmoxClusterService.ts +25 -0
- package/Server/Services/RumApplicationService.ts +45 -0
- package/Server/Services/ScheduledMaintenanceService.ts +9 -23
- package/Server/Services/ServerlessFunctionService.ts +47 -0
- package/Server/Services/ServiceService.ts +33 -10
- package/Server/Services/StatusPageDomainService.ts +622 -213
- package/Server/Services/StatusPageOidcService.ts +20 -0
- package/Server/Services/StatusPageResourceService.ts +89 -34
- package/Server/Services/StatusPageService.ts +270 -54
- package/Server/Services/StatusPageSsoService.ts +20 -0
- package/Server/Services/TraceScrubRuleService.ts +50 -0
- package/Server/Services/UserIncomingCallNumberService.ts +28 -14
- package/Server/Services/VMwareVCenterService.ts +25 -0
- package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +3 -3
- package/Server/Utils/Greenlock/CertificateOrder.ts +482 -0
- package/Server/Utils/Greenlock/CertificateOrderBudget.ts +134 -0
- package/Server/Utils/Greenlock/CertificateOrderFailures.ts +288 -0
- package/Server/Utils/Greenlock/CertificateOrderLock.ts +163 -0
- package/Server/Utils/Greenlock/CertificateOrderOutcome.ts +29 -0
- package/Server/Utils/Greenlock/CertificateOwners.ts +72 -0
- package/Server/Utils/Greenlock/CertificateReissueOrder.ts +99 -0
- package/Server/Utils/Greenlock/CustomDomainOrders.ts +397 -0
- package/Server/Utils/Greenlock/Greenlock.ts +839 -203
- package/Server/Utils/Rules/GroupingRuleEpisodeOwners.ts +551 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +8 -1
- package/Server/Utils/ScrubRuleValidation.ts +248 -0
- package/Server/Utils/StatusPage/AffectedStatusPageResources.ts +138 -0
- package/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.ts +294 -0
- package/Server/Utils/Telemetry/DiscoveredResourceCreate.ts +275 -0
- package/Server/Utils/Telemetry/DiscoveredResourceUpdate.ts +217 -0
- package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +8 -2
- package/Tests/App/Accounts/FormPage.test.tsx +238 -0
- package/Tests/App/Accounts/FormUtils.test.ts +108 -0
- package/Tests/App/AdminDashboard/AdminAddToProjectMembersTeam.test.tsx +1087 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +140 -138
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +144 -145
- package/Tests/App/AdminDashboard/AdminSettingsFormsOnePage.test.tsx +907 -0
- package/Tests/App/AdminDashboard/AdminSettingsSwitches.test.tsx +906 -0
- package/Tests/App/AdminDashboard/AdminSmtpSettingsForm.test.tsx +823 -0
- package/Tests/App/AdminDashboard/BulkAddUsersToProjectModal.test.tsx +341 -368
- package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +199 -54
- package/Tests/App/AdminDashboard/ProjectScopedTeamsPicker.test.tsx +991 -0
- package/Tests/App/Dashboard/AIInvestigationSettingsLimits.test.tsx +147 -90
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +224 -104
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +302 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +408 -152
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +55 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +206 -115
- package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +32 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +206 -71
- package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +45 -9
- package/Tests/App/Dashboard/AnnouncementCreateForm.test.tsx +1208 -0
- package/Tests/App/Dashboard/AnnouncementEditAndTemplateForms.test.tsx +693 -0
- package/Tests/App/Dashboard/AnnouncementFormsStructure.test.ts +546 -0
- package/Tests/App/Dashboard/AnnouncementStatusPageSuggestions.test.tsx +425 -0
- package/Tests/App/Dashboard/AnnouncementsTableCreateLinks.test.tsx +267 -0
- package/Tests/App/Dashboard/ApiKeyCreateForm.test.ts +68 -51
- package/Tests/App/Dashboard/ApiKeyViewPermissions.test.tsx +11 -9
- package/Tests/App/Dashboard/ApiKeysCreateAccess.test.tsx +24 -16
- package/Tests/App/Dashboard/BulkChangeStateModalOnePage.test.tsx +333 -0
- package/Tests/App/Dashboard/CardDescriptionsSayWhatFor.test.tsx +307 -0
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +18 -4
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +7 -2
- package/Tests/App/Dashboard/ColorFieldsPrefilledPages.test.tsx +453 -0
- package/Tests/App/Dashboard/CreateFromRecordBreadcrumbs.test.ts +272 -0
- package/Tests/App/Dashboard/CreateFromRecordLinks.test.tsx +495 -0
- package/Tests/App/Dashboard/CreateFromRecordPages.test.tsx +1026 -0
- package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +65 -23
- package/Tests/App/Dashboard/CriteriaName.test.ts +5 -1
- package/Tests/App/Dashboard/CustomDomainCreateFlow.test.tsx +516 -0
- package/Tests/App/Dashboard/CustomDomainDnsSetupModal.test.tsx +547 -0
- package/Tests/App/Dashboard/CustomDomainsPages.test.tsx +1077 -0
- package/Tests/App/Dashboard/CustomFieldSimpleCreate.test.tsx +2 -2
- package/Tests/App/Dashboard/CustomFieldSimpleCreateRender.test.tsx +12 -6
- package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +1 -1
- package/Tests/App/Dashboard/CustomSmtpConfigForm.test.tsx +969 -0
- package/Tests/App/Dashboard/DashboardBlankCanvasAddWidget.test.tsx +425 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +400 -0
- package/Tests/App/Dashboard/DashboardComponentsMRTranslation.test.tsx +4 -3
- package/Tests/App/Dashboard/DashboardCreateForm.test.ts +375 -0
- package/Tests/App/Dashboard/DashboardCreateFromTemplate.test.tsx +727 -0
- package/Tests/App/Dashboard/DashboardEmptyCanvasAddWidget.test.tsx +86 -0
- package/Tests/App/Dashboard/DashboardPhoneProductsMenu.test.tsx +99 -9
- package/Tests/App/Dashboard/DashboardSharingCard.test.tsx +1226 -0
- package/Tests/App/Dashboard/DashboardSharingEntryPoints.test.tsx +383 -0
- package/Tests/App/Dashboard/DashboardSharingPage.test.tsx +478 -0
- package/Tests/App/Dashboard/DeclareFormsAdvancedRender.test.tsx +90 -34
- package/Tests/App/Dashboard/DeclareIncidentMonitorsApart.test.tsx +1028 -0
- package/Tests/App/Dashboard/DefaultSsoTeams.test.tsx +215 -0
- package/Tests/App/Dashboard/DisabledWarningArchived.test.tsx +3 -3
- package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +15 -12
- package/Tests/App/Dashboard/DiscoveredResourceCreateForms.test.tsx +936 -0
- package/Tests/App/Dashboard/EmbeddedMetricCardGroup.test.tsx +720 -0
- package/Tests/App/Dashboard/EpisodeMemberRoleAssignmentsFormField.test.tsx +331 -0
- package/Tests/App/Dashboard/EpisodePostmortemPage.test.tsx +327 -0
- package/Tests/App/Dashboard/EscalationRuleForm.test.ts +2 -2
- package/Tests/App/Dashboard/EscalationRuleFormGuard.test.ts +6 -2
- package/Tests/App/Dashboard/EscalationRuleOneStep.test.tsx +8 -4
- package/Tests/App/Dashboard/EventMeasurements.test.ts +1175 -0
- package/Tests/App/Dashboard/EventMeasurementsCard.test.tsx +993 -0
- package/Tests/App/Dashboard/EventNoteComposerDialog.test.tsx +939 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +34 -1
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +186 -1
- package/Tests/App/Dashboard/EventSettingsSwitchPages.test.tsx +625 -0
- package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +6 -2
- package/Tests/App/Dashboard/FeedNoteComposerDialog.test.tsx +1327 -0
- package/Tests/App/Dashboard/FeedNoteDialogHelpers.ts +109 -0
- package/Tests/App/Dashboard/FilterChipClearButton.test.tsx +356 -0
- package/Tests/App/Dashboard/FormBrandingSection.test.tsx +504 -0
- package/Tests/App/Dashboard/FormBrandingValues.test.ts +255 -0
- package/Tests/App/Dashboard/FormBuilderParts.test.tsx +38 -1
- package/Tests/App/Dashboard/FormBuilderUi.test.tsx +176 -2
- package/Tests/App/Dashboard/FormMappingCard.test.tsx +33 -13
- package/Tests/App/Dashboard/FormsMovedPagesAndSubmissions.test.tsx +1 -1
- package/Tests/App/Dashboard/GeneratedKeyForms.test.tsx +30 -7
- package/Tests/App/Dashboard/GlobalProbesOnNewMonitorsCard.test.tsx +258 -0
- package/Tests/App/Dashboard/GroupingRuleFormFlow.test.tsx +653 -37
- package/Tests/App/Dashboard/GroupingRulePages.test.tsx +218 -9
- package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +52 -4
- package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +230 -338
- package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +45 -9
- package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +227 -295
- package/Tests/App/Dashboard/IncidentLinkedAlertsSettingsPage.test.tsx +157 -181
- package/Tests/App/Dashboard/IncidentPostmortemPage.test.tsx +775 -0
- package/Tests/App/Dashboard/IncidentRoleFormField.test.tsx +379 -15
- package/Tests/App/Dashboard/IncidentRolesSettingsPage.test.tsx +148 -32
- package/Tests/App/Dashboard/IncidentTemplateInitialState.test.tsx +430 -0
- package/Tests/App/Dashboard/IncidentTemplateMonitorsApart.test.tsx +492 -0
- package/Tests/App/Dashboard/IncomingCallEscalationOneStep.test.tsx +830 -0
- package/Tests/App/Dashboard/IncomingCallEscalationRuleForm.test.ts +510 -0
- package/Tests/App/Dashboard/IncomingCallEscalationRuleFormGuard.test.ts +378 -0
- package/Tests/App/Dashboard/IngestionKeyForm.test.ts +664 -0
- package/Tests/App/Dashboard/IngestionKeySelectorCreate.test.tsx +523 -0
- package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +130 -9
- package/Tests/App/Dashboard/IpAllowlistCopy.test.ts +122 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +19 -3
- package/Tests/App/Dashboard/KubernetesMetricsSetupEmptyState.test.tsx +275 -0
- package/Tests/App/Dashboard/KubernetesMetricsSetupHints.test.tsx +720 -0
- package/Tests/App/Dashboard/LabelsFormField.test.tsx +18 -13
- package/Tests/App/Dashboard/LegacyDefaultAssigneeNote.test.tsx +359 -0
- package/Tests/App/Dashboard/LogMonitorAttributeOperatorPreview.test.tsx +10 -10
- package/Tests/App/Dashboard/MarkdownTemplateDialogsWide.test.tsx +42 -20
- package/Tests/App/Dashboard/MeasurementForms.test.tsx +191 -5
- package/Tests/App/Dashboard/MeasurementPagesI18n.test.ts +2 -0
- package/Tests/App/Dashboard/MeasurementSetup.test.ts +5 -2
- package/Tests/App/Dashboard/MenuSpecificFoldedSections.test.tsx +38 -12
- package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +34 -11
- package/Tests/App/Dashboard/MetricAndRecordingRuleFormsRender.test.tsx +1206 -0
- package/Tests/App/Dashboard/MetricResultsState.test.ts +248 -0
- package/Tests/App/Dashboard/MetricViewResultsState.test.tsx +404 -0
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorCriteriaAdvancedOptions.test.tsx +77 -27
- package/Tests/App/Dashboard/MonitorCriteriaAttributeFilter.test.tsx +5 -8
- package/Tests/App/Dashboard/MonitorCriteriaHeaderControls.test.tsx +228 -0
- package/Tests/App/Dashboard/MonitorCriteriaIncidentRoles.test.tsx +411 -0
- package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +5 -1
- package/Tests/App/Dashboard/MonitorFormIncidentRoles.test.tsx +460 -0
- package/Tests/App/Dashboard/MonitorIntervalRedirect.test.tsx +299 -0
- package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +243 -2
- package/Tests/App/Dashboard/MonitorProbesAndIntervalPage.test.tsx +638 -0
- package/Tests/App/Dashboard/MonitorStepsDefaultStatusAdvanced.test.tsx +2 -2
- package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +2 -2
- package/Tests/App/Dashboard/MonitoringIntervalCard.test.tsx +493 -0
- package/Tests/App/Dashboard/MonitoringSwitch.test.tsx +597 -0
- package/Tests/App/Dashboard/MovedRunnerSettingsRedirects.test.tsx +4 -5
- package/Tests/App/Dashboard/NotificationChannelOffSwitchLists.test.tsx +636 -0
- package/Tests/App/Dashboard/OnCallPolicyCreateFormGuard.test.ts +8 -4
- package/Tests/App/Dashboard/OnCallPolicyFirstResponders.test.tsx +1 -1
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +54 -0
- package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +43 -24
- package/Tests/App/Dashboard/OnCallRulesRedirects.test.tsx +530 -0
- package/Tests/App/Dashboard/OnCallRulesTable.test.tsx +158 -74
- package/Tests/App/Dashboard/OnCallRulesTabs.test.tsx +511 -0
- package/Tests/App/Dashboard/OnCallScheduleAddLayerDefaults.test.tsx +236 -0
- package/Tests/App/Dashboard/OnCallScheduleCreateFormGuard.test.ts +633 -0
- package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +13 -2
- package/Tests/App/Dashboard/OnCallScheduleWhoTakesTurns.test.tsx +771 -0
- package/Tests/App/Dashboard/OnCallSharedCalendarFeedSettingsForm.test.tsx +357 -0
- package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +16 -6
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +112 -23
- package/Tests/App/Dashboard/PageSearchIndexCoversMenus.test.tsx +594 -0
- package/Tests/App/Dashboard/PageSearchIndexCoversRoutes.test.tsx +271 -0
- package/Tests/App/Dashboard/PageSearchRanking.test.tsx +373 -0
- package/Tests/App/Dashboard/PostmortemPageParts.test.tsx +548 -0
- package/Tests/App/Dashboard/ProbeAgreementCard.test.tsx +483 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +9 -2
- package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +282 -404
- package/Tests/App/Dashboard/ProjectAiSettingsSwitchPages.test.tsx +1414 -0
- package/Tests/App/Dashboard/ProjectNotificationChannels.test.tsx +1191 -0
- package/Tests/App/Dashboard/ProjectSettingsSwitchCards.test.tsx +603 -0
- package/Tests/App/Dashboard/RemindersCard.test.tsx +477 -0
- package/Tests/App/Dashboard/ResourceDetailsCard.test.tsx +458 -0
- package/Tests/App/Dashboard/ResourceRuleForm.test.ts +525 -0
- package/Tests/App/Dashboard/ResourceRuleFormsRender.test.tsx +803 -0
- package/Tests/App/Dashboard/RoleAccess.test.ts +753 -0
- package/Tests/App/Dashboard/RoleCardSelectOptions.test.ts +13 -6
- package/Tests/App/Dashboard/RouteUtilPageRoute.test.ts +116 -0
- package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +1 -1
- package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +172 -219
- package/Tests/App/Dashboard/RunbookStepHeaderControls.test.tsx +269 -0
- package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +45 -85
- package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +16 -23
- package/Tests/App/Dashboard/ScheduledMaintenanceAffectedResourcesEditForm.test.tsx +485 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +27 -2
- package/Tests/App/Dashboard/ScheduledMaintenanceCreateForm.test.tsx +65 -28
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +208 -309
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +36 -53
- package/Tests/App/Dashboard/ScheduledMaintenanceFormsStructure.test.ts +83 -14
- package/Tests/App/Dashboard/ScheduledMaintenanceMonitorsApart.test.tsx +1085 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +378 -25
- package/Tests/App/Dashboard/ScheduledMaintenanceStatusPageSuggestions.test.tsx +513 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceTemplateForm.test.tsx +31 -9
- package/Tests/App/Dashboard/ScheduledMaintenanceTemplateMonitorsApart.test.tsx +760 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +11 -13
- package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +228 -69
- package/Tests/App/Dashboard/SelectedProjectSwitches.test.tsx +359 -0
- package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1 -1
- package/Tests/App/Dashboard/SessionReplayAllowedCard.test.tsx +297 -0
- package/Tests/App/Dashboard/SetupGuideCard.test.tsx +7 -1
- package/Tests/App/Dashboard/ShortFormsOnePage.test.tsx +591 -0
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +253 -6
- package/Tests/App/Dashboard/SloOverviewData.test.tsx +99 -0
- package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +3 -1
- package/Tests/App/Dashboard/SloSettings.test.tsx +257 -4
- package/Tests/App/Dashboard/SsoPages.test.tsx +448 -52
- package/Tests/App/Dashboard/StateChangeDialogsFolded.test.tsx +695 -0
- package/Tests/App/Dashboard/StateChangeFormFields.test.ts +376 -0
- package/Tests/App/Dashboard/StatusPageAccessCard.test.tsx +1088 -0
- package/Tests/App/Dashboard/StatusPageAccessCopy.test.ts +450 -0
- package/Tests/App/Dashboard/StatusPageAccessMenu.test.tsx +137 -0
- package/Tests/App/Dashboard/StatusPageAccessPage.test.tsx +458 -0
- package/Tests/App/Dashboard/StatusPageAdvancedSettingsPage.test.tsx +30 -86
- package/Tests/App/Dashboard/StatusPageBrandingPage.test.tsx +28 -15
- package/Tests/App/Dashboard/StatusPageDisplaySettingsCard.test.tsx +949 -14
- package/Tests/App/Dashboard/StatusPagePrivateUsersNotice.test.tsx +233 -0
- package/Tests/App/Dashboard/StatusPageReportsCard.test.tsx +1001 -0
- package/Tests/App/Dashboard/StatusPageRequireSsoCard.test.tsx +247 -0
- package/Tests/App/Dashboard/StatusPageSubscriberSettingsPages.test.tsx +4 -17
- package/Tests/App/Dashboard/StatusPageSuggestions.test.tsx +930 -0
- package/Tests/App/Dashboard/StatusPageSwitchCardPages.test.tsx +335 -0
- package/Tests/App/Dashboard/TeamBlockPermissionsRedirect.test.tsx +332 -0
- package/Tests/App/Dashboard/TeamCreateForm.test.ts +206 -0
- package/Tests/App/Dashboard/TeamViewPermissions.test.tsx +713 -0
- package/Tests/App/Dashboard/TeamViewSideMenuBlockPermissions.test.tsx +113 -0
- package/Tests/App/Dashboard/TeamsCreateAccess.test.tsx +799 -0
- package/Tests/App/Dashboard/TelemetryDataRuleForms.test.ts +655 -0
- package/Tests/App/Dashboard/TelemetryDataRuleFormsRender.test.tsx +1014 -0
- package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +6 -3
- package/Tests/App/Dashboard/TelemetryIngestionKeyForm.test.tsx +446 -446
- package/Tests/App/Dashboard/TelemetryMonitorFiltersFold.test.tsx +613 -0
- package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +37 -2
- package/Tests/App/Dashboard/TemplateFormsNoInternalDataWarning.test.tsx +3 -3
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +338 -0
- package/Tests/App/Dashboard/TwilioConfigFirstDefault.test.tsx +786 -0
- package/Tests/App/Dashboard/UpcomingShiftGetCover.test.tsx +306 -0
- package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +36 -11
- package/Tests/App/Dashboard/UserOverrideForm.test.ts +505 -0
- package/Tests/App/Dashboard/UserOverrideFormGuard.test.ts +334 -0
- package/Tests/App/Dashboard/UserOverrideWhoIsAway.test.tsx +999 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +33 -11
- package/Tests/App/Dashboard/UserSettingsSetupChecklistPage.test.tsx +49 -4
- package/Tests/App/Dashboard/UsersPageEmptyState.test.tsx +245 -0
- package/Tests/App/Dashboard/WorkflowVariableOAuthSettingsEditSteps.test.tsx +13 -6
- package/Tests/App/Dashboard/WorkspaceMenusConnected.test.tsx +0 -2
- package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +108 -86
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +397 -0
- package/Tests/App/StatusPage/StatusPageResourceForm.test.tsx +931 -0
- package/Tests/App/StatusPage/StatusPageSubscribeOnePage.test.tsx +686 -0
- package/Tests/DialogActionRules.ts +16 -5
- package/Tests/Helpers/CardHeaderScan.ts +258 -0
- package/Tests/Helpers/FormStepsScan.ts +576 -11
- package/Tests/Helpers/MonitorGroupStatusPageRows.ts +237 -0
- package/Tests/Helpers/NestedControls.ts +184 -0
- package/Tests/Helpers/NestedControlsScan.ts +414 -0
- package/Tests/Helpers/SteppedFooterScan.ts +722 -0
- package/Tests/Models/DatabaseModels/FormModel.test.ts +31 -7
- package/Tests/Models/DatabaseModels/UserOverrideColumnDescriptions.test.ts +123 -0
- package/Tests/Models/TelemetryDataRuleColumnDefaults.test.ts +239 -0
- package/Tests/ResponsiveFlexLayout.test.ts +111 -0
- package/Tests/ResponsiveFlexLayout.ts +165 -0
- package/Tests/Server/API/DashboardDomainOrderSslAPI.test.ts +372 -0
- package/Tests/Server/API/DashboardDomainVerifyCnameAPI.test.ts +921 -0
- package/Tests/Server/API/DashboardSharingPublicRoutes.test.ts +559 -0
- package/Tests/Server/API/FormBrandingPublicRoutes.test.ts +680 -0
- package/Tests/Server/API/ProjectAPICreateWithTenantHeader.test.ts +300 -0
- package/Tests/Server/API/ProjectCreateTestHelpers.ts +211 -0
- package/Tests/Server/API/ProjectCreateWithTenantHeaderPostgres.test.ts +387 -0
- package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +29 -12
- package/Tests/Server/API/StatusPageDomainVerifyCnameAPI.test.ts +1090 -0
- package/Tests/Server/API/StatusPageMasterPageAccess.test.ts +254 -0
- package/Tests/Server/API/StatusPageReportScheduleWrites.test.ts +829 -0
- package/Tests/Server/API/StatusPageUptimeSettingsWrites.test.ts +417 -0
- package/Tests/Server/API/StatusPagesListingMonitorsAPI.test.ts +1029 -0
- package/Tests/Server/API/StatusPagesListingMonitorsRoute.test.ts +286 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +156 -0
- package/Tests/Server/Infrastructure/Postgres/MigrateIncidentFormsToFormsMigration.test.ts +52 -1
- package/Tests/Server/Services/CustomDomainCertificateLifecycle.test.ts +1559 -0
- package/Tests/Server/Services/CustomDomainCertificateReissue.test.ts +186 -16
- package/Tests/Server/Services/DashboardAccessChoice.test.ts +657 -0
- package/Tests/Server/Services/DashboardCreateFromTemplate.test.ts +200 -0
- package/Tests/Server/Services/DashboardDomainCertificateSweeps.test.ts +1142 -0
- package/Tests/Server/Services/DiscoveredResourceCreate.test.ts +864 -0
- package/Tests/Server/Services/DiscoveredResourceUpdate.test.ts +822 -0
- package/Tests/Server/Services/EpisodeRuleSeverityRepair.test.ts +3 -4
- package/Tests/Server/Services/FileServiceProject.test.ts +345 -0
- package/Tests/Server/Services/FormBranding.test.ts +982 -0
- package/Tests/Server/Services/FormPublicForm.test.ts +15 -0
- package/Tests/Server/Services/GroupingRuleEpisodeOwners.test.ts +857 -0
- package/Tests/Server/Services/IncidentFormPostgres.test.ts +297 -1
- package/Tests/Server/Services/MachinePickedColors.test.ts +202 -0
- package/Tests/Server/Services/OidcProviderCreateDefaults.test.ts +252 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleFirstLayer.test.ts +799 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleFirstLayerPlans.test.ts +172 -0
- package/Tests/Server/Services/OnCallDutyPolicyUserOverrideWhoIsAway.test.ts +571 -0
- package/Tests/Server/Services/OnCallSetupReminder.test.ts +35 -13
- package/Tests/Server/Services/OnCallUndeliverablePageRulesLink.test.ts +217 -0
- package/Tests/Server/Services/ProfileAggregationService.test.ts +213 -4
- package/Tests/Server/Services/ProjectCallSMSConfigFirstDefault.test.ts +699 -0
- package/Tests/Server/Services/ProjectCallSMSConfigFirstDefaultBilling.test.ts +247 -0
- package/Tests/Server/Services/SamlProviderCreateDefaults.test.ts +255 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberMonitorGroups.test.ts +333 -0
- package/Tests/Server/Services/ScrubRuleSaveValidation.test.ts +947 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +17 -4
- package/Tests/Server/Services/StatusPageAccessChoice.test.ts +548 -0
- package/Tests/Server/Services/StatusPageDomainCertificateSweeps.test.ts +1238 -0
- package/Tests/Server/Services/TeamCreateAccessGrant.test.ts +607 -0
- package/Tests/Server/Services/TwilioConfigSendersGuard.test.ts +249 -0
- package/Tests/Server/Services/VerificationCodesUseProjectTwilioConfig.test.ts +264 -0
- package/Tests/Server/Types/Database/Permissions/FormBrandingColumns.test.ts +270 -0
- package/Tests/Server/Utils/Greenlock/CertificateCleanup.test.ts +526 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrder.test.ts +1062 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrderBudget.test.ts +243 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrderFailures.test.ts +293 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrderLock.test.ts +152 -0
- package/Tests/Server/Utils/Greenlock/CertificateOwnersGuard.test.ts +119 -0
- package/Tests/Server/Utils/Greenlock/CertificateRenewalOwnership.test.ts +1170 -0
- package/Tests/Server/Utils/Greenlock/CertificateRenewalSafety.test.ts +368 -0
- package/Tests/Server/Utils/Greenlock/CertificateRenewalSchedule.test.ts +188 -11
- package/Tests/Server/Utils/Greenlock/CustomDomainOrders.test.ts +723 -0
- package/Tests/Server/Utils/Greenlock/InMemoryRedis.ts +189 -0
- package/Tests/Server/Utils/Greenlock/NginxAcmeCertificatesToDisk.test.ts +242 -0
- package/Tests/Server/Utils/Greenlock/NginxCustomCertificatesToDisk.test.ts +305 -0
- package/Tests/Server/Utils/Greenlock/OrderCertGuards.test.ts +583 -0
- package/Tests/Server/Utils/Greenlock/OrderCertStorage.test.ts +203 -0
- package/Tests/Server/Utils/StatusPage/AffectedStatusPageResources.test.ts +700 -0
- package/Tests/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.test.ts +744 -0
- package/Tests/Types/CustomDomain/CustomDomainCertificates.test.ts +106 -0
- package/Tests/Types/CustomDomain/CustomDomainVerification.test.ts +94 -0
- package/Tests/Types/Dashboard/DashboardAccess.test.ts +460 -0
- package/Tests/Types/Filter/FilterConditionUtil.test.ts +59 -0
- package/Tests/Types/Form/FormBranding.test.ts +760 -0
- package/Tests/Types/IncomingCall/IncomingCallRingTime.test.ts +80 -0
- package/Tests/Types/NotificationRule/OnCallRuleKind.test.ts +271 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleFirstLayer.test.ts +300 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleLayerDefaults.test.ts +316 -0
- package/Tests/Types/OnCallDutyPolicy/UserOverrideCoverRequest.test.ts +257 -0
- package/Tests/Types/SSO/OidcProviderDefaults.test.ts +474 -0
- package/Tests/Types/SSO/SamlProviderDefaults.test.ts +150 -0
- package/Tests/Types/SSO/SsoProviderDefaults.test.ts +181 -0
- package/Tests/Types/StatusPage/StatusPageAccess.test.ts +393 -0
- package/Tests/Types/StatusPage/StatusPagesListingMonitors.test.ts +149 -0
- package/Tests/Types/Telemetry/ScrubRule.test.ts +375 -0
- package/Tests/UI/Components/AdvancedPageSection.test.tsx +201 -61
- package/Tests/UI/Components/BasicFormModalSteps.test.tsx +129 -153
- package/Tests/UI/Components/Card.test.tsx +354 -367
- package/Tests/UI/Components/CardHeaderActionsGuard.test.tsx +605 -0
- package/Tests/UI/Components/CardModelDetailHeaderLayout.test.tsx +23 -8
- package/Tests/UI/Components/CardModelDetailOnBeforeUpdate.test.tsx +224 -0
- package/Tests/UI/Components/CardModelDetailPageButtons.test.tsx +231 -0
- package/Tests/UI/Components/ChoiceRows.test.tsx +365 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +341 -5
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +655 -64
- package/Tests/UI/Components/Detail/DetailCreatedOnIdLine.test.tsx +669 -0
- package/Tests/UI/Components/Detail/DetailIdLineDarkMode.test.ts +34 -7
- package/Tests/UI/Components/Detail/DetailIdLineInLocale.test.tsx +71 -0
- package/Tests/UI/Components/Detail/DetailRecordIdLine.test.tsx +26 -7
- package/Tests/UI/Components/Detail/DetailRecordLine.test.tsx +326 -0
- package/Tests/UI/Components/Detail/DetailRecordTime.test.ts +324 -0
- package/Tests/UI/Components/DetailCompactStyle.test.tsx +7 -3
- package/Tests/UI/Components/Dropdown/DropdownChange.test.ts +163 -0
- package/Tests/UI/Components/EntityDropdown.test.tsx +103 -1
- package/Tests/UI/Components/EntityDropdownClearButton.test.tsx +638 -0
- package/Tests/UI/Components/EntityDropdownEscape.test.tsx +6 -6
- package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +21 -4
- package/Tests/UI/Components/EntityDropdownQuery.test.tsx +411 -0
- package/Tests/UI/Components/EntityDropdownQueryHelpers.test.ts +131 -0
- package/Tests/UI/Components/FilePicker.test.tsx +220 -1
- package/Tests/UI/Components/FoldedSection/FoldedSection.test.tsx +582 -0
- package/Tests/UI/Components/FoldedSection/FoldedSectionDarkMode.test.ts +197 -0
- package/Tests/UI/Components/FoldedSection/FoldedSectionItem.test.ts +247 -0
- package/Tests/UI/Components/FoldedSection/FoldedSectionQueries.ts +86 -0
- package/Tests/UI/Components/Forms/AdvancedStepsGuard.test.ts +358 -32
- package/Tests/UI/Components/Forms/AnchoredFieldPopupPlacement.test.tsx +195 -0
- package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +187 -23
- package/Tests/UI/Components/Forms/BasicFormFillsInOnShow.test.tsx +246 -0
- package/Tests/UI/Components/Forms/BasicFormFooterSetValue.test.tsx +283 -0
- package/Tests/UI/Components/Forms/BasicFormPrimaryActionLastStep.test.tsx +780 -0
- package/Tests/UI/Components/Forms/BasicFormSingleStep.test.tsx +232 -0
- package/Tests/UI/Components/Forms/BasicFormStepValidation.test.tsx +7 -4
- package/Tests/UI/Components/Forms/BasicFormSubmitAllSteps.test.tsx +4 -3
- package/Tests/UI/Components/Forms/CreateFormDefaultsGuard.test.ts +252 -7
- package/Tests/UI/Components/Forms/DeclareAndCreateFormsGuard.test.ts +247 -7
- package/Tests/UI/Components/Forms/DiscoveredResourceCreateFormsGuard.test.ts +492 -0
- package/Tests/UI/Components/Forms/FilterConditionOnlyWithTwoFiltersGuard.test.ts +333 -0
- package/Tests/UI/Components/Forms/FoldedEditorWidthTiming.test.tsx +127 -0
- package/Tests/UI/Components/Forms/FoldedSectionsGuard.test.ts +523 -0
- package/Tests/UI/Components/Forms/FollowPickName.test.ts +88 -0
- package/Tests/UI/Components/Forms/FormFieldDropdownChange.test.tsx +294 -0
- package/Tests/UI/Components/Forms/FormModalWidth.test.tsx +237 -2
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +181 -0
- package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +110 -86
- package/Tests/UI/Components/Forms/LabelsFormFieldGuard.test.ts +101 -96
- package/Tests/UI/Components/Forms/LongFormStepsGuard.test.ts +559 -10
- package/Tests/UI/Components/Forms/MarkdownFormsAreWide.test.ts +56 -4
- package/Tests/UI/Components/Forms/MetricAndRecordingRuleFormsGuard.test.ts +400 -0
- package/Tests/UI/Components/Forms/ModelFormColorDefaults.test.tsx +659 -0
- package/Tests/UI/Components/Forms/ModelFormCreateDefaults.test.tsx +108 -4
- package/Tests/UI/Components/Forms/ModelFormDropdownQuery.test.tsx +403 -0
- package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +126 -0
- package/Tests/UI/Components/Forms/ModelFormSinglePickPeoplePicker.test.tsx +453 -0
- package/Tests/UI/Components/Forms/OidcProviderFormsGuard.test.ts +321 -0
- package/Tests/UI/Components/Forms/OneIncidentRolePickerGuard.test.ts +823 -0
- package/Tests/UI/Components/Forms/OneSwitchCardsGuard.test.ts +739 -0
- package/Tests/UI/Components/Forms/OpenFormSections.test.tsx +169 -0
- package/Tests/UI/Components/Forms/OverloadedFormStepsGuard.test.ts +21 -9
- package/Tests/UI/Components/Forms/PrimaryActionLastStepGuard.test.ts +478 -0
- package/Tests/UI/Components/Forms/ProjectTeamFormsGuard.test.ts +240 -0
- package/Tests/UI/Components/Forms/ResourceDetailsOnePlaceGuard.test.ts +936 -0
- package/Tests/UI/Components/Forms/ResourceRuleFormsGuard.test.ts +527 -0
- package/Tests/UI/Components/Forms/SamlProviderFormsGuard.test.ts +387 -0
- package/Tests/UI/Components/Forms/SmallWizardsOnePageGuard.test.ts +331 -0
- package/Tests/UI/Components/Forms/SmtpConfigFormsGuard.test.ts +470 -0
- package/Tests/UI/Components/Forms/StateChangeDialogsFoldTheNote.test.ts +322 -0
- package/Tests/UI/Components/Forms/StatusPageResourceFormsGuard.test.ts +381 -0
- package/Tests/UI/Components/Forms/SteppedFormFooter.test.ts +225 -0
- package/Tests/UI/Components/Forms/SteppedFormFooterTiming.test.tsx +82 -40
- package/Tests/UI/Components/Forms/SwitchCardsGuard.test.ts +339 -0
- package/Tests/UI/Components/Forms/TelemetryDataRuleFormsGuard.test.ts +383 -0
- package/Tests/UI/Components/Forms/UniqueName.test.ts +163 -0
- package/Tests/UI/Components/Forms/Utils/AdvancedFormSection.test.ts +131 -11
- package/Tests/UI/Components/Forms/Utils/CreateFormColorDefaults.test.ts +373 -0
- package/Tests/UI/Components/Forms/Utils/FoldedFormFields.test.ts +482 -0
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +32 -0
- package/Tests/UI/Components/MemberRoleAssignment.test.tsx +51 -7
- package/Tests/UI/Components/ModalSecondaryButton.test.tsx +60 -3
- package/Tests/UI/Components/ModelFormDraftValues.test.tsx +255 -0
- package/Tests/UI/Components/ModelPageHeaderChanged.test.tsx +293 -0
- package/Tests/UI/Components/ModelSwitchCard.test.tsx +813 -0
- package/Tests/UI/Components/ModelSwitchEvents.test.ts +188 -0
- package/Tests/UI/Components/ModelSwitchRow.test.tsx +861 -0
- package/Tests/UI/Components/ModelSwitchUtil.test.ts +239 -0
- package/Tests/UI/Components/ModelSwitchesCard.test.tsx +699 -0
- package/Tests/UI/Components/NavBar.test.tsx +41 -2
- package/Tests/UI/Components/NavBarCategoryToggleDarkMode.test.ts +12 -0
- package/Tests/UI/Components/NavBarMenuCatalog.test.tsx +197 -30
- package/Tests/UI/Components/NavBarMenuFolding.test.tsx +221 -39
- package/Tests/UI/Components/NavBarMenuSearch.test.tsx +15 -10
- package/Tests/UI/Components/NestedControlsGuard.test.ts +300 -0
- package/Tests/UI/Components/PageBreadcrumbOverride.test.tsx +202 -0
- package/Tests/UI/Components/PeoplePicker/OwnersFieldGuard.test.ts +269 -5
- package/Tests/UI/Components/PeoplePicker/PeoplePickerChange.test.tsx +414 -0
- package/Tests/UI/Components/PeoplePicker/PeoplePickerExcludePicks.test.tsx +582 -0
- package/Tests/UI/Components/PeoplePicker/PeoplePickerSinglePick.test.tsx +519 -0
- package/Tests/UI/Components/PeoplePicker/PeoplePickerSinglePickTypes.test.ts +174 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +8 -3
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaNamesGuard.test.ts +14 -6
- package/Tests/UI/Components/RuleRun/RuleViewDescription.test.tsx +107 -0
- package/Tests/UI/Components/SaveStatus.test.tsx +81 -0
- package/Tests/UI/Components/SmtpConfig/SmtpConfigFormFields.test.ts +1078 -0
- package/Tests/UI/Components/Sso/OidcProviderForm.test.tsx +608 -0
- package/Tests/UI/Components/Sso/OidcProviderFormFields.test.ts +698 -0
- package/Tests/UI/Components/Sso/SamlProviderForm.test.tsx +583 -0
- package/Tests/UI/Components/Sso/SamlProviderFormFields.test.ts +619 -0
- package/Tests/UI/Components/SteppedEditFormSave.test.tsx +199 -141
- package/Tests/UI/Components/Table/TableEmptyStateComponent.test.tsx +143 -0
- package/Tests/UI/Components/UseSaveModelSwitch.test.tsx +409 -0
- package/Tests/UI/Components/Workflow/ArgumentsForm.test.tsx +3 -3
- package/Tests/UI/Components/Workflow/ArgumentsFormAdvancedSettings.test.tsx +83 -27
- package/Tests/UI/Components/Workflow/WorkflowLogModal.test.tsx +7 -2
- package/Tests/UI/Components/useSaveOnChange.test.tsx +341 -0
- package/Tests/UI/Monitor/MonitorStepRetrySettings.test.tsx +1 -1
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +75 -5
- package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +97 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +12 -39
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -6
- package/Tests/{App/Dashboard → UI/Utils}/DefaultInviteTeam.test.ts +126 -4
- package/Tests/UI/Utils/GrantablePermission.test.ts +172 -0
- package/Tests/UI/Utils/PermissionGateColumnUpdate.test.ts +211 -0
- package/Tests/UI/Utils/TranslateTemplate.test.ts +31 -0
- package/Tests/Utils/DistinctColor.test.ts +446 -0
- package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +14 -2
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +1 -1
- package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +2 -2
- package/Tests/Utils/Slo/SloHealth.test.ts +28 -6
- package/Tests/Utils/StatusPage/ReportSchedule.test.ts +867 -0
- package/Tests/Utils/Telemetry/DiscoveredResourceName.test.ts +189 -0
- package/Tests/Utils/WordMatch.test.ts +104 -0
- package/Types/BrandColors.ts +10 -0
- package/Types/CustomDomain/CustomDomainCertificates.ts +128 -0
- package/Types/CustomDomain/CustomDomainVerification.ts +78 -0
- package/Types/Dashboard/DashboardAccess.ts +250 -0
- package/Types/Dashboard/DashboardTemplates.ts +33 -0
- package/Types/Filter/FilterConditionUtil.ts +29 -0
- package/Types/Form/FormBranding.ts +475 -0
- package/Types/Form/FormPublic.ts +26 -0
- package/Types/IncomingCall/IncomingCallRingTime.ts +48 -0
- package/Types/Log/LogScrubField.ts +14 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +1 -1
- package/Types/NotificationRule/OnCallRuleKind.ts +194 -0
- package/Types/OnCallDutyPolicy/FirstResponders.ts +3 -32
- package/Types/OnCallDutyPolicy/MiscDataId.ts +38 -0
- package/Types/OnCallDutyPolicy/ScheduleFirstLayer.ts +165 -0
- package/Types/OnCallDutyPolicy/ScheduleLayerDefaults.ts +160 -0
- package/Types/OnCallDutyPolicy/UserOverrideCoverRequest.ts +148 -0
- package/Types/SSO/OidcProviderDefaults.ts +282 -0
- package/Types/SSO/SamlProviderDefaults.ts +77 -0
- package/Types/SSO/SsoProviderDefaults.ts +101 -0
- package/Types/StatusPage/StatusPageAccess.ts +215 -0
- package/Types/StatusPage/StatusPagesListingMonitors.ts +150 -0
- package/Types/Telemetry/ScrubRule.ts +240 -0
- package/UI/Components/AdvancedPageSection/AdvancedPageSection.tsx +59 -29
- package/UI/Components/Card/Card.tsx +139 -80
- package/UI/Components/ChoiceRows/ChoiceRows.tsx +249 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +28 -12
- package/UI/Components/CommandPalette/PaletteFilter.ts +962 -75
- package/UI/Components/CommandPalette/PaletteRow.tsx +35 -3
- package/UI/Components/CommandPalette/Types.ts +37 -1
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +6 -0
- package/UI/Components/Detail/Detail.tsx +52 -15
- package/UI/Components/Detail/DetailRecordLine.tsx +96 -0
- package/UI/Components/Detail/DetailRecordTime.ts +196 -0
- package/UI/Components/Dropdown/DropdownChange.ts +198 -0
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +270 -106
- package/UI/Components/EntityDropdown/EntityDropdownQuery.ts +119 -0
- package/UI/Components/FilePicker/FilePicker.tsx +90 -6
- package/UI/Components/FoldedSection/FoldedSection.tsx +370 -0
- package/UI/Components/FoldedSection/FoldedSectionItem.ts +141 -0
- package/UI/Components/FoldedSection/FoldedSectionTitles.ts +39 -0
- package/UI/Components/FormModal/BasicFormModal.tsx +40 -67
- package/UI/Components/Forms/BasicForm.tsx +218 -119
- package/UI/Components/Forms/BasicModelForm.tsx +0 -2
- package/UI/Components/Forms/CollapsibleFormSection.tsx +108 -18
- package/UI/Components/Forms/Fields/FormField.tsx +62 -15
- package/UI/Components/Forms/Fields/GeneratedKeyField.tsx +1 -5
- package/UI/Components/Forms/FormSummary.tsx +5 -3
- package/UI/Components/Forms/ModelForm.tsx +123 -16
- package/UI/Components/Forms/Types/Field.ts +98 -16
- package/UI/Components/Forms/Utils/AdvancedFormSection.ts +102 -31
- package/UI/Components/Forms/Utils/CreateFormDefaults.ts +158 -17
- package/UI/Components/Forms/Utils/FoldedFormFields.ts +393 -0
- package/UI/Components/Forms/Utils/FollowPickName.ts +52 -0
- package/UI/Components/Forms/Utils/FormModalWidth.ts +35 -4
- package/UI/Components/Forms/Utils/OpenFormSections.ts +104 -0
- package/UI/Components/Forms/Utils/SteppedFormFooter.ts +151 -0
- package/UI/Components/Forms/Utils/UniqueName.ts +81 -0
- package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +22 -3
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +6 -5
- package/UI/Components/Modal/ModalFooter.tsx +10 -1
- package/UI/Components/ModelDetail/CardModelDetail.tsx +33 -8
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +44 -58
- package/UI/Components/ModelSwitch/ModelSwitchCard.tsx +305 -0
- package/UI/Components/ModelSwitch/ModelSwitchEvents.ts +109 -0
- package/UI/Components/ModelSwitch/ModelSwitchRow.tsx +438 -0
- package/UI/Components/ModelSwitch/ModelSwitchUtil.ts +120 -0
- package/UI/Components/ModelSwitch/ModelSwitchesCard.tsx +265 -0
- package/UI/Components/ModelSwitch/useSaveModelSwitch.ts +144 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +6 -0
- package/UI/Components/ModelTable/ModelTable.tsx +5 -0
- package/UI/Components/Navbar/NavBar.tsx +10 -9
- package/UI/Components/Navbar/NavBarMenuCatalog.ts +57 -22
- package/UI/Components/Navbar/NavBarMenuModal.tsx +17 -13
- package/UI/Components/Navbar/NavBarMobileMenu.tsx +40 -23
- package/UI/Components/Page/ModelHeaderEvents.ts +75 -0
- package/UI/Components/Page/ModelPage.tsx +21 -1
- package/UI/Components/Page/Page.tsx +68 -13
- package/UI/Components/PeoplePicker/PeoplePicker.tsx +150 -45
- package/UI/Components/PeoplePicker/PeoplePickerTypes.ts +193 -4
- package/UI/Components/PeoplePicker/PeopleSearchPopup.tsx +37 -10
- package/UI/Components/PublicForm/PublicFormFavicon.ts +99 -0
- package/UI/Components/PublicForm/PublicFormLogo.tsx +81 -0
- package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +5 -3
- package/UI/Components/RuleRun/RuleView.tsx +2 -5
- package/UI/Components/SaveStatus/SaveStatus.tsx +76 -0
- package/UI/Components/SaveStatus/useSaveOnChange.ts +178 -0
- package/UI/Components/SmtpConfig/SmtpConfigFormFields.ts +815 -0
- package/UI/Components/Sso/OidcProviderFormFields.ts +481 -0
- package/UI/Components/Sso/SamlProviderFormFields.ts +322 -0
- package/UI/Components/Sso/SsoProviderFormFields.ts +331 -0
- package/UI/Components/Table/TableEmptyState.tsx +39 -5
- package/UI/Components/Workflow/ArgumentsForm.tsx +21 -78
- package/UI/Components/Workflow/ComponentPicker/ComponentSearch.ts +18 -145
- package/UI/Components/Workflow/WorkflowLogModal.tsx +1 -3
- package/UI/Types/UseAnchoredFieldPopup.ts +46 -4
- package/UI/Utils/DefaultInviteTeam.ts +306 -0
- package/UI/Utils/GrantablePermission.ts +46 -0
- package/UI/Utils/PermissionGate.ts +80 -7
- package/UI/Utils/TranslateTemplate.ts +22 -0
- package/Utils/DistinctColor.ts +223 -0
- package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +47 -2
- package/Utils/Slo/SloHealth.ts +9 -3
- package/Utils/StatusPage/ReportSchedule.ts +462 -0
- package/Utils/Telemetry/DiscoveredResourceName.ts +95 -0
- package/Utils/WordMatch.ts +185 -0
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +6 -6
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/File.js +47 -1
- package/build/dist/Models/DatabaseModels/File.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Form.js +125 -0
- package/build/dist/Models/DatabaseModels/Form.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +6 -6
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogDropFilter.js +1 -0
- package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogPipeline.js +1 -0
- package/build/dist/Models/DatabaseModels/LogPipeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogScrubRule.js +14 -8
- package/build/dist/Models/DatabaseModels/LogScrubRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricRecordingRule.js +1 -1
- package/build/dist/Models/DatabaseModels/MetricRecordingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js +20 -9
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +6 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +4 -4
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +1 -0
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TracePipeline.js +1 -0
- package/build/dist/Models/DatabaseModels/TracePipeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceRecordingRule.js +1 -1
- package/build/dist/Models/DatabaseModels/TraceRecordingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceScrubRule.js +14 -8
- package/build/dist/Models/DatabaseModels/TraceScrubRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -2
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Server/API/CustomDomainRoutes.js +124 -0
- package/build/dist/Server/API/CustomDomainRoutes.js.map +1 -0
- package/build/dist/Server/API/DashboardAPI.js +22 -4
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardDomainAPI.js +56 -49
- package/build/dist/Server/API/DashboardDomainAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +101 -39
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageDomainAPI.js +52 -51
- package/build/dist/Server/API/StatusPageDomainAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/GlobalCache.js +63 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +44 -61
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingRuleService.js +45 -0
- package/build/dist/Server/Services/AlertGroupingRuleService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +23 -0
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +39 -0
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DashboardDomainService.js +510 -172
- package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
- package/build/dist/Server/Services/DashboardService.js +22 -9
- package/build/dist/Server/Services/DashboardService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +114 -10
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +51 -0
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +23 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/FileService.js +45 -0
- package/build/dist/Server/Services/FileService.js.map +1 -1
- package/build/dist/Server/Services/FormService.js +158 -14
- package/build/dist/Server/Services/FormService.js.map +1 -1
- package/build/dist/Server/Services/GlobalOidcService.js +9 -0
- package/build/dist/Server/Services/GlobalOidcService.js.map +1 -1
- package/build/dist/Server/Services/GlobalSsoService.js +9 -0
- package/build/dist/Server/Services/GlobalSsoService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +50 -0
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +45 -62
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingRuleService.js +45 -0
- package/build/dist/Server/Services/IncidentGroupingRuleService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetService.js +23 -0
- package/build/dist/Server/Services/IoTFleetService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +54 -0
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +6 -16
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/LogScrubRuleService.js +31 -0
- package/build/dist/Server/Services/LogScrubRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +202 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +7 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js +17 -24
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
- package/build/dist/Server/Services/OnCallSetupReminderService.js +32 -38
- package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +51 -0
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProfileAggregationService.js +34 -0
- package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js +53 -3
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
- package/build/dist/Server/Services/ProjectOidcService.js +28 -0
- package/build/dist/Server/Services/ProjectOidcService.js.map +1 -1
- package/build/dist/Server/Services/ProjectSsoService.js +28 -0
- package/build/dist/Server/Services/ProjectSsoService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +23 -0
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationService.js +42 -0
- package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +18 -26
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionService.js +44 -0
- package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +30 -4
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageDomainService.js +495 -174
- package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOidcService.js +28 -0
- package/build/dist/Server/Services/StatusPageOidcService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageResourceService.js +82 -46
- package/build/dist/Server/Services/StatusPageResourceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +174 -45
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSsoService.js +28 -0
- package/build/dist/Server/Services/StatusPageSsoService.js.map +1 -1
- package/build/dist/Server/Services/TraceScrubRuleService.js +31 -0
- package/build/dist/Server/Services/TraceScrubRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +20 -10
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterService.js +23 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +3 -3
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -1
- package/build/dist/Server/Utils/Greenlock/CertificateOrder.js +353 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrder.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderBudget.js +119 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderBudget.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderFailures.js +208 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderFailures.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderLock.js +111 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderLock.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderOutcome.js +30 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderOutcome.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOwners.js +52 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOwners.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateReissueOrder.js +80 -0
- package/build/dist/Server/Utils/Greenlock/CertificateReissueOrder.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CustomDomainOrders.js +296 -0
- package/build/dist/Server/Utils/Greenlock/CustomDomainOrders.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/Greenlock.js +595 -146
- package/build/dist/Server/Utils/Greenlock/Greenlock.js.map +1 -1
- package/build/dist/Server/Utils/Rules/GroupingRuleEpisodeOwners.js +366 -0
- package/build/dist/Server/Utils/Rules/GroupingRuleEpisodeOwners.js.map +1 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +7 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
- package/build/dist/Server/Utils/ScrubRuleValidation.js +127 -0
- package/build/dist/Server/Utils/ScrubRuleValidation.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/AffectedStatusPageResources.js +97 -0
- package/build/dist/Server/Utils/StatusPage/AffectedStatusPageResources.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.js +195 -0
- package/build/dist/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceCreate.js +177 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceCreate.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceUpdate.js +129 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceUpdate.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +8 -2
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -1
- package/build/dist/Types/BrandColors.js +9 -0
- package/build/dist/Types/BrandColors.js.map +1 -1
- package/build/dist/Types/CustomDomain/CustomDomainCertificates.js +71 -0
- package/build/dist/Types/CustomDomain/CustomDomainCertificates.js.map +1 -0
- package/build/dist/Types/CustomDomain/CustomDomainVerification.js +58 -0
- package/build/dist/Types/CustomDomain/CustomDomainVerification.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardAccess.js +157 -0
- package/build/dist/Types/Dashboard/DashboardAccess.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +26 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Filter/FilterConditionUtil.js +24 -0
- package/build/dist/Types/Filter/FilterConditionUtil.js.map +1 -0
- package/build/dist/Types/Form/FormBranding.js +266 -0
- package/build/dist/Types/Form/FormBranding.js.map +1 -0
- package/build/dist/Types/Form/FormPublic.js +6 -0
- package/build/dist/Types/Form/FormPublic.js.map +1 -1
- package/build/dist/Types/IncomingCall/IncomingCallRingTime.js +37 -0
- package/build/dist/Types/IncomingCall/IncomingCallRingTime.js.map +1 -0
- package/build/dist/Types/Log/LogScrubField.js +15 -0
- package/build/dist/Types/Log/LogScrubField.js.map +1 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/NotificationRule/OnCallRuleKind.js +134 -0
- package/build/dist/Types/NotificationRule/OnCallRuleKind.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/FirstResponders.js +2 -23
- package/build/dist/Types/OnCallDutyPolicy/FirstResponders.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/MiscDataId.js +30 -0
- package/build/dist/Types/OnCallDutyPolicy/MiscDataId.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleFirstLayer.js +113 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleFirstLayer.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleLayerDefaults.js +95 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleLayerDefaults.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideCoverRequest.js +99 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideCoverRequest.js.map +1 -0
- package/build/dist/Types/SSO/OidcProviderDefaults.js +189 -0
- package/build/dist/Types/SSO/OidcProviderDefaults.js.map +1 -0
- package/build/dist/Types/SSO/SamlProviderDefaults.js +55 -0
- package/build/dist/Types/SSO/SamlProviderDefaults.js.map +1 -0
- package/build/dist/Types/SSO/SsoProviderDefaults.js +67 -0
- package/build/dist/Types/SSO/SsoProviderDefaults.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageAccess.js +132 -0
- package/build/dist/Types/StatusPage/StatusPageAccess.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPagesListingMonitors.js +84 -0
- package/build/dist/Types/StatusPage/StatusPagesListingMonitors.js.map +1 -0
- package/build/dist/Types/Telemetry/ScrubRule.js +180 -0
- package/build/dist/Types/Telemetry/ScrubRule.js.map +1 -0
- package/build/dist/UI/Components/AdvancedPageSection/AdvancedPageSection.js +9 -7
- package/build/dist/UI/Components/AdvancedPageSection/AdvancedPageSection.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +81 -35
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/ChoiceRows/ChoiceRows.js +54 -0
- package/build/dist/UI/Components/ChoiceRows/ChoiceRows.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +25 -12
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +632 -64
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +7 -1
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +7 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +26 -13
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/Detail/DetailRecordLine.js +32 -0
- package/build/dist/UI/Components/Detail/DetailRecordLine.js.map +1 -0
- package/build/dist/UI/Components/Detail/DetailRecordTime.js +134 -0
- package/build/dist/UI/Components/Detail/DetailRecordTime.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/DropdownChange.js +102 -0
- package/build/dist/UI/Components/Dropdown/DropdownChange.js.map +1 -0
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +134 -57
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdownQuery.js +78 -0
- package/build/dist/UI/Components/EntityDropdown/EntityDropdownQuery.js.map +1 -0
- package/build/dist/UI/Components/FilePicker/FilePicker.js +55 -6
- package/build/dist/UI/Components/FilePicker/FilePicker.js.map +1 -1
- package/build/dist/UI/Components/FoldedSection/FoldedSection.js +139 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSection.js.map +1 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionItem.js +58 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionItem.js.map +1 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionTitles.js +34 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionTitles.js.map +1 -0
- package/build/dist/UI/Components/FormModal/BasicFormModal.js +29 -45
- package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +148 -89
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicModelForm.js +1 -1
- package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +49 -10
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +25 -11
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/GeneratedKeyField.js +2 -5
- package/build/dist/UI/Components/Forms/Fields/GeneratedKeyField.js.map +1 -1
- package/build/dist/UI/Components/Forms/FormSummary.js +5 -3
- package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +72 -14
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/AdvancedFormSection.js +80 -23
- package/build/dist/UI/Components/Forms/Utils/AdvancedFormSection.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/CreateFormDefaults.js +91 -9
- package/build/dist/UI/Components/Forms/Utils/CreateFormDefaults.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/FoldedFormFields.js +243 -0
- package/build/dist/UI/Components/Forms/Utils/FoldedFormFields.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/FollowPickName.js +32 -0
- package/build/dist/UI/Components/Forms/Utils/FollowPickName.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/FormModalWidth.js +25 -5
- package/build/dist/UI/Components/Forms/Utils/FormModalWidth.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/OpenFormSections.js +32 -0
- package/build/dist/UI/Components/Forms/Utils/OpenFormSections.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/SteppedFormFooter.js +71 -0
- package/build/dist/UI/Components/Forms/Utils/SteppedFormFooter.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/UniqueName.js +56 -0
- package/build/dist/UI/Components/Forms/Utils/UniqueName.js.map +1 -0
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +17 -1
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +8 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +19 -6
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +33 -43
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchCard.js +151 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchCard.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchEvents.js +54 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchEvents.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchRow.js +201 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchRow.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchUtil.js +60 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchUtil.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchesCard.js +116 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchesCard.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/useSaveModelSwitch.js +68 -0
- package/build/dist/UI/Components/ModelSwitch/useSaveModelSwitch.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +3 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuCatalog.js +21 -10
- package/build/dist/UI/Components/Navbar/NavBarMenuCatalog.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +10 -7
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMobileMenu.js +17 -9
- package/build/dist/UI/Components/Navbar/NavBarMobileMenu.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelHeaderEvents.js +43 -0
- package/build/dist/UI/Components/Page/ModelHeaderEvents.js.map +1 -0
- package/build/dist/UI/Components/Page/ModelPage.js +19 -1
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/Page/Page.js +31 -13
- package/build/dist/UI/Components/Page/Page.js.map +1 -1
- package/build/dist/UI/Components/PeoplePicker/PeoplePicker.js +62 -20
- package/build/dist/UI/Components/PeoplePicker/PeoplePicker.js.map +1 -1
- package/build/dist/UI/Components/PeoplePicker/PeoplePickerTypes.js +98 -1
- package/build/dist/UI/Components/PeoplePicker/PeoplePickerTypes.js.map +1 -1
- package/build/dist/UI/Components/PeoplePicker/PeopleSearchPopup.js +35 -14
- package/build/dist/UI/Components/PeoplePicker/PeopleSearchPopup.js.map +1 -1
- package/build/dist/UI/Components/PublicForm/PublicFormFavicon.js +66 -0
- package/build/dist/UI/Components/PublicForm/PublicFormFavicon.js.map +1 -0
- package/build/dist/UI/Components/PublicForm/PublicFormLogo.js +38 -0
- package/build/dist/UI/Components/PublicForm/PublicFormLogo.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +5 -3
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -1
- package/build/dist/UI/Components/RuleRun/RuleView.js +2 -2
- package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -1
- package/build/dist/UI/Components/SaveStatus/SaveStatus.js +46 -0
- package/build/dist/UI/Components/SaveStatus/SaveStatus.js.map +1 -0
- package/build/dist/UI/Components/SaveStatus/useSaveOnChange.js +98 -0
- package/build/dist/UI/Components/SaveStatus/useSaveOnChange.js.map +1 -0
- package/build/dist/UI/Components/SmtpConfig/SmtpConfigFormFields.js +503 -0
- package/build/dist/UI/Components/SmtpConfig/SmtpConfigFormFields.js.map +1 -0
- package/build/dist/UI/Components/Sso/OidcProviderFormFields.js +283 -0
- package/build/dist/UI/Components/Sso/OidcProviderFormFields.js.map +1 -0
- package/build/dist/UI/Components/Sso/SamlProviderFormFields.js +182 -0
- package/build/dist/UI/Components/Sso/SamlProviderFormFields.js.map +1 -0
- package/build/dist/UI/Components/Sso/SsoProviderFormFields.js +208 -0
- package/build/dist/UI/Components/Sso/SsoProviderFormFields.js.map +1 -0
- package/build/dist/UI/Components/Table/TableEmptyState.js +17 -4
- package/build/dist/UI/Components/Table/TableEmptyState.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +17 -52
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js +7 -89
- package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js.map +1 -1
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +1 -1
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -1
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js +22 -3
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
- package/build/dist/UI/Utils/DefaultInviteTeam.js +207 -0
- package/build/dist/UI/Utils/DefaultInviteTeam.js.map +1 -0
- package/build/dist/UI/Utils/GrantablePermission.js +31 -0
- package/build/dist/UI/Utils/GrantablePermission.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +54 -3
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/TranslateTemplate.js +16 -0
- package/build/dist/UI/Utils/TranslateTemplate.js.map +1 -1
- package/build/dist/Utils/DistinctColor.js +151 -0
- package/build/dist/Utils/DistinctColor.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +12 -1
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -1
- package/build/dist/Utils/Slo/SloHealth.js +9 -3
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/StatusPage/ReportSchedule.js +304 -0
- package/build/dist/Utils/StatusPage/ReportSchedule.js.map +1 -0
- package/build/dist/Utils/Telemetry/DiscoveredResourceName.js +65 -0
- package/build/dist/Utils/Telemetry/DiscoveredResourceName.js.map +1 -0
- package/build/dist/Utils/WordMatch.js +115 -0
- package/build/dist/Utils/WordMatch.js.map +1 -0
- package/package.json +1 -1
- package/Tests/App/Dashboard/BulkChangeStateModalSteps.test.ts +0 -109
- package/Tests/App/StatusPage/StatusPageSubscribeFromFirstStep.test.tsx +0 -382
- package/Tests/UI/Components/Forms/BasicFormFinishFromAnyStep.test.tsx +0 -729
- package/Tests/UI/Components/Forms/FinishFromAnyStep.test.ts +0 -571
- package/Tests/UI/Components/Forms/FinishFromAnyStepGuard.test.ts +0 -566
- package/UI/Components/Forms/Utils/FinishFromAnyStep.ts +0 -284
- package/build/dist/UI/Components/Forms/Utils/FinishFromAnyStep.js +0 -132
- package/build/dist/UI/Components/Forms/Utils/FinishFromAnyStep.js.map +0 -1
|
@@ -3,6 +3,14 @@ import DeleteBy from "../Types/Database/DeleteBy";
|
|
|
3
3
|
import UpdateBy from "../Types/Database/UpdateBy";
|
|
4
4
|
import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
|
|
5
5
|
import GreenlockUtil from "../Utils/Greenlock/Greenlock";
|
|
6
|
+
import CertificateOrder, {
|
|
7
|
+
CertificateOrderOutcome,
|
|
8
|
+
} from "../Utils/Greenlock/CertificateOrder";
|
|
9
|
+
import CustomDomainOrders from "../Utils/Greenlock/CustomDomainOrders";
|
|
10
|
+
import { CertificateOrderLockHandle } from "../Utils/Greenlock/CertificateOrderLock";
|
|
11
|
+
import { CertificateOrderReason } from "../Utils/Greenlock/CertificateOrderBudget";
|
|
12
|
+
import CertificateOrderFailures from "../Utils/Greenlock/CertificateOrderFailures";
|
|
13
|
+
import CertificateReissueOrder from "../Utils/Greenlock/CertificateReissueOrder";
|
|
6
14
|
import logger, { LogAttributes } from "../Utils/Logger";
|
|
7
15
|
import DatabaseService from "./DatabaseService";
|
|
8
16
|
import DomainService from "./DomainService";
|
|
@@ -15,7 +23,6 @@ import ObjectID from "../../Types/ObjectID";
|
|
|
15
23
|
import AcmeCertificate from "../../Models/DatabaseModels/AcmeCertificate";
|
|
16
24
|
import DomainModel from "../../Models/DatabaseModels/Domain";
|
|
17
25
|
import StatusPageDomain from "../../Models/DatabaseModels/StatusPageDomain";
|
|
18
|
-
import AcmeCertificateService from "./AcmeCertificateService";
|
|
19
26
|
import Telemetry, { Span } from "../Utils/Telemetry";
|
|
20
27
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
21
28
|
import { StatusPageCNameRecord } from "../EnvironmentConfig";
|
|
@@ -23,8 +30,9 @@ import Domain from "../Types/Domain";
|
|
|
23
30
|
import ArrayUtil from "../../Utils/Array";
|
|
24
31
|
import OneUptimeDate from "../../Types/Date";
|
|
25
32
|
import CertificateReissueUtil from "../../Utils/CertificateReissue";
|
|
26
|
-
import TooManyRequestsException from "../../Types/Exception/TooManyRequestsException";
|
|
27
33
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
34
|
+
import { CustomDomainVerificationResult } from "../../Types/CustomDomain/CustomDomainVerification";
|
|
35
|
+
import { CustomDomainCertificate } from "../../Types/CustomDomain/CustomDomainCertificates";
|
|
28
36
|
|
|
29
37
|
const STATUS_PAGE_DOMAIN_EGRESS_LABEL: string = "Status page domain";
|
|
30
38
|
|
|
@@ -38,6 +46,37 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
38
46
|
*/
|
|
39
47
|
public static readonly SSL_PROVISIONING_CHECK_CONCURRENCY: number = 10;
|
|
40
48
|
|
|
49
|
+
/*
|
|
50
|
+
* How many certificates the sweeps that order them may order in one
|
|
51
|
+
* 15-minute window, between them: the order for the domains the CNAME
|
|
52
|
+
* sweep has just verified, the order sweep for every verified domain still
|
|
53
|
+
* without a certificate, and the re-order of a certificate that has gone
|
|
54
|
+
* missing. They draw from one budget (CertificateOrder.takeOrderSlot,
|
|
55
|
+
* SWEEP_ORDER_BUDGET), and each picks its batch afresh every run
|
|
56
|
+
* (GreenlockUtil.pickForThisRun), so a domain whose order keeps failing -
|
|
57
|
+
* a CAA record that leaves Let's Encrypt out, a name it has paused -
|
|
58
|
+
* cannot hold a slot the others are waiting for, and waits longer after
|
|
59
|
+
* each failed order (CertificateOrderFailures). Check now is not counted
|
|
60
|
+
* here: it has a window of its own per domain
|
|
61
|
+
* (CertificateOrder.claimOnDemandOrder) and the on-demand budget.
|
|
62
|
+
*
|
|
63
|
+
* Every order spends from the one Let's Encrypt account the whole
|
|
64
|
+
* installation shares, 300 new orders per three hours, renewals included.
|
|
65
|
+
* Whatever these caps allow, no order is placed beyond the installation's
|
|
66
|
+
* own budget for that account (CertificateOrderBudget), which every order
|
|
67
|
+
* of every kind draws from. In a steady state these sweeps order a few
|
|
68
|
+
* certificates a day: a domain whose owner clicks Check now is ordered by
|
|
69
|
+
* that request. The cap is for a backlog, such as the domains the order
|
|
70
|
+
* sweep used to retry every 15 minutes without any limit, which is now
|
|
71
|
+
* worked off a few domains a run the way the dashboard sweeps
|
|
72
|
+
* (DashboardDomainService.ORDER_MAX_PER_RUN) and renewals
|
|
73
|
+
* (GreenlockUtil.RENEW_MAX_PER_RUN) are.
|
|
74
|
+
*/
|
|
75
|
+
public static readonly ORDER_MAX_PER_RUN: number = 5;
|
|
76
|
+
|
|
77
|
+
// The budget the ordering sweeps share (CertificateOrder.takeOrderSlot).
|
|
78
|
+
public static readonly SWEEP_ORDER_BUDGET: string = "StatusPageDomainSweeps";
|
|
79
|
+
|
|
41
80
|
public constructor() {
|
|
42
81
|
super(StatusPageDomain);
|
|
43
82
|
}
|
|
@@ -181,9 +220,82 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
181
220
|
await GreenlockUtil.removeDomain(domain);
|
|
182
221
|
}
|
|
183
222
|
|
|
223
|
+
/*
|
|
224
|
+
* The domain with its full name and whether it serves an uploaded
|
|
225
|
+
* certificate, read once when the caller did not have them both.
|
|
226
|
+
*/
|
|
227
|
+
private async getDomainToOrder(
|
|
228
|
+
statusPageDomain: StatusPageDomain,
|
|
229
|
+
): Promise<StatusPageDomain> {
|
|
230
|
+
if (!statusPageDomain.id) {
|
|
231
|
+
throw new BadDataException(
|
|
232
|
+
"Domain ID is required to order a certificate",
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (
|
|
237
|
+
statusPageDomain.fullDomain &&
|
|
238
|
+
statusPageDomain.isCustomCertificate !== undefined
|
|
239
|
+
) {
|
|
240
|
+
return statusPageDomain;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const fetchedStatusPageDomain: StatusPageDomain | null =
|
|
244
|
+
await this.findOneBy({
|
|
245
|
+
query: {
|
|
246
|
+
_id: statusPageDomain.id.toString(),
|
|
247
|
+
},
|
|
248
|
+
select: {
|
|
249
|
+
_id: true,
|
|
250
|
+
fullDomain: true,
|
|
251
|
+
isCustomCertificate: true,
|
|
252
|
+
projectId: true,
|
|
253
|
+
},
|
|
254
|
+
props: {
|
|
255
|
+
isRoot: true,
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
if (!fetchedStatusPageDomain) {
|
|
260
|
+
throw new BadDataException("DomainModel not found");
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (!fetchedStatusPageDomain.fullDomain) {
|
|
264
|
+
throw new BadDataException(
|
|
265
|
+
"Unable to order certificate because domain is null",
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return fetchedStatusPageDomain;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/*
|
|
273
|
+
* Order this domain's certificate and record it: a first certificate
|
|
274
|
+
* (the default), or a reissue. GreenlockUtil.orderCert places it under the
|
|
275
|
+
* name's order lock - the one handed in, or its own - and within the
|
|
276
|
+
* installation's Let's Encrypt allowance; the outcome says whether it
|
|
277
|
+
* ordered.
|
|
278
|
+
*/
|
|
184
279
|
@CaptureSpan()
|
|
185
|
-
public async orderCert(
|
|
186
|
-
|
|
280
|
+
public async orderCert(
|
|
281
|
+
statusPageDomain: StatusPageDomain,
|
|
282
|
+
options?: {
|
|
283
|
+
reason?: CertificateOrderReason | undefined;
|
|
284
|
+
// The name's order lock, when the caller holds it.
|
|
285
|
+
lock?: CertificateOrderLockHandle | undefined;
|
|
286
|
+
/*
|
|
287
|
+
* The caller has just found the domain's CNAME record: the order
|
|
288
|
+
* does not check it again (see GreenlockUtil.orderCert).
|
|
289
|
+
*/
|
|
290
|
+
cnameVerifiedJustNow?: boolean | undefined;
|
|
291
|
+
/*
|
|
292
|
+
* The caller's share of orders (CertificateOrder.getOrderShare),
|
|
293
|
+
* asked once the CNAME check has passed.
|
|
294
|
+
*/
|
|
295
|
+
mayOrder?: (() => Promise<boolean>) | undefined;
|
|
296
|
+
},
|
|
297
|
+
): Promise<CertificateOrderOutcome> {
|
|
298
|
+
return Telemetry.startActiveSpan<Promise<CertificateOrderOutcome>>({
|
|
187
299
|
name: "StatusPageDomainService.orderCert",
|
|
188
300
|
options: {
|
|
189
301
|
attributes: {
|
|
@@ -191,65 +303,58 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
191
303
|
_id: statusPageDomain.id?.toString(),
|
|
192
304
|
},
|
|
193
305
|
},
|
|
194
|
-
fn: async (span: Span): Promise<
|
|
306
|
+
fn: async (span: Span): Promise<CertificateOrderOutcome> => {
|
|
195
307
|
try {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
await this.findOneBy({
|
|
199
|
-
query: {
|
|
200
|
-
_id: statusPageDomain.id!.toString(),
|
|
201
|
-
},
|
|
202
|
-
select: {
|
|
203
|
-
_id: true,
|
|
204
|
-
fullDomain: true,
|
|
205
|
-
},
|
|
206
|
-
props: {
|
|
207
|
-
isRoot: true,
|
|
208
|
-
},
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
if (!fetchedStatusPageDomain) {
|
|
212
|
-
throw new BadDataException("DomainModel not found");
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
statusPageDomain = fetchedStatusPageDomain;
|
|
216
|
-
}
|
|
308
|
+
const domainToOrder: StatusPageDomain =
|
|
309
|
+
await this.getDomainToOrder(statusPageDomain);
|
|
217
310
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
logger.debug(
|
|
225
|
-
"Ordering SSL for domain: " + statusPageDomain.fullDomain,
|
|
226
|
-
{ fullDomain: statusPageDomain.fullDomain } as LogAttributes,
|
|
227
|
-
);
|
|
311
|
+
logger.debug("Ordering SSL for domain: " + domainToOrder.fullDomain, {
|
|
312
|
+
fullDomain: domainToOrder.fullDomain,
|
|
313
|
+
} as LogAttributes);
|
|
228
314
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
315
|
+
const outcome: CertificateOrderOutcome =
|
|
316
|
+
await GreenlockUtil.orderCert({
|
|
317
|
+
domain: domainToOrder.fullDomain as string,
|
|
318
|
+
reason:
|
|
319
|
+
options?.reason || CertificateOrderReason.FirstCertificate,
|
|
320
|
+
validateCname: options?.cnameVerifiedJustNow
|
|
321
|
+
? null
|
|
322
|
+
: async (fullDomain: string) => {
|
|
323
|
+
return await this.isCnameValid(fullDomain);
|
|
324
|
+
},
|
|
325
|
+
lock: options?.lock,
|
|
326
|
+
mayOrder: options?.mayOrder,
|
|
327
|
+
});
|
|
235
328
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
329
|
+
if (outcome === CertificateOrderOutcome.Ordered) {
|
|
330
|
+
logger.debug(
|
|
331
|
+
"SSL ordered for domain: " + domainToOrder.fullDomain,
|
|
332
|
+
{ fullDomain: domainToOrder.fullDomain } as LogAttributes,
|
|
333
|
+
);
|
|
240
334
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
335
|
+
/*
|
|
336
|
+
* Verified as well as ordered: Let's Encrypt has just fetched
|
|
337
|
+
* its challenge from this domain, so the domain reaches us. A
|
|
338
|
+
* CNAME sweep that saw a DNS blip while the order ran - and
|
|
339
|
+
* marked the domain unverified and unordered - would otherwise
|
|
340
|
+
* leave it "ordered" but "waiting for DNS", with a certificate
|
|
341
|
+
* the dialog had just called verified.
|
|
342
|
+
*/
|
|
343
|
+
await this.updateOneById({
|
|
344
|
+
id: domainToOrder.id!,
|
|
345
|
+
data: {
|
|
346
|
+
isCnameVerified: true,
|
|
347
|
+
isSslOrdered: true,
|
|
348
|
+
},
|
|
349
|
+
props: {
|
|
350
|
+
isRoot: true,
|
|
351
|
+
},
|
|
352
|
+
});
|
|
353
|
+
}
|
|
251
354
|
|
|
252
355
|
Telemetry.endSpan(span);
|
|
356
|
+
|
|
357
|
+
return outcome;
|
|
253
358
|
} catch (err) {
|
|
254
359
|
Telemetry.recordExceptionMarkSpanAsErrorAndEndSpan({
|
|
255
360
|
span,
|
|
@@ -262,6 +367,42 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
262
367
|
});
|
|
263
368
|
}
|
|
264
369
|
|
|
370
|
+
/*
|
|
371
|
+
* Records these domains as ordered: they have a certificate, ordered
|
|
372
|
+
* before, so nothing is ordered. One write for all of them, and only on
|
|
373
|
+
* domains that are still verified - a CNAME check that failed meanwhile
|
|
374
|
+
* marked a domain unverified and unordered, and marking it ordered again
|
|
375
|
+
* would leave it ordered but "waiting for DNS". The next CNAME check that
|
|
376
|
+
* passes records it again.
|
|
377
|
+
*/
|
|
378
|
+
private async recordCertificatesAsOrdered(
|
|
379
|
+
domainIds: Array<ObjectID>,
|
|
380
|
+
): Promise<void> {
|
|
381
|
+
if (domainIds.length === 0) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
await this.updateBy({
|
|
386
|
+
query: {
|
|
387
|
+
_id: QueryHelper.any(
|
|
388
|
+
domainIds.map((id: ObjectID) => {
|
|
389
|
+
return id.toString();
|
|
390
|
+
}),
|
|
391
|
+
),
|
|
392
|
+
isCnameVerified: true,
|
|
393
|
+
isSslOrdered: false,
|
|
394
|
+
},
|
|
395
|
+
data: {
|
|
396
|
+
isSslOrdered: true,
|
|
397
|
+
},
|
|
398
|
+
limit: LIMIT_MAX,
|
|
399
|
+
skip: 0,
|
|
400
|
+
props: {
|
|
401
|
+
isRoot: true,
|
|
402
|
+
},
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
|
|
265
406
|
/*
|
|
266
407
|
* Reissue this domain's Let's Encrypt certificate because a customer asked
|
|
267
408
|
* for it, rather than because it is close to expiring.
|
|
@@ -324,69 +465,215 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
324
465
|
}
|
|
325
466
|
|
|
326
467
|
/*
|
|
327
|
-
* A domain that never ordered a certificate has nothing to reissue
|
|
328
|
-
*
|
|
468
|
+
* A domain that never ordered a certificate has nothing to reissue. Its
|
|
469
|
+
* first certificate is ordered on its own once the CNAME is verified, and
|
|
470
|
+
* the dashboard shows Reissue SSL only after that.
|
|
329
471
|
*/
|
|
330
472
|
if (!statusPageDomain.isSslOrdered) {
|
|
331
473
|
throw new BadDataException(
|
|
332
|
-
"No SSL certificate has been ordered for this domain yet.
|
|
474
|
+
"No SSL certificate has been ordered for this domain yet. One is ordered automatically once its CNAME record is verified.",
|
|
333
475
|
);
|
|
334
476
|
}
|
|
335
477
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
478
|
+
await CertificateReissueOrder.reissue({
|
|
479
|
+
domain: statusPageDomain.fullDomain,
|
|
480
|
+
now: now,
|
|
481
|
+
lastReissueRequestedAt: statusPageDomain.certificateReissueRequestedAt,
|
|
482
|
+
claimCooldown: async (): Promise<number> => {
|
|
483
|
+
/*
|
|
484
|
+
* Claim the cooldown before ordering anything, and claim it by
|
|
485
|
+
* putting the cooldown condition in the WHERE clause rather than in
|
|
486
|
+
* an `if` above the write. Two clicks that arrive together both read
|
|
487
|
+
* a row that is not cooling down; only the write can decide which
|
|
488
|
+
* one of them gets to spend the CA's allowance.
|
|
489
|
+
*/
|
|
490
|
+
return await this.updateOneBy({
|
|
491
|
+
query: {
|
|
492
|
+
_id: domainId.toString(),
|
|
493
|
+
certificateReissueRequestedAt: QueryHelper.lessThanEqualToOrNull(
|
|
494
|
+
CertificateReissueUtil.getCooldownCutoff(now),
|
|
495
|
+
),
|
|
496
|
+
},
|
|
497
|
+
data: {
|
|
498
|
+
certificateReissueRequestedAt: now,
|
|
499
|
+
},
|
|
500
|
+
props: {
|
|
501
|
+
isRoot: true,
|
|
502
|
+
},
|
|
503
|
+
});
|
|
355
504
|
},
|
|
356
|
-
|
|
357
|
-
|
|
505
|
+
giveCooldownBack: async (): Promise<void> => {
|
|
506
|
+
await this.updateOneBy({
|
|
507
|
+
query: {
|
|
508
|
+
_id: domainId.toString(),
|
|
509
|
+
certificateReissueRequestedAt: now,
|
|
510
|
+
},
|
|
511
|
+
data: {
|
|
512
|
+
certificateReissueRequestedAt:
|
|
513
|
+
statusPageDomain.certificateReissueRequestedAt || null,
|
|
514
|
+
} as never,
|
|
515
|
+
props: {
|
|
516
|
+
isRoot: true,
|
|
517
|
+
},
|
|
518
|
+
});
|
|
358
519
|
},
|
|
359
|
-
|
|
360
|
-
|
|
520
|
+
order: async (
|
|
521
|
+
lock: CertificateOrderLockHandle,
|
|
522
|
+
): Promise<CertificateOrderOutcome> => {
|
|
523
|
+
logger.debug(
|
|
524
|
+
"Reissuing SSL certificate for domain: " +
|
|
525
|
+
statusPageDomain.fullDomain,
|
|
526
|
+
{ fullDomain: statusPageDomain.fullDomain } as LogAttributes,
|
|
527
|
+
);
|
|
528
|
+
|
|
529
|
+
return await this.orderCert(statusPageDomain, {
|
|
530
|
+
reason: CertificateOrderReason.Reissue,
|
|
531
|
+
lock: lock,
|
|
532
|
+
});
|
|
361
533
|
},
|
|
362
534
|
});
|
|
535
|
+
}
|
|
363
536
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
537
|
+
/*
|
|
538
|
+
* Order this domain's free certificate unless it has one already, or one
|
|
539
|
+
* is being ordered for it right now (CertificateOrder.orderIfMissing): the
|
|
540
|
+
* one way a first certificate is ordered, whether by Check now, by the
|
|
541
|
+
* order sweeps or by the order-ssl API.
|
|
542
|
+
*
|
|
543
|
+
* Never for a domain that serves a certificate its owner uploaded. Throws
|
|
544
|
+
* what the order throws, so a caller can show why.
|
|
545
|
+
*/
|
|
546
|
+
@CaptureSpan()
|
|
547
|
+
public async orderCertIfMissing(
|
|
548
|
+
statusPageDomain: StatusPageDomain,
|
|
549
|
+
options?: {
|
|
550
|
+
// An order of the sweeps: it draws from their shared window budget.
|
|
551
|
+
fromSweep?: boolean | undefined;
|
|
374
552
|
/*
|
|
375
|
-
*
|
|
376
|
-
*
|
|
377
|
-
* the caller must not order.
|
|
553
|
+
* An order somebody asked for (Check now, the order API): it draws
|
|
554
|
+
* from the on-demand budget (CertificateOrder.ON_DEMAND_ORDER_BUDGET).
|
|
378
555
|
*/
|
|
556
|
+
onDemand?: boolean | undefined;
|
|
557
|
+
// The caller has just found the domain's CNAME record.
|
|
558
|
+
cnameVerifiedJustNow?: boolean | undefined;
|
|
559
|
+
// Order for an expired certificate too (Check now).
|
|
560
|
+
renewIfExpired?: boolean | undefined;
|
|
561
|
+
},
|
|
562
|
+
): Promise<CertificateOrderOutcome> {
|
|
563
|
+
const domainToOrder: StatusPageDomain =
|
|
564
|
+
await this.getDomainToOrder(statusPageDomain);
|
|
565
|
+
|
|
566
|
+
// The sweeps never order for one either: it serves the upload.
|
|
567
|
+
if (domainToOrder.isCustomCertificate) {
|
|
379
568
|
throw new BadDataException(
|
|
380
|
-
"
|
|
569
|
+
"This domain uses a certificate you uploaded, so there is no free SSL certificate to order for it.",
|
|
381
570
|
);
|
|
382
571
|
}
|
|
383
572
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
573
|
+
const domainId: ObjectID = domainToOrder.id!;
|
|
574
|
+
|
|
575
|
+
return await CertificateOrder.orderIfMissing({
|
|
576
|
+
domain: domainToOrder.fullDomain as string,
|
|
577
|
+
renewIfExpired: options?.renewIfExpired,
|
|
578
|
+
recordAsOrdered: async (): Promise<void> => {
|
|
579
|
+
await this.recordCertificatesAsOrdered([domainId]);
|
|
580
|
+
},
|
|
581
|
+
order: async (
|
|
582
|
+
lock: CertificateOrderLockHandle,
|
|
583
|
+
): Promise<CertificateOrderOutcome> => {
|
|
584
|
+
return await this.orderCert(domainToOrder, {
|
|
585
|
+
reason: CertificateOrderReason.FirstCertificate,
|
|
586
|
+
lock: lock,
|
|
587
|
+
cnameVerifiedJustNow: options?.cnameVerifiedJustNow,
|
|
588
|
+
mayOrder: CertificateOrder.getOrderShare({
|
|
589
|
+
sweep: options?.fromSweep
|
|
590
|
+
? {
|
|
591
|
+
budget: Service.SWEEP_ORDER_BUDGET,
|
|
592
|
+
maxPerWindow: Service.ORDER_MAX_PER_RUN,
|
|
593
|
+
}
|
|
594
|
+
: undefined,
|
|
595
|
+
onDemand: options?.onDemand
|
|
596
|
+
? { projectId: domainToOrder.projectId?.toString() }
|
|
597
|
+
: undefined,
|
|
598
|
+
}),
|
|
599
|
+
});
|
|
600
|
+
},
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/*
|
|
605
|
+
* Called by verify-cname once it has found the domain's CNAME record:
|
|
606
|
+
* order the domain's free certificate now rather than at the next run of
|
|
607
|
+
* the order sweep, and say what happens to its certificate next
|
|
608
|
+
* (CustomDomainOrders.orderOnceCnameIsVerified, which dashboard domains
|
|
609
|
+
* share). Never rejects.
|
|
610
|
+
*/
|
|
611
|
+
@CaptureSpan()
|
|
612
|
+
public async orderCertOnceCnameIsVerified(
|
|
613
|
+
statusPageDomain: StatusPageDomain,
|
|
614
|
+
options?: { waitInMs?: number | undefined },
|
|
615
|
+
): Promise<CustomDomainVerificationResult> {
|
|
616
|
+
return await CustomDomainOrders.orderOnceCnameIsVerified({
|
|
617
|
+
domain: statusPageDomain,
|
|
618
|
+
waitInMs: options?.waitInMs,
|
|
619
|
+
recordAsOrdered: async (): Promise<void> => {
|
|
620
|
+
await this.recordCertificatesAsOrdered([statusPageDomain.id!]);
|
|
621
|
+
},
|
|
622
|
+
orderIfMissing: async (): Promise<CertificateOrderOutcome> => {
|
|
623
|
+
return await this.orderCertIfMissing(statusPageDomain, {
|
|
624
|
+
onDemand: true,
|
|
625
|
+
// The route found the record a moment ago.
|
|
626
|
+
cnameVerifiedJustNow: true,
|
|
627
|
+
renewIfExpired: true,
|
|
628
|
+
});
|
|
629
|
+
},
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
/*
|
|
634
|
+
* Order the first certificate of each of these domains, whose CNAME is
|
|
635
|
+
* verified: at most ORDER_MAX_PER_RUN orders, picked afresh every run; a
|
|
636
|
+
* domain that has a certificate already is only recorded as ordered, and
|
|
637
|
+
* one whose orders keep failing waits longer after each failure
|
|
638
|
+
* (CustomDomainOrders.orderForVerifiedDomainsWithoutOne, which the
|
|
639
|
+
* dashboard sweeps share).
|
|
640
|
+
*/
|
|
641
|
+
private async orderCertsForVerifiedDomainsWithoutOne(
|
|
642
|
+
domains: Array<StatusPageDomain>,
|
|
643
|
+
options?: {
|
|
644
|
+
// Every one of them was verified a moment ago, by this caller.
|
|
645
|
+
cnameVerifiedJustNow?: boolean | undefined;
|
|
646
|
+
},
|
|
647
|
+
): Promise<void> {
|
|
648
|
+
await CustomDomainOrders.orderForVerifiedDomainsWithoutOne<StatusPageDomain>(
|
|
649
|
+
{
|
|
650
|
+
domains: domains,
|
|
651
|
+
maxPerRun: Service.ORDER_MAX_PER_RUN,
|
|
652
|
+
recordAsOrdered: async (domainIds: Array<ObjectID>): Promise<void> => {
|
|
653
|
+
await this.recordCertificatesAsOrdered(domainIds);
|
|
654
|
+
},
|
|
655
|
+
orderIfMissing: async (
|
|
656
|
+
domain: StatusPageDomain,
|
|
657
|
+
): Promise<CertificateOrderOutcome> => {
|
|
658
|
+
return await this.orderCertIfMissing(domain, {
|
|
659
|
+
fromSweep: true,
|
|
660
|
+
cnameVerifiedJustNow: options?.cnameVerifiedJustNow,
|
|
661
|
+
});
|
|
662
|
+
},
|
|
663
|
+
},
|
|
387
664
|
);
|
|
665
|
+
}
|
|
388
666
|
|
|
389
|
-
|
|
667
|
+
/*
|
|
668
|
+
* Where the certificates of these domains stand, for the Custom Domains
|
|
669
|
+
* page's Status column (CustomDomainCertificates): each one's expiry, and
|
|
670
|
+
* its last failed order while no order since has succeeded.
|
|
671
|
+
*/
|
|
672
|
+
@CaptureSpan()
|
|
673
|
+
public async getCertificates(
|
|
674
|
+
domains: Array<StatusPageDomain>,
|
|
675
|
+
): Promise<Array<CustomDomainCertificate>> {
|
|
676
|
+
return await CustomDomainOrders.getCertificates(domains);
|
|
390
677
|
}
|
|
391
678
|
|
|
392
679
|
@CaptureSpan()
|
|
@@ -491,7 +778,32 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
491
778
|
}
|
|
492
779
|
|
|
493
780
|
@CaptureSpan()
|
|
494
|
-
public async isCnameValid(
|
|
781
|
+
public async isCnameValid(
|
|
782
|
+
fullDomain: string,
|
|
783
|
+
options?: {
|
|
784
|
+
/*
|
|
785
|
+
* Whether the answer is written to the domain row: verified, or
|
|
786
|
+
* unverified, unordered and unprovisioned. The renewal run passes
|
|
787
|
+
* false - a DNS blip while it renews must not reset a domain whose
|
|
788
|
+
* certificate it keeps; the provisioning sweep still notices a
|
|
789
|
+
* record that is really gone.
|
|
790
|
+
*/
|
|
791
|
+
recordResult?: boolean | undefined;
|
|
792
|
+
},
|
|
793
|
+
): Promise<boolean> {
|
|
794
|
+
const recordResult: (cnameStatus: boolean) => Promise<void> = async (
|
|
795
|
+
cnameStatus: boolean,
|
|
796
|
+
): Promise<void> => {
|
|
797
|
+
if (options?.recordResult === false) {
|
|
798
|
+
return;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
await this.updateCnameStatusForStatusPageDomain({
|
|
802
|
+
domain: fullDomain,
|
|
803
|
+
cnameStatus: cnameStatus,
|
|
804
|
+
});
|
|
805
|
+
};
|
|
806
|
+
|
|
495
807
|
try {
|
|
496
808
|
// get the token from the domain.
|
|
497
809
|
|
|
@@ -540,10 +852,7 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
540
852
|
logger.debug(result, { fullDomain } as LogAttributes);
|
|
541
853
|
|
|
542
854
|
if (result.isSuccess()) {
|
|
543
|
-
await
|
|
544
|
-
domain: fullDomain,
|
|
545
|
-
cnameStatus: true,
|
|
546
|
-
});
|
|
855
|
+
await recordResult(true);
|
|
547
856
|
|
|
548
857
|
return true;
|
|
549
858
|
}
|
|
@@ -573,10 +882,7 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
573
882
|
logger.debug(resultHttps, { fullDomain } as LogAttributes);
|
|
574
883
|
|
|
575
884
|
if (resultHttps.isSuccess()) {
|
|
576
|
-
await
|
|
577
|
-
domain: fullDomain,
|
|
578
|
-
cnameStatus: true,
|
|
579
|
-
});
|
|
885
|
+
await recordResult(true);
|
|
580
886
|
|
|
581
887
|
return true;
|
|
582
888
|
}
|
|
@@ -605,10 +911,7 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
605
911
|
`No CNAME record found for ${fullDomain}. Expected record: ${StatusPageCNameRecord}`,
|
|
606
912
|
{ fullDomain } as LogAttributes,
|
|
607
913
|
);
|
|
608
|
-
await
|
|
609
|
-
domain: fullDomain,
|
|
610
|
-
cnameStatus: false,
|
|
611
|
-
});
|
|
914
|
+
await recordResult(false);
|
|
612
915
|
return false;
|
|
613
916
|
}
|
|
614
917
|
|
|
@@ -622,10 +925,7 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
622
925
|
{ fullDomain } as LogAttributes,
|
|
623
926
|
);
|
|
624
927
|
|
|
625
|
-
await
|
|
626
|
-
domain: fullDomain,
|
|
627
|
-
cnameStatus: true,
|
|
628
|
-
});
|
|
928
|
+
await recordResult(true);
|
|
629
929
|
|
|
630
930
|
return true;
|
|
631
931
|
}
|
|
@@ -642,10 +942,7 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
642
942
|
logger.debug(err, { fullDomain } as LogAttributes);
|
|
643
943
|
}
|
|
644
944
|
|
|
645
|
-
await
|
|
646
|
-
domain: fullDomain,
|
|
647
|
-
cnameStatus: false,
|
|
648
|
-
});
|
|
945
|
+
await recordResult(false);
|
|
649
946
|
|
|
650
947
|
return false;
|
|
651
948
|
} catch (err) {
|
|
@@ -654,15 +951,32 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
654
951
|
} as LogAttributes);
|
|
655
952
|
logger.debug(err, { fullDomain } as LogAttributes);
|
|
656
953
|
|
|
657
|
-
await
|
|
658
|
-
domain: fullDomain,
|
|
659
|
-
cnameStatus: false,
|
|
660
|
-
});
|
|
954
|
+
await recordResult(false);
|
|
661
955
|
|
|
662
956
|
return false;
|
|
663
957
|
}
|
|
664
958
|
}
|
|
665
959
|
|
|
960
|
+
/*
|
|
961
|
+
* Record whether this domain's certificate is being served yet.
|
|
962
|
+
*
|
|
963
|
+
* This never orders a certificate. It used to re-order whenever the HTTPS
|
|
964
|
+
* probe failed while the CNAME still checked out - and right after an
|
|
965
|
+
* order the probe fails as a rule, because nginx writes new certificates
|
|
966
|
+
* to disk every 15 minutes, so a new domain was ordered twice. The
|
|
967
|
+
* re-order could also delete a working certificate: it checks the CNAME
|
|
968
|
+
* once more, and GreenlockUtil.orderCert removes the name's certificate
|
|
969
|
+
* when that check fails, so a moment's DNS trouble between the two checks
|
|
970
|
+
* took the domain off HTTPS. The two cases that do need an order have
|
|
971
|
+
* capped sweeps of their own: checkOrderStatus re-orders a certificate
|
|
972
|
+
* that has gone missing, and the renewal run renews one that is about to
|
|
973
|
+
* expire or has expired.
|
|
974
|
+
*
|
|
975
|
+
* When the probe fails the CNAME is checked again, so a domain whose
|
|
976
|
+
* record was removed goes back to asking for it. The result is written
|
|
977
|
+
* only when it changes: this sweep visits every ordered domain every 15
|
|
978
|
+
* minutes.
|
|
979
|
+
*/
|
|
666
980
|
@CaptureSpan()
|
|
667
981
|
public async updateSslProvisioningStatus(
|
|
668
982
|
domain: StatusPageDomain,
|
|
@@ -679,6 +993,7 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
679
993
|
_id: true,
|
|
680
994
|
fullDomain: true,
|
|
681
995
|
cnameVerificationToken: true,
|
|
996
|
+
isSslProvisioned: true,
|
|
682
997
|
},
|
|
683
998
|
props: {
|
|
684
999
|
isRoot: true,
|
|
@@ -690,52 +1005,25 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
690
1005
|
}
|
|
691
1006
|
|
|
692
1007
|
logger.debug(
|
|
693
|
-
`StatusPageCerts:
|
|
1008
|
+
`StatusPageCerts:CheckSslProvisioningStatus - Checking ${statusPageDomain.fullDomain}`,
|
|
694
1009
|
{ fullDomain: statusPageDomain.fullDomain } as LogAttributes,
|
|
695
1010
|
);
|
|
696
1011
|
|
|
697
|
-
|
|
698
|
-
const isValid: boolean = await this.isSSLProvisioned(
|
|
1012
|
+
const isProvisioned: boolean = await this.isSSLProvisioned(
|
|
699
1013
|
statusPageDomain.fullDomain!,
|
|
700
1014
|
statusPageDomain.cnameVerificationToken!,
|
|
701
1015
|
);
|
|
702
1016
|
|
|
703
|
-
if (!
|
|
704
|
-
//
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
statusPageDomain.fullDomain!,
|
|
708
|
-
);
|
|
709
|
-
|
|
710
|
-
await this.updateOneById({
|
|
711
|
-
id: statusPageDomain.id!,
|
|
712
|
-
data: {
|
|
713
|
-
isSslProvisioned: false,
|
|
714
|
-
},
|
|
715
|
-
props: {
|
|
716
|
-
isRoot: true,
|
|
717
|
-
},
|
|
718
|
-
});
|
|
1017
|
+
if (!isProvisioned) {
|
|
1018
|
+
// isCnameValid also records the result on the domain.
|
|
1019
|
+
await this.isCnameValid(statusPageDomain.fullDomain!);
|
|
1020
|
+
}
|
|
719
1021
|
|
|
720
|
-
|
|
721
|
-
try {
|
|
722
|
-
// if cname is valid then order cert again.
|
|
723
|
-
await this.orderCert(statusPageDomain);
|
|
724
|
-
} catch (err) {
|
|
725
|
-
logger.error(
|
|
726
|
-
"Cannot order cert for domain: " + statusPageDomain.fullDomain,
|
|
727
|
-
{ fullDomain: statusPageDomain.fullDomain } as LogAttributes,
|
|
728
|
-
);
|
|
729
|
-
logger.error(err, {
|
|
730
|
-
fullDomain: statusPageDomain.fullDomain,
|
|
731
|
-
} as LogAttributes);
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
} else {
|
|
1022
|
+
if (Boolean(statusPageDomain.isSslProvisioned) !== isProvisioned) {
|
|
735
1023
|
await this.updateOneById({
|
|
736
1024
|
id: statusPageDomain.id!,
|
|
737
1025
|
data: {
|
|
738
|
-
isSslProvisioned:
|
|
1026
|
+
isSslProvisioned: isProvisioned,
|
|
739
1027
|
},
|
|
740
1028
|
props: {
|
|
741
1029
|
isRoot: true,
|
|
@@ -744,6 +1032,19 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
744
1032
|
}
|
|
745
1033
|
}
|
|
746
1034
|
|
|
1035
|
+
/*
|
|
1036
|
+
* Order the first certificate of every verified domain that has none yet,
|
|
1037
|
+
* at most ORDER_MAX_PER_RUN per run (orderCertsForVerifiedDomainsWithoutOne).
|
|
1038
|
+
*
|
|
1039
|
+
* Only verified domains. This sweep used to try every domain not marked
|
|
1040
|
+
* ordered, verified or not, and without a limit: for a domain whose record
|
|
1041
|
+
* was not in place that was one more failed CNAME check every 15 minutes,
|
|
1042
|
+
* and for one whose check failed for a moment it was a duplicate order -
|
|
1043
|
+
* or, if the check failed again during the order, the deletion of its
|
|
1044
|
+
* working certificate. verifyCnameWhoseCnameisNotVerified checks the
|
|
1045
|
+
* unverified domains, and orders each one's certificate the moment it is
|
|
1046
|
+
* verified; this sweep is the fallback for the rest.
|
|
1047
|
+
*/
|
|
747
1048
|
@CaptureSpan()
|
|
748
1049
|
public async orderSSLForDomainsWhichAreNotOrderedYet(): Promise<void> {
|
|
749
1050
|
return Telemetry.startActiveSpan<Promise<void>>({
|
|
@@ -751,34 +1052,25 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
751
1052
|
options: { attributes: {} },
|
|
752
1053
|
fn: async (span: Span): Promise<void> => {
|
|
753
1054
|
try {
|
|
754
|
-
const domains: Array<StatusPageDomain> = await this.
|
|
1055
|
+
const domains: Array<StatusPageDomain> = await this.findAllBy({
|
|
755
1056
|
query: {
|
|
1057
|
+
isCnameVerified: true,
|
|
756
1058
|
isSslOrdered: false,
|
|
757
1059
|
isCustomCertificate: false, // only order for non custom certificates.
|
|
758
1060
|
},
|
|
759
1061
|
select: {
|
|
760
1062
|
_id: true,
|
|
761
1063
|
fullDomain: true,
|
|
1064
|
+
isSslOrdered: true,
|
|
1065
|
+
isCustomCertificate: true,
|
|
762
1066
|
},
|
|
763
|
-
limit: LIMIT_MAX,
|
|
764
1067
|
skip: 0,
|
|
765
1068
|
props: {
|
|
766
1069
|
isRoot: true,
|
|
767
1070
|
},
|
|
768
1071
|
});
|
|
769
1072
|
|
|
770
|
-
|
|
771
|
-
try {
|
|
772
|
-
logger.debug("Ordering SSL for domain: " + domain.fullDomain, {
|
|
773
|
-
fullDomain: domain.fullDomain,
|
|
774
|
-
} as LogAttributes);
|
|
775
|
-
await this.orderCert(domain);
|
|
776
|
-
} catch (e) {
|
|
777
|
-
logger.error(e, {
|
|
778
|
-
fullDomain: domain.fullDomain,
|
|
779
|
-
} as LogAttributes);
|
|
780
|
-
}
|
|
781
|
-
}
|
|
1073
|
+
await this.orderCertsForVerifiedDomainsWithoutOne(domains);
|
|
782
1074
|
|
|
783
1075
|
Telemetry.endSpan(span);
|
|
784
1076
|
} catch (err) {
|
|
@@ -793,6 +1085,14 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
793
1085
|
});
|
|
794
1086
|
}
|
|
795
1087
|
|
|
1088
|
+
/*
|
|
1089
|
+
* Check every domain whose CNAME is not verified yet, at most
|
|
1090
|
+
* SSL_PROVISIONING_CHECK_CONCURRENCY at a time, and order the certificate
|
|
1091
|
+
* of each one that is verified now straight away rather than at the next
|
|
1092
|
+
* run of the order sweep. So a domain is served on its own certificate
|
|
1093
|
+
* within about 15 minutes of its record going live - nginx writes new
|
|
1094
|
+
* certificates every 15 minutes - whether or not anyone clicked Check now.
|
|
1095
|
+
*/
|
|
796
1096
|
@CaptureSpan()
|
|
797
1097
|
public async verifyCnameWhoseCnameisNotVerified(): Promise<void> {
|
|
798
1098
|
const domains: Array<StatusPageDomain> = await this.findBy({
|
|
@@ -802,6 +1102,8 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
802
1102
|
select: {
|
|
803
1103
|
_id: true,
|
|
804
1104
|
fullDomain: true,
|
|
1105
|
+
isCustomCertificate: true,
|
|
1106
|
+
isSslOrdered: true,
|
|
805
1107
|
},
|
|
806
1108
|
limit: LIMIT_MAX,
|
|
807
1109
|
skip: 0,
|
|
@@ -810,22 +1112,99 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
810
1112
|
},
|
|
811
1113
|
});
|
|
812
1114
|
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
1115
|
+
const verifiedNow: Array<StatusPageDomain> = [];
|
|
1116
|
+
|
|
1117
|
+
await ArrayUtil.forEachWithConcurrency(
|
|
1118
|
+
domains,
|
|
1119
|
+
Service.SSL_PROVISIONING_CHECK_CONCURRENCY,
|
|
1120
|
+
async (domain: StatusPageDomain): Promise<void> => {
|
|
1121
|
+
try {
|
|
1122
|
+
// isCnameValid also records the result on the domain.
|
|
1123
|
+
const isVerified: boolean = await this.isCnameValid(
|
|
1124
|
+
domain.fullDomain as string,
|
|
1125
|
+
);
|
|
1126
|
+
|
|
1127
|
+
if (isVerified && !domain.isCustomCertificate) {
|
|
1128
|
+
verifiedNow.push(domain);
|
|
1129
|
+
}
|
|
1130
|
+
} catch (e) {
|
|
1131
|
+
logger.error(e, {
|
|
1132
|
+
fullDomain: domain.fullDomain as string,
|
|
1133
|
+
} as LogAttributes);
|
|
1134
|
+
}
|
|
1135
|
+
},
|
|
1136
|
+
);
|
|
1137
|
+
|
|
1138
|
+
try {
|
|
1139
|
+
/*
|
|
1140
|
+
* Each was verified by this run a moment ago, so the orders do not
|
|
1141
|
+
* check the CNAME again.
|
|
1142
|
+
*/
|
|
1143
|
+
await this.orderCertsForVerifiedDomainsWithoutOne(verifiedNow, {
|
|
1144
|
+
cnameVerifiedJustNow: true,
|
|
1145
|
+
});
|
|
1146
|
+
} catch (e) {
|
|
1147
|
+
// The order sweep orders them on its next run.
|
|
1148
|
+
logger.error(e);
|
|
821
1149
|
}
|
|
822
1150
|
}
|
|
823
1151
|
|
|
1152
|
+
/*
|
|
1153
|
+
* Which of these certificate domains are status page domains. The renewal
|
|
1154
|
+
* run renews - and removes - only the certificates this returns, so the
|
|
1155
|
+
* certificates of dashboard domains and of the primary host, which share
|
|
1156
|
+
* the AcmeCertificate table, are never mistaken for status page domains
|
|
1157
|
+
* whose CNAME stopped validating.
|
|
1158
|
+
*
|
|
1159
|
+
* A domain serving a certificate its owner uploaded still claims its
|
|
1160
|
+
* Let's Encrypt certificate, which stays renewed meanwhile: nginx serves
|
|
1161
|
+
* the uploaded one for that name (AcmeWriteCertificates leaves it alone),
|
|
1162
|
+
* and switching back is then instant, on every nginx replica, including
|
|
1163
|
+
* ones that start with an empty certificate directory.
|
|
1164
|
+
*/
|
|
1165
|
+
@CaptureSpan()
|
|
1166
|
+
public async getOwnedDomains(domains: Array<string>): Promise<Array<string>> {
|
|
1167
|
+
if (domains.length === 0) {
|
|
1168
|
+
return [];
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
const statusPageDomains: Array<StatusPageDomain> = await this.findBy({
|
|
1172
|
+
query: {
|
|
1173
|
+
fullDomain: QueryHelper.any(domains),
|
|
1174
|
+
},
|
|
1175
|
+
select: {
|
|
1176
|
+
fullDomain: true,
|
|
1177
|
+
},
|
|
1178
|
+
limit: LIMIT_MAX,
|
|
1179
|
+
skip: 0,
|
|
1180
|
+
props: {
|
|
1181
|
+
isRoot: true,
|
|
1182
|
+
},
|
|
1183
|
+
});
|
|
1184
|
+
|
|
1185
|
+
return statusPageDomains
|
|
1186
|
+
.map((statusPageDomain: StatusPageDomain) => {
|
|
1187
|
+
return statusPageDomain.fullDomain || "";
|
|
1188
|
+
})
|
|
1189
|
+
.filter((fullDomain: string) => {
|
|
1190
|
+
return fullDomain.length > 0;
|
|
1191
|
+
});
|
|
1192
|
+
}
|
|
1193
|
+
|
|
824
1194
|
@CaptureSpan()
|
|
825
1195
|
public async renewCertsWhichAreExpiringSoon(): Promise<void> {
|
|
826
1196
|
await GreenlockUtil.renewAllCertsWhichAreExpiringSoon({
|
|
1197
|
+
getOwnedDomains: async (domains: Array<string>) => {
|
|
1198
|
+
return await this.getOwnedDomains(domains);
|
|
1199
|
+
},
|
|
1200
|
+
/*
|
|
1201
|
+
* A check that writes nothing: a DNS blip while a certificate is
|
|
1202
|
+
* renewed must not mark the domain unverified and unordered while its
|
|
1203
|
+
* certificate keeps serving. The provisioning sweep still notices a
|
|
1204
|
+
* record that is really gone.
|
|
1205
|
+
*/
|
|
827
1206
|
validateCname: async (fullDomain: string) => {
|
|
828
|
-
return await this.isCnameValid(fullDomain);
|
|
1207
|
+
return await this.isCnameValid(fullDomain, { recordResult: false });
|
|
829
1208
|
},
|
|
830
1209
|
notifyDomainRemoved: async (domain: string) => {
|
|
831
1210
|
// mark the domain as not ordered.
|
|
@@ -849,9 +1228,20 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
849
1228
|
});
|
|
850
1229
|
}
|
|
851
1230
|
|
|
1231
|
+
/*
|
|
1232
|
+
* Re-order the certificate of a domain that says it has one ordered but
|
|
1233
|
+
* whose certificate is gone, at most ORDER_MAX_PER_RUN per run, picked
|
|
1234
|
+
* afresh every run. It used to look the certificates up one domain at a
|
|
1235
|
+
* time and re-order every missing one in the same run, without a limit.
|
|
1236
|
+
*
|
|
1237
|
+
* The re-order goes through orderCertIfMissing like every first order, so
|
|
1238
|
+
* it never races one that Check now or the order sweep is placing. A
|
|
1239
|
+
* domain whose last re-orders failed waits longer after each failure
|
|
1240
|
+
* (CertificateOrderFailures).
|
|
1241
|
+
*/
|
|
852
1242
|
@CaptureSpan()
|
|
853
1243
|
public async checkOrderStatus(): Promise<void> {
|
|
854
|
-
const domains: Array<StatusPageDomain> = await this.
|
|
1244
|
+
const domains: Array<StatusPageDomain> = await this.findAllBy({
|
|
855
1245
|
query: {
|
|
856
1246
|
isSslOrdered: true,
|
|
857
1247
|
isCustomCertificate: false,
|
|
@@ -859,44 +1249,63 @@ export class Service extends DatabaseService<StatusPageDomain> {
|
|
|
859
1249
|
select: {
|
|
860
1250
|
_id: true,
|
|
861
1251
|
fullDomain: true,
|
|
862
|
-
|
|
1252
|
+
isCustomCertificate: true,
|
|
863
1253
|
},
|
|
864
|
-
limit: LIMIT_MAX,
|
|
865
1254
|
skip: 0,
|
|
866
1255
|
props: {
|
|
867
1256
|
isRoot: true,
|
|
868
1257
|
},
|
|
869
1258
|
});
|
|
870
1259
|
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
}
|
|
1260
|
+
const domainsWithName: Array<StatusPageDomain> = domains.filter(
|
|
1261
|
+
(domain: StatusPageDomain) => {
|
|
1262
|
+
return Boolean(domain.id) && Boolean(domain.fullDomain);
|
|
1263
|
+
},
|
|
1264
|
+
);
|
|
875
1265
|
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
query: {
|
|
880
|
-
domain: domain.fullDomain,
|
|
881
|
-
},
|
|
882
|
-
select: {
|
|
883
|
-
_id: true,
|
|
884
|
-
},
|
|
885
|
-
props: {
|
|
886
|
-
isRoot: true,
|
|
887
|
-
},
|
|
888
|
-
});
|
|
1266
|
+
if (domainsWithName.length === 0) {
|
|
1267
|
+
return;
|
|
1268
|
+
}
|
|
889
1269
|
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
}
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
1270
|
+
const certificates: Map<string, AcmeCertificate> =
|
|
1271
|
+
await GreenlockUtil.findCertificatesByDomain(
|
|
1272
|
+
domainsWithName.map((domain: StatusPageDomain) => {
|
|
1273
|
+
return CertificateOrder.normalizeDomain(domain.fullDomain as string);
|
|
1274
|
+
}),
|
|
1275
|
+
);
|
|
1276
|
+
|
|
1277
|
+
const now: Date = OneUptimeDate.getCurrentDate();
|
|
1278
|
+
|
|
1279
|
+
const domainsWithoutCertificate: Array<StatusPageDomain> =
|
|
1280
|
+
await CertificateOrderFailures.withoutThoseWaitingToRetry({
|
|
1281
|
+
items: domainsWithName.filter((domain: StatusPageDomain) => {
|
|
1282
|
+
return !certificates.has(
|
|
1283
|
+
CertificateOrder.normalizeDomain(domain.fullDomain as string),
|
|
1284
|
+
);
|
|
1285
|
+
}),
|
|
1286
|
+
getDomain: (domain: StatusPageDomain): string => {
|
|
1287
|
+
return domain.fullDomain as string;
|
|
1288
|
+
},
|
|
1289
|
+
now: now,
|
|
1290
|
+
});
|
|
1291
|
+
|
|
1292
|
+
const batch: Array<StatusPageDomain> = GreenlockUtil.pickForThisRun({
|
|
1293
|
+
items: domainsWithoutCertificate,
|
|
1294
|
+
max: Service.ORDER_MAX_PER_RUN,
|
|
1295
|
+
now: now,
|
|
1296
|
+
getKey: (domain: StatusPageDomain): string => {
|
|
1297
|
+
return domain.fullDomain || "";
|
|
1298
|
+
},
|
|
1299
|
+
});
|
|
1300
|
+
|
|
1301
|
+
for (const domain of batch) {
|
|
1302
|
+
try {
|
|
1303
|
+
await this.orderCertIfMissing(domain, { fromSweep: true });
|
|
1304
|
+
} catch (err) {
|
|
1305
|
+
logger.error("Cannot order cert for domain: " + domain.fullDomain, {
|
|
1306
|
+
fullDomain: domain.fullDomain,
|
|
1307
|
+
} as LogAttributes);
|
|
1308
|
+
logger.error(err, { fullDomain: domain.fullDomain } as LogAttributes);
|
|
900
1309
|
}
|
|
901
1310
|
}
|
|
902
1311
|
}
|