@oneuptime/common 12.0.34 → 13.0.0

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 (259) hide show
  1. package/Models/DatabaseModels/GlobalConfig.ts +12 -12
  2. package/Models/DatabaseModels/InventoryItem.ts +44 -1
  3. package/Models/DatabaseModels/NetworkDevice.ts +126 -0
  4. package/Server/EnvironmentConfig.ts +47 -16
  5. package/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.ts +25 -0
  6. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  7. package/Server/Infrastructure/Redis.ts +8 -8
  8. package/Server/Infrastructure/Status.ts +10 -4
  9. package/Server/Services/DatabaseService.ts +65 -13
  10. package/Server/Services/InventoryItemService.ts +31 -1
  11. package/Server/Services/MonitorTemplateService.ts +140 -19
  12. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +349 -41
  13. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +87 -2
  14. package/Server/Services/NetworkDeviceService.ts +69 -0
  15. package/Server/Services/UserNotificationRuleService.ts +76 -25
  16. package/Server/Types/Database/Permissions/ReadPermission.ts +45 -5
  17. package/Server/Types/Database/QueryUtil.ts +56 -0
  18. package/Server/Types/Markdown.ts +93 -1
  19. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +82 -17
  20. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +10 -1
  21. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +2 -2
  22. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +82 -35
  23. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +31 -5
  24. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +202 -37
  25. package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +82 -9
  26. package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +16 -7
  27. package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +29 -17
  28. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +107 -48
  29. package/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.ts +158 -0
  30. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +27 -0
  31. package/Server/Utils/Telemetry/EntityRegistry.ts +11 -1
  32. package/Server/Utils/Telemetry/TelemetryEntity.ts +83 -9
  33. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +32 -0
  34. package/Tests/App/Dashboard/AdoptedDeviceDrawer.test.tsx +374 -0
  35. package/Tests/App/Dashboard/DashboardLabelVariables.test.tsx +580 -0
  36. package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +438 -0
  37. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +5 -2
  38. package/Tests/App/Dashboard/DeviceAttachmentCard.test.tsx +273 -0
  39. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +505 -0
  40. package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +163 -0
  41. package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +401 -0
  42. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +232 -0
  43. package/Tests/App/Dashboard/InventoryItems.test.tsx +201 -0
  44. package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +798 -0
  45. package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +320 -0
  46. package/Tests/App/Dashboard/NetworkTopologyToolbar.test.tsx +275 -0
  47. package/Tests/App/Dashboard/OnCallCalendarFeedEmptyState.test.tsx +975 -0
  48. package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +63 -0
  49. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +626 -0
  50. package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +348 -0
  51. package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +331 -0
  52. package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +603 -0
  53. package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +324 -0
  54. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +13 -4
  55. package/Tests/App/StatusPage/StatusPageOidcOrigin.test.tsx +223 -0
  56. package/Tests/Models/InventoryItemStatus.test.ts +147 -0
  57. package/Tests/Models/NetworkDeviceMacAddressColumn.test.ts +294 -0
  58. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +129 -0
  59. package/Tests/Server/EnvironmentConfigValkey.test.ts +227 -0
  60. package/Tests/Server/Infrastructure/Postgres/AddMacAddressToNetworkDeviceMigration.test.ts +365 -0
  61. package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +62 -23
  62. package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +265 -0
  63. package/Tests/Server/Middleware/HttpMetricsMiddleware.test.ts +382 -0
  64. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +525 -0
  65. package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +291 -56
  66. package/Tests/Server/Services/DatabaseServiceSortTiebreaker.test.ts +151 -0
  67. package/Tests/Server/Services/InventoryItemManualCreate.test.ts +105 -0
  68. package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +178 -0
  69. package/Tests/Server/Services/MonitorTemplateServiceCustomFieldSync.test.ts +502 -0
  70. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1133 -81
  71. package/Tests/Server/Services/NetworkDeviceDiscoveryScanRegistration.test.ts +520 -0
  72. package/Tests/Server/Services/NetworkDeviceMacAddressNormalization.test.ts +572 -0
  73. package/Tests/Server/Types/Database/InventoryStatusPostgres.test.ts +368 -0
  74. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +261 -14
  75. package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroups.test.ts +169 -0
  76. package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroupsPostgres.test.ts +297 -0
  77. package/Tests/Server/Types/Markdown.test.ts +194 -1
  78. package/Tests/Server/Types/Workflow/Components/IncomingWebhookUtils.test.ts +279 -0
  79. package/Tests/Server/Types/Workflow/Components/TextToJson.test.ts +212 -0
  80. package/Tests/Server/Utils/CustomField/CustomFieldMappingRegistry.test.ts +436 -0
  81. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +214 -0
  82. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
  83. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +10 -3
  84. package/Tests/Server/Utils/EventLoop.test.ts +359 -0
  85. package/Tests/Server/Utils/JsonWebToken.test.ts +30 -0
  86. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +242 -0
  87. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +13 -7
  88. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +29 -0
  89. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +30 -6
  90. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +246 -0
  91. package/Tests/Server/Utils/Monitor/MonitorCriteriaEmailEvalLogAgreement.test.ts +280 -0
  92. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +224 -10
  93. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +570 -0
  94. package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +30 -5
  95. package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +68 -21
  96. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +36 -19
  97. package/Tests/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.test.ts +573 -0
  98. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +317 -0
  99. package/Tests/Server/Utils/Telemetry/ContextSpanProcessor.test.ts +281 -0
  100. package/Tests/Server/Utils/Telemetry/InventoryDuplicateIdentity.test.ts +316 -0
  101. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +111 -8
  102. package/Tests/Types/Database/IncludesAnyOfGroups.test.ts +106 -0
  103. package/Tests/Types/JSONFunctions.test.ts +40 -0
  104. package/Tests/Types/NetworkAutomation/AutoImportRunMerge.test.ts +235 -0
  105. package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +66 -0
  106. package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +309 -1
  107. package/Tests/Types/Telemetry/InventoryLiveness.test.ts +99 -0
  108. package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +160 -0
  109. package/Tests/UI/ReactRouterSingletonBuild.test.ts +133 -0
  110. package/Tests/UI/Rum/ReplayHeader.test.tsx +10 -2
  111. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +514 -0
  112. package/Tests/UI/Rum/ReplayTimeFormat.test.ts +94 -0
  113. package/Tests/UI/Rum/ReplayUi.test.tsx +559 -0
  114. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
  115. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -0
  116. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +11 -1
  117. package/Tests/Utils/Dashboard/LabelVariable.test.ts +257 -0
  118. package/Tests/Utils/Dashboard/VariableUrlState.test.ts +144 -14
  119. package/Tests/Utils/MetricUnitUtil.test.ts +81 -0
  120. package/Tests/Utils/Monitor/DeviceMacLearningUtil.test.ts +497 -0
  121. package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +546 -0
  122. package/Tests/Utils/Monitor/MonitorTemplateCustomFieldUtil.test.ts +218 -0
  123. package/Tests/Utils/Monitor/NetworkTopologyEndpointAdoption.test.ts +1755 -0
  124. package/Tests/Utils/NetworkAutomation/AutoImportRunChain.test.ts +320 -0
  125. package/Types/BaseDatabase/IncludesAnyOfGroups.ts +77 -0
  126. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  127. package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +1 -0
  128. package/Types/Dashboard/DashboardVariable.ts +8 -0
  129. package/Types/JSON.ts +4 -0
  130. package/Types/JSONFunctions.ts +16 -0
  131. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
  132. package/Types/NetworkAutomation/RuleRunResult.ts +402 -13
  133. package/Types/SerializableObjectDictionary.ts +4 -0
  134. package/Types/Telemetry/InventoryLiveness.ts +56 -0
  135. package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +9 -2
  136. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +46 -21
  137. package/UI/Components/Dashboard/DashboardVariableControl.tsx +285 -0
  138. package/UI/esbuild-config.js +6 -0
  139. package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +12 -1
  140. package/Utils/Dashboard/LabelVariable.ts +152 -0
  141. package/Utils/Dashboard/VariableUrlState.ts +27 -5
  142. package/Utils/MetricUnitUtil.ts +34 -0
  143. package/Utils/Monitor/DeviceMacLearningUtil.ts +177 -0
  144. package/Utils/Monitor/MetricValueFormatter.ts +342 -0
  145. package/Utils/Monitor/MonitorTemplateCustomFieldUtil.ts +124 -0
  146. package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +7 -2
  147. package/Utils/Monitor/NetworkTopologyUtil.ts +693 -0
  148. package/Utils/NetworkAutomation/AutoImportRunChain.ts +138 -0
  149. package/build/dist/Models/DatabaseModels/GlobalConfig.js +12 -12
  150. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  151. package/build/dist/Models/DatabaseModels/InventoryItem.js +34 -1
  152. package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
  153. package/build/dist/Models/DatabaseModels/NetworkDevice.js +128 -0
  154. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  155. package/build/dist/Server/EnvironmentConfig.js +44 -12
  156. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  157. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js +14 -0
  158. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js.map +1 -0
  159. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  160. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  161. package/build/dist/Server/Infrastructure/Redis.js +8 -8
  162. package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
  163. package/build/dist/Server/Infrastructure/Status.js +10 -4
  164. package/build/dist/Server/Infrastructure/Status.js.map +1 -1
  165. package/build/dist/Server/Services/DatabaseService.js +58 -13
  166. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  167. package/build/dist/Server/Services/InventoryItemService.js +28 -1
  168. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  169. package/build/dist/Server/Services/MonitorTemplateService.js +116 -17
  170. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  171. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +270 -37
  172. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  173. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +65 -0
  174. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  175. package/build/dist/Server/Services/NetworkDeviceService.js +54 -0
  176. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  177. package/build/dist/Server/Services/UserNotificationRuleService.js +60 -25
  178. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  179. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +29 -4
  180. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
  181. package/build/dist/Server/Types/Database/QueryUtil.js +36 -0
  182. package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
  183. package/build/dist/Server/Types/Markdown.js +75 -0
  184. package/build/dist/Server/Types/Markdown.js.map +1 -1
  185. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +53 -18
  186. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
  187. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +10 -1
  188. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  189. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +2 -2
  190. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
  191. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +58 -35
  192. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  193. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +29 -5
  194. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  195. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +166 -35
  196. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  197. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +58 -9
  198. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
  199. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +9 -3
  200. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
  201. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +26 -12
  202. package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
  203. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +74 -33
  204. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  205. package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js +114 -0
  206. package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js.map +1 -0
  207. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +25 -0
  208. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  209. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +9 -1
  210. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  211. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +70 -13
  212. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  213. package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js +54 -0
  214. package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js.map +1 -0
  215. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  216. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  217. package/build/dist/Types/Dashboard/DashboardVariable.js +1 -0
  218. package/build/dist/Types/Dashboard/DashboardVariable.js.map +1 -1
  219. package/build/dist/Types/JSON.js +1 -0
  220. package/build/dist/Types/JSON.js.map +1 -1
  221. package/build/dist/Types/JSONFunctions.js +13 -0
  222. package/build/dist/Types/JSONFunctions.js.map +1 -1
  223. package/build/dist/Types/NetworkAutomation/RuleRunResult.js +291 -6
  224. package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
  225. package/build/dist/Types/SerializableObjectDictionary.js +4 -0
  226. package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
  227. package/build/dist/Types/Telemetry/InventoryLiveness.js +37 -0
  228. package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -0
  229. package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +7 -0
  230. package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
  231. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +9 -2
  232. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  233. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +137 -0
  234. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -0
  235. package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +9 -1
  236. package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
  237. package/build/dist/Utils/Dashboard/LabelVariable.js +96 -0
  238. package/build/dist/Utils/Dashboard/LabelVariable.js.map +1 -0
  239. package/build/dist/Utils/Dashboard/VariableUrlState.js +19 -4
  240. package/build/dist/Utils/Dashboard/VariableUrlState.js.map +1 -1
  241. package/build/dist/Utils/MetricUnitUtil.js +26 -0
  242. package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
  243. package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js +112 -0
  244. package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js.map +1 -0
  245. package/build/dist/Utils/Monitor/MetricValueFormatter.js +276 -0
  246. package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -0
  247. package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js +101 -0
  248. package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js.map +1 -0
  249. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +7 -2
  250. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
  251. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +484 -0
  252. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  253. package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js +59 -0
  254. package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js.map +1 -0
  255. package/jest.config.json +2 -0
  256. package/package.json +1 -1
  257. package/test-setup.sh +9 -9
  258. package/tsconfig.json +51 -11
  259. package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +0 -399
@@ -22,6 +22,7 @@ import PositiveNumber from "../../Types/PositiveNumber";
22
22
  import Model from "../../Models/DatabaseModels/MonitorTemplate";
23
23
  import Monitor from "../../Models/DatabaseModels/Monitor";
24
24
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
25
+ import MonitorTemplateCustomFieldUtil from "../../Utils/Monitor/MonitorTemplateCustomFieldUtil";
25
26
  import NetworkDeviceMonitorTemplateUtil from "../../Utils/Monitor/NetworkDeviceMonitorTemplateUtil";
26
27
  import SortOrder from "../../Types/BaseDatabase/SortOrder";
27
28
  import ModelPermission from "../Types/Database/Permissions/Index";
@@ -41,9 +42,31 @@ export type SyncableTemplateField =
41
42
  | "monitorSteps"
42
43
  | "monitoringInterval"
43
44
  | "minimumProbeAgreement"
44
- | "labels";
45
+ | "labels"
46
+ | "customFields";
45
47
 
46
- const ALL_SYNCABLE_FIELDS: ReadonlyArray<SyncableTemplateField> = [
48
+ const SYNCABLE_FIELDS: ReadonlyArray<SyncableTemplateField> = [
49
+ "monitorSteps",
50
+ "monitoringInterval",
51
+ "minimumProbeAgreement",
52
+ "labels",
53
+ "customFields",
54
+ ];
55
+
56
+ /*
57
+ * What an UNSCOPED sync pushes — every syncable field except custom field
58
+ * defaults.
59
+ *
60
+ * Custom fields are the one syncable thing whose per-monitor value is
61
+ * ordinarily typed in by hand: a monitor's Configuration Item or Vendor is
62
+ * about that device, not about the template. A caller that names no fields is
63
+ * saying "push the template", not "and also rewrite every operator-entered
64
+ * value in the fleet", so custom fields ship only when asked for by name —
65
+ * which is what the dedicated button on the template's Custom Field Defaults
66
+ * card does. The dashboard always scopes its syncs, so this only decides what
67
+ * an API caller gets by default.
68
+ */
69
+ const DEFAULT_SYNCABLE_FIELDS: ReadonlyArray<SyncableTemplateField> = [
47
70
  "monitorSteps",
48
71
  "monitoringInterval",
49
72
  "minimumProbeAgreement",
@@ -309,10 +332,10 @@ export class Service extends DatabaseService<Model> {
309
332
  fields: Array<string> | undefined,
310
333
  ): Array<SyncableTemplateField> {
311
334
  if (!fields || fields.length === 0) {
312
- return [...ALL_SYNCABLE_FIELDS];
335
+ return [...DEFAULT_SYNCABLE_FIELDS];
313
336
  }
314
337
 
315
- const allowed: Set<string> = new Set(ALL_SYNCABLE_FIELDS);
338
+ const allowed: Set<string> = new Set(SYNCABLE_FIELDS);
316
339
  for (const field of fields) {
317
340
  if (!allowed.has(field)) {
318
341
  throw new BadDataException(
@@ -323,6 +346,16 @@ export class Service extends DatabaseService<Model> {
323
346
  return fields as Array<SyncableTemplateField>;
324
347
  }
325
348
 
349
+ /*
350
+ * The part of the push that is identical for every linked monitor, so it can
351
+ * ride a single bulk update.
352
+ *
353
+ * `customFields` is deliberately absent: a template's custom fields are
354
+ * DEFAULTS overlaid on whatever the monitor already holds, which is a
355
+ * different value per monitor and therefore cannot be one shared payload.
356
+ * The two sync entry points below compute it per monitor instead — see
357
+ * buildCustomFieldsUpdate.
358
+ */
326
359
  private buildUpdateData(
327
360
  template: Model,
328
361
  fields: Array<SyncableTemplateField>,
@@ -330,6 +363,10 @@ export class Service extends DatabaseService<Model> {
330
363
  const updateData: Partial<Monitor> = {};
331
364
 
332
365
  for (const field of fields) {
366
+ if (field === "customFields") {
367
+ continue;
368
+ }
369
+
333
370
  const value: unknown = (template as unknown as Record<string, unknown>)[
334
371
  field
335
372
  ];
@@ -342,13 +379,46 @@ export class Service extends DatabaseService<Model> {
342
379
  return updateData;
343
380
  }
344
381
 
382
+ /*
383
+ * Does this push carry custom field defaults that are worth a write?
384
+ *
385
+ * A template whose bag is absent, empty, or holds nothing but blanks has no
386
+ * defaults to give, and saying so here is what stops a custom-fields-only
387
+ * sync from taking the per-monitor path (and reporting a fleet-wide write)
388
+ * to push nothing at all.
389
+ */
390
+ private hasCustomFieldDefaultsToSync(
391
+ template: Model,
392
+ fields: Array<SyncableTemplateField>,
393
+ ): boolean {
394
+ return (
395
+ fields.includes("customFields") &&
396
+ MonitorTemplateCustomFieldUtil.hasDefaults(template.customFields)
397
+ );
398
+ }
399
+
400
+ /*
401
+ * One monitor's custom field bag after the template's defaults are laid over
402
+ * it: the template wins every field it actually defaults, and every other
403
+ * value the operator entered on that monitor survives untouched.
404
+ */
405
+ private buildCustomFieldsUpdate(data: {
406
+ template: Model;
407
+ monitor: Monitor;
408
+ }): JSONObject {
409
+ return MonitorTemplateCustomFieldUtil.applyDefaults({
410
+ templateCustomFields: data.template.customFields,
411
+ monitorCustomFields: data.monitor.customFields,
412
+ });
413
+ }
414
+
345
415
  /**
346
416
  * Push the template's current configuration onto every monitor that was
347
417
  * created from it. Sync is intentionally explicit (button-triggered) so a
348
418
  * config tweak doesn't silently re-deploy across the whole fleet.
349
419
  *
350
420
  * Pass `fields` to scope the sync — e.g. `["monitorSteps"]` to push only the
351
- * criteria. If omitted, every syncable field is pushed.
421
+ * criteria. If omitted, DEFAULT_SYNCABLE_FIELDS is pushed.
352
422
  */
353
423
  @CaptureSpan()
354
424
  public async syncLinkedMonitors(data: {
@@ -369,6 +439,7 @@ export class Service extends DatabaseService<Model> {
369
439
  monitorSteps: true,
370
440
  monitoringInterval: true,
371
441
  minimumProbeAgreement: true,
442
+ customFields: true,
372
443
  labels: {
373
444
  _id: true,
374
445
  },
@@ -398,7 +469,17 @@ export class Service extends DatabaseService<Model> {
398
469
 
399
470
  const updateData: Partial<Monitor> = this.buildUpdateData(template, fields);
400
471
 
401
- if (Object.keys(updateData).length === 0) {
472
+ /*
473
+ * Custom field defaults never ride in updateData — the value written
474
+ * depends on what each monitor already holds — so they are their own
475
+ * reason for this push to have work to do.
476
+ */
477
+ const syncCustomFields: boolean = this.hasCustomFieldDefaultsToSync(
478
+ template,
479
+ fields,
480
+ );
481
+
482
+ if (Object.keys(updateData).length === 0 && !syncCustomFields) {
402
483
  return {
403
484
  totalLinkedMonitors,
404
485
  syncedMonitors: 0,
@@ -412,10 +493,16 @@ export class Service extends DatabaseService<Model> {
412
493
  * those rows individually and rebind cloned template steps to each
413
494
  * monitor's current (or provenance-backed) device instead.
414
495
  */
415
- if (
496
+ const rebindMonitorSteps: boolean =
416
497
  template.monitorType === MonitorType.NetworkDevice &&
417
- fields.includes("monitorSteps")
418
- ) {
498
+ fields.includes("monitorSteps");
499
+
500
+ /*
501
+ * Custom field defaults take the same row-at-a-time path for their own
502
+ * reason: they are overlaid on the monitor's existing bag, so the payload
503
+ * is read from the row being written and cannot be shared.
504
+ */
505
+ if (rebindMonitorSteps || syncCustomFields) {
419
506
  let syncedMonitors: number = 0;
420
507
  const linkedMonitorQuery: Query<Monitor> = {
421
508
  monitorTemplateId: template.id!,
@@ -428,12 +515,20 @@ export class Service extends DatabaseService<Model> {
428
515
  * label scope order-dependent: accessible rows could update before a
429
516
  * later hidden row threw. This is the same permission-narrowed subset
430
517
  * the ordinary bulk update path applies atomically.
518
+ *
519
+ * The probe names `customFields` when this push writes them — the
520
+ * per-monitor values are not known yet, and only the KEYS decide the
521
+ * column check — so a caller who may not update that column is refused
522
+ * up front rather than on an arbitrary row partway through the fleet.
431
523
  */
432
524
  const authorizedMonitorQuery: Query<Monitor> =
433
525
  await ModelPermission.checkUpdateQueryPermissions(
434
526
  Monitor,
435
527
  linkedMonitorQuery,
436
- updateData as any,
528
+ {
529
+ ...updateData,
530
+ ...(syncCustomFields ? { customFields: {} } : {}),
531
+ } as any,
437
532
  data.props,
438
533
  );
439
534
  const monitorsToSync: Array<Monitor> = [];
@@ -444,6 +539,7 @@ export class Service extends DatabaseService<Model> {
444
539
  select: {
445
540
  _id: true,
446
541
  monitorSteps: true,
542
+ customFields: true,
447
543
  autoProvisionedNetworkDeviceId: true,
448
544
  },
449
545
  sort: { createdAt: SortOrder.Ascending, _id: SortOrder.Ascending },
@@ -468,15 +564,27 @@ export class Service extends DatabaseService<Model> {
468
564
  monitor,
469
565
  data: {
470
566
  ...updateData,
471
- monitorSteps: monitor.autoProvisionedNetworkDeviceId
472
- ? NetworkDeviceMonitorTemplateUtil.rebindMonitorSteps({
473
- monitorSteps: template.monitorSteps,
474
- networkDeviceId: monitor.autoProvisionedNetworkDeviceId,
475
- })
476
- : NetworkDeviceMonitorTemplateUtil.buildSyncedMonitorSteps({
477
- templateMonitorSteps: template.monitorSteps,
478
- currentMonitorSteps: monitor.monitorSteps,
479
- }),
567
+ ...(rebindMonitorSteps
568
+ ? {
569
+ monitorSteps: monitor.autoProvisionedNetworkDeviceId
570
+ ? NetworkDeviceMonitorTemplateUtil.rebindMonitorSteps({
571
+ monitorSteps: template.monitorSteps,
572
+ networkDeviceId: monitor.autoProvisionedNetworkDeviceId,
573
+ })
574
+ : NetworkDeviceMonitorTemplateUtil.buildSyncedMonitorSteps({
575
+ templateMonitorSteps: template.monitorSteps,
576
+ currentMonitorSteps: monitor.monitorSteps,
577
+ }),
578
+ }
579
+ : {}),
580
+ ...(syncCustomFields
581
+ ? {
582
+ customFields: this.buildCustomFieldsUpdate({
583
+ template,
584
+ monitor,
585
+ }),
586
+ }
587
+ : {}),
480
588
  },
481
589
  };
482
590
  });
@@ -642,6 +750,7 @@ export class Service extends DatabaseService<Model> {
642
750
  monitorSteps: true,
643
751
  monitoringInterval: true,
644
752
  minimumProbeAgreement: true,
753
+ customFields: true,
645
754
  labels: {
646
755
  _id: true,
647
756
  },
@@ -664,6 +773,7 @@ export class Service extends DatabaseService<Model> {
664
773
  projectId: true,
665
774
  monitorTemplateId: true,
666
775
  monitorSteps: true,
776
+ customFields: true,
667
777
  autoProvisionedNetworkDeviceId: true,
668
778
  },
669
779
  props: { isRoot: true },
@@ -706,6 +816,17 @@ export class Service extends DatabaseService<Model> {
706
816
  });
707
817
  }
708
818
 
819
+ /*
820
+ * Overlaid on this monitor's own bag, so a value the operator entered on
821
+ * a field the template does not default survives the push.
822
+ */
823
+ if (this.hasCustomFieldDefaultsToSync(template, fields)) {
824
+ updateData.customFields = this.buildCustomFieldsUpdate({
825
+ template,
826
+ monitor,
827
+ });
828
+ }
829
+
709
830
  if (Object.keys(updateData).length === 0) {
710
831
  return;
711
832
  }