@oneuptime/common 14.0.0 → 14.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/Models/DatabaseModels/Index.ts +4 -0
  2. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
  3. package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
  4. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
  5. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
  6. package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
  7. package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
  8. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  9. package/Server/Services/DatabaseService.ts +10 -0
  10. package/Server/Services/Index.ts +4 -0
  11. package/Server/Services/MonitorService.ts +3 -2
  12. package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
  13. package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
  14. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
  15. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
  16. package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
  17. package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
  18. package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
  19. package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
  20. package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
  21. package/Server/Utils/Monitor/AffectedResourceList.ts +31 -73
  22. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
  23. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
  24. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +181 -136
  25. package/Server/Utils/Monitor/RootCauseList.ts +139 -0
  26. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
  27. package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
  28. package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
  29. package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
  30. package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
  31. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
  32. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
  33. package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
  34. package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
  35. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
  36. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
  37. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
  38. package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
  39. package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
  40. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
  41. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
  42. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
  43. package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
  44. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
  45. package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
  46. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
  47. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  48. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  49. package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
  50. package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
  51. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
  52. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
  53. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
  54. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
  55. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
  56. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
  57. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
  58. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
  59. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
  60. package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
  61. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
  62. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
  63. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
  64. package/Tests/Server/Types/Markdown.test.ts +2 -1
  65. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
  66. package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
  67. package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
  68. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
  69. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +405 -0
  70. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
  71. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
  72. package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
  73. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
  74. package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
  75. package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
  76. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
  77. package/Tests/Types/API/Route.test.ts +56 -0
  78. package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
  79. package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
  80. package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
  81. package/Tests/UI/Components/Icon.test.tsx +26 -0
  82. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  83. package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
  84. package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
  85. package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
  86. package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
  87. package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
  88. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
  89. package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
  90. package/Types/API/Route.ts +19 -2
  91. package/Types/API/URL.ts +26 -2
  92. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
  93. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
  94. package/Types/Permission.ts +90 -0
  95. package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
  96. package/Types/Rules/RuleRun.ts +4 -0
  97. package/UI/Components/Feed/FeedOptions.ts +427 -0
  98. package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
  99. package/UI/Components/Feed/useFeedItems.ts +28 -9
  100. package/UI/Components/Feed/useFeedOptions.ts +225 -0
  101. package/UI/Components/Icon/Icon.tsx +1 -1
  102. package/Utils/LabelRuleImportExport.ts +27 -9
  103. package/Utils/Monitor/MetricValueFormatter.ts +2 -2
  104. package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
  105. package/Utils/Slo/SloDuration.ts +22 -6
  106. package/Utils/Slo/SloHealth.ts +8 -7
  107. package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
  108. package/Utils/Slo/SloOverviewText.ts +33 -0
  109. package/Utils/Slo/SloProjection.ts +4 -3
  110. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  111. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  112. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
  113. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
  114. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
  115. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
  116. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
  117. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
  118. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
  119. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
  120. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
  121. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
  122. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
  123. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
  124. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  125. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  126. package/build/dist/Server/Services/DatabaseService.js +7 -0
  127. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  128. package/build/dist/Server/Services/Index.js +4 -0
  129. package/build/dist/Server/Services/Index.js.map +1 -1
  130. package/build/dist/Server/Services/MonitorService.js +3 -2
  131. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  132. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
  133. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
  134. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
  135. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
  136. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
  137. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  138. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
  139. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
  140. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
  141. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
  142. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
  143. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
  144. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
  145. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  146. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
  147. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
  148. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
  149. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  150. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +22 -51
  151. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -1
  152. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
  153. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
  154. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +139 -109
  155. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  156. package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
  157. package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
  158. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
  159. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  160. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
  161. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
  162. package/build/dist/Types/API/Route.js +18 -2
  163. package/build/dist/Types/API/Route.js.map +1 -1
  164. package/build/dist/Types/API/URL.js +23 -2
  165. package/build/dist/Types/API/URL.js.map +1 -1
  166. package/build/dist/Types/Permission.js +84 -0
  167. package/build/dist/Types/Permission.js.map +1 -1
  168. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
  169. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  170. package/build/dist/Types/Rules/RuleRun.js +4 -0
  171. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  172. package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
  173. package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
  174. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
  175. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
  176. package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
  177. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
  178. package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
  179. package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
  180. package/build/dist/UI/Components/Icon/Icon.js +1 -1
  181. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  182. package/build/dist/Utils/LabelRuleImportExport.js +22 -6
  183. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  184. package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
  185. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
  186. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
  187. package/build/dist/Utils/Slo/SloDuration.js +13 -5
  188. package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
  189. package/build/dist/Utils/Slo/SloHealth.js +8 -7
  190. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  191. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
  192. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
  193. package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
  194. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
  195. package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
  196. package/package.json +1 -1
@@ -1,5 +1,7 @@
1
1
  import AlertReminderRule from "../../../Models/DatabaseModels/AlertReminderRule";
2
2
  import StatusPageMonitorRule from "../../../Models/DatabaseModels/StatusPageMonitorRule";
3
+ import ServiceLevelObjectiveMonitorRule from "../../../Models/DatabaseModels/ServiceLevelObjectiveMonitorRule";
4
+ import MonitorType from "../../../Types/Monitor/MonitorType";
3
5
  import DatabaseService from "../../../Server/Services/DatabaseService";
4
6
  import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
5
7
  import FilterCondition from "../../../Types/Filter/FilterCondition";
@@ -520,3 +522,105 @@ describe("DatabaseService rule criteria validation", () => {
520
522
  );
521
523
  });
522
524
  });
525
+
526
+ describe("DatabaseService SLO monitor type criteria validation", () => {
527
+ const sloService: DatabaseService<ServiceLevelObjectiveMonitorRule> =
528
+ new DatabaseService<ServiceLevelObjectiveMonitorRule>(
529
+ ServiceLevelObjectiveMonitorRule,
530
+ );
531
+ const sanitizeSlo: SanitizeFunction = async (
532
+ data: unknown,
533
+ props: DatabaseCommonInteractionProps = { isRoot: true },
534
+ isUpdate: boolean = true,
535
+ ): Promise<JSONObject> => {
536
+ return (await (
537
+ sloService as unknown as { sanitizeCreateOrUpdate: SanitizeFunction }
538
+ ).sanitizeCreateOrUpdate(data, props, isUpdate)) as JSONObject;
539
+ };
540
+
541
+ it.each([true, false])(
542
+ "persists valid type criteria with a fail-closed compatibility shadow on update=%p",
543
+ async (isUpdate: boolean) => {
544
+ const criteria: JSONObject = criteriaFor({
545
+ field: "monitorType",
546
+ operator: RuleCriteriaOperator.Equals,
547
+ value: MonitorType.Docker,
548
+ });
549
+ const result: JSONObject = await sanitizeSlo(
550
+ {
551
+ criteria,
552
+ monitorType: MonitorType.API,
553
+ monitorNamePattern: ".*",
554
+ monitorLabels: ["11111111-1111-4111-8111-111111111111"],
555
+ },
556
+ { isRoot: true },
557
+ isUpdate,
558
+ );
559
+ expect(result).toMatchObject({
560
+ criteria,
561
+ monitorType: null,
562
+ monitorNamePattern: "(?!)",
563
+ });
564
+ expect(result["monitorLabels"]).toBeUndefined();
565
+ },
566
+ );
567
+
568
+ it.each(Object.values(MonitorType))(
569
+ "accepts equality and inequality for %s",
570
+ async (monitorType: MonitorType) => {
571
+ for (const operator of [
572
+ RuleCriteriaOperator.Equals,
573
+ RuleCriteriaOperator.NotEquals,
574
+ ]) {
575
+ await expect(
576
+ sanitizeSlo({
577
+ criteria: criteriaFor({
578
+ field: "monitorType",
579
+ operator,
580
+ value: monitorType,
581
+ }),
582
+ }),
583
+ ).resolves.toBeDefined();
584
+ }
585
+ },
586
+ );
587
+
588
+ it.each(["Unknown", "api", "API.*", 1, true])(
589
+ "rejects invalid type value %p",
590
+ async (value: string | number | boolean) => {
591
+ await expect(
592
+ sanitizeSlo({
593
+ criteria: criteriaFor({
594
+ field: "monitorType",
595
+ operator: RuleCriteriaOperator.NotEquals,
596
+ value,
597
+ }),
598
+ }),
599
+ ).rejects.toThrow("valid monitor type");
600
+ },
601
+ );
602
+
603
+ it.each([
604
+ RuleCriteriaOperator.Contains,
605
+ RuleCriteriaOperator.DoesNotContain,
606
+ RuleCriteriaOperator.StartsWith,
607
+ RuleCriteriaOperator.EndsWith,
608
+ RuleCriteriaOperator.MatchesPattern,
609
+ RuleCriteriaOperator.DoesNotMatchPattern,
610
+ RuleCriteriaOperator.HasAnyOf,
611
+ RuleCriteriaOperator.HasAllOf,
612
+ RuleCriteriaOperator.HasNoneOf,
613
+ ])(
614
+ "rejects unsupported type operator %s",
615
+ async (operator: RuleCriteriaOperator) => {
616
+ const value: string | Array<string> = operator.startsWith("Has")
617
+ ? [MonitorType.API]
618
+ : MonitorType.API;
619
+ await expect(
620
+ sanitizeSlo({
621
+ criteria: criteriaFor({ field: "monitorType", operator, value }),
622
+ }),
623
+ ).rejects.toThrow("only support Equals");
624
+ },
625
+ );
626
+ });
@@ -28,6 +28,10 @@ import ServiceFeedService from "../../../../Server/Services/ServiceFeedService";
28
28
  import ServiceLabelRuleEngineService from "../../../../Server/Services/ServiceLabelRuleEngineService";
29
29
  import ServiceLabelRuleService from "../../../../Server/Services/ServiceLabelRuleService";
30
30
  import ServiceService from "../../../../Server/Services/ServiceService";
31
+ import ServiceLevelObjectiveFeedService from "../../../../Server/Services/ServiceLevelObjectiveFeedService";
32
+ import ServiceLevelObjectiveLabelRuleEngineService from "../../../../Server/Services/ServiceLevelObjectiveLabelRuleEngineService";
33
+ import ServiceLevelObjectiveLabelRuleService from "../../../../Server/Services/ServiceLevelObjectiveLabelRuleService";
34
+ import ServiceLevelObjectiveService from "../../../../Server/Services/ServiceLevelObjectiveService";
31
35
  import StatusPageLabelRuleEngineService from "../../../../Server/Services/StatusPageLabelRuleEngineService";
32
36
  import StatusPageLabelRuleService from "../../../../Server/Services/StatusPageLabelRuleService";
33
37
  import StatusPageService from "../../../../Server/Services/StatusPageService";
@@ -61,6 +65,8 @@ import ServerlessFunction from "../../../../Models/DatabaseModels/ServerlessFunc
61
65
  import ServerlessFunctionLabelRule from "../../../../Models/DatabaseModels/ServerlessFunctionLabelRule";
62
66
  import Service from "../../../../Models/DatabaseModels/Service";
63
67
  import ServiceLabelRule from "../../../../Models/DatabaseModels/ServiceLabelRule";
68
+ import ServiceLevelObjective from "../../../../Models/DatabaseModels/ServiceLevelObjective";
69
+ import ServiceLevelObjectiveLabelRule from "../../../../Models/DatabaseModels/ServiceLevelObjectiveLabelRule";
64
70
  import StatusPage from "../../../../Models/DatabaseModels/StatusPage";
65
71
  import StatusPageLabelRule from "../../../../Models/DatabaseModels/StatusPageLabelRule";
66
72
  import VMwareVCenter from "../../../../Models/DatabaseModels/VMwareVCenter";
@@ -397,6 +403,47 @@ const cases: Array<LabelEngineCase> = [
397
403
  },
398
404
  feedResourceIdKey: "serviceId",
399
405
  }),
406
+ labelEngineCase<ServiceLevelObjective, ServiceLevelObjectiveLabelRule>({
407
+ name: "ServiceLevelObjectiveLabelRuleEngineService",
408
+ engine: ServiceLevelObjectiveLabelRuleEngineService,
409
+ applyOnCreate: (resource: ServiceLevelObjective): Promise<void> => {
410
+ return ServiceLevelObjectiveLabelRuleEngineService.applyRulesToServiceLevelObjective(
411
+ resource,
412
+ );
413
+ },
414
+ ruleService:
415
+ ServiceLevelObjectiveLabelRuleService as unknown as RuleReadService,
416
+ resourceService: ServiceLevelObjectiveService as unknown as ResourceService,
417
+ resourceModel: ServiceLevelObjective,
418
+ textField: "name",
419
+ patternField: "serviceLevelObjectiveNamePattern",
420
+ labelMatchField: "serviceLevelObjectiveLabels",
421
+ matchesHandedResource: false,
422
+ syncsInMemoryLabels: true,
423
+ severity: null,
424
+ expectedRuleSelect: {
425
+ _id: true,
426
+ name: true,
427
+ criteria: true,
428
+ serviceLevelObjectiveLabels: { _id: true },
429
+ serviceLevelObjectiveNamePattern: true,
430
+ serviceLevelObjectiveDescriptionPattern: true,
431
+ labelsToAdd: { _id: true },
432
+ },
433
+ expectedResourceSelect: IDS_ONLY_RESOURCE_SELECT,
434
+ mockFeed: (): jest.SpyInstance => {
435
+ jest
436
+ .spyOn(ServiceLevelObjectiveService, "getSloMarkdownLink")
437
+ .mockResolvedValue(MARKDOWN_LINK);
438
+ return jest
439
+ .spyOn(
440
+ ServiceLevelObjectiveFeedService,
441
+ "createServiceLevelObjectiveFeedItem",
442
+ )
443
+ .mockResolvedValue(undefined);
444
+ },
445
+ feedResourceIdKey: "serviceLevelObjectiveId",
446
+ }),
400
447
  labelEngineCase<StatusPage, StatusPageLabelRule>({
401
448
  name: "StatusPageLabelRuleEngineService",
402
449
  engine: StatusPageLabelRuleEngineService,
@@ -797,7 +844,7 @@ describe("label rule engines (group B) - applying a rule to existing resources",
797
844
  cases.map((c: LabelEngineCase) => {
798
845
  return c.name;
799
846
  }),
800
- ).toHaveLength(11);
847
+ ).toHaveLength(12);
801
848
  });
802
849
 
803
850
  describe.each(cases)("$name", (c: LabelEngineCase) => {
@@ -43,6 +43,12 @@ import ServiceOwnerRuleService from "../../../../Server/Services/ServiceOwnerRul
43
43
  import ServiceOwnerTeamService from "../../../../Server/Services/ServiceOwnerTeamService";
44
44
  import ServiceOwnerUserService from "../../../../Server/Services/ServiceOwnerUserService";
45
45
  import ServiceService from "../../../../Server/Services/ServiceService";
46
+ import ServiceLevelObjectiveFeedService from "../../../../Server/Services/ServiceLevelObjectiveFeedService";
47
+ import ServiceLevelObjectiveOwnerRuleEngineService from "../../../../Server/Services/ServiceLevelObjectiveOwnerRuleEngineService";
48
+ import ServiceLevelObjectiveOwnerRuleService from "../../../../Server/Services/ServiceLevelObjectiveOwnerRuleService";
49
+ import ServiceLevelObjectiveOwnerTeamService from "../../../../Server/Services/ServiceLevelObjectiveOwnerTeamService";
50
+ import ServiceLevelObjectiveOwnerUserService from "../../../../Server/Services/ServiceLevelObjectiveOwnerUserService";
51
+ import ServiceLevelObjectiveService from "../../../../Server/Services/ServiceLevelObjectiveService";
46
52
  import StatusPageOwnerRuleEngineService from "../../../../Server/Services/StatusPageOwnerRuleEngineService";
47
53
  import StatusPageOwnerRuleService from "../../../../Server/Services/StatusPageOwnerRuleService";
48
54
  import StatusPageOwnerTeamService from "../../../../Server/Services/StatusPageOwnerTeamService";
@@ -78,6 +84,8 @@ import ServerlessFunctionOwnerTeam from "../../../../Models/DatabaseModels/Serve
78
84
  import ServerlessFunctionOwnerUser from "../../../../Models/DatabaseModels/ServerlessFunctionOwnerUser";
79
85
  import ServiceOwnerTeam from "../../../../Models/DatabaseModels/ServiceOwnerTeam";
80
86
  import ServiceOwnerUser from "../../../../Models/DatabaseModels/ServiceOwnerUser";
87
+ import ServiceLevelObjectiveOwnerTeam from "../../../../Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam";
88
+ import ServiceLevelObjectiveOwnerUser from "../../../../Models/DatabaseModels/ServiceLevelObjectiveOwnerUser";
81
89
  import StatusPageOwnerTeam from "../../../../Models/DatabaseModels/StatusPageOwnerTeam";
82
90
  import StatusPageOwnerUser from "../../../../Models/DatabaseModels/StatusPageOwnerUser";
83
91
  import VMwareVCenterOwnerTeam from "../../../../Models/DatabaseModels/VMwareVCenterOwnerTeam";
@@ -336,6 +344,28 @@ const ENGINE_CASES: Array<EngineCase> = [
336
344
  }),
337
345
  prepare: noop,
338
346
  },
347
+ {
348
+ name: "SLO",
349
+ engine: ServiceLevelObjectiveOwnerRuleEngineService,
350
+ createHook: "applyRulesToServiceLevelObjective",
351
+ ruleService: ServiceLevelObjectiveOwnerRuleService,
352
+ rereadService: ServiceLevelObjectiveService,
353
+ ownerUserService: ServiceLevelObjectiveOwnerUserService,
354
+ ownerTeamService: ServiceLevelObjectiveOwnerTeamService,
355
+ ownerUserModel: ServiceLevelObjectiveOwnerUser,
356
+ ownerTeamModel: ServiceLevelObjectiveOwnerTeam,
357
+ resourceIdColumn: "serviceLevelObjectiveId",
358
+ namePatternField: "serviceLevelObjectiveNamePattern",
359
+ hasNotificationFlag: true,
360
+ addOwnersService: null,
361
+ mockFeed: feedMock({
362
+ linkService: ServiceLevelObjectiveService,
363
+ linkMethod: "getSloMarkdownLink",
364
+ feedService: ServiceLevelObjectiveFeedService,
365
+ feedMethod: "createServiceLevelObjectiveFeedItem",
366
+ }),
367
+ prepare: noop,
368
+ },
339
369
  {
340
370
  name: "status page",
341
371
  engine: StatusPageOwnerRuleEngineService,