@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.
- package/Models/DatabaseModels/GlobalConfig.ts +12 -12
- package/Models/DatabaseModels/InventoryItem.ts +44 -1
- package/Models/DatabaseModels/NetworkDevice.ts +126 -0
- package/Server/EnvironmentConfig.ts +47 -16
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Infrastructure/Redis.ts +8 -8
- package/Server/Infrastructure/Status.ts +10 -4
- package/Server/Services/DatabaseService.ts +65 -13
- package/Server/Services/InventoryItemService.ts +31 -1
- package/Server/Services/MonitorTemplateService.ts +140 -19
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +349 -41
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +87 -2
- package/Server/Services/NetworkDeviceService.ts +69 -0
- package/Server/Services/UserNotificationRuleService.ts +76 -25
- package/Server/Types/Database/Permissions/ReadPermission.ts +45 -5
- package/Server/Types/Database/QueryUtil.ts +56 -0
- package/Server/Types/Markdown.ts +93 -1
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +82 -17
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +10 -1
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +2 -2
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +82 -35
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +31 -5
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +202 -37
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +82 -9
- package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +16 -7
- package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +29 -17
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +107 -48
- package/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.ts +158 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +27 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +11 -1
- package/Server/Utils/Telemetry/TelemetryEntity.ts +83 -9
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +32 -0
- package/Tests/App/Dashboard/AdoptedDeviceDrawer.test.tsx +374 -0
- package/Tests/App/Dashboard/DashboardLabelVariables.test.tsx +580 -0
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +438 -0
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +5 -2
- package/Tests/App/Dashboard/DeviceAttachmentCard.test.tsx +273 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +505 -0
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +163 -0
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +401 -0
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +232 -0
- package/Tests/App/Dashboard/InventoryItems.test.tsx +201 -0
- package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +798 -0
- package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +320 -0
- package/Tests/App/Dashboard/NetworkTopologyToolbar.test.tsx +275 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedEmptyState.test.tsx +975 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +63 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +626 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +348 -0
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +331 -0
- package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +603 -0
- package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +324 -0
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +13 -4
- package/Tests/App/StatusPage/StatusPageOidcOrigin.test.tsx +223 -0
- package/Tests/Models/InventoryItemStatus.test.ts +147 -0
- package/Tests/Models/NetworkDeviceMacAddressColumn.test.ts +294 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +129 -0
- package/Tests/Server/EnvironmentConfigValkey.test.ts +227 -0
- package/Tests/Server/Infrastructure/Postgres/AddMacAddressToNetworkDeviceMigration.test.ts +365 -0
- package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +62 -23
- package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +265 -0
- package/Tests/Server/Middleware/HttpMetricsMiddleware.test.ts +382 -0
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +525 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +291 -56
- package/Tests/Server/Services/DatabaseServiceSortTiebreaker.test.ts +151 -0
- package/Tests/Server/Services/InventoryItemManualCreate.test.ts +105 -0
- package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +178 -0
- package/Tests/Server/Services/MonitorTemplateServiceCustomFieldSync.test.ts +502 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1133 -81
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanRegistration.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceMacAddressNormalization.test.ts +572 -0
- package/Tests/Server/Types/Database/InventoryStatusPostgres.test.ts +368 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +261 -14
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroups.test.ts +169 -0
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroupsPostgres.test.ts +297 -0
- package/Tests/Server/Types/Markdown.test.ts +194 -1
- package/Tests/Server/Types/Workflow/Components/IncomingWebhookUtils.test.ts +279 -0
- package/Tests/Server/Types/Workflow/Components/TextToJson.test.ts +212 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingRegistry.test.ts +436 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +214 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +10 -3
- package/Tests/Server/Utils/EventLoop.test.ts +359 -0
- package/Tests/Server/Utils/JsonWebToken.test.ts +30 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +242 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +13 -7
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +29 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +30 -6
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +246 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEmailEvalLogAgreement.test.ts +280 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +224 -10
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +570 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +30 -5
- package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +68 -21
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +36 -19
- package/Tests/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.test.ts +573 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +317 -0
- package/Tests/Server/Utils/Telemetry/ContextSpanProcessor.test.ts +281 -0
- package/Tests/Server/Utils/Telemetry/InventoryDuplicateIdentity.test.ts +316 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +111 -8
- package/Tests/Types/Database/IncludesAnyOfGroups.test.ts +106 -0
- package/Tests/Types/JSONFunctions.test.ts +40 -0
- package/Tests/Types/NetworkAutomation/AutoImportRunMerge.test.ts +235 -0
- package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +66 -0
- package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +309 -1
- package/Tests/Types/Telemetry/InventoryLiveness.test.ts +99 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +160 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +133 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +10 -2
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +514 -0
- package/Tests/UI/Rum/ReplayTimeFormat.test.ts +94 -0
- package/Tests/UI/Rum/ReplayUi.test.tsx +559 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +11 -1
- package/Tests/Utils/Dashboard/LabelVariable.test.ts +257 -0
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +144 -14
- package/Tests/Utils/MetricUnitUtil.test.ts +81 -0
- package/Tests/Utils/Monitor/DeviceMacLearningUtil.test.ts +497 -0
- package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +546 -0
- package/Tests/Utils/Monitor/MonitorTemplateCustomFieldUtil.test.ts +218 -0
- package/Tests/Utils/Monitor/NetworkTopologyEndpointAdoption.test.ts +1755 -0
- package/Tests/Utils/NetworkAutomation/AutoImportRunChain.test.ts +320 -0
- package/Types/BaseDatabase/IncludesAnyOfGroups.ts +77 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +1 -0
- package/Types/Dashboard/DashboardVariable.ts +8 -0
- package/Types/JSON.ts +4 -0
- package/Types/JSONFunctions.ts +16 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
- package/Types/NetworkAutomation/RuleRunResult.ts +402 -13
- package/Types/SerializableObjectDictionary.ts +4 -0
- package/Types/Telemetry/InventoryLiveness.ts +56 -0
- package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +9 -2
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +46 -21
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +285 -0
- package/UI/esbuild-config.js +6 -0
- package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +12 -1
- package/Utils/Dashboard/LabelVariable.ts +152 -0
- package/Utils/Dashboard/VariableUrlState.ts +27 -5
- package/Utils/MetricUnitUtil.ts +34 -0
- package/Utils/Monitor/DeviceMacLearningUtil.ts +177 -0
- package/Utils/Monitor/MetricValueFormatter.ts +342 -0
- package/Utils/Monitor/MonitorTemplateCustomFieldUtil.ts +124 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +7 -2
- package/Utils/Monitor/NetworkTopologyUtil.ts +693 -0
- package/Utils/NetworkAutomation/AutoImportRunChain.ts +138 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +12 -12
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js +34 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +128 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +44 -12
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Redis.js +8 -8
- package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
- package/build/dist/Server/Infrastructure/Status.js +10 -4
- package/build/dist/Server/Infrastructure/Status.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +58 -13
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +28 -1
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +116 -17
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +270 -37
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +65 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +54 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +60 -25
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +29 -4
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +36 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +75 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +53 -18
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +10 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +2 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +58 -35
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +29 -5
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +166 -35
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +58 -9
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +9 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +26 -12
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +74 -33
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js +114 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +25 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +9 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +70 -13
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js +54 -0
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardVariable.js +1 -0
- package/build/dist/Types/Dashboard/DashboardVariable.js.map +1 -1
- package/build/dist/Types/JSON.js +1 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +13 -0
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +291 -6
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/SerializableObjectDictionary.js +4 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/InventoryLiveness.js +37 -0
- package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -0
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +7 -0
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +9 -2
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +137 -0
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +9 -1
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/LabelVariable.js +96 -0
- package/build/dist/Utils/Dashboard/LabelVariable.js.map +1 -0
- package/build/dist/Utils/Dashboard/VariableUrlState.js +19 -4
- package/build/dist/Utils/Dashboard/VariableUrlState.js.map +1 -1
- package/build/dist/Utils/MetricUnitUtil.js +26 -0
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js +112 -0
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +276 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js +101 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +7 -2
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +484 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js +59 -0
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js.map +1 -0
- package/jest.config.json +2 -0
- package/package.json +1 -1
- package/test-setup.sh +9 -9
- package/tsconfig.json +51 -11
- 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
|
|
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 [...
|
|
335
|
+
return [...DEFAULT_SYNCABLE_FIELDS];
|
|
313
336
|
}
|
|
314
337
|
|
|
315
|
-
const allowed: Set<string> = new Set(
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
472
|
-
?
|
|
473
|
-
monitorSteps:
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
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
|
}
|