@oneuptime/common 11.6.0 → 11.6.2
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/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.ts +41 -24
- package/Models/AnalyticsModels/Index.ts +4 -0
- package/Models/AnalyticsModels/KubernetesCostAllocation.ts +842 -0
- package/Models/AnalyticsModels/MetricBaselineHourly.ts +2 -0
- package/Models/AnalyticsModels/MetricItemAggMV1m.ts +5 -2
- package/Models/AnalyticsModels/MetricItemAggMV1mByContainer.ts +5 -2
- package/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.ts +5 -2
- package/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts +5 -2
- package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +5 -2
- package/Models/AnalyticsModels/NetworkFlow.ts +54 -0
- package/Models/AnalyticsModels/SloHistory.ts +240 -0
- package/Models/DatabaseModels/Index.ts +20 -0
- package/Models/DatabaseModels/NetworkDevice.ts +453 -6
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +7 -6
- package/Models/DatabaseModels/NetworkEndpoint.ts +753 -0
- package/Models/DatabaseModels/NetworkSite.ts +1155 -0
- package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +517 -0
- package/Models/DatabaseModels/NetworkSiteLink.ts +611 -0
- package/Models/DatabaseModels/NetworkSiteStatusTimeline.ts +520 -0
- package/Models/DatabaseModels/NetworkSiteType.ts +499 -0
- package/Models/DatabaseModels/ServiceLevelObjective.ts +1106 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +762 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +444 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +443 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.ts +359 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.ts +48 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.ts +65 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.ts +88 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.ts +391 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Services/AnalyticsDatabaseService.ts +38 -10
- package/Server/Services/Index.ts +24 -0
- package/Server/Services/KubernetesCostAllocationService.ts +14 -0
- package/Server/Services/MetricService.ts +21 -2
- package/Server/Services/MonitorService.ts +22 -0
- package/Server/Services/NetworkDeviceService.ts +438 -2
- package/Server/Services/NetworkEndpointService.ts +414 -0
- package/Server/Services/NetworkSiteAssignmentRuleService.ts +98 -0
- package/Server/Services/NetworkSiteLinkService.ts +10 -0
- package/Server/Services/NetworkSiteService.ts +1254 -0
- package/Server/Services/NetworkSiteStatusTimelineService.ts +10 -0
- package/Server/Services/NetworkSiteTypeService.ts +10 -0
- package/Server/Services/ProjectService.ts +122 -2
- package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +457 -0
- package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +10 -0
- package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +10 -0
- package/Server/Services/ServiceLevelObjectiveService.ts +677 -0
- package/Server/Services/SloHistoryService.ts +101 -0
- package/Server/Services/UserNotificationSettingService.ts +37 -0
- package/Server/Types/AnalyticsDatabase/AggregateBy.ts +9 -0
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +15 -0
- package/Server/Utils/AnalyticsDatabase/Statement.ts +39 -3
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +128 -52
- package/Server/Utils/Memory.ts +9 -1
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +190 -12
- package/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
- package/Server/Utils/Monitor/DnsResolutionCache.ts +129 -0
- package/Server/Utils/Monitor/MonitorResource.ts +4 -30
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +214 -39
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +343 -0
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +251 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +176 -142
- package/Server/Utils/Monitor/OuiLookupUtil.ts +49 -0
- package/Server/Utils/Monitor/SnmpInterfaceRateUtil.ts +17 -13
- package/Server/Utils/WhatsAppTemplateUtil.ts +7 -3
- package/Tests/Models/AnalyticsModels/AnalyticsBaseModel.test.ts +122 -0
- package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +135 -0
- package/Tests/Models/NetworkSiteHierarchy.test.ts +134 -0
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +239 -0
- package/Tests/Server/Services/KubernetesCostAllocationAggregate.test.ts +338 -0
- package/Tests/Server/Services/MetricServiceAggregate.test.ts +142 -0
- package/Tests/Server/Services/NetworkDeviceSiteAssignment.test.ts +484 -0
- package/Tests/Server/Services/NetworkEndpointServiceUpsert.test.ts +686 -0
- package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +185 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +1354 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +1313 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +1988 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +164 -3
- package/Tests/Server/Utils/AnalyticsDatabase/Statement.test.ts +22 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +503 -0
- package/Tests/Server/Utils/Encryption.test.ts +70 -0
- package/Tests/Server/Utils/FileAttachmentMarkdownUtil.test.ts +225 -0
- package/Tests/Server/Utils/JsonWebToken.test.ts +175 -0
- package/Tests/Server/Utils/LocalFile.test.ts +258 -0
- package/Tests/Server/Utils/Memory.test.ts +213 -0
- package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +30 -0
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +385 -0
- package/Tests/Server/Utils/Monitor/DnsResolutionCache.test.ts +194 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +155 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +600 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +151 -124
- package/Tests/Server/Utils/Monitor/SnmpInterfaceRateUtil.test.ts +496 -0
- package/Tests/Server/Utils/MonitorCriteriaDataExtractor.test.ts +175 -0
- package/Tests/Server/Utils/MonitorCriteriaMessageFormatter.test.ts +282 -0
- package/Tests/Server/Utils/OuiLookupUtil.test.ts +59 -0
- package/Tests/Server/Utils/SeriesResourceLabels.test.ts +117 -0
- package/Tests/Server/Utils/StackTraceParser.test.ts +370 -0
- package/Tests/Server/Utils/Stream.test.ts +87 -0
- package/Tests/Server/Utils/ValidateGlobalProviderProjectTeams.test.ts +221 -0
- package/Tests/Server/Utils/WhatsAppTemplateUtil.test.ts +199 -0
- package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +33 -0
- package/Tests/Types/Email.test.ts +198 -0
- package/Tests/Types/HashCode.test.ts +41 -0
- package/Tests/Types/Kubernetes/KubernetesObjectParser.test.ts +177 -0
- package/Tests/Types/Log/LogQueryParser.test.ts +186 -0
- package/Tests/Types/Log/LogQueryToFilter.test.ts +111 -0
- package/Tests/Types/Monitor/MonitorStepNetworkDeviceMonitor.test.ts +141 -1
- package/Tests/Types/Monitor/MonitorType.test.ts +59 -1
- package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +97 -0
- package/Tests/Types/Monitor/SnmpEndpointDiscovery.test.ts +151 -0
- package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +110 -6
- package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +129 -0
- package/Tests/Types/SerializableObjectDictionary.test.ts +166 -0
- package/Tests/Types/Time/RangeStartAndEndDateTime.test.ts +98 -0
- package/Tests/Types/WebsiteRequest.test.ts +230 -0
- package/Tests/UI/Components/EntityFilterRoundTrip.test.tsx +103 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +612 -0
- package/Tests/UI/Components/ModelTable/FilterDataToQuery.test.ts +275 -0
- package/Tests/UI/Utils/LogExport.test.ts +159 -0
- package/Tests/UI/Utils/Navigation.test.ts +183 -0
- package/Tests/UI/Utils/TableFilterUrlState.test.ts +539 -0
- package/Tests/UI/Utils/TableViewUrlState.test.ts +272 -0
- package/Tests/Utils/Base64.test.ts +51 -0
- package/Tests/Utils/Boolean.test.ts +76 -0
- package/Tests/Utils/Crypto.test.ts +48 -0
- package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +259 -0
- package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +162 -0
- package/Tests/Utils/Dashboard/VariableInterpolation.test.ts +197 -0
- package/Tests/Utils/Enum.test.ts +54 -0
- package/Tests/Utils/IpCanonicalUtil.test.ts +85 -0
- package/Tests/Utils/Metrics/MetricSeriesFingerprint.test.ts +160 -0
- package/Tests/Utils/Monitor/EndpointAttachmentUtil.test.ts +836 -0
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +218 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +447 -0
- package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +440 -0
- package/Tests/Utils/NetworkSite/MaterializedPathUtil.test.ts +205 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +221 -0
- package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +283 -0
- package/Tests/Utils/ObjectUtil.test.ts +30 -0
- package/Tests/Utils/Slo/SloStatusColor.test.ts +89 -0
- package/Tests/Utils/Slo/SloUtil.test.ts +1980 -0
- package/Tests/Utils/Slo/SloWidgetFormat.test.ts +605 -0
- package/Tests/Utils/TechStack.test.ts +50 -0
- package/Tests/Utils/Traces/CriticalPath.test.ts +178 -0
- package/Tests/Utils/ValueFormatter.test.ts +305 -0
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +10 -0
- package/Types/AnalyticsDatabase/TableColumn.ts +23 -0
- package/Types/BaseDatabase/EqualTo.ts +9 -1
- package/Types/BaseDatabase/EqualToOrNull.ts +9 -1
- package/Types/BaseDatabase/NotEqual.ts +9 -1
- package/Types/Dashboard/DashboardComponentType.ts +1 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +42 -0
- package/Types/Dashboard/DashboardTemplates.ts +214 -0
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/Kubernetes/KubernetesCostIngest.ts +79 -0
- package/Types/Monitor/CriteriaFilter.ts +9 -0
- package/Types/Monitor/MonitorStep.ts +5 -8
- package/Types/Monitor/MonitorStepNetworkDeviceMonitor.ts +27 -5
- package/Types/Monitor/MonitorType.ts +15 -5
- package/Types/Monitor/SnmpMonitor/ArpEntry.ts +14 -0
- package/Types/Monitor/SnmpMonitor/FdbEntry.ts +18 -0
- package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +10 -3
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -5
- package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +12 -0
- package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +231 -3
- package/Types/NetworkSite/DefaultNetworkSiteType.ts +20 -0
- package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
- package/Types/Permission.ts +449 -0
- package/Types/ServiceLevelObjective/SliType.ts +6 -0
- package/Types/ServiceLevelObjective/SloMultiMonitorMode.ts +6 -0
- package/Types/ServiceLevelObjective/SloStatus.ts +9 -0
- package/Types/ServiceLevelObjective/SloWindowType.ts +6 -0
- package/Types/Telemetry/ServiceType.ts +1 -0
- package/UI/Components/Filters/EntityFilter.tsx +16 -0
- package/UI/Components/Filters/FilterViewer.tsx +22 -5
- package/UI/Components/List/List.tsx +8 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +309 -106
- package/UI/Components/ModelTable/FilterDataToQuery.ts +172 -0
- package/UI/Components/Navbar/NavBar.tsx +16 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +3 -3
- package/UI/Utils/Navigation.ts +10 -0
- package/UI/Utils/TableFilterUrlState.ts +204 -17
- package/UI/Utils/TableViewUrlState.ts +165 -0
- package/Utils/Dashboard/Components/DashboardSloComponent.ts +114 -0
- package/Utils/Dashboard/Components/Index.ts +7 -0
- package/Utils/IpCanonicalUtil.ts +134 -0
- package/Utils/Monitor/EndpointAttachmentUtil.ts +508 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +157 -5
- package/Utils/NetworkSite/CidrMatchUtil.ts +296 -0
- package/Utils/NetworkSite/MaterializedPathUtil.ts +115 -0
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +97 -0
- package/Utils/NetworkSite/SiteUptimeUtil.ts +111 -0
- package/Utils/Slo/SloStatusColor.ts +54 -0
- package/Utils/Slo/SloUtil.ts +637 -0
- package/Utils/Slo/SloWidgetFormat.ts +383 -0
- package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js +25 -20
- package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Index.js +4 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +713 -0
- package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js +2 -0
- package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js +5 -2
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js +5 -2
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.js +5 -2
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +5 -2
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +5 -2
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/NetworkFlow.js +44 -0
- package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/SloHistory.js +215 -0
- package/build/dist/Models/AnalyticsModels/SloHistory.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +20 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +458 -6
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +0 -6
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkEndpoint.js +779 -0
- package/build/dist/Models/DatabaseModels/NetworkEndpoint.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSite.js +1180 -0
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +534 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteLink.js +629 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteLink.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +538 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js +522 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +1124 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +769 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +460 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +459 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js +130 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js +31 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js +49 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js +140 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +32 -7
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +24 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesCostAllocationService.js +12 -0
- package/build/dist/Server/Services/KubernetesCostAllocationService.js.map +1 -0
- package/build/dist/Server/Services/MetricService.js +21 -3
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +19 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +351 -1
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkEndpointService.js +319 -0
- package/build/dist/Server/Services/NetworkEndpointService.js.map +1 -0
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +90 -0
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -0
- package/build/dist/Server/Services/NetworkSiteLinkService.js +9 -0
- package/build/dist/Server/Services/NetworkSiteLinkService.js.map +1 -0
- package/build/dist/Server/Services/NetworkSiteService.js +1038 -0
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -0
- package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js +9 -0
- package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js +9 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -0
- package/build/dist/Server/Services/ProjectService.js +98 -2
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +358 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +9 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +582 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -0
- package/build/dist/Server/Services/SloHistoryService.js +77 -0
- package/build/dist/Server/Services/SloHistoryService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js +20 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +9 -0
- package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +15 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +31 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +105 -52
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Memory.js +9 -1
- package/build/dist/Server/Utils/Memory.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +132 -10
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
- package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js +77 -0
- package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +21 -41
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +152 -40
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +262 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +201 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +152 -120
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js +44 -0
- package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js +10 -10
- package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js.map +1 -1
- package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +5 -0
- package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +10 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/TableColumn.js +7 -0
- package/build/dist/Types/AnalyticsDatabase/TableColumn.js.map +1 -1
- package/build/dist/Types/BaseDatabase/EqualTo.js +9 -1
- package/build/dist/Types/BaseDatabase/EqualTo.js.map +1 -1
- package/build/dist/Types/BaseDatabase/EqualToOrNull.js +9 -1
- package/build/dist/Types/BaseDatabase/EqualToOrNull.js.map +1 -1
- package/build/dist/Types/BaseDatabase/NotEqual.js +9 -1
- package/build/dist/Types/BaseDatabase/NotEqual.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- 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/DashboardComponents/DashboardSloComponent.js +23 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +205 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesCostIngest.js +21 -0
- package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +5 -5
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js +8 -0
- package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +15 -5
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js +2 -0
- package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js +2 -0
- package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +9 -3
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +217 -3
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js +21 -0
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
- package/build/dist/Types/Permission.js +409 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/ServiceLevelObjective/SliType.js +7 -0
- package/build/dist/Types/ServiceLevelObjective/SliType.js.map +1 -0
- package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js +7 -0
- package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js.map +1 -0
- package/build/dist/Types/ServiceLevelObjective/SloStatus.js +10 -0
- package/build/dist/Types/ServiceLevelObjective/SloStatus.js.map +1 -0
- package/build/dist/Types/ServiceLevelObjective/SloWindowType.js +7 -0
- package/build/dist/Types/ServiceLevelObjective/SloWindowType.js.map +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Filters/EntityFilter.js +15 -0
- package/build/dist/UI/Components/Filters/EntityFilter.js.map +1 -1
- package/build/dist/UI/Components/Filters/FilterViewer.js +19 -4
- package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
- package/build/dist/UI/Components/List/List.js +1 -1
- package/build/dist/UI/Components/List/List.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +235 -89
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js +96 -0
- package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js.map +1 -0
- package/build/dist/UI/Components/Navbar/NavBar.js +14 -2
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +3 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +9 -0
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/TableFilterUrlState.js +159 -15
- package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
- package/build/dist/UI/Utils/TableViewUrlState.js +103 -0
- package/build/dist/UI/Utils/TableViewUrlState.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +93 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/IpCanonicalUtil.js +110 -0
- package/build/dist/Utils/IpCanonicalUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js +311 -0
- package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +98 -5
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +222 -0
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js +89 -0
- package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +60 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +76 -0
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -0
- package/build/dist/Utils/Slo/SloStatusColor.js +18 -0
- package/build/dist/Utils/Slo/SloStatusColor.js.map +1 -0
- package/build/dist/Utils/Slo/SloUtil.js +393 -0
- package/build/dist/Utils/Slo/SloUtil.js.map +1 -0
- package/build/dist/Utils/Slo/SloWidgetFormat.js +174 -0
- package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -0
- package/package.json +2 -2
- package/Types/Dashboard/DashboardComponents/Index.ts +0 -7
- package/build/dist/Types/Dashboard/DashboardComponents/Index.js +0 -8
- package/build/dist/Types/Dashboard/DashboardComponents/Index.js.map +0 -1
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
|
|
2
2
|
import NetworkInventoryUtil from "../../../../Server/Utils/Monitor/NetworkInventoryUtil";
|
|
3
3
|
import NetworkDeviceService from "../../../../Server/Services/NetworkDeviceService";
|
|
4
|
+
import NetworkEndpointService from "../../../../Server/Services/NetworkEndpointService";
|
|
4
5
|
import NetworkInterfaceService from "../../../../Server/Services/NetworkInterfaceService";
|
|
5
|
-
import Monitor from "../../../../Models/DatabaseModels/Monitor";
|
|
6
6
|
import NetworkDevice from "../../../../Models/DatabaseModels/NetworkDevice";
|
|
7
7
|
import NetworkInterface from "../../../../Models/DatabaseModels/NetworkInterface";
|
|
8
|
-
import MonitorStep from "../../../../Types/Monitor/MonitorStep";
|
|
9
|
-
import MonitorSteps from "../../../../Types/Monitor/MonitorSteps";
|
|
10
8
|
import ObjectID from "../../../../Types/ObjectID";
|
|
11
9
|
import OneUptimeDate from "../../../../Types/Date";
|
|
12
|
-
import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
|
|
13
10
|
import SnmpInterface from "../../../../Types/Monitor/SnmpMonitor/SnmpInterface";
|
|
14
11
|
import SnmpMonitorResponse from "../../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
|
|
15
12
|
import LldpNeighbor from "../../../../Types/Monitor/SnmpMonitor/LldpNeighbor";
|
|
@@ -18,14 +15,17 @@ import CdpNeighbor from "../../../../Types/Monitor/SnmpMonitor/CdpNeighbor";
|
|
|
18
15
|
/*
|
|
19
16
|
* NetworkInventoryUtil.updateFromWalk is the single writer that keeps the
|
|
20
17
|
* NetworkDevice / NetworkInterface inventory in sync with each SNMP
|
|
21
|
-
* interface walk.
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
18
|
+
* interface walk. Under device-owned polling it is called straight from the
|
|
19
|
+
* device polling pipeline with the device's own identity — no Monitor in
|
|
20
|
+
* between. These tests mock the services it writes through and pin the
|
|
21
|
+
* enrichment contract: which walked fields land on the device row (and at
|
|
22
|
+
* what column-limit truncation), how uptime becomes lastRebootedAt, how the
|
|
23
|
+
* vendor is chosen, the LLDP/CDP snapshot semantics (store-even-when-empty,
|
|
24
|
+
* capped), what flows into the interface upsert on both the update and
|
|
25
|
+
* create paths, and when endpoint discovery runs.
|
|
27
26
|
*/
|
|
28
27
|
|
|
28
|
+
const PROJECT_ID: string = "1c9d4a7b-0000-4000-8000-000000000011";
|
|
29
29
|
const DEVICE_ID: string = "8f2c1f0e-0000-4000-8000-0000000000aa";
|
|
30
30
|
const NOW: Date = new Date("2026-07-16T12:00:00.000Z");
|
|
31
31
|
|
|
@@ -38,12 +38,13 @@ let deviceUpdateSpy: jest.SpyInstance;
|
|
|
38
38
|
let interfaceFindSpy: jest.SpyInstance;
|
|
39
39
|
let interfaceUpdateSpy: jest.SpyInstance;
|
|
40
40
|
let interfaceCreateSpy: jest.SpyInstance;
|
|
41
|
+
let endpointUpsertSpy: jest.SpyInstance;
|
|
41
42
|
|
|
42
43
|
function mockServices(existingInterfaces: Array<NetworkInterface> = []): void {
|
|
43
44
|
/*
|
|
44
|
-
* The project-membership guard resolves the device (scoped to the
|
|
45
|
-
*
|
|
46
|
-
*
|
|
45
|
+
* The project-membership guard resolves the device (scoped to the given
|
|
46
|
+
* project) before any write; return a matching device so the write path
|
|
47
|
+
* runs. The cross-project-refusal case overrides this to null.
|
|
47
48
|
*/
|
|
48
49
|
const ownedDevice: NetworkDevice = new NetworkDevice();
|
|
49
50
|
ownedDevice.id = new ObjectID(DEVICE_ID);
|
|
@@ -62,6 +63,9 @@ function mockServices(existingInterfaces: Array<NetworkInterface> = []): void {
|
|
|
62
63
|
interfaceCreateSpy = jest
|
|
63
64
|
.spyOn(NetworkInterfaceService, "create")
|
|
64
65
|
.mockResolvedValue(new NetworkInterface());
|
|
66
|
+
endpointUpsertSpy = jest
|
|
67
|
+
.spyOn(NetworkEndpointService, "upsertDiscoveredEndpoints")
|
|
68
|
+
.mockResolvedValue(undefined as never);
|
|
65
69
|
}
|
|
66
70
|
|
|
67
71
|
function deviceUpdatePayload(): DeviceUpdatePayload {
|
|
@@ -69,56 +73,16 @@ function deviceUpdatePayload(): DeviceUpdatePayload {
|
|
|
69
73
|
return deviceUpdateSpy.mock.calls[0][0].data as DeviceUpdatePayload;
|
|
70
74
|
}
|
|
71
75
|
|
|
72
|
-
function
|
|
73
|
-
monitor: Monitor;
|
|
74
|
-
stepId: ObjectID;
|
|
75
|
-
} {
|
|
76
|
-
const step: MonitorStep = new MonitorStep();
|
|
77
|
-
step.data = {
|
|
78
|
-
...step.data,
|
|
79
|
-
networkDeviceMonitor: {
|
|
80
|
-
networkDeviceId:
|
|
81
|
-
options && "networkDeviceId" in options
|
|
82
|
-
? options.networkDeviceId
|
|
83
|
-
: DEVICE_ID,
|
|
84
|
-
monitorInterfaces: true,
|
|
85
|
-
},
|
|
86
|
-
} as MonitorStep["data"];
|
|
87
|
-
|
|
88
|
-
const monitorSteps: MonitorSteps = new MonitorSteps();
|
|
89
|
-
monitorSteps.data = {
|
|
90
|
-
monitorStepsInstanceArray: [step],
|
|
91
|
-
defaultMonitorStatusId: undefined,
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
const monitor: Monitor = new Monitor();
|
|
95
|
-
monitor.projectId = ObjectID.generate();
|
|
96
|
-
monitor.monitorSteps = monitorSteps;
|
|
97
|
-
|
|
98
|
-
return { monitor: monitor, stepId: step.id };
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function buildResponse(
|
|
102
|
-
stepId: ObjectID,
|
|
76
|
+
function buildSnmpResponse(
|
|
103
77
|
snmpFields?: Partial<SnmpMonitorResponse>,
|
|
104
|
-
):
|
|
105
|
-
|
|
78
|
+
): SnmpMonitorResponse {
|
|
79
|
+
return {
|
|
106
80
|
isOnline: true,
|
|
107
81
|
responseTimeInMs: 12,
|
|
108
82
|
failureCause: "",
|
|
109
83
|
oidResponses: [],
|
|
110
84
|
...snmpFields,
|
|
111
85
|
};
|
|
112
|
-
|
|
113
|
-
return {
|
|
114
|
-
projectId: ObjectID.generate(),
|
|
115
|
-
monitorStepId: stepId,
|
|
116
|
-
monitorId: ObjectID.generate(),
|
|
117
|
-
probeId: ObjectID.generate(),
|
|
118
|
-
failureCause: "",
|
|
119
|
-
monitoredAt: NOW,
|
|
120
|
-
snmpResponse: snmpResponse,
|
|
121
|
-
} as ProbeMonitorResponse;
|
|
122
86
|
}
|
|
123
87
|
|
|
124
88
|
function walkedInterface(overrides?: Partial<SnmpInterface>): SnmpInterface {
|
|
@@ -141,16 +105,18 @@ function existingInterface(interfaceIndex: number): NetworkInterface {
|
|
|
141
105
|
|
|
142
106
|
async function runWalk(
|
|
143
107
|
snmpFields?: Partial<SnmpMonitorResponse>,
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const
|
|
108
|
+
options?: { isOnline?: boolean | undefined },
|
|
109
|
+
): Promise<SnmpMonitorResponse> {
|
|
110
|
+
const snmpResponse: SnmpMonitorResponse = buildSnmpResponse(snmpFields);
|
|
147
111
|
|
|
148
112
|
await NetworkInventoryUtil.updateFromWalk({
|
|
149
|
-
|
|
150
|
-
|
|
113
|
+
projectId: new ObjectID(PROJECT_ID),
|
|
114
|
+
deviceId: new ObjectID(DEVICE_ID),
|
|
115
|
+
snmpResponse: snmpResponse,
|
|
116
|
+
isOnline: options && "isOnline" in options ? options.isOnline : true,
|
|
151
117
|
});
|
|
152
118
|
|
|
153
|
-
return
|
|
119
|
+
return snmpResponse;
|
|
154
120
|
}
|
|
155
121
|
|
|
156
122
|
beforeEach(() => {
|
|
@@ -243,7 +209,7 @@ describe("NetworkInventoryUtil.updateFromWalk — system group enrichment", () =
|
|
|
243
209
|
});
|
|
244
210
|
|
|
245
211
|
describe("NetworkInventoryUtil.updateFromWalk — project-membership guard", () => {
|
|
246
|
-
test("refuses to write when the
|
|
212
|
+
test("refuses to write when the device is not in the given project", async () => {
|
|
247
213
|
mockServices();
|
|
248
214
|
// The scoped lookup finds no device → the id belongs to another project.
|
|
249
215
|
deviceFindSpy.mockResolvedValue(null);
|
|
@@ -257,37 +223,60 @@ describe("NetworkInventoryUtil.updateFromWalk — project-membership guard", ()
|
|
|
257
223
|
expect(interfaceCreateSpy).not.toHaveBeenCalled();
|
|
258
224
|
expect(interfaceUpdateSpy).not.toHaveBeenCalled();
|
|
259
225
|
});
|
|
226
|
+
|
|
227
|
+
test("the ownership lookup is scoped to both the device id and the project id", async () => {
|
|
228
|
+
mockServices();
|
|
229
|
+
|
|
230
|
+
await runWalk();
|
|
231
|
+
|
|
232
|
+
const query: Record<string, unknown> = deviceFindSpy.mock.calls[0][0].query;
|
|
233
|
+
|
|
234
|
+
expect(query["_id"]?.toString()).toBe(DEVICE_ID);
|
|
235
|
+
expect(query["projectId"]?.toString()).toBe(PROJECT_ID);
|
|
236
|
+
});
|
|
260
237
|
});
|
|
261
238
|
|
|
262
239
|
describe("NetworkInventoryUtil.updateFromWalk — reachability gating", () => {
|
|
263
240
|
test("an unreachable poll with no walk data writes nothing (no phantom lastSeenAt)", async () => {
|
|
264
241
|
mockServices();
|
|
265
242
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
projectId: ObjectID.generate(),
|
|
269
|
-
monitorStepId: stepId,
|
|
270
|
-
monitorId: ObjectID.generate(),
|
|
271
|
-
probeId: ObjectID.generate(),
|
|
272
|
-
failureCause: "Device did not respond",
|
|
273
|
-
monitoredAt: NOW,
|
|
274
|
-
isOnline: false,
|
|
275
|
-
snmpResponse: {
|
|
243
|
+
await runWalk(
|
|
244
|
+
{
|
|
276
245
|
isOnline: false,
|
|
277
246
|
responseTimeInMs: 0,
|
|
278
247
|
failureCause: "Device did not respond",
|
|
279
|
-
oidResponses: [],
|
|
280
248
|
},
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
await NetworkInventoryUtil.updateFromWalk({
|
|
284
|
-
monitor: monitor,
|
|
285
|
-
dataToProcess: response,
|
|
286
|
-
});
|
|
249
|
+
{ isOnline: false },
|
|
250
|
+
);
|
|
287
251
|
|
|
288
252
|
// lastSeenAt drives the up/down pill; a failed poll must not bump it.
|
|
289
253
|
expect(deviceUpdateSpy).not.toHaveBeenCalled();
|
|
290
254
|
});
|
|
255
|
+
|
|
256
|
+
test("an unreachable poll with walk data still enriches but never stamps lastSeenAt", async () => {
|
|
257
|
+
mockServices();
|
|
258
|
+
|
|
259
|
+
await runWalk(
|
|
260
|
+
{
|
|
261
|
+
isOnline: false,
|
|
262
|
+
systemInfo: { sysName: "core-sw-01" },
|
|
263
|
+
},
|
|
264
|
+
{ isOnline: false },
|
|
265
|
+
);
|
|
266
|
+
|
|
267
|
+
const update: DeviceUpdatePayload = deviceUpdatePayload();
|
|
268
|
+
|
|
269
|
+
expect(update["sysName"]).toBe("core-sw-01");
|
|
270
|
+
expect(update).not.toHaveProperty("lastSeenAt");
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
test("a walk that reports no reachability at all is treated as seen", async () => {
|
|
274
|
+
mockServices();
|
|
275
|
+
|
|
276
|
+
await runWalk(undefined, { isOnline: undefined });
|
|
277
|
+
|
|
278
|
+
expect(deviceUpdatePayload()["lastSeenAt"]).toEqual(NOW);
|
|
279
|
+
});
|
|
291
280
|
});
|
|
292
281
|
|
|
293
282
|
describe("NetworkInventoryUtil.updateFromWalk — lastRebootedAt", () => {
|
|
@@ -592,19 +581,15 @@ describe("NetworkInventoryUtil.updateFromWalk — interface upsert", () => {
|
|
|
592
581
|
|
|
593
582
|
test("the create path passes macAddress and interfaceType through", async () => {
|
|
594
583
|
mockServices([]);
|
|
595
|
-
const { monitor, stepId } = buildMonitor();
|
|
596
584
|
|
|
597
|
-
await
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
}),
|
|
606
|
-
],
|
|
607
|
-
}),
|
|
585
|
+
await runWalk({
|
|
586
|
+
interfaces: [
|
|
587
|
+
walkedInterface({
|
|
588
|
+
interfaceIndex: 7,
|
|
589
|
+
macAddress: "aa:bb:cc:dd:ee:ff",
|
|
590
|
+
interfaceType: 6,
|
|
591
|
+
}),
|
|
592
|
+
],
|
|
608
593
|
});
|
|
609
594
|
|
|
610
595
|
expect(interfaceCreateSpy).toHaveBeenCalledTimes(1);
|
|
@@ -618,7 +603,7 @@ describe("NetworkInventoryUtil.updateFromWalk — interface upsert", () => {
|
|
|
618
603
|
expect(created.name).toBe("GigabitEthernet0/1");
|
|
619
604
|
expect(created.isMonitored).toBe(true);
|
|
620
605
|
expect(created.networkDeviceId?.toString()).toBe(DEVICE_ID);
|
|
621
|
-
expect(created.projectId?.toString()).toBe(
|
|
606
|
+
expect(created.projectId?.toString()).toBe(PROJECT_ID);
|
|
622
607
|
});
|
|
623
608
|
|
|
624
609
|
test("the create path leaves macAddress and interfaceType unset when the walk has none", async () => {
|
|
@@ -667,7 +652,7 @@ describe("NetworkInventoryUtil.updateFromWalk — interface upsert", () => {
|
|
|
667
652
|
muted.isMonitored = false;
|
|
668
653
|
mockServices([muted]);
|
|
669
654
|
|
|
670
|
-
const
|
|
655
|
+
const snmpResponse: SnmpMonitorResponse = await runWalk({
|
|
671
656
|
interfaces: [
|
|
672
657
|
walkedInterface({ interfaceIndex: 1 }),
|
|
673
658
|
walkedInterface({ interfaceIndex: 2, name: "GigabitEthernet0/2" }),
|
|
@@ -679,8 +664,8 @@ describe("NetworkInventoryUtil.updateFromWalk — interface upsert", () => {
|
|
|
679
664
|
expect(interfaceCreateSpy).toHaveBeenCalledTimes(1);
|
|
680
665
|
|
|
681
666
|
// The in-flight response only keeps the monitored interface.
|
|
682
|
-
expect(
|
|
683
|
-
expect(
|
|
667
|
+
expect(snmpResponse.interfaces).toHaveLength(1);
|
|
668
|
+
expect(snmpResponse.interfaces?.[0]?.interfaceIndex).toBe(2);
|
|
684
669
|
});
|
|
685
670
|
});
|
|
686
671
|
|
|
@@ -707,14 +692,12 @@ describe("NetworkInventoryUtil.updateFromWalk — walks without interfaces", ()
|
|
|
707
692
|
|
|
708
693
|
test("a walk with no snmpResponse at all still stamps lastSeenAt", async () => {
|
|
709
694
|
mockServices();
|
|
710
|
-
const { monitor, stepId } = buildMonitor();
|
|
711
|
-
|
|
712
|
-
const response: ProbeMonitorResponse = buildResponse(stepId);
|
|
713
|
-
delete (response as { snmpResponse?: unknown }).snmpResponse;
|
|
714
695
|
|
|
715
696
|
await NetworkInventoryUtil.updateFromWalk({
|
|
716
|
-
|
|
717
|
-
|
|
697
|
+
projectId: new ObjectID(PROJECT_ID),
|
|
698
|
+
deviceId: new ObjectID(DEVICE_ID),
|
|
699
|
+
snmpResponse: undefined,
|
|
700
|
+
isOnline: true,
|
|
718
701
|
});
|
|
719
702
|
|
|
720
703
|
expect(deviceUpdatePayload()).toEqual({ lastSeenAt: NOW });
|
|
@@ -722,43 +705,87 @@ describe("NetworkInventoryUtil.updateFromWalk — walks without interfaces", ()
|
|
|
722
705
|
});
|
|
723
706
|
});
|
|
724
707
|
|
|
725
|
-
describe("NetworkInventoryUtil.updateFromWalk —
|
|
726
|
-
test("a
|
|
708
|
+
describe("NetworkInventoryUtil.updateFromWalk — endpoint discovery", () => {
|
|
709
|
+
test("a walk without ARP/FDB arrays (collection off) never touches endpoints", async () => {
|
|
727
710
|
mockServices();
|
|
728
|
-
const { monitor } = buildMonitor({ networkDeviceId: undefined });
|
|
729
711
|
|
|
730
|
-
await
|
|
731
|
-
|
|
732
|
-
dataToProcess: buildResponse(ObjectID.generate()),
|
|
712
|
+
await runWalk({
|
|
713
|
+
interfaces: [walkedInterface()],
|
|
733
714
|
});
|
|
734
715
|
|
|
735
|
-
expect(
|
|
736
|
-
expect(interfaceFindSpy).not.toHaveBeenCalled();
|
|
716
|
+
expect(endpointUpsertSpy).not.toHaveBeenCalled();
|
|
737
717
|
});
|
|
738
718
|
|
|
739
|
-
test("
|
|
719
|
+
test("ARP/FDB arrays that yield no endpoints skip the upsert", async () => {
|
|
740
720
|
mockServices();
|
|
741
|
-
const { monitor } = buildMonitor();
|
|
742
721
|
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
722
|
+
// Arrays present (collection ran) but nothing qualified as an endpoint.
|
|
723
|
+
await runWalk({
|
|
724
|
+
arpEntries: [],
|
|
725
|
+
fdbEntries: [],
|
|
746
726
|
});
|
|
747
727
|
|
|
748
|
-
expect(
|
|
728
|
+
expect(endpointUpsertSpy).not.toHaveBeenCalled();
|
|
749
729
|
});
|
|
750
730
|
|
|
751
|
-
test("a
|
|
731
|
+
test("a learned FDB entry is upserted as an attachment for the device's project", async () => {
|
|
752
732
|
mockServices();
|
|
753
|
-
const { monitor, stepId } = buildMonitor();
|
|
754
|
-
// exactOptionalPropertyTypes forbids assigning undefined directly.
|
|
755
|
-
(monitor as { projectId?: ObjectID | undefined }).projectId = undefined;
|
|
756
733
|
|
|
757
|
-
await
|
|
758
|
-
|
|
759
|
-
|
|
734
|
+
await runWalk({
|
|
735
|
+
interfaces: [walkedInterface({ interfaceIndex: 5, name: "Gi0/5" })],
|
|
736
|
+
fdbEntries: [
|
|
737
|
+
{
|
|
738
|
+
macAddress: "AA-BB-CC-00-11-22",
|
|
739
|
+
bridgePort: 5,
|
|
740
|
+
interfaceIndex: 5,
|
|
741
|
+
status: "learned",
|
|
742
|
+
},
|
|
743
|
+
],
|
|
760
744
|
});
|
|
761
745
|
|
|
762
|
-
expect(
|
|
746
|
+
expect(endpointUpsertSpy).toHaveBeenCalledTimes(1);
|
|
747
|
+
|
|
748
|
+
const upsert: Record<string, unknown> = endpointUpsertSpy.mock.calls[0][0];
|
|
749
|
+
|
|
750
|
+
expect((upsert["projectId"] as ObjectID).toString()).toBe(PROJECT_ID);
|
|
751
|
+
expect((upsert["deviceId"] as ObjectID).toString()).toBe(DEVICE_ID);
|
|
752
|
+
expect(upsert["now"]).toEqual(NOW);
|
|
753
|
+
expect(upsert["attachments"]).toEqual([
|
|
754
|
+
{
|
|
755
|
+
macAddress: "aa:bb:cc:00:11:22",
|
|
756
|
+
attachedInterfaceIndex: 5,
|
|
757
|
+
attachedPortName: "Gi0/5",
|
|
758
|
+
vlanId: undefined,
|
|
759
|
+
},
|
|
760
|
+
]);
|
|
761
|
+
expect(upsert["ipBindings"]).toEqual([]);
|
|
762
|
+
});
|
|
763
|
+
|
|
764
|
+
test("an ARP entry is upserted as an IP binding", async () => {
|
|
765
|
+
mockServices();
|
|
766
|
+
|
|
767
|
+
await runWalk({
|
|
768
|
+
arpEntries: [
|
|
769
|
+
{
|
|
770
|
+
ipAddress: "10.0.0.5",
|
|
771
|
+
macAddress: "aa:bb:cc:00:11:22",
|
|
772
|
+
interfaceIndex: 3,
|
|
773
|
+
entryType: "dynamic",
|
|
774
|
+
},
|
|
775
|
+
],
|
|
776
|
+
});
|
|
777
|
+
|
|
778
|
+
expect(endpointUpsertSpy).toHaveBeenCalledTimes(1);
|
|
779
|
+
|
|
780
|
+
const upsert: Record<string, unknown> = endpointUpsertSpy.mock.calls[0][0];
|
|
781
|
+
|
|
782
|
+
expect(upsert["attachments"]).toEqual([]);
|
|
783
|
+
expect(upsert["ipBindings"]).toEqual([
|
|
784
|
+
{
|
|
785
|
+
macAddress: "aa:bb:cc:00:11:22",
|
|
786
|
+
ipAddress: "10.0.0.5",
|
|
787
|
+
routerInterfaceIndex: 3,
|
|
788
|
+
},
|
|
789
|
+
]);
|
|
763
790
|
});
|
|
764
791
|
});
|