@oneuptime/common 12.0.10 → 12.0.12

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 (98) hide show
  1. package/Models/DatabaseModels/NetworkDevice.ts +44 -0
  2. package/Models/DatabaseModels/NetworkDeviceLink.ts +116 -0
  3. package/Server/Infrastructure/Postgres/SchemaMigrations/1787400000000-AddDeviceRoleAndDeclaredLinkParent.ts +52 -0
  4. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  5. package/Server/Services/NetworkDeviceLinkService.ts +338 -2
  6. package/Server/Types/Billing/MeteredPlan/AllMeteredPlans.ts +19 -5
  7. package/Server/Types/Database/JSONColumnQuery.ts +42 -4
  8. package/Server/Types/Workflow/Components/Conditions/IfElse.ts +9 -0
  9. package/Server/Types/Workflow/Components/JavaScript.ts +9 -0
  10. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +12 -0
  11. package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +186 -38
  12. package/Server/Utils/VM/VMRunner.ts +693 -874
  13. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +420 -112
  14. package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +543 -0
  15. package/Tests/App/Dashboard/PayAsYouGoFreePlan.test.ts +125 -0
  16. package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +612 -0
  17. package/Tests/App/Dashboard/SloWidgetChartRendering.test.tsx +536 -0
  18. package/Tests/Models/AnalyticsModels/CommonModel.test.ts +312 -0
  19. package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +250 -0
  20. package/Tests/Server/Infrastructure/Postgres/EpisodeMemberNotifyIndexesMigration.test.ts +46 -18
  21. package/Tests/Server/Services/NetworkDeviceLinkParentValidation.test.ts +1043 -0
  22. package/Tests/Server/Types/Billing/PayAsYouGoMeteredPricing.test.ts +125 -0
  23. package/Tests/Server/Types/Database/JSONColumnQuery.test.ts +508 -0
  24. package/Tests/Server/Types/Workflow/Components/CustomCodeScriptError.test.ts +121 -0
  25. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorJavascriptExpression.test.ts +92 -0
  26. package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +668 -0
  27. package/Tests/Server/Utils/VM/VMRunnerIsolation.test.ts +385 -0
  28. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +3 -0
  29. package/Tests/Types/Billing/PayAsYouGoPricing.test.ts +64 -0
  30. package/Tests/Types/CustomField/CustomFieldTypeCorrespondence.test.ts +107 -0
  31. package/Tests/Types/Monitor/MonitorType.test.ts +62 -0
  32. package/Tests/UI/Components/Charts/ChartXAxisDataKey.test.tsx +256 -0
  33. package/Tests/UI/Components/Charts/DataPointUtil.test.ts +323 -0
  34. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +349 -1
  35. package/Tests/Utils/Monitor/NetworkDeviceRoleUtil.test.ts +502 -0
  36. package/Tests/Utils/Monitor/NetworkTopologyDeclaredHierarchy.test.ts +759 -0
  37. package/Tests/Utils/Schema/BaseSchema.test.ts +651 -0
  38. package/Types/Billing/PayAsYouGoPricing.ts +47 -0
  39. package/Types/CustomField/CustomFieldType.ts +28 -0
  40. package/Types/Monitor/CustomCodeMonitor/CustomCodeMonitorResponse.ts +14 -2
  41. package/Types/Monitor/MonitorType.ts +11 -0
  42. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
  43. package/UI/Components/Charts/Area/AreaChart.tsx +4 -2
  44. package/UI/Components/Charts/Bar/BarChart.tsx +4 -2
  45. package/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.ts +13 -0
  46. package/UI/Components/Charts/Line/LineChart.tsx +4 -2
  47. package/UI/Components/Charts/Types/XAxis/XAxis.ts +6 -0
  48. package/UI/Components/Charts/Utils/DataPoint.ts +15 -12
  49. package/UI/Components/ModelTable/CustomFieldColumns.tsx +55 -0
  50. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +45 -0
  51. package/Utils/Monitor/NetworkTopologyUtil.ts +42 -2
  52. package/build/dist/Models/DatabaseModels/NetworkDevice.js +45 -0
  53. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  54. package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js +115 -0
  55. package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js.map +1 -1
  56. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787400000000-AddDeviceRoleAndDeclaredLinkParent.js +33 -0
  57. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787400000000-AddDeviceRoleAndDeclaredLinkParent.js.map +1 -0
  58. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  59. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  60. package/build/dist/Server/Services/NetworkDeviceLinkService.js +253 -1
  61. package/build/dist/Server/Services/NetworkDeviceLinkService.js.map +1 -1
  62. package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js +12 -5
  63. package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js.map +1 -1
  64. package/build/dist/Server/Types/Database/JSONColumnQuery.js +40 -4
  65. package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -1
  66. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js +8 -0
  67. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js.map +1 -1
  68. package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
  69. package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
  70. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +12 -1
  71. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  72. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +128 -35
  73. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
  74. package/build/dist/Server/Utils/VM/VMRunner.js +402 -525
  75. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  76. package/build/dist/Types/Billing/PayAsYouGoPricing.js +41 -0
  77. package/build/dist/Types/Billing/PayAsYouGoPricing.js.map +1 -0
  78. package/build/dist/Types/CustomField/CustomFieldType.js +26 -0
  79. package/build/dist/Types/CustomField/CustomFieldType.js.map +1 -1
  80. package/build/dist/Types/Monitor/MonitorType.js +10 -0
  81. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  82. package/build/dist/UI/Components/Charts/Area/AreaChart.js +2 -1
  83. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  84. package/build/dist/UI/Components/Charts/Bar/BarChart.js +2 -1
  85. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  86. package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js +12 -0
  87. package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js.map +1 -1
  88. package/build/dist/UI/Components/Charts/Line/LineChart.js +2 -1
  89. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  90. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +17 -10
  91. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  92. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +42 -0
  93. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
  94. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +37 -0
  95. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
  96. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +25 -3
  97. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  98. package/package.json +1 -1
@@ -0,0 +1,121 @@
1
+ import JavaScriptCode from "../../../../../Server/Types/Workflow/Components/JavaScript";
2
+ import IfElse from "../../../../../Server/Types/Workflow/Components/Conditions/IfElse";
3
+ import {
4
+ RunOptions,
5
+ RunReturnType,
6
+ } from "../../../../../Server/Types/Workflow/ComponentCode";
7
+ import VMUtil from "../../../../../Server/Utils/VM/VMAPI";
8
+ import ReturnResult from "../../../../../Types/IsolatedVM/ReturnResult";
9
+ import Exception from "../../../../../Types/Exception/Exception";
10
+ import ObjectID from "../../../../../Types/ObjectID";
11
+ import { describe, expect, test, afterEach } from "@jest/globals";
12
+
13
+ interface OptionsFixture {
14
+ options: RunOptions;
15
+ log: jest.Mock;
16
+ onError: jest.Mock;
17
+ }
18
+
19
+ function makeOptions(): OptionsFixture {
20
+ const log: jest.Mock = jest.fn();
21
+ const onError: jest.Mock = jest.fn((exception: Exception): Exception => {
22
+ return exception;
23
+ });
24
+
25
+ return {
26
+ log,
27
+ onError,
28
+ options: {
29
+ log: log as RunOptions["log"],
30
+ workflowLogId: ObjectID.generate(),
31
+ workflowId: ObjectID.generate(),
32
+ projectId: ObjectID.generate(),
33
+ onError: onError as RunOptions["onError"],
34
+ executeWorkflow: async (): Promise<void> => {},
35
+ } as RunOptions,
36
+ };
37
+ }
38
+
39
+ afterEach(() => {
40
+ jest.restoreAllMocks();
41
+ });
42
+
43
+ describe("Custom JavaScript component scriptError routing", () => {
44
+ test("routes to the error port when the sandbox resolves with scriptError", async () => {
45
+ const sandboxResult: ReturnResult = {
46
+ returnValue: undefined,
47
+ logMessages: ["before failure"],
48
+ capturedMetrics: [],
49
+ scriptError: new Error("script exploded"),
50
+ };
51
+ jest.spyOn(VMUtil, "runCodeInSandbox").mockResolvedValue(sandboxResult);
52
+
53
+ const { options, log }: OptionsFixture = makeOptions();
54
+ const result: RunReturnType = await new JavaScriptCode().run(
55
+ { code: "throw new Error('script exploded');" },
56
+ options,
57
+ );
58
+
59
+ expect(result.executePort?.id).toBe("error");
60
+ expect(log).toHaveBeenCalledWith("before failure");
61
+ expect(log).toHaveBeenCalledWith("Error running script");
62
+ expect(log).toHaveBeenCalledWith("script exploded");
63
+ });
64
+
65
+ test("routes to the success port with the return value on success", async () => {
66
+ const sandboxResult: ReturnResult = {
67
+ returnValue: { answer: 42 },
68
+ logMessages: [],
69
+ capturedMetrics: [],
70
+ };
71
+ jest.spyOn(VMUtil, "runCodeInSandbox").mockResolvedValue(sandboxResult);
72
+
73
+ const { options }: OptionsFixture = makeOptions();
74
+ const result: RunReturnType = await new JavaScriptCode().run(
75
+ { code: "return { answer: 42 };" },
76
+ options,
77
+ );
78
+
79
+ expect(result.executePort?.id).toBe("success");
80
+ expect(result.returnValues).toEqual({ returnValue: { answer: 42 } });
81
+ });
82
+ });
83
+
84
+ describe("If/Else component scriptError handling", () => {
85
+ test("fails the run instead of silently taking a branch when the expression errors", async () => {
86
+ const sandboxResult: ReturnResult = {
87
+ returnValue: undefined,
88
+ logMessages: [],
89
+ capturedMetrics: [],
90
+ scriptError: new Error("expression exploded"),
91
+ };
92
+ jest.spyOn(VMUtil, "runCodeInSandbox").mockResolvedValue(sandboxResult);
93
+
94
+ const { options, onError }: OptionsFixture = makeOptions();
95
+
96
+ await expect(
97
+ new IfElse().run(
98
+ { "input-1": "a", "input-2": "b", operator: "==" },
99
+ options,
100
+ ),
101
+ ).rejects.toThrow("expression exploded");
102
+ expect(onError).toHaveBeenCalled();
103
+ });
104
+
105
+ test("takes the Yes branch when the expression evaluates truthy", async () => {
106
+ const sandboxResult: ReturnResult = {
107
+ returnValue: true,
108
+ logMessages: [],
109
+ capturedMetrics: [],
110
+ };
111
+ jest.spyOn(VMUtil, "runCodeInSandbox").mockResolvedValue(sandboxResult);
112
+
113
+ const { options }: OptionsFixture = makeOptions();
114
+ const result: RunReturnType = await new IfElse().run(
115
+ { "input-1": "a", "input-2": "a", operator: "==" },
116
+ options,
117
+ );
118
+
119
+ expect(result.executePort?.id).toBe("yes");
120
+ });
121
+ });
@@ -0,0 +1,92 @@
1
+ import MonitorCriteriaEvaluator from "../../../../Server/Utils/Monitor/MonitorCriteriaEvaluator";
2
+ import VMUtil from "../../../../Server/Utils/VM/VMAPI";
3
+ import Monitor from "../../../../Models/DatabaseModels/Monitor";
4
+ import MonitorStep from "../../../../Types/Monitor/MonitorStep";
5
+ import {
6
+ CheckOn,
7
+ CriteriaFilter,
8
+ } from "../../../../Types/Monitor/CriteriaFilter";
9
+ import MonitorType from "../../../../Types/Monitor/MonitorType";
10
+ import ReturnResult from "../../../../Types/IsolatedVM/ReturnResult";
11
+ import ObjectID from "../../../../Types/ObjectID";
12
+ import { describe, expect, test, afterEach } from "@jest/globals";
13
+
14
+ type EvaluatorPrivate = {
15
+ isMonitorInstanceCriteriaFilterMet: (input: {
16
+ dataToProcess: unknown;
17
+ monitorStep: MonitorStep;
18
+ monitor: Monitor;
19
+ probeApiIngestResponse: unknown;
20
+ criteriaInstance: unknown;
21
+ criteriaFilter: CriteriaFilter;
22
+ }) => Promise<string | null>;
23
+ };
24
+
25
+ const Evaluator: EvaluatorPrivate =
26
+ MonitorCriteriaEvaluator as unknown as EvaluatorPrivate;
27
+
28
+ function makeInput(): Parameters<
29
+ EvaluatorPrivate["isMonitorInstanceCriteriaFilterMet"]
30
+ >[0] {
31
+ const monitor: Monitor = new Monitor();
32
+ monitor.projectId = ObjectID.generate();
33
+ monitor.monitorType = MonitorType.Ping;
34
+
35
+ return {
36
+ dataToProcess: { isOnline: true },
37
+ monitorStep: new MonitorStep(),
38
+ monitor,
39
+ probeApiIngestResponse: {},
40
+ criteriaInstance: {},
41
+ criteriaFilter: {
42
+ checkOn: CheckOn.JavaScriptExpression,
43
+ value: "1 === 1",
44
+ } as CriteriaFilter,
45
+ };
46
+ }
47
+
48
+ afterEach(() => {
49
+ jest.restoreAllMocks();
50
+ });
51
+
52
+ describe("MonitorCriteriaEvaluator JavaScript expression criteria", () => {
53
+ test("treats a sandbox scriptError as criteria not met", async () => {
54
+ const sandboxResult: ReturnResult = {
55
+ returnValue: undefined,
56
+ logMessages: [],
57
+ capturedMetrics: [],
58
+ scriptError: new Error("expression exploded"),
59
+ };
60
+ jest.spyOn(VMUtil, "runCodeInSandbox").mockResolvedValue(sandboxResult);
61
+
62
+ const result: string | null =
63
+ await Evaluator.isMonitorInstanceCriteriaFilterMet(makeInput());
64
+
65
+ expect(result).toBeNull();
66
+ });
67
+
68
+ test("reports the criteria as met when the expression evaluates truthy", async () => {
69
+ const sandboxResult: ReturnResult = {
70
+ returnValue: true,
71
+ logMessages: [],
72
+ capturedMetrics: [],
73
+ };
74
+ jest.spyOn(VMUtil, "runCodeInSandbox").mockResolvedValue(sandboxResult);
75
+
76
+ const result: string | null =
77
+ await Evaluator.isMonitorInstanceCriteriaFilterMet(makeInput());
78
+
79
+ expect(result).toContain("evaluated to true");
80
+ });
81
+
82
+ test("treats a sandbox rejection as criteria not met", async () => {
83
+ jest
84
+ .spyOn(VMUtil, "runCodeInSandbox")
85
+ .mockRejectedValue(new Error("isolate crashed"));
86
+
87
+ const result: string | null =
88
+ await Evaluator.isMonitorInstanceCriteriaFilterMet(makeInput());
89
+
90
+ expect(result).toBeNull();
91
+ });
92
+ });