@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
@@ -0,0 +1,111 @@
1
+ import GreaterThan from "../../../Types/BaseDatabase/GreaterThan";
2
+ import GreaterThanOrEqual from "../../../Types/BaseDatabase/GreaterThanOrEqual";
3
+ import LessThan from "../../../Types/BaseDatabase/LessThan";
4
+ import NotEqual from "../../../Types/BaseDatabase/NotEqual";
5
+ import Search from "../../../Types/BaseDatabase/Search";
6
+ import {
7
+ LogFilter,
8
+ queryStringToFilter,
9
+ } from "../../../Types/Log/LogQueryToFilter";
10
+ import { describe, expect, test } from "@jest/globals";
11
+
12
+ /*
13
+ * queryStringToFilter turns the log search bar's query string into a
14
+ * Query<Log>-shaped filter. It sits on top of the (separately tested)
15
+ * LogQueryParser, so these tests focus on the mapping layer: operator ->
16
+ * BaseDatabase value type, top-level vs @attribute routing, severity casing
17
+ * normalization, and free-text accumulation into body Search.
18
+ */
19
+
20
+ describe("queryStringToFilter - free text", () => {
21
+ test("empty query yields an empty filter", () => {
22
+ expect(queryStringToFilter("")).toEqual({});
23
+ });
24
+
25
+ test("bare words become a body Search", () => {
26
+ const filter: LogFilter = queryStringToFilter("connection refused");
27
+ expect(filter.body).toBeInstanceOf(Search);
28
+ expect((filter.body as Search<string>).toString()).toBe(
29
+ "connection refused",
30
+ );
31
+ });
32
+ });
33
+
34
+ describe("queryStringToFilter - top-level fields", () => {
35
+ test("severity:error normalizes to title-case Error as an equals match", () => {
36
+ const filter: LogFilter = queryStringToFilter("severity:error");
37
+ expect(filter.severityText).toBe("Error");
38
+ });
39
+
40
+ test("level:warn aliases to severityText and normalizes warn -> Warning", () => {
41
+ const filter: LogFilter = queryStringToFilter("level:warn");
42
+ expect(filter.severityText).toBe("Warning");
43
+ });
44
+
45
+ test("service:api maps to primaryEntityId", () => {
46
+ const filter: LogFilter = queryStringToFilter("service:api");
47
+ expect(filter.primaryEntityId).toBe("api");
48
+ });
49
+
50
+ test("negation produces a NotEqual with normalized severity", () => {
51
+ const filter: LogFilter = queryStringToFilter("-severity:debug");
52
+ expect(filter.severityText).toBeInstanceOf(NotEqual);
53
+ expect((filter.severityText as unknown as NotEqual<string>).value).toBe(
54
+ "Debug",
55
+ );
56
+ });
57
+
58
+ test("wildcard produces a Search with the asterisks stripped", () => {
59
+ const filter: LogFilter = queryStringToFilter("service:api-*");
60
+ expect(filter.primaryEntityId).toBeInstanceOf(Search);
61
+ expect(
62
+ (filter.primaryEntityId as unknown as Search<string>).toString(),
63
+ ).toBe("api-");
64
+ });
65
+ });
66
+
67
+ describe("queryStringToFilter - attribute fields", () => {
68
+ test("@http.status_code:500 lands under attributes as an equals string", () => {
69
+ const filter: LogFilter = queryStringToFilter("@http.status_code:500");
70
+ expect(filter.attributes).toEqual({ "http.status_code": "500" });
71
+ });
72
+
73
+ test("numeric comparison operators parse the value as a number", () => {
74
+ const gt: LogFilter = queryStringToFilter("@duration:>1000");
75
+ expect(gt.attributes!["duration"]).toBeInstanceOf(GreaterThan);
76
+ expect((gt.attributes!["duration"] as GreaterThan<number>).value).toBe(
77
+ 1000,
78
+ );
79
+
80
+ const gte: LogFilter = queryStringToFilter("@duration:>=1000");
81
+ expect(gte.attributes!["duration"]).toBeInstanceOf(GreaterThanOrEqual);
82
+
83
+ const lt: LogFilter = queryStringToFilter("@duration:<50");
84
+ expect(lt.attributes!["duration"]).toBeInstanceOf(LessThan);
85
+ expect((lt.attributes!["duration"] as LessThan<number>).value).toBe(50);
86
+ });
87
+
88
+ test("a non-numeric comparison value stays a string", () => {
89
+ const filter: LogFilter = queryStringToFilter("@version:>abc");
90
+ expect((filter.attributes!["version"] as GreaterThan<string>).value).toBe(
91
+ "abc",
92
+ );
93
+ });
94
+
95
+ test("negated attribute filter produces a NotEqual", () => {
96
+ const filter: LogFilter = queryStringToFilter("-@http.method:GET");
97
+ expect(filter.attributes!["http.method"]).toBeInstanceOf(NotEqual);
98
+ expect((filter.attributes!["http.method"] as NotEqual<string>).value).toBe(
99
+ "GET",
100
+ );
101
+ });
102
+ });
103
+
104
+ describe("queryStringToFilter - combinations", () => {
105
+ test("a field filter plus trailing free text populate distinct slots", () => {
106
+ const filter: LogFilter = queryStringToFilter("severity:error timeout");
107
+ expect(filter.severityText).toBe("Error");
108
+ expect(filter.body).toBeInstanceOf(Search);
109
+ expect((filter.body as Search<string>).toString()).toBe("timeout");
110
+ });
111
+ });
@@ -1,17 +1,44 @@
1
1
  import { JSONObject } from "../../../Types/JSON";
2
+ import MonitorStep from "../../../Types/Monitor/MonitorStep";
2
3
  import MonitorStepNetworkDeviceMonitor, {
3
4
  MonitorStepNetworkDeviceMonitorUtil,
4
5
  } from "../../../Types/Monitor/MonitorStepNetworkDeviceMonitor";
6
+ import MonitorType from "../../../Types/Monitor/MonitorType";
5
7
  import SnmpOid from "../../../Types/Monitor/SnmpMonitor/SnmpOid";
8
+ import ObjectID from "../../../Types/ObjectID";
9
+
10
+ const getNetworkDeviceMonitorStep: (
11
+ overrides?: Partial<MonitorStepNetworkDeviceMonitor>,
12
+ ) => MonitorStep = (
13
+ overrides: Partial<MonitorStepNetworkDeviceMonitor> = {},
14
+ ): MonitorStep => {
15
+ const id: ObjectID = ObjectID.generate();
16
+ const monitorStep: MonitorStep = MonitorStep.getDefaultMonitorStep({
17
+ monitorName: "Network device monitor",
18
+ monitorType: MonitorType.NetworkDevice,
19
+ onlineMonitorStatusId: id,
20
+ offlineMonitorStatusId: id,
21
+ defaultIncidentSeverityId: id,
22
+ defaultAlertSeverityId: id,
23
+ });
24
+
25
+ return monitorStep.setNetworkDeviceMonitor({
26
+ ...MonitorStepNetworkDeviceMonitorUtil.getDefault(),
27
+ networkDeviceId: "device-1",
28
+ ...overrides,
29
+ });
30
+ };
6
31
 
7
32
  describe("MonitorStepNetworkDeviceMonitorUtil", () => {
8
33
  describe("getDefault", () => {
9
- test("returns no device, interface monitoring on, and no oids", () => {
34
+ test("returns no device, interface monitoring on, endpoint collection OFF, and no oids", () => {
10
35
  const def: MonitorStepNetworkDeviceMonitor =
11
36
  MonitorStepNetworkDeviceMonitorUtil.getDefault();
12
37
 
13
38
  expect(def.networkDeviceId).toBeUndefined();
14
39
  expect(def.monitorInterfaces).toBe(true);
40
+ // Endpoint collection is strictly opt-in, so a new step starts off.
41
+ expect(def.collectEndpoints).toBe(false);
15
42
  expect(def.oids).toEqual([]);
16
43
  });
17
44
  });
@@ -22,6 +49,7 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
22
49
  MonitorStepNetworkDeviceMonitorUtil.fromJSON({
23
50
  networkDeviceId: "device-1",
24
51
  monitorInterfaces: false,
52
+ collectEndpoints: false,
25
53
  oids: [
26
54
  {
27
55
  oid: "1.3.6.1.2.1.1.1.0",
@@ -33,6 +61,7 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
33
61
 
34
62
  expect(monitor.networkDeviceId).toBe("device-1");
35
63
  expect(monitor.monitorInterfaces).toBe(false);
64
+ expect(monitor.collectEndpoints).toBe(false);
36
65
  expect(monitor.oids.length).toBe(1);
37
66
  expect(monitor.oids[0]!.oid).toBe("1.3.6.1.2.1.1.1.0");
38
67
  expect(monitor.oids[0]!.name).toBe("sysDescr");
@@ -58,6 +87,37 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
58
87
  ).toBe(false);
59
88
  });
60
89
 
90
+ test("defaults collectEndpoints to false unless it is explicitly true", () => {
91
+ // Missing -> false: steps saved before the flag existed stay opted out.
92
+ expect(
93
+ MonitorStepNetworkDeviceMonitorUtil.fromJSON({}).collectEndpoints,
94
+ ).toBe(false);
95
+ // Explicit true -> true: the only way to opt in.
96
+ expect(
97
+ MonitorStepNetworkDeviceMonitorUtil.fromJSON({
98
+ collectEndpoints: true,
99
+ }).collectEndpoints,
100
+ ).toBe(true);
101
+ // Explicit false -> false.
102
+ expect(
103
+ MonitorStepNetworkDeviceMonitorUtil.fromJSON({
104
+ collectEndpoints: false,
105
+ }).collectEndpoints,
106
+ ).toBe(false);
107
+ // null (a JSON round trip of undefined) -> false, not "not false".
108
+ expect(
109
+ MonitorStepNetworkDeviceMonitorUtil.fromJSON({
110
+ collectEndpoints: null,
111
+ }).collectEndpoints,
112
+ ).toBe(false);
113
+ // A truthy non-true value is NOT an opt-in.
114
+ expect(
115
+ MonitorStepNetworkDeviceMonitorUtil.fromJSON({
116
+ collectEndpoints: "true",
117
+ }).collectEndpoints,
118
+ ).toBe(false);
119
+ });
120
+
61
121
  test("coerces a missing networkDeviceId to undefined and missing oids to []", () => {
62
122
  const monitor: MonitorStepNetworkDeviceMonitor =
63
123
  MonitorStepNetworkDeviceMonitorUtil.fromJSON({});
@@ -85,6 +145,7 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
85
145
  const monitor: MonitorStepNetworkDeviceMonitor = {
86
146
  networkDeviceId: "device-42",
87
147
  monitorInterfaces: false,
148
+ collectEndpoints: false,
88
149
  oids: [{ oid: "1.2.3", name: "n", description: "d" }],
89
150
  };
90
151
 
@@ -93,10 +154,22 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
93
154
 
94
155
  expect(json["networkDeviceId"]).toBe("device-42");
95
156
  expect(json["monitorInterfaces"]).toBe(false);
157
+ expect(json["collectEndpoints"]).toBe(false);
96
158
  expect(json["oids"]).toEqual([
97
159
  { oid: "1.2.3", name: "n", description: "d" },
98
160
  ]);
99
161
  });
162
+
163
+ test("passes collectEndpoints through untouched (true stays true)", () => {
164
+ const json: JSONObject = MonitorStepNetworkDeviceMonitorUtil.toJSON({
165
+ networkDeviceId: undefined,
166
+ monitorInterfaces: true,
167
+ collectEndpoints: true,
168
+ oids: [],
169
+ });
170
+
171
+ expect(json["collectEndpoints"]).toBe(true);
172
+ });
100
173
  });
101
174
 
102
175
  describe("round trip", () => {
@@ -104,6 +177,7 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
104
177
  const original: MonitorStepNetworkDeviceMonitor = {
105
178
  networkDeviceId: "device-7",
106
179
  monitorInterfaces: false,
180
+ collectEndpoints: false,
107
181
  oids: [
108
182
  { oid: "1.3.6.1.2.1.1.1.0", name: "sysDescr", description: "desc" },
109
183
  {
@@ -134,6 +208,26 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
134
208
  expect(roundTripped).toEqual(def);
135
209
  });
136
210
 
211
+ test("a legacy step without collectEndpoints round-trips to endpoint collection OFF", () => {
212
+ // Steps saved before the flag existed serialize without it…
213
+ const legacy: MonitorStepNetworkDeviceMonitor = {
214
+ networkDeviceId: "device-legacy",
215
+ monitorInterfaces: true,
216
+ oids: [],
217
+ };
218
+
219
+ const roundTripped: MonitorStepNetworkDeviceMonitor =
220
+ MonitorStepNetworkDeviceMonitorUtil.fromJSON(
221
+ MonitorStepNetworkDeviceMonitorUtil.toJSON(legacy),
222
+ );
223
+
224
+ /*
225
+ * …and must deserialize opted OUT: an upgrade cannot silently enrol
226
+ * an existing monitor into extra SNMP walks and per-MAC writes.
227
+ */
228
+ expect(roundTripped.collectEndpoints).toBe(false);
229
+ });
230
+
137
231
  test("preserves oids with only an oid string across a round trip", () => {
138
232
  const original: MonitorStepNetworkDeviceMonitor = {
139
233
  networkDeviceId: undefined,
@@ -152,4 +246,50 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
152
246
  expect(oid.description).toBeUndefined();
153
247
  });
154
248
  });
249
+
250
+ /*
251
+ * Under device-owned polling a Network Device monitor is a pure alerting
252
+ * layer: WHAT to collect (interface walks, endpoint discovery, OIDs) lives
253
+ * on the NetworkDevice resource itself. Step validation therefore only
254
+ * requires the device reference — the old "enable interface monitoring or
255
+ * configure at least one OID" rule is gone.
256
+ */
257
+ describe("MonitorStep validation", () => {
258
+ test("accepts a step with only a device reference (interfaces off, zero oids)", () => {
259
+ const monitorStep: MonitorStep = getNetworkDeviceMonitorStep({
260
+ monitorInterfaces: false,
261
+ oids: [],
262
+ });
263
+
264
+ expect(
265
+ MonitorStep.getValidationError(monitorStep, MonitorType.NetworkDevice),
266
+ ).toBeNull();
267
+ });
268
+
269
+ test("still rejects a step with no device reference", () => {
270
+ const monitorStep: MonitorStep = getNetworkDeviceMonitorStep({
271
+ networkDeviceId: undefined,
272
+ });
273
+
274
+ expect(
275
+ MonitorStep.getValidationError(monitorStep, MonitorType.NetworkDevice),
276
+ ).toBe("Network Device is required");
277
+ });
278
+
279
+ test("rejects a step that has no networkDeviceMonitor block at all", () => {
280
+ const id: ObjectID = ObjectID.generate();
281
+ const monitorStep: MonitorStep = MonitorStep.getDefaultMonitorStep({
282
+ monitorName: "Network device monitor",
283
+ monitorType: MonitorType.NetworkDevice,
284
+ onlineMonitorStatusId: id,
285
+ offlineMonitorStatusId: id,
286
+ defaultIncidentSeverityId: id,
287
+ defaultAlertSeverityId: id,
288
+ });
289
+
290
+ expect(
291
+ MonitorStep.getValidationError(monitorStep, MonitorType.NetworkDevice),
292
+ ).toBe("Network Device is required");
293
+ });
294
+ });
155
295
  });
@@ -120,7 +120,6 @@ describe("MonitorTypeHelper", () => {
120
120
  MonitorType.SSLCertificate,
121
121
  MonitorType.SyntheticMonitor,
122
122
  MonitorType.CustomJavaScriptCode,
123
- MonitorType.NetworkDevice,
124
123
  MonitorType.DNS,
125
124
  MonitorType.DNSSEC,
126
125
  MonitorType.Domain,
@@ -134,6 +133,8 @@ describe("MonitorTypeHelper", () => {
134
133
  MonitorType.Logs,
135
134
  MonitorType.Server,
136
135
  MonitorType.IncomingRequest,
136
+ // Device-owned polling: the NetworkDevice resource polls itself.
137
+ MonitorType.NetworkDevice,
137
138
  ])("returns false for %s", (monitorType: MonitorType) => {
138
139
  expect(MonitorTypeHelper.isProbableMonitor(monitorType)).toBe(false);
139
140
  });
@@ -195,6 +196,63 @@ describe("MonitorTypeHelper", () => {
195
196
  });
196
197
  });
197
198
 
199
+ /*
200
+ * NetworkDevice is a pure alerting layer under device-owned polling: the
201
+ * NetworkDevice resource's assigned probe walks it on the device's own
202
+ * schedule, and the monitor is evaluated server-side against each walk.
203
+ * It must therefore never appear probeable (no MonitorProbe rows, no
204
+ * interval) while keeping its full monitor surface: criteria, graphs,
205
+ * documentation, creatability, and its place in the Network category.
206
+ */
207
+ describe("NetworkDevice under device-owned polling", () => {
208
+ test("is not probeable and has no interval", () => {
209
+ expect(
210
+ MonitorTypeHelper.isProbableMonitor(MonitorType.NetworkDevice),
211
+ ).toBe(false);
212
+ expect(
213
+ MonitorTypeHelper.doesMonitorTypeHaveInterval(
214
+ MonitorType.NetworkDevice,
215
+ ),
216
+ ).toBe(false);
217
+ });
218
+
219
+ test("still has criteria, graphs, and documentation", () => {
220
+ expect(
221
+ MonitorTypeHelper.doesMonitorTypeHaveCriteria(
222
+ MonitorType.NetworkDevice,
223
+ ),
224
+ ).toBe(true);
225
+ expect(
226
+ MonitorTypeHelper.doesMonitorTypeHaveGraphs(MonitorType.NetworkDevice),
227
+ ).toBe(true);
228
+ expect(
229
+ MonitorTypeHelper.doesMonitorTypeHaveDocumentation(
230
+ MonitorType.NetworkDevice,
231
+ ),
232
+ ).toBe(true);
233
+ });
234
+
235
+ test("is still an active (creatable) monitor type", () => {
236
+ expect(MonitorTypeHelper.getActiveMonitorTypes()).toContain(
237
+ MonitorType.NetworkDevice,
238
+ );
239
+ });
240
+
241
+ test("is still listed under the Network category", () => {
242
+ const networkCategory: MonitorTypeCategory | undefined =
243
+ MonitorTypeHelper.getMonitorTypeCategories().find(
244
+ (category: MonitorTypeCategory) => {
245
+ return category.label === "Network";
246
+ },
247
+ );
248
+
249
+ expect(networkCategory).toBeDefined();
250
+ expect(networkCategory?.monitorTypes).toContain(
251
+ MonitorType.NetworkDevice,
252
+ );
253
+ });
254
+ });
255
+
198
256
  describe("doesMonitorTypeHaveGraphs", () => {
199
257
  test("returns true for graphable types and false otherwise", () => {
200
258
  expect(
@@ -0,0 +1,97 @@
1
+ import NetworkDeviceAlertPackUtil, {
2
+ NetworkDeviceAlertPackItem,
3
+ } from "../../../Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack";
4
+ import MonitorCriteriaInstance from "../../../Types/Monitor/MonitorCriteriaInstance";
5
+ import ObjectID from "../../../Types/ObjectID";
6
+
7
+ describe("NetworkDeviceAlertPackUtil.getPackItems", () => {
8
+ test("every pack item has a name, a description and at least one filter", () => {
9
+ const items: Array<NetworkDeviceAlertPackItem> =
10
+ NetworkDeviceAlertPackUtil.getPackItems();
11
+
12
+ expect(items.length).toBeGreaterThan(0);
13
+
14
+ for (const item of items) {
15
+ expect(item.name).toBeTruthy();
16
+ expect(item.description).toBeTruthy();
17
+ expect(item.filters.length).toBeGreaterThan(0);
18
+ }
19
+ });
20
+ });
21
+
22
+ describe("NetworkDeviceAlertPackUtil.buildCriteriaInstances", () => {
23
+ test("builds one enabled instance per pack item with unique ids", () => {
24
+ const instances: Array<MonitorCriteriaInstance> =
25
+ NetworkDeviceAlertPackUtil.buildCriteriaInstances();
26
+
27
+ expect(instances.length).toBe(
28
+ NetworkDeviceAlertPackUtil.getPackItems().length,
29
+ );
30
+
31
+ const ids: Set<string> = new Set<string>();
32
+ for (const instance of instances) {
33
+ expect(instance.data?.isEnabled).toBe(true);
34
+ expect(instance.data?.id).toBeTruthy();
35
+ ids.add(instance.data!.id);
36
+ }
37
+ expect(ids.size).toBe(instances.length);
38
+ });
39
+
40
+ test("with a downMonitorStatusId context, incident-creating criteria carry that status id", () => {
41
+ const downStatusId: ObjectID = ObjectID.generate();
42
+
43
+ const instances: Array<MonitorCriteriaInstance> =
44
+ NetworkDeviceAlertPackUtil.buildCriteriaInstances({
45
+ downMonitorStatusId: downStatusId,
46
+ });
47
+
48
+ for (const instance of instances) {
49
+ expect(instance.data?.monitorStatusId?.toString()).toBe(
50
+ downStatusId.toString(),
51
+ );
52
+
53
+ /*
54
+ * changeMonitorStatus must never be true while the target status id
55
+ * is missing — that combination produces a criteria that "changes"
56
+ * the monitor to no status at all.
57
+ */
58
+ if (instance.data?.changeMonitorStatus) {
59
+ expect(instance.data?.monitorStatusId).toBeTruthy();
60
+ }
61
+ }
62
+ });
63
+
64
+ test("without context, no instance claims to change monitor status to an undefined id", () => {
65
+ const instances: Array<MonitorCriteriaInstance> =
66
+ NetworkDeviceAlertPackUtil.buildCriteriaInstances();
67
+
68
+ for (const instance of instances) {
69
+ expect(instance.data?.monitorStatusId).toBeUndefined();
70
+ /*
71
+ * Legacy call sites (no context) still exist in principle; the pack
72
+ * must not produce a status change pointing at nothing.
73
+ */
74
+ expect(instance.data?.changeMonitorStatus).toBe(false);
75
+ }
76
+ });
77
+
78
+ test("only incident-creating pack items request a monitor status change", () => {
79
+ const downStatusId: ObjectID = ObjectID.generate();
80
+ const items: Array<NetworkDeviceAlertPackItem> =
81
+ NetworkDeviceAlertPackUtil.getPackItems();
82
+ const instances: Array<MonitorCriteriaInstance> =
83
+ NetworkDeviceAlertPackUtil.buildCriteriaInstances({
84
+ downMonitorStatusId: downStatusId,
85
+ });
86
+
87
+ for (let i: number = 0; i < items.length; i++) {
88
+ expect(instances[i]!.data?.createIncidents).toBe(
89
+ items[i]!.createIncidents,
90
+ );
91
+ expect(instances[i]!.data?.createAlerts).toBe(items[i]!.createAlerts);
92
+ expect(instances[i]!.data?.changeMonitorStatus).toBe(
93
+ items[i]!.createIncidents,
94
+ );
95
+ }
96
+ });
97
+ });
@@ -0,0 +1,151 @@
1
+ import ArpEntry from "../../../Types/Monitor/SnmpMonitor/ArpEntry";
2
+ import FdbEntry from "../../../Types/Monitor/SnmpMonitor/FdbEntry";
3
+ import SnmpMonitorResponse from "../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
4
+ import NetworkTopology, {
5
+ NetworkTopologyEdge,
6
+ NetworkTopologyNode,
7
+ } from "../../../Types/Monitor/SnmpMonitor/NetworkTopology";
8
+
9
+ /*
10
+ * These types travel over the probe ingest wire and get stored in JSON
11
+ * columns, so a plain JSON round trip must preserve them exactly — no
12
+ * class instances, no Dates, no methods.
13
+ */
14
+ describe("SNMP endpoint discovery types", () => {
15
+ describe("SnmpMonitorResponse with endpoint data", () => {
16
+ test("arp and fdb entries survive a JSON wire round trip", () => {
17
+ const arpEntry: ArpEntry = {
18
+ ipAddress: "10.20.30.40",
19
+ macAddress: "aa:bb:cc:dd:ee:ff",
20
+ interfaceIndex: 3,
21
+ entryType: "dynamic",
22
+ };
23
+ const fdbEntry: FdbEntry = {
24
+ macAddress: "aa:bb:cc:dd:ee:ff",
25
+ bridgePort: 7,
26
+ interfaceIndex: 3,
27
+ vlanId: 120,
28
+ status: "learned",
29
+ };
30
+ const response: SnmpMonitorResponse = {
31
+ isOnline: true,
32
+ responseTimeInMs: 12,
33
+ failureCause: "",
34
+ oidResponses: [],
35
+ arpEntries: [arpEntry],
36
+ fdbEntries: [fdbEntry],
37
+ };
38
+
39
+ const roundTripped: SnmpMonitorResponse = JSON.parse(
40
+ JSON.stringify(response),
41
+ ) as SnmpMonitorResponse;
42
+
43
+ expect(roundTripped.arpEntries).toEqual([arpEntry]);
44
+ expect(roundTripped.fdbEntries).toEqual([fdbEntry]);
45
+ });
46
+
47
+ test("an older probe's payload carries no endpoint keys at all", () => {
48
+ const response: SnmpMonitorResponse = {
49
+ isOnline: false,
50
+ responseTimeInMs: 0,
51
+ failureCause: "Timed out",
52
+ oidResponses: [],
53
+ };
54
+
55
+ /*
56
+ * The server branches on presence, not emptiness (an absent array
57
+ * means "this probe does not collect endpoints", an empty one means
58
+ * "collected, found nothing"), so the wire form must not gain the
59
+ * keys — JSON.stringify has to drop them rather than emit [].
60
+ */
61
+ const roundTripped: SnmpMonitorResponse = JSON.parse(
62
+ JSON.stringify(response),
63
+ ) as SnmpMonitorResponse;
64
+
65
+ expect(Object.keys(roundTripped)).toEqual([
66
+ "isOnline",
67
+ "responseTimeInMs",
68
+ "failureCause",
69
+ "oidResponses",
70
+ ]);
71
+ expect("arpEntries" in roundTripped).toBe(false);
72
+ expect("fdbEntries" in roundTripped).toBe(false);
73
+ });
74
+
75
+ test("entries carry only their required fields over the wire", () => {
76
+ const arpEntry: ArpEntry = {
77
+ ipAddress: "10.0.0.1",
78
+ macAddress: "00:11:22:33:44:55",
79
+ interfaceIndex: 1,
80
+ };
81
+ const fdbEntry: FdbEntry = {
82
+ macAddress: "00:11:22:33:44:55",
83
+ bridgePort: 2,
84
+ };
85
+
86
+ expect(Object.keys(JSON.parse(JSON.stringify(arpEntry)))).toEqual([
87
+ "ipAddress",
88
+ "macAddress",
89
+ "interfaceIndex",
90
+ ]);
91
+ expect(Object.keys(JSON.parse(JSON.stringify(fdbEntry)))).toEqual([
92
+ "macAddress",
93
+ "bridgePort",
94
+ ]);
95
+ });
96
+ });
97
+
98
+ describe("NetworkTopology endpoint nodes and fdb links", () => {
99
+ test("an endpoint node attached via an fdb edge round-trips", () => {
100
+ const endpointNode: NetworkTopologyNode = {
101
+ id: "endpoint:aa:bb:cc:dd:ee:ff",
102
+ name: "POS Terminal 3",
103
+ isManaged: false,
104
+ status: "up",
105
+ kind: "endpoint",
106
+ macAddress: "aa:bb:cc:dd:ee:ff",
107
+ ipAddress: "10.20.30.40",
108
+ vendor: "Verifone",
109
+ classification: "pos-terminal",
110
+ };
111
+ const edge: NetworkTopologyEdge = {
112
+ fromNodeId: "device-1",
113
+ toNodeId: endpointNode.id,
114
+ protocols: ["fdb"],
115
+ };
116
+ const topology: NetworkTopology = {
117
+ nodes: [endpointNode],
118
+ edges: [edge],
119
+ };
120
+
121
+ const roundTripped: NetworkTopology = JSON.parse(
122
+ JSON.stringify(topology),
123
+ ) as NetworkTopology;
124
+
125
+ expect(roundTripped).toEqual(topology);
126
+ expect(roundTripped.nodes[0]!.kind).toBe("endpoint");
127
+ expect(roundTripped.edges[0]!.protocols).toEqual(["fdb"]);
128
+ });
129
+
130
+ test("a legacy node round-trips without gaining endpoint keys", () => {
131
+ const legacyNode: NetworkTopologyNode = {
132
+ id: "device-1",
133
+ name: "core-switch",
134
+ isManaged: true,
135
+ status: "up",
136
+ };
137
+
138
+ const roundTripped: NetworkTopologyNode = JSON.parse(
139
+ JSON.stringify(legacyNode),
140
+ ) as NetworkTopologyNode;
141
+
142
+ expect(Object.keys(roundTripped)).toEqual([
143
+ "id",
144
+ "name",
145
+ "isManaged",
146
+ "status",
147
+ ]);
148
+ expect(roundTripped).toEqual(legacyNode);
149
+ });
150
+ });
151
+ });