@oneuptime/common 11.6.1 → 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.
Files changed (397) hide show
  1. package/Models/AnalyticsModels/Index.ts +4 -0
  2. package/Models/AnalyticsModels/KubernetesCostAllocation.ts +842 -0
  3. package/Models/AnalyticsModels/NetworkFlow.ts +54 -0
  4. package/Models/AnalyticsModels/SloHistory.ts +240 -0
  5. package/Models/DatabaseModels/Index.ts +20 -0
  6. package/Models/DatabaseModels/NetworkDevice.ts +453 -6
  7. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +7 -6
  8. package/Models/DatabaseModels/NetworkEndpoint.ts +753 -0
  9. package/Models/DatabaseModels/NetworkSite.ts +1155 -0
  10. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +517 -0
  11. package/Models/DatabaseModels/NetworkSiteLink.ts +611 -0
  12. package/Models/DatabaseModels/NetworkSiteStatusTimeline.ts +520 -0
  13. package/Models/DatabaseModels/NetworkSiteType.ts +499 -0
  14. package/Models/DatabaseModels/ServiceLevelObjective.ts +1106 -0
  15. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +762 -0
  16. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +444 -0
  17. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +443 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.ts +359 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.ts +48 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.ts +65 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.ts +88 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.ts +391 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  24. package/Server/Services/AnalyticsDatabaseService.ts +25 -9
  25. package/Server/Services/Index.ts +24 -0
  26. package/Server/Services/KubernetesCostAllocationService.ts +14 -0
  27. package/Server/Services/MetricService.ts +21 -2
  28. package/Server/Services/MonitorService.ts +22 -0
  29. package/Server/Services/NetworkDeviceService.ts +438 -2
  30. package/Server/Services/NetworkEndpointService.ts +414 -0
  31. package/Server/Services/NetworkSiteAssignmentRuleService.ts +98 -0
  32. package/Server/Services/NetworkSiteLinkService.ts +10 -0
  33. package/Server/Services/NetworkSiteService.ts +1254 -0
  34. package/Server/Services/NetworkSiteStatusTimelineService.ts +10 -0
  35. package/Server/Services/NetworkSiteTypeService.ts +10 -0
  36. package/Server/Services/ProjectService.ts +122 -2
  37. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +457 -0
  38. package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +10 -0
  39. package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +10 -0
  40. package/Server/Services/ServiceLevelObjectiveService.ts +677 -0
  41. package/Server/Services/SloHistoryService.ts +101 -0
  42. package/Server/Services/UserNotificationSettingService.ts +37 -0
  43. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +9 -0
  44. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +15 -0
  45. package/Server/Utils/AnalyticsDatabase/Statement.ts +39 -3
  46. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +87 -48
  47. package/Server/Utils/Memory.ts +9 -1
  48. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +190 -12
  49. package/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  50. package/Server/Utils/Monitor/DnsResolutionCache.ts +129 -0
  51. package/Server/Utils/Monitor/MonitorResource.ts +4 -30
  52. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +214 -39
  53. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +343 -0
  54. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +251 -0
  55. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +176 -142
  56. package/Server/Utils/Monitor/OuiLookupUtil.ts +49 -0
  57. package/Server/Utils/Monitor/SnmpInterfaceRateUtil.ts +17 -13
  58. package/Server/Utils/WhatsAppTemplateUtil.ts +7 -3
  59. package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +135 -0
  60. package/Tests/Models/NetworkSiteHierarchy.test.ts +134 -0
  61. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +239 -0
  62. package/Tests/Server/Services/KubernetesCostAllocationAggregate.test.ts +338 -0
  63. package/Tests/Server/Services/MetricServiceAggregate.test.ts +142 -0
  64. package/Tests/Server/Services/NetworkDeviceSiteAssignment.test.ts +484 -0
  65. package/Tests/Server/Services/NetworkEndpointServiceUpsert.test.ts +686 -0
  66. package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +185 -0
  67. package/Tests/Server/Services/NetworkSiteService.test.ts +1354 -0
  68. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +1313 -0
  69. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +1988 -0
  70. package/Tests/Server/Utils/AnalyticsDatabase/Statement.test.ts +22 -0
  71. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +404 -0
  72. package/Tests/Server/Utils/Encryption.test.ts +70 -0
  73. package/Tests/Server/Utils/FileAttachmentMarkdownUtil.test.ts +225 -0
  74. package/Tests/Server/Utils/JsonWebToken.test.ts +175 -0
  75. package/Tests/Server/Utils/LocalFile.test.ts +258 -0
  76. package/Tests/Server/Utils/Memory.test.ts +213 -0
  77. package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +30 -0
  78. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +385 -0
  79. package/Tests/Server/Utils/Monitor/DnsResolutionCache.test.ts +194 -0
  80. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +155 -0
  81. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +600 -0
  82. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +151 -124
  83. package/Tests/Server/Utils/Monitor/SnmpInterfaceRateUtil.test.ts +496 -0
  84. package/Tests/Server/Utils/MonitorCriteriaDataExtractor.test.ts +175 -0
  85. package/Tests/Server/Utils/MonitorCriteriaMessageFormatter.test.ts +282 -0
  86. package/Tests/Server/Utils/OuiLookupUtil.test.ts +59 -0
  87. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +117 -0
  88. package/Tests/Server/Utils/StackTraceParser.test.ts +370 -0
  89. package/Tests/Server/Utils/Stream.test.ts +87 -0
  90. package/Tests/Server/Utils/ValidateGlobalProviderProjectTeams.test.ts +221 -0
  91. package/Tests/Server/Utils/WhatsAppTemplateUtil.test.ts +199 -0
  92. package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +33 -0
  93. package/Tests/Types/Email.test.ts +198 -0
  94. package/Tests/Types/Kubernetes/KubernetesObjectParser.test.ts +177 -0
  95. package/Tests/Types/Log/LogQueryToFilter.test.ts +111 -0
  96. package/Tests/Types/Monitor/MonitorStepNetworkDeviceMonitor.test.ts +141 -1
  97. package/Tests/Types/Monitor/MonitorType.test.ts +59 -1
  98. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +97 -0
  99. package/Tests/Types/Monitor/SnmpEndpointDiscovery.test.ts +151 -0
  100. package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +110 -6
  101. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +129 -0
  102. package/Tests/Types/SerializableObjectDictionary.test.ts +166 -0
  103. package/Tests/Types/Time/RangeStartAndEndDateTime.test.ts +98 -0
  104. package/Tests/Types/WebsiteRequest.test.ts +230 -0
  105. package/Tests/UI/Components/EntityFilterRoundTrip.test.tsx +103 -0
  106. package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +612 -0
  107. package/Tests/UI/Components/ModelTable/FilterDataToQuery.test.ts +275 -0
  108. package/Tests/UI/Utils/LogExport.test.ts +159 -0
  109. package/Tests/UI/Utils/Navigation.test.ts +183 -0
  110. package/Tests/UI/Utils/TableFilterUrlState.test.ts +539 -0
  111. package/Tests/UI/Utils/TableViewUrlState.test.ts +272 -0
  112. package/Tests/Utils/Base64.test.ts +51 -0
  113. package/Tests/Utils/Boolean.test.ts +76 -0
  114. package/Tests/Utils/Crypto.test.ts +48 -0
  115. package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +259 -0
  116. package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +162 -0
  117. package/Tests/Utils/Enum.test.ts +54 -0
  118. package/Tests/Utils/IpCanonicalUtil.test.ts +85 -0
  119. package/Tests/Utils/Metrics/MetricSeriesFingerprint.test.ts +160 -0
  120. package/Tests/Utils/Monitor/EndpointAttachmentUtil.test.ts +836 -0
  121. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +218 -0
  122. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +447 -0
  123. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +440 -0
  124. package/Tests/Utils/NetworkSite/MaterializedPathUtil.test.ts +205 -0
  125. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +221 -0
  126. package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +283 -0
  127. package/Tests/Utils/ObjectUtil.test.ts +30 -0
  128. package/Tests/Utils/Slo/SloStatusColor.test.ts +89 -0
  129. package/Tests/Utils/Slo/SloUtil.test.ts +1980 -0
  130. package/Tests/Utils/Slo/SloWidgetFormat.test.ts +605 -0
  131. package/Tests/Utils/TechStack.test.ts +50 -0
  132. package/Tests/Utils/Traces/CriticalPath.test.ts +178 -0
  133. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +10 -0
  134. package/Types/BaseDatabase/EqualTo.ts +9 -1
  135. package/Types/BaseDatabase/EqualToOrNull.ts +9 -1
  136. package/Types/BaseDatabase/NotEqual.ts +9 -1
  137. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  138. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  139. package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +42 -0
  140. package/Types/Dashboard/DashboardTemplates.ts +214 -0
  141. package/Types/Email/EmailTemplateType.ts +2 -0
  142. package/Types/Kubernetes/KubernetesCostIngest.ts +79 -0
  143. package/Types/Monitor/CriteriaFilter.ts +9 -0
  144. package/Types/Monitor/MonitorStep.ts +5 -8
  145. package/Types/Monitor/MonitorStepNetworkDeviceMonitor.ts +27 -5
  146. package/Types/Monitor/MonitorType.ts +15 -5
  147. package/Types/Monitor/SnmpMonitor/ArpEntry.ts +14 -0
  148. package/Types/Monitor/SnmpMonitor/FdbEntry.ts +18 -0
  149. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +10 -3
  150. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -5
  151. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +12 -0
  152. package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +231 -3
  153. package/Types/NetworkSite/DefaultNetworkSiteType.ts +20 -0
  154. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  155. package/Types/Permission.ts +449 -0
  156. package/Types/ServiceLevelObjective/SliType.ts +6 -0
  157. package/Types/ServiceLevelObjective/SloMultiMonitorMode.ts +6 -0
  158. package/Types/ServiceLevelObjective/SloStatus.ts +9 -0
  159. package/Types/ServiceLevelObjective/SloWindowType.ts +6 -0
  160. package/Types/Telemetry/ServiceType.ts +1 -0
  161. package/UI/Components/Filters/EntityFilter.tsx +16 -0
  162. package/UI/Components/Filters/FilterViewer.tsx +22 -5
  163. package/UI/Components/List/List.tsx +8 -0
  164. package/UI/Components/ModelTable/BaseModelTable.tsx +309 -106
  165. package/UI/Components/ModelTable/FilterDataToQuery.ts +172 -0
  166. package/UI/Components/Navbar/NavBar.tsx +16 -2
  167. package/UI/Components/Navbar/NavBarMenuModal.tsx +3 -3
  168. package/UI/Utils/Navigation.ts +10 -0
  169. package/UI/Utils/TableFilterUrlState.ts +204 -17
  170. package/UI/Utils/TableViewUrlState.ts +165 -0
  171. package/Utils/Dashboard/Components/DashboardSloComponent.ts +114 -0
  172. package/Utils/Dashboard/Components/Index.ts +7 -0
  173. package/Utils/IpCanonicalUtil.ts +134 -0
  174. package/Utils/Monitor/EndpointAttachmentUtil.ts +508 -0
  175. package/Utils/Monitor/NetworkTopologyUtil.ts +157 -5
  176. package/Utils/NetworkSite/CidrMatchUtil.ts +296 -0
  177. package/Utils/NetworkSite/MaterializedPathUtil.ts +115 -0
  178. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +97 -0
  179. package/Utils/NetworkSite/SiteUptimeUtil.ts +111 -0
  180. package/Utils/Slo/SloStatusColor.ts +54 -0
  181. package/Utils/Slo/SloUtil.ts +637 -0
  182. package/Utils/Slo/SloWidgetFormat.ts +383 -0
  183. package/build/dist/Models/AnalyticsModels/Index.js +4 -0
  184. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  185. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +713 -0
  186. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -0
  187. package/build/dist/Models/AnalyticsModels/NetworkFlow.js +44 -0
  188. package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
  189. package/build/dist/Models/AnalyticsModels/SloHistory.js +215 -0
  190. package/build/dist/Models/AnalyticsModels/SloHistory.js.map +1 -0
  191. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  192. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  193. package/build/dist/Models/DatabaseModels/NetworkDevice.js +458 -6
  194. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  195. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +0 -6
  196. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  197. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js +779 -0
  198. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js.map +1 -0
  199. package/build/dist/Models/DatabaseModels/NetworkSite.js +1180 -0
  200. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -0
  201. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +534 -0
  202. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -0
  203. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js +629 -0
  204. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js.map +1 -0
  205. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +538 -0
  206. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -0
  207. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +522 -0
  208. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -0
  209. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +1124 -0
  210. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -0
  211. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +769 -0
  212. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -0
  213. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +460 -0
  214. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -0
  215. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +459 -0
  216. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -0
  217. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js +130 -0
  218. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js.map +1 -0
  219. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js +31 -0
  220. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js.map +1 -0
  221. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js +36 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js.map +1 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js +49 -0
  224. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js.map +1 -0
  225. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js +140 -0
  226. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js.map +1 -0
  227. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  228. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  229. package/build/dist/Server/Services/AnalyticsDatabaseService.js +23 -6
  230. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  231. package/build/dist/Server/Services/Index.js +24 -0
  232. package/build/dist/Server/Services/Index.js.map +1 -1
  233. package/build/dist/Server/Services/KubernetesCostAllocationService.js +12 -0
  234. package/build/dist/Server/Services/KubernetesCostAllocationService.js.map +1 -0
  235. package/build/dist/Server/Services/MetricService.js +21 -3
  236. package/build/dist/Server/Services/MetricService.js.map +1 -1
  237. package/build/dist/Server/Services/MonitorService.js +19 -0
  238. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  239. package/build/dist/Server/Services/NetworkDeviceService.js +351 -1
  240. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  241. package/build/dist/Server/Services/NetworkEndpointService.js +319 -0
  242. package/build/dist/Server/Services/NetworkEndpointService.js.map +1 -0
  243. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +90 -0
  244. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -0
  245. package/build/dist/Server/Services/NetworkSiteLinkService.js +9 -0
  246. package/build/dist/Server/Services/NetworkSiteLinkService.js.map +1 -0
  247. package/build/dist/Server/Services/NetworkSiteService.js +1038 -0
  248. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -0
  249. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js +9 -0
  250. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js.map +1 -0
  251. package/build/dist/Server/Services/NetworkSiteTypeService.js +9 -0
  252. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -0
  253. package/build/dist/Server/Services/ProjectService.js +98 -2
  254. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  255. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +358 -0
  256. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -0
  257. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +9 -0
  258. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -0
  259. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +9 -0
  260. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -0
  261. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +582 -0
  262. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -0
  263. package/build/dist/Server/Services/SloHistoryService.js +77 -0
  264. package/build/dist/Server/Services/SloHistoryService.js.map +1 -0
  265. package/build/dist/Server/Services/UserNotificationSettingService.js +20 -0
  266. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  267. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +9 -0
  268. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  269. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +15 -0
  270. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  271. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +31 -0
  272. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  273. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +76 -48
  274. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  275. package/build/dist/Server/Utils/Memory.js +9 -1
  276. package/build/dist/Server/Utils/Memory.js.map +1 -1
  277. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +132 -10
  278. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  279. package/build/dist/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  280. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js +77 -0
  281. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js.map +1 -0
  282. package/build/dist/Server/Utils/Monitor/MonitorResource.js +21 -41
  283. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  284. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +152 -40
  285. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  286. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +262 -0
  287. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -0
  288. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +201 -0
  289. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -0
  290. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +152 -120
  291. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  292. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js +44 -0
  293. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js.map +1 -0
  294. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js +10 -10
  295. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js.map +1 -1
  296. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +5 -0
  297. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  298. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +10 -0
  299. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  300. package/build/dist/Types/BaseDatabase/EqualTo.js +9 -1
  301. package/build/dist/Types/BaseDatabase/EqualTo.js.map +1 -1
  302. package/build/dist/Types/BaseDatabase/EqualToOrNull.js +9 -1
  303. package/build/dist/Types/BaseDatabase/EqualToOrNull.js.map +1 -1
  304. package/build/dist/Types/BaseDatabase/NotEqual.js +9 -1
  305. package/build/dist/Types/BaseDatabase/NotEqual.js.map +1 -1
  306. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  307. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  308. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  309. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  310. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js +23 -0
  311. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js.map +1 -0
  312. package/build/dist/Types/Dashboard/DashboardTemplates.js +205 -0
  313. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  314. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  315. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  316. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js +21 -0
  317. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -0
  318. package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
  319. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  320. package/build/dist/Types/Monitor/MonitorStep.js +5 -5
  321. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  322. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js +8 -0
  323. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js.map +1 -1
  324. package/build/dist/Types/Monitor/MonitorType.js +15 -5
  325. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  326. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js +2 -0
  327. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js.map +1 -0
  328. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js +2 -0
  329. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js.map +1 -0
  330. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +9 -3
  331. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  332. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +217 -3
  333. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
  334. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js +21 -0
  335. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js.map +1 -0
  336. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  337. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  338. package/build/dist/Types/Permission.js +409 -0
  339. package/build/dist/Types/Permission.js.map +1 -1
  340. package/build/dist/Types/ServiceLevelObjective/SliType.js +7 -0
  341. package/build/dist/Types/ServiceLevelObjective/SliType.js.map +1 -0
  342. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js +7 -0
  343. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js.map +1 -0
  344. package/build/dist/Types/ServiceLevelObjective/SloStatus.js +10 -0
  345. package/build/dist/Types/ServiceLevelObjective/SloStatus.js.map +1 -0
  346. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js +7 -0
  347. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js.map +1 -0
  348. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  349. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  350. package/build/dist/UI/Components/Filters/EntityFilter.js +15 -0
  351. package/build/dist/UI/Components/Filters/EntityFilter.js.map +1 -1
  352. package/build/dist/UI/Components/Filters/FilterViewer.js +19 -4
  353. package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
  354. package/build/dist/UI/Components/List/List.js +1 -1
  355. package/build/dist/UI/Components/List/List.js.map +1 -1
  356. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +235 -89
  357. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  358. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js +96 -0
  359. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js.map +1 -0
  360. package/build/dist/UI/Components/Navbar/NavBar.js +14 -2
  361. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  362. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +3 -2
  363. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  364. package/build/dist/UI/Utils/Navigation.js +9 -0
  365. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  366. package/build/dist/UI/Utils/TableFilterUrlState.js +159 -15
  367. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  368. package/build/dist/UI/Utils/TableViewUrlState.js +103 -0
  369. package/build/dist/UI/Utils/TableViewUrlState.js.map +1 -0
  370. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +93 -0
  371. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -0
  372. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  373. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  374. package/build/dist/Utils/IpCanonicalUtil.js +110 -0
  375. package/build/dist/Utils/IpCanonicalUtil.js.map +1 -0
  376. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js +311 -0
  377. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js.map +1 -0
  378. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +98 -5
  379. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  380. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +222 -0
  381. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -0
  382. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js +89 -0
  383. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js.map +1 -0
  384. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +60 -0
  385. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -0
  386. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +76 -0
  387. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -0
  388. package/build/dist/Utils/Slo/SloStatusColor.js +18 -0
  389. package/build/dist/Utils/Slo/SloStatusColor.js.map +1 -0
  390. package/build/dist/Utils/Slo/SloUtil.js +393 -0
  391. package/build/dist/Utils/Slo/SloUtil.js.map +1 -0
  392. package/build/dist/Utils/Slo/SloWidgetFormat.js +174 -0
  393. package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -0
  394. package/package.json +2 -2
  395. package/Types/Dashboard/DashboardComponents/Index.ts +0 -7
  396. package/build/dist/Types/Dashboard/DashboardComponents/Index.js +0 -8
  397. 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. These tests mock the two services it writes through and
22
- * pin the enrichment contract: which walked fields land on the device row
23
- * (and at what column-limit truncation), how uptime becomes lastRebootedAt,
24
- * how the vendor is chosen, the LLDP/CDP snapshot semantics (store-even-
25
- * when-empty, capped), and what flows into the interface upsert on both the
26
- * update and create paths.
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
- * monitor's project) before any write; return a matching device so the
46
- * write path runs. The cross-project-refusal case overrides this to null.
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 buildMonitor(options?: { networkDeviceId?: string | undefined }): {
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
- ): ProbeMonitorResponse {
105
- const snmpResponse: SnmpMonitorResponse = {
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
- ): Promise<ProbeMonitorResponse> {
145
- const { monitor, stepId } = buildMonitor();
146
- const response: ProbeMonitorResponse = buildResponse(stepId, snmpFields);
108
+ options?: { isOnline?: boolean | undefined },
109
+ ): Promise<SnmpMonitorResponse> {
110
+ const snmpResponse: SnmpMonitorResponse = buildSnmpResponse(snmpFields);
147
111
 
148
112
  await NetworkInventoryUtil.updateFromWalk({
149
- monitor: monitor,
150
- dataToProcess: response,
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 response;
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 step's device is not in the monitor's project", async () => {
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
- const { monitor, stepId } = buildMonitor();
267
- const response: ProbeMonitorResponse = {
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
- } as ProbeMonitorResponse;
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 NetworkInventoryUtil.updateFromWalk({
598
- monitor: monitor,
599
- dataToProcess: buildResponse(stepId, {
600
- interfaces: [
601
- walkedInterface({
602
- interfaceIndex: 7,
603
- macAddress: "aa:bb:cc:dd:ee:ff",
604
- interfaceType: 6,
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(monitor.projectId?.toString());
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 response: ProbeMonitorResponse = await runWalk({
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(response.snmpResponse?.interfaces).toHaveLength(1);
683
- expect(response.snmpResponse?.interfaces?.[0]?.interfaceIndex).toBe(2);
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
- monitor: monitor,
717
- dataToProcess: response,
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 — guards", () => {
726
- test("a response for a step that does not reference a device performs no writes", async () => {
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 NetworkInventoryUtil.updateFromWalk({
731
- monitor: monitor,
732
- dataToProcess: buildResponse(ObjectID.generate()),
712
+ await runWalk({
713
+ interfaces: [walkedInterface()],
733
714
  });
734
715
 
735
- expect(deviceUpdateSpy).not.toHaveBeenCalled();
736
- expect(interfaceFindSpy).not.toHaveBeenCalled();
716
+ expect(endpointUpsertSpy).not.toHaveBeenCalled();
737
717
  });
738
718
 
739
- test("a response whose step id matches no step performs no writes", async () => {
719
+ test("ARP/FDB arrays that yield no endpoints skip the upsert", async () => {
740
720
  mockServices();
741
- const { monitor } = buildMonitor();
742
721
 
743
- await NetworkInventoryUtil.updateFromWalk({
744
- monitor: monitor,
745
- dataToProcess: buildResponse(ObjectID.generate()),
722
+ // Arrays present (collection ran) but nothing qualified as an endpoint.
723
+ await runWalk({
724
+ arpEntries: [],
725
+ fdbEntries: [],
746
726
  });
747
727
 
748
- expect(deviceUpdateSpy).not.toHaveBeenCalled();
728
+ expect(endpointUpsertSpy).not.toHaveBeenCalled();
749
729
  });
750
730
 
751
- test("a monitor without a projectId performs no writes", async () => {
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 NetworkInventoryUtil.updateFromWalk({
758
- monitor: monitor,
759
- dataToProcess: buildResponse(stepId),
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(deviceUpdateSpy).not.toHaveBeenCalled();
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
  });