@oneuptime/common 12.0.13 → 12.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/OnCallDutyPolicySchedule.ts +14 -0
- package/Models/DatabaseModels/UserCall.ts +94 -3
- package/Models/DatabaseModels/UserEmail.ts +94 -3
- package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
- package/Models/DatabaseModels/UserPush.ts +37 -0
- package/Models/DatabaseModels/UserSMS.ts +94 -3
- package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
- package/Server/API/BaseAPI.ts +79 -14
- package/Server/API/UserCallAPI.ts +53 -45
- package/Server/API/UserEmailAPI.ts +53 -44
- package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
- package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
- package/Server/API/UserPushAPI.ts +126 -2
- package/Server/API/UserSmsAPI.ts +53 -44
- package/Server/API/UserWhatsAppAPI.ts +53 -50
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/DatabaseService.ts +101 -0
- package/Server/Services/LogAggregationService.ts +5 -0
- package/Server/Services/PushNotificationService.ts +127 -12
- package/Server/Services/TeamMemberService.ts +53 -13
- package/Server/Services/UserCallService.ts +55 -24
- package/Server/Services/UserEmailService.ts +83 -17
- package/Server/Services/UserIncomingCallNumberService.ts +49 -85
- package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
- package/Server/Services/UserNotificationRuleService.ts +26 -0
- package/Server/Services/UserPushService.ts +89 -0
- package/Server/Services/UserSmsService.ts +50 -17
- package/Server/Services/UserWhatsAppService.ts +48 -15
- package/Server/Types/Database/QueryHelper.ts +30 -0
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
- package/Server/Utils/ChannelVerification.ts +510 -0
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
- package/Server/Utils/TotpAuth.ts +137 -9
- package/Server/Utils/UserRegistrationToken.ts +182 -0
- package/Server/Utils/VerificationCode.ts +134 -0
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +28 -0
- package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
- package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
- package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
- package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
- package/Tests/Server/API/UserSmsApi.test.ts +107 -14
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
- package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
- package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
- package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
- package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
- package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
- package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
- package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
- package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
- package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
- package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
- package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
- package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
- package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
- package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
- package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
- package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
- package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
- package/Tests/Server/Utils/Browser.test.ts +162 -0
- package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
- package/Tests/Server/Utils/Express.test.ts +371 -0
- package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
- package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
- package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
- package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
- package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
- package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
- package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
- package/Tests/Types/Call/CallRequest.test.ts +189 -0
- package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
- package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
- package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
- package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
- package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
- package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
- package/Tests/Types/TextRandomGeneration.test.ts +211 -0
- package/Tests/UI/Components/Button.test.tsx +175 -1
- package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
- package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
- package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
- package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
- package/Tests/UI/Components/List.test.tsx +9 -2
- package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
- package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
- package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
- package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
- package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
- package/Tests/UI/Components/Skeleton.test.tsx +71 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
- package/Tests/UI/Components/Tabs.test.tsx +24 -0
- package/Tests/UI/Components/Toast.test.tsx +130 -7
- package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
- package/Tests/UI/Utils/Dropdown.test.ts +423 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
- package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
- package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
- package/Tests/Utils/API.test.ts +16 -2
- package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
- package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
- package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
- package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
- package/Types/Permission.ts +35 -0
- package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
- package/Types/PushNotification/PushNotificationMessage.ts +15 -0
- package/Types/PushNotification/PushNotificationRequest.ts +8 -16
- package/Types/Service/ServiceLanguage.ts +144 -0
- package/Types/Text.ts +111 -19
- package/UI/Components/Button/Button.tsx +27 -14
- package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
- package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
- package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
- package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
- package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
- package/UI/Components/CommandPalette/Types.ts +49 -0
- package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/Feed/FeedItem.tsx +1 -1
- package/UI/Components/List/List.tsx +37 -5
- package/UI/Components/List/ListSkeleton.tsx +54 -0
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
- package/UI/Components/Modal/Modal.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
- package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
- package/UI/Components/Navbar/NavBar.tsx +14 -1
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
- package/UI/Components/SideOver/SideOver.tsx +37 -2
- package/UI/Components/Skeleton/Skeleton.tsx +53 -0
- package/UI/Components/Table/Table.tsx +74 -44
- package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
- package/UI/Components/Tabs/Tab.tsx +1 -1
- package/UI/Components/Toast/Toast.tsx +118 -53
- package/UI/Components/Toast/ToastInit.tsx +82 -32
- package/UI/Styles/Theme.css +40 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
- package/UI/Utils/ModelListCache.ts +188 -0
- package/UI/Utils/Project.ts +29 -0
- package/Utils/API.ts +6 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
- package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
- package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
- package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
- package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +69 -13
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +42 -38
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +42 -38
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
- package/build/dist/Server/API/UserPushAPI.js +95 -2
- package/build/dist/Server/API/UserPushAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +42 -38
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +74 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +5 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +69 -30
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +43 -7
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/UserCallService.js +54 -22
- package/build/dist/Server/Services/UserCallService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +78 -17
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserPushService.js +77 -0
- package/build/dist/Server/Services/UserPushService.js.map +1 -1
- package/build/dist/Server/Services/UserSmsService.js +50 -17
- package/build/dist/Server/Services/UserSmsService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
- package/build/dist/Server/Utils/ChannelVerification.js +348 -0
- package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/TotpAuth.js +127 -8
- package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
- package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
- package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
- package/build/dist/Server/Utils/VerificationCode.js +120 -0
- package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +33 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
- package/build/dist/Types/Service/ServiceLanguage.js +96 -0
- package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
- package/build/dist/Types/Text.js +82 -17
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +22 -14
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
- package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/List/List.js +19 -5
- package/build/dist/UI/Components/List/List.js.map +1 -1
- package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
- package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
- package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +35 -24
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
- package/build/dist/UI/Components/Tabs/Tab.js +1 -1
- package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
- package/build/dist/UI/Components/Toast/Toast.js +77 -23
- package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
- package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
- package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelListCache.js +126 -0
- package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
- package/build/dist/UI/Utils/Project.js +24 -1
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/Utils/API.js +6 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/jest.config.json +1 -1
- package/package.json +2 -3
- package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
- package/Tests/__mocks__/otpauth.js +0 -30
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
|
@@ -3,6 +3,7 @@ import MonitorRecommendationCatalog, {
|
|
|
3
3
|
} from "../../../../Types/Monitor/Recommendation/MonitorRecommendationCatalog";
|
|
4
4
|
import {
|
|
5
5
|
MonitorRecommendation,
|
|
6
|
+
MonitorRecommendationContext,
|
|
6
7
|
MonitorRecommendationResourceType,
|
|
7
8
|
buildRecommendationId,
|
|
8
9
|
} from "../../../../Types/Monitor/Recommendation/MonitorRecommendationTypes";
|
|
@@ -17,9 +18,14 @@ import { getAllKubernetesAlertTemplates } from "../../../../Types/Monitor/Kubern
|
|
|
17
18
|
import { getAllPodmanAlertTemplates } from "../../../../Types/Monitor/PodmanAlertTemplates";
|
|
18
19
|
import { getAllProxmoxAlertTemplates } from "../../../../Types/Monitor/ProxmoxAlertTemplates";
|
|
19
20
|
import { getAllRumAlertTemplates } from "../../../../Types/Monitor/RumAlertTemplates";
|
|
21
|
+
import {
|
|
22
|
+
getAllServiceAlertTemplates,
|
|
23
|
+
getLanguagesWithServiceAlertTemplates,
|
|
24
|
+
getServiceAlertTemplates,
|
|
25
|
+
} from "../../../../Types/Monitor/ServiceAlertTemplates";
|
|
20
26
|
|
|
21
27
|
/*
|
|
22
|
-
* The catalog is the seam between
|
|
28
|
+
* The catalog is the seam between ten independently-maintained alert-template
|
|
23
29
|
* modules and one Recommendations UI. Everything it can silently get wrong is
|
|
24
30
|
* a wiring mistake that produces a page that looks fine and creates broken or
|
|
25
31
|
* duplicated monitors:
|
|
@@ -43,12 +49,25 @@ import { getAllRumAlertTemplates } from "../../../../Types/Monitor/RumAlertTempl
|
|
|
43
49
|
interface ModuleExpectation {
|
|
44
50
|
resourceType: MonitorRecommendationResourceType;
|
|
45
51
|
monitorTypes: Array<MonitorType>;
|
|
52
|
+
/*
|
|
53
|
+
* Everything the module can ever produce. For nine of the ten this is also
|
|
54
|
+
* what the page shows; for Service it is the union across every runtime.
|
|
55
|
+
*/
|
|
46
56
|
templateCount: number;
|
|
57
|
+
/*
|
|
58
|
+
* What `getRecommendations(resourceType)` returns with NO context — what a
|
|
59
|
+
* caller that knows nothing about the specific resource is offered. Equal to
|
|
60
|
+
* `templateCount` for every resource type whose set is a constant, and
|
|
61
|
+
* smaller for Service, where knowing nothing means the language-agnostic
|
|
62
|
+
* subset.
|
|
63
|
+
*/
|
|
64
|
+
contextFreeTemplateCount: number;
|
|
47
65
|
identifierFieldName:
|
|
48
66
|
| "clusterIdentifier"
|
|
49
67
|
| "hostIdentifier"
|
|
50
68
|
| "fleetIdentifier"
|
|
51
|
-
| "rumApplicationId"
|
|
69
|
+
| "rumApplicationId"
|
|
70
|
+
| "serviceId";
|
|
52
71
|
}
|
|
53
72
|
|
|
54
73
|
const MODULE_EXPECTATIONS: Array<ModuleExpectation> = [
|
|
@@ -56,48 +75,56 @@ const MODULE_EXPECTATIONS: Array<ModuleExpectation> = [
|
|
|
56
75
|
resourceType: MonitorRecommendationResourceType.Kubernetes,
|
|
57
76
|
monitorTypes: [MonitorType.Kubernetes],
|
|
58
77
|
templateCount: getAllKubernetesAlertTemplates().length,
|
|
78
|
+
contextFreeTemplateCount: getAllKubernetesAlertTemplates().length,
|
|
59
79
|
identifierFieldName: "clusterIdentifier",
|
|
60
80
|
},
|
|
61
81
|
{
|
|
62
82
|
resourceType: MonitorRecommendationResourceType.Host,
|
|
63
83
|
monitorTypes: [MonitorType.Host],
|
|
64
84
|
templateCount: getAllHostAlertTemplates().length,
|
|
85
|
+
contextFreeTemplateCount: getAllHostAlertTemplates().length,
|
|
65
86
|
identifierFieldName: "hostIdentifier",
|
|
66
87
|
},
|
|
67
88
|
{
|
|
68
89
|
resourceType: MonitorRecommendationResourceType.Docker,
|
|
69
90
|
monitorTypes: [MonitorType.Docker],
|
|
70
91
|
templateCount: getAllDockerAlertTemplates().length,
|
|
92
|
+
contextFreeTemplateCount: getAllDockerAlertTemplates().length,
|
|
71
93
|
identifierFieldName: "hostIdentifier",
|
|
72
94
|
},
|
|
73
95
|
{
|
|
74
96
|
resourceType: MonitorRecommendationResourceType.DockerSwarm,
|
|
75
97
|
monitorTypes: [MonitorType.DockerSwarm],
|
|
76
98
|
templateCount: getAllDockerSwarmAlertTemplates().length,
|
|
99
|
+
contextFreeTemplateCount: getAllDockerSwarmAlertTemplates().length,
|
|
77
100
|
identifierFieldName: "clusterIdentifier",
|
|
78
101
|
},
|
|
79
102
|
{
|
|
80
103
|
resourceType: MonitorRecommendationResourceType.Podman,
|
|
81
104
|
monitorTypes: [MonitorType.Podman],
|
|
82
105
|
templateCount: getAllPodmanAlertTemplates().length,
|
|
106
|
+
contextFreeTemplateCount: getAllPodmanAlertTemplates().length,
|
|
83
107
|
identifierFieldName: "hostIdentifier",
|
|
84
108
|
},
|
|
85
109
|
{
|
|
86
110
|
resourceType: MonitorRecommendationResourceType.Proxmox,
|
|
87
111
|
monitorTypes: [MonitorType.Proxmox],
|
|
88
112
|
templateCount: getAllProxmoxAlertTemplates().length,
|
|
113
|
+
contextFreeTemplateCount: getAllProxmoxAlertTemplates().length,
|
|
89
114
|
identifierFieldName: "clusterIdentifier",
|
|
90
115
|
},
|
|
91
116
|
{
|
|
92
117
|
resourceType: MonitorRecommendationResourceType.Ceph,
|
|
93
118
|
monitorTypes: [MonitorType.Ceph],
|
|
94
119
|
templateCount: getAllCephAlertTemplates().length,
|
|
120
|
+
contextFreeTemplateCount: getAllCephAlertTemplates().length,
|
|
95
121
|
identifierFieldName: "clusterIdentifier",
|
|
96
122
|
},
|
|
97
123
|
{
|
|
98
124
|
resourceType: MonitorRecommendationResourceType.IoTDevice,
|
|
99
125
|
monitorTypes: [MonitorType.IoTDevice],
|
|
100
126
|
templateCount: getAllIoTAlertTemplates().length,
|
|
127
|
+
contextFreeTemplateCount: getAllIoTAlertTemplates().length,
|
|
101
128
|
identifierFieldName: "fleetIdentifier",
|
|
102
129
|
},
|
|
103
130
|
{
|
|
@@ -108,8 +135,26 @@ const MODULE_EXPECTATIONS: Array<ModuleExpectation> = [
|
|
|
108
135
|
MonitorType.Exceptions,
|
|
109
136
|
],
|
|
110
137
|
templateCount: getAllRumAlertTemplates().length,
|
|
138
|
+
contextFreeTemplateCount: getAllRumAlertTemplates().length,
|
|
111
139
|
identifierFieldName: "rumApplicationId",
|
|
112
140
|
},
|
|
141
|
+
{
|
|
142
|
+
resourceType: MonitorRecommendationResourceType.Service,
|
|
143
|
+
monitorTypes: [
|
|
144
|
+
MonitorType.Metrics,
|
|
145
|
+
MonitorType.Traces,
|
|
146
|
+
MonitorType.Exceptions,
|
|
147
|
+
],
|
|
148
|
+
templateCount: getAllServiceAlertTemplates().length,
|
|
149
|
+
/*
|
|
150
|
+
* The only row where these two differ, and the reason the field exists.
|
|
151
|
+
* `getServiceAlertTemplates(null)` is the module's own answer to "what
|
|
152
|
+
* applies to a service whose runtime is unknown", so this stays correct
|
|
153
|
+
* when a template moves between the agnostic and language-specific sets.
|
|
154
|
+
*/
|
|
155
|
+
contextFreeTemplateCount: getServiceAlertTemplates(null).length,
|
|
156
|
+
identifierFieldName: "serviceId",
|
|
157
|
+
},
|
|
113
158
|
];
|
|
114
159
|
|
|
115
160
|
describe("MonitorRecommendationCatalog", () => {
|
|
@@ -143,7 +188,17 @@ describe("MonitorRecommendationCatalog", () => {
|
|
|
143
188
|
/*
|
|
144
189
|
* A dropped `.map` or a filtered adapter would show up here as a count
|
|
145
190
|
* mismatch rather than as a quietly shorter list in the UI.
|
|
191
|
+
*
|
|
192
|
+
* Two counts, because the two questions are different and only one of
|
|
193
|
+
* them is context-free: `getRecommendations` with no context answers
|
|
194
|
+
* "what applies to a resource we know nothing about", while
|
|
195
|
+
* `getAllRecommendations` has to stay exhaustive or every invariant
|
|
196
|
+
* downstream of it silently stops covering the language-specific half of
|
|
197
|
+
* the service catalog.
|
|
146
198
|
*/
|
|
199
|
+
const allRecommendations: Array<MonitorRecommendation> =
|
|
200
|
+
MonitorRecommendationCatalog.getAllRecommendations();
|
|
201
|
+
|
|
147
202
|
for (const expectation of MODULE_EXPECTATIONS) {
|
|
148
203
|
const recommendations: Array<MonitorRecommendation> =
|
|
149
204
|
MonitorRecommendationCatalog.getRecommendations(
|
|
@@ -151,7 +206,16 @@ describe("MonitorRecommendationCatalog", () => {
|
|
|
151
206
|
);
|
|
152
207
|
|
|
153
208
|
expect(expectation.templateCount).toBeGreaterThan(0);
|
|
154
|
-
expect(
|
|
209
|
+
expect(expectation.contextFreeTemplateCount).toBeGreaterThan(0);
|
|
210
|
+
expect(recommendations.length).toBe(
|
|
211
|
+
expectation.contextFreeTemplateCount,
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
expect(
|
|
215
|
+
allRecommendations.filter((recommendation: MonitorRecommendation) => {
|
|
216
|
+
return recommendation.resourceType === expectation.resourceType;
|
|
217
|
+
}).length,
|
|
218
|
+
).toBe(expectation.templateCount);
|
|
155
219
|
}
|
|
156
220
|
});
|
|
157
221
|
|
|
@@ -195,8 +259,8 @@ describe("MonitorRecommendationCatalog", () => {
|
|
|
195
259
|
it("canary: raw templateIds happen to be globally unique today", () => {
|
|
196
260
|
/*
|
|
197
261
|
* Every module self-prefixes (`host-high-cpu`, `docker-high-cpu`,
|
|
198
|
-
* `podman-high-cpu`), so no two of
|
|
199
|
-
* convention across
|
|
262
|
+
* `podman-high-cpu`), so no two of them collide right now. That is a
|
|
263
|
+
* convention across ten independently maintained files, not a
|
|
200
264
|
* contract — each module only promises uniqueness within itself.
|
|
201
265
|
*
|
|
202
266
|
* This test is a canary, NOT a requirement the registry depends on. If
|
|
@@ -396,4 +460,197 @@ describe("MonitorRecommendationCatalog", () => {
|
|
|
396
460
|
).toEqual([]);
|
|
397
461
|
});
|
|
398
462
|
});
|
|
463
|
+
|
|
464
|
+
/*
|
|
465
|
+
* Services are the only resource type whose recommendation set is not a
|
|
466
|
+
* constant. Everything below is about the seam between "what applies to this
|
|
467
|
+
* resource" and "what this catalog can ever produce" — the two are the same
|
|
468
|
+
* question for nine resource types and different for the tenth, and the
|
|
469
|
+
* failure mode of conflating them is a page that offers JVM heap monitors to
|
|
470
|
+
* a Go service.
|
|
471
|
+
*/
|
|
472
|
+
describe("context-aware recommendations", () => {
|
|
473
|
+
const AGNOSTIC_COUNT: number = getServiceAlertTemplates(null).length;
|
|
474
|
+
|
|
475
|
+
function serviceRecommendationIds(
|
|
476
|
+
context?: MonitorRecommendationContext | undefined,
|
|
477
|
+
): Array<string> {
|
|
478
|
+
return MonitorRecommendationCatalog.getRecommendations(
|
|
479
|
+
MonitorRecommendationResourceType.Service,
|
|
480
|
+
context,
|
|
481
|
+
).map((recommendation: MonitorRecommendation) => {
|
|
482
|
+
return recommendation.recommendationId;
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
it("treats no context, an empty context and a null language alike", () => {
|
|
487
|
+
/*
|
|
488
|
+
* `detectServiceLanguage` returns null while an absent field is
|
|
489
|
+
* undefined, so both reach this API in practice. They mean the same
|
|
490
|
+
* thing and must not diverge — a null narrowing to some default language
|
|
491
|
+
* would be the worst possible reading of "we could not tell".
|
|
492
|
+
*/
|
|
493
|
+
const noContext: Array<string> = serviceRecommendationIds();
|
|
494
|
+
|
|
495
|
+
expect(noContext.length).toBe(AGNOSTIC_COUNT);
|
|
496
|
+
expect(serviceRecommendationIds({})).toEqual(noContext);
|
|
497
|
+
expect(serviceRecommendationIds({ serviceLanguage: null })).toEqual(
|
|
498
|
+
noContext,
|
|
499
|
+
);
|
|
500
|
+
expect(serviceRecommendationIds({ serviceLanguage: undefined })).toEqual(
|
|
501
|
+
noContext,
|
|
502
|
+
);
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
it("adds a runtime's own recommendations on top of the agnostic set", () => {
|
|
506
|
+
const agnostic: Array<string> = serviceRecommendationIds();
|
|
507
|
+
const forJava: Array<string> = serviceRecommendationIds({
|
|
508
|
+
serviceLanguage: "java",
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
expect(forJava.length).toBeGreaterThan(agnostic.length);
|
|
512
|
+
|
|
513
|
+
for (const recommendationId of agnostic) {
|
|
514
|
+
expect(forJava).toContain(recommendationId);
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
it("never offers one runtime's recommendations to another", () => {
|
|
519
|
+
const forJava: Array<string> = serviceRecommendationIds({
|
|
520
|
+
serviceLanguage: "java",
|
|
521
|
+
});
|
|
522
|
+
const forGo: Array<string> = serviceRecommendationIds({
|
|
523
|
+
serviceLanguage: "go",
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
const javaOnly: Array<string> = forJava.filter(
|
|
527
|
+
(recommendationId: string) => {
|
|
528
|
+
return !serviceRecommendationIds().includes(recommendationId);
|
|
529
|
+
},
|
|
530
|
+
);
|
|
531
|
+
|
|
532
|
+
expect(javaOnly.length).toBeGreaterThan(0);
|
|
533
|
+
|
|
534
|
+
for (const recommendationId of javaOnly) {
|
|
535
|
+
expect(forGo).not.toContain(recommendationId);
|
|
536
|
+
}
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
it("is inert for every resource type whose set is a constant", () => {
|
|
540
|
+
for (const resourceType of Object.values(
|
|
541
|
+
MonitorRecommendationResourceType,
|
|
542
|
+
)) {
|
|
543
|
+
if (resourceType === MonitorRecommendationResourceType.Service) {
|
|
544
|
+
continue;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
const withoutContext: Array<string> =
|
|
548
|
+
MonitorRecommendationCatalog.getRecommendations(resourceType).map(
|
|
549
|
+
(recommendation: MonitorRecommendation) => {
|
|
550
|
+
return recommendation.recommendationId;
|
|
551
|
+
},
|
|
552
|
+
);
|
|
553
|
+
|
|
554
|
+
const withContext: Array<string> =
|
|
555
|
+
MonitorRecommendationCatalog.getRecommendations(resourceType, {
|
|
556
|
+
serviceLanguage: "java",
|
|
557
|
+
}).map((recommendation: MonitorRecommendation) => {
|
|
558
|
+
return recommendation.recommendationId;
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
expect(withContext).toEqual(withoutContext);
|
|
562
|
+
}
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
it("keeps getAllRecommendations exhaustive", () => {
|
|
566
|
+
/*
|
|
567
|
+
* The registry-wide invariants — unique ids, distinct fingerprints,
|
|
568
|
+
* a mappable severity — all run over this. If it narrowed to the
|
|
569
|
+
* context-free subset, the language-specific templates would be the ones
|
|
570
|
+
* left unchecked, which is exactly the half most likely to collide.
|
|
571
|
+
*/
|
|
572
|
+
const serviceRecommendations: Array<MonitorRecommendation> =
|
|
573
|
+
MonitorRecommendationCatalog.getAllRecommendations().filter(
|
|
574
|
+
(recommendation: MonitorRecommendation) => {
|
|
575
|
+
return (
|
|
576
|
+
recommendation.resourceType ===
|
|
577
|
+
MonitorRecommendationResourceType.Service
|
|
578
|
+
);
|
|
579
|
+
},
|
|
580
|
+
);
|
|
581
|
+
|
|
582
|
+
expect(serviceRecommendations.length).toBe(
|
|
583
|
+
getAllServiceAlertTemplates().length,
|
|
584
|
+
);
|
|
585
|
+
expect(serviceRecommendations.length).toBeGreaterThan(AGNOSTIC_COUNT);
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
it("resolves a language-specific recommendation by id, with no context", () => {
|
|
589
|
+
/*
|
|
590
|
+
* The path a dismissal takes: the row stores a recommendation id and
|
|
591
|
+
* nothing about the language, so lookup has to work without one.
|
|
592
|
+
*/
|
|
593
|
+
for (const template of getAllServiceAlertTemplates()) {
|
|
594
|
+
const recommendationId: string = buildRecommendationId(
|
|
595
|
+
MonitorRecommendationResourceType.Service,
|
|
596
|
+
template.id,
|
|
597
|
+
);
|
|
598
|
+
|
|
599
|
+
expect(
|
|
600
|
+
MonitorRecommendationCatalog.getRecommendationById(recommendationId),
|
|
601
|
+
).toBeDefined();
|
|
602
|
+
}
|
|
603
|
+
});
|
|
604
|
+
|
|
605
|
+
it("lists the agnostic categories first, whatever the runtime", () => {
|
|
606
|
+
const agnosticCategories: Array<string> =
|
|
607
|
+
MonitorRecommendationCatalog.getCategories(
|
|
608
|
+
MonitorRecommendationResourceType.Service,
|
|
609
|
+
);
|
|
610
|
+
|
|
611
|
+
expect(agnosticCategories.length).toBeGreaterThan(0);
|
|
612
|
+
|
|
613
|
+
for (const language of getLanguagesWithServiceAlertTemplates()) {
|
|
614
|
+
const categories: Array<string> =
|
|
615
|
+
MonitorRecommendationCatalog.getCategories(
|
|
616
|
+
MonitorRecommendationResourceType.Service,
|
|
617
|
+
{ serviceLanguage: language },
|
|
618
|
+
);
|
|
619
|
+
|
|
620
|
+
expect(categories.slice(0, agnosticCategories.length)).toEqual(
|
|
621
|
+
agnosticCategories,
|
|
622
|
+
);
|
|
623
|
+
expect(categories.length).toBeGreaterThan(agnosticCategories.length);
|
|
624
|
+
}
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
it("carries the service monitor types the coverage query needs", () => {
|
|
628
|
+
/*
|
|
629
|
+
* The page queries existing monitors by these types. A missing one means
|
|
630
|
+
* monitors of that type are never considered, so every recommendation it
|
|
631
|
+
* covers renders as still-to-do and accepting it creates a duplicate.
|
|
632
|
+
*/
|
|
633
|
+
const definition: MonitorRecommendationResourceTypeDefinition =
|
|
634
|
+
MonitorRecommendationCatalog.getResourceTypeDefinition(
|
|
635
|
+
MonitorRecommendationResourceType.Service,
|
|
636
|
+
)!;
|
|
637
|
+
|
|
638
|
+
const usedMonitorTypes: Set<MonitorType> = new Set<MonitorType>(
|
|
639
|
+
MonitorRecommendationCatalog.getAllRecommendations()
|
|
640
|
+
.filter((recommendation: MonitorRecommendation) => {
|
|
641
|
+
return (
|
|
642
|
+
recommendation.resourceType ===
|
|
643
|
+
MonitorRecommendationResourceType.Service
|
|
644
|
+
);
|
|
645
|
+
})
|
|
646
|
+
.map((recommendation: MonitorRecommendation) => {
|
|
647
|
+
return recommendation.monitorType;
|
|
648
|
+
}),
|
|
649
|
+
);
|
|
650
|
+
|
|
651
|
+
for (const monitorType of usedMonitorTypes) {
|
|
652
|
+
expect(definition.monitorTypes).toContain(monitorType);
|
|
653
|
+
}
|
|
654
|
+
});
|
|
655
|
+
});
|
|
399
656
|
});
|
|
@@ -513,7 +513,7 @@ describe("MonitorRecommendationUtil.getCoveredRecommendationMonitorIds", () => {
|
|
|
513
513
|
* both a covered and an uncovered answer are exercised for all eight
|
|
514
514
|
* resource types.
|
|
515
515
|
*/
|
|
516
|
-
expect(RESOURCE_TYPE_DEFINITIONS.length).toBe(
|
|
516
|
+
expect(RESOURCE_TYPE_DEFINITIONS.length).toBe(10);
|
|
517
517
|
|
|
518
518
|
for (const definition of RESOURCE_TYPE_DEFINITIONS) {
|
|
519
519
|
const recommendations: Array<MonitorRecommendation> =
|
|
@@ -149,7 +149,7 @@ describe("MonitorRecommendationNotificationMode", () => {
|
|
|
149
149
|
it("has recommendations to test at all", () => {
|
|
150
150
|
// Guards every for-loop in this file against a vacuous pass.
|
|
151
151
|
expect(ALL_RECOMMENDATIONS.length).toBeGreaterThan(0);
|
|
152
|
-
expect(ONE_PER_RESOURCE_TYPE.length).toBe(
|
|
152
|
+
expect(ONE_PER_RESOURCE_TYPE.length).toBe(10);
|
|
153
153
|
});
|
|
154
154
|
|
|
155
155
|
it("ships every unhealthy criteria with createIncidents AND createAlerts true, and both arrays populated", () => {
|