@oneuptime/common 11.6.1 → 11.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) 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 +243 -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 +1115 -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/1785066759532-MigrationName.ts +30 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  25. package/Server/Services/AnalyticsDatabaseService.ts +25 -9
  26. package/Server/Services/Index.ts +24 -0
  27. package/Server/Services/KubernetesCostAllocationService.ts +14 -0
  28. package/Server/Services/MetricService.ts +21 -2
  29. package/Server/Services/MonitorService.ts +22 -0
  30. package/Server/Services/NetworkDeviceService.ts +438 -2
  31. package/Server/Services/NetworkEndpointService.ts +414 -0
  32. package/Server/Services/NetworkSiteAssignmentRuleService.ts +98 -0
  33. package/Server/Services/NetworkSiteLinkService.ts +10 -0
  34. package/Server/Services/NetworkSiteService.ts +1254 -0
  35. package/Server/Services/NetworkSiteStatusTimelineService.ts +10 -0
  36. package/Server/Services/NetworkSiteTypeService.ts +10 -0
  37. package/Server/Services/ProjectService.ts +122 -2
  38. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +457 -0
  39. package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +10 -0
  40. package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +10 -0
  41. package/Server/Services/ServiceLevelObjectiveService.ts +685 -0
  42. package/Server/Services/SloHistoryService.ts +101 -0
  43. package/Server/Services/UserNotificationSettingService.ts +37 -0
  44. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +9 -0
  45. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +15 -0
  46. package/Server/Utils/AnalyticsDatabase/Statement.ts +39 -3
  47. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +87 -48
  48. package/Server/Utils/Memory.ts +9 -1
  49. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +190 -12
  50. package/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  51. package/Server/Utils/Monitor/DnsResolutionCache.ts +129 -0
  52. package/Server/Utils/Monitor/MonitorResource.ts +4 -30
  53. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +214 -39
  54. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +343 -0
  55. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +251 -0
  56. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +176 -142
  57. package/Server/Utils/Monitor/OuiLookupUtil.ts +49 -0
  58. package/Server/Utils/Monitor/SnmpInterfaceRateUtil.ts +17 -13
  59. package/Server/Utils/WhatsAppTemplateUtil.ts +7 -3
  60. package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +135 -0
  61. package/Tests/Models/NetworkSiteHierarchy.test.ts +134 -0
  62. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +239 -0
  63. package/Tests/Server/Services/KubernetesCostAllocationAggregate.test.ts +338 -0
  64. package/Tests/Server/Services/MetricServiceAggregate.test.ts +142 -0
  65. package/Tests/Server/Services/NetworkDeviceSiteAssignment.test.ts +484 -0
  66. package/Tests/Server/Services/NetworkEndpointServiceUpsert.test.ts +686 -0
  67. package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +185 -0
  68. package/Tests/Server/Services/NetworkSiteService.test.ts +1354 -0
  69. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +1313 -0
  70. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +1988 -0
  71. package/Tests/Server/Utils/AnalyticsDatabase/Statement.test.ts +22 -0
  72. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +404 -0
  73. package/Tests/Server/Utils/Encryption.test.ts +70 -0
  74. package/Tests/Server/Utils/FileAttachmentMarkdownUtil.test.ts +225 -0
  75. package/Tests/Server/Utils/JsonWebToken.test.ts +175 -0
  76. package/Tests/Server/Utils/LocalFile.test.ts +258 -0
  77. package/Tests/Server/Utils/Memory.test.ts +213 -0
  78. package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +30 -0
  79. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +385 -0
  80. package/Tests/Server/Utils/Monitor/DnsResolutionCache.test.ts +194 -0
  81. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +155 -0
  82. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +600 -0
  83. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +151 -124
  84. package/Tests/Server/Utils/Monitor/SnmpInterfaceRateUtil.test.ts +496 -0
  85. package/Tests/Server/Utils/MonitorCriteriaDataExtractor.test.ts +175 -0
  86. package/Tests/Server/Utils/MonitorCriteriaMessageFormatter.test.ts +282 -0
  87. package/Tests/Server/Utils/OuiLookupUtil.test.ts +59 -0
  88. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +117 -0
  89. package/Tests/Server/Utils/StackTraceParser.test.ts +370 -0
  90. package/Tests/Server/Utils/Stream.test.ts +87 -0
  91. package/Tests/Server/Utils/ValidateGlobalProviderProjectTeams.test.ts +221 -0
  92. package/Tests/Server/Utils/WhatsAppTemplateUtil.test.ts +199 -0
  93. package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +33 -0
  94. package/Tests/Types/Email.test.ts +198 -0
  95. package/Tests/Types/Kubernetes/KubernetesObjectParser.test.ts +177 -0
  96. package/Tests/Types/Log/LogQueryToFilter.test.ts +111 -0
  97. package/Tests/Types/Monitor/MonitorCriteria.test.ts +155 -0
  98. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +465 -0
  99. package/Tests/Types/Monitor/MonitorStep.test.ts +183 -0
  100. package/Tests/Types/Monitor/MonitorStepNetworkDeviceMonitor.test.ts +141 -1
  101. package/Tests/Types/Monitor/MonitorSteps.test.ts +183 -0
  102. package/Tests/Types/Monitor/MonitorType.test.ts +59 -1
  103. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +97 -0
  104. package/Tests/Types/Monitor/SnmpEndpointDiscovery.test.ts +151 -0
  105. package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +110 -6
  106. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +129 -0
  107. package/Tests/Types/SerializableObjectDictionary.test.ts +166 -0
  108. package/Tests/Types/Time/RangeStartAndEndDateTime.test.ts +98 -0
  109. package/Tests/Types/WebsiteRequest.test.ts +230 -0
  110. package/Tests/UI/Components/EntityFilterRoundTrip.test.tsx +103 -0
  111. package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +612 -0
  112. package/Tests/UI/Components/ModelTable/FilterDataToQuery.test.ts +275 -0
  113. package/Tests/UI/Utils/LogExport.test.ts +159 -0
  114. package/Tests/UI/Utils/Navigation.test.ts +183 -0
  115. package/Tests/UI/Utils/TableFilterUrlState.test.ts +539 -0
  116. package/Tests/UI/Utils/TableViewUrlState.test.ts +272 -0
  117. package/Tests/Utils/Base64.test.ts +51 -0
  118. package/Tests/Utils/Boolean.test.ts +76 -0
  119. package/Tests/Utils/Crypto.test.ts +48 -0
  120. package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +259 -0
  121. package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +162 -0
  122. package/Tests/Utils/Enum.test.ts +54 -0
  123. package/Tests/Utils/IpCanonicalUtil.test.ts +85 -0
  124. package/Tests/Utils/Memory.test.ts +44 -0
  125. package/Tests/Utils/Metrics/MetricSeriesFingerprint.test.ts +160 -0
  126. package/Tests/Utils/Monitor/EndpointAttachmentUtil.test.ts +836 -0
  127. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +218 -0
  128. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +447 -0
  129. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +440 -0
  130. package/Tests/Utils/NetworkSite/MaterializedPathUtil.test.ts +205 -0
  131. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +221 -0
  132. package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +283 -0
  133. package/Tests/Utils/ObjectUtil.test.ts +30 -0
  134. package/Tests/Utils/Slo/SloBurnRateRuleState.test.ts +124 -0
  135. package/Tests/Utils/Slo/SloDuration.test.ts +148 -0
  136. package/Tests/Utils/Slo/SloHealth.test.ts +334 -0
  137. package/Tests/Utils/Slo/SloStatusColor.test.ts +89 -0
  138. package/Tests/Utils/Slo/SloUtil.test.ts +1980 -0
  139. package/Tests/Utils/Slo/SloWidgetFormat.test.ts +605 -0
  140. package/Tests/Utils/TechStack.test.ts +50 -0
  141. package/Tests/Utils/Traces/CriticalPath.test.ts +178 -0
  142. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +10 -0
  143. package/Types/BaseDatabase/EqualTo.ts +9 -1
  144. package/Types/BaseDatabase/EqualToOrNull.ts +9 -1
  145. package/Types/BaseDatabase/NotEqual.ts +9 -1
  146. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  147. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  148. package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +42 -0
  149. package/Types/Dashboard/DashboardTemplates.ts +214 -0
  150. package/Types/Email/EmailTemplateType.ts +2 -0
  151. package/Types/Kubernetes/KubernetesCostIngest.ts +79 -0
  152. package/Types/Monitor/CriteriaFilter.ts +9 -0
  153. package/Types/Monitor/MonitorStep.ts +5 -8
  154. package/Types/Monitor/MonitorStepNetworkDeviceMonitor.ts +27 -5
  155. package/Types/Monitor/MonitorType.ts +15 -5
  156. package/Types/Monitor/SnmpMonitor/ArpEntry.ts +14 -0
  157. package/Types/Monitor/SnmpMonitor/FdbEntry.ts +18 -0
  158. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +10 -3
  159. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -5
  160. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +12 -0
  161. package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +231 -3
  162. package/Types/NetworkSite/DefaultNetworkSiteType.ts +20 -0
  163. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  164. package/Types/Permission.ts +449 -0
  165. package/Types/ServiceLevelObjective/SliType.ts +6 -0
  166. package/Types/ServiceLevelObjective/SloMultiMonitorMode.ts +6 -0
  167. package/Types/ServiceLevelObjective/SloStatus.ts +9 -0
  168. package/Types/ServiceLevelObjective/SloWindowType.ts +6 -0
  169. package/Types/Telemetry/ServiceType.ts +1 -0
  170. package/UI/Components/Filters/EntityFilter.tsx +16 -0
  171. package/UI/Components/Filters/FilterViewer.tsx +22 -5
  172. package/UI/Components/List/List.tsx +8 -0
  173. package/UI/Components/ModelTable/BaseModelTable.tsx +309 -106
  174. package/UI/Components/ModelTable/FilterDataToQuery.ts +172 -0
  175. package/UI/Components/Navbar/NavBar.tsx +16 -2
  176. package/UI/Components/Navbar/NavBarMenuModal.tsx +3 -3
  177. package/UI/Utils/Navigation.ts +10 -0
  178. package/UI/Utils/TableFilterUrlState.ts +204 -17
  179. package/UI/Utils/TableViewUrlState.ts +165 -0
  180. package/Utils/Dashboard/Components/DashboardSloComponent.ts +114 -0
  181. package/Utils/Dashboard/Components/Index.ts +7 -0
  182. package/Utils/IpCanonicalUtil.ts +134 -0
  183. package/Utils/Monitor/EndpointAttachmentUtil.ts +508 -0
  184. package/Utils/Monitor/NetworkTopologyUtil.ts +157 -5
  185. package/Utils/NetworkSite/CidrMatchUtil.ts +296 -0
  186. package/Utils/NetworkSite/MaterializedPathUtil.ts +115 -0
  187. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +97 -0
  188. package/Utils/NetworkSite/SiteUptimeUtil.ts +111 -0
  189. package/Utils/Slo/SloBurnRateRuleState.ts +91 -0
  190. package/Utils/Slo/SloDuration.ts +165 -0
  191. package/Utils/Slo/SloEvaluation.ts +22 -0
  192. package/Utils/Slo/SloHealth.ts +302 -0
  193. package/Utils/Slo/SloStatusColor.ts +54 -0
  194. package/Utils/Slo/SloUtil.ts +637 -0
  195. package/Utils/Slo/SloWidgetFormat.ts +383 -0
  196. package/build/dist/Models/AnalyticsModels/Index.js +4 -0
  197. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  198. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +713 -0
  199. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -0
  200. package/build/dist/Models/AnalyticsModels/NetworkFlow.js +44 -0
  201. package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
  202. package/build/dist/Models/AnalyticsModels/SloHistory.js +218 -0
  203. package/build/dist/Models/AnalyticsModels/SloHistory.js.map +1 -0
  204. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  205. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/NetworkDevice.js +458 -6
  207. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +0 -6
  209. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js +779 -0
  211. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js.map +1 -0
  212. package/build/dist/Models/DatabaseModels/NetworkSite.js +1180 -0
  213. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -0
  214. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +534 -0
  215. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -0
  216. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js +629 -0
  217. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js.map +1 -0
  218. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +538 -0
  219. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -0
  220. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +522 -0
  221. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -0
  222. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +1134 -0
  223. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -0
  224. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +769 -0
  225. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -0
  226. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +460 -0
  227. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -0
  228. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +459 -0
  229. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js +130 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js.map +1 -0
  232. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js +31 -0
  233. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js.map +1 -0
  234. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js +36 -0
  235. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js.map +1 -0
  236. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js +49 -0
  237. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js.map +1 -0
  238. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js +140 -0
  239. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js.map +1 -0
  240. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785066759532-MigrationName.js +21 -0
  241. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785066759532-MigrationName.js.map +1 -0
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  244. package/build/dist/Server/Services/AnalyticsDatabaseService.js +23 -6
  245. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  246. package/build/dist/Server/Services/Index.js +24 -0
  247. package/build/dist/Server/Services/Index.js.map +1 -1
  248. package/build/dist/Server/Services/KubernetesCostAllocationService.js +12 -0
  249. package/build/dist/Server/Services/KubernetesCostAllocationService.js.map +1 -0
  250. package/build/dist/Server/Services/MetricService.js +21 -3
  251. package/build/dist/Server/Services/MetricService.js.map +1 -1
  252. package/build/dist/Server/Services/MonitorService.js +19 -0
  253. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  254. package/build/dist/Server/Services/NetworkDeviceService.js +351 -1
  255. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  256. package/build/dist/Server/Services/NetworkEndpointService.js +319 -0
  257. package/build/dist/Server/Services/NetworkEndpointService.js.map +1 -0
  258. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +90 -0
  259. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -0
  260. package/build/dist/Server/Services/NetworkSiteLinkService.js +9 -0
  261. package/build/dist/Server/Services/NetworkSiteLinkService.js.map +1 -0
  262. package/build/dist/Server/Services/NetworkSiteService.js +1038 -0
  263. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -0
  264. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js +9 -0
  265. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js.map +1 -0
  266. package/build/dist/Server/Services/NetworkSiteTypeService.js +9 -0
  267. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -0
  268. package/build/dist/Server/Services/ProjectService.js +98 -2
  269. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  270. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +358 -0
  271. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -0
  272. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +9 -0
  273. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -0
  274. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +9 -0
  275. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -0
  276. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +588 -0
  277. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -0
  278. package/build/dist/Server/Services/SloHistoryService.js +77 -0
  279. package/build/dist/Server/Services/SloHistoryService.js.map +1 -0
  280. package/build/dist/Server/Services/UserNotificationSettingService.js +20 -0
  281. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  282. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +9 -0
  283. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  284. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +15 -0
  285. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  286. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +31 -0
  287. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  288. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +76 -48
  289. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  290. package/build/dist/Server/Utils/Memory.js +9 -1
  291. package/build/dist/Server/Utils/Memory.js.map +1 -1
  292. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +132 -10
  293. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  294. package/build/dist/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  295. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js +77 -0
  296. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js.map +1 -0
  297. package/build/dist/Server/Utils/Monitor/MonitorResource.js +21 -41
  298. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  299. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +152 -40
  300. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  301. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +262 -0
  302. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -0
  303. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +201 -0
  304. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -0
  305. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +152 -120
  306. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  307. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js +44 -0
  308. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js.map +1 -0
  309. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js +10 -10
  310. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js.map +1 -1
  311. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +5 -0
  312. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  313. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +10 -0
  314. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  315. package/build/dist/Types/BaseDatabase/EqualTo.js +9 -1
  316. package/build/dist/Types/BaseDatabase/EqualTo.js.map +1 -1
  317. package/build/dist/Types/BaseDatabase/EqualToOrNull.js +9 -1
  318. package/build/dist/Types/BaseDatabase/EqualToOrNull.js.map +1 -1
  319. package/build/dist/Types/BaseDatabase/NotEqual.js +9 -1
  320. package/build/dist/Types/BaseDatabase/NotEqual.js.map +1 -1
  321. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  322. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  323. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  324. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  325. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js +23 -0
  326. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js.map +1 -0
  327. package/build/dist/Types/Dashboard/DashboardTemplates.js +205 -0
  328. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  329. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  330. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  331. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js +21 -0
  332. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -0
  333. package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
  334. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  335. package/build/dist/Types/Monitor/MonitorStep.js +5 -5
  336. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  337. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js +8 -0
  338. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js.map +1 -1
  339. package/build/dist/Types/Monitor/MonitorType.js +15 -5
  340. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  341. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js +2 -0
  342. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js.map +1 -0
  343. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js +2 -0
  344. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js.map +1 -0
  345. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +9 -3
  346. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  347. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +217 -3
  348. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
  349. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js +21 -0
  350. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js.map +1 -0
  351. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  352. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  353. package/build/dist/Types/Permission.js +409 -0
  354. package/build/dist/Types/Permission.js.map +1 -1
  355. package/build/dist/Types/ServiceLevelObjective/SliType.js +7 -0
  356. package/build/dist/Types/ServiceLevelObjective/SliType.js.map +1 -0
  357. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js +7 -0
  358. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js.map +1 -0
  359. package/build/dist/Types/ServiceLevelObjective/SloStatus.js +10 -0
  360. package/build/dist/Types/ServiceLevelObjective/SloStatus.js.map +1 -0
  361. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js +7 -0
  362. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js.map +1 -0
  363. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  364. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  365. package/build/dist/UI/Components/Filters/EntityFilter.js +15 -0
  366. package/build/dist/UI/Components/Filters/EntityFilter.js.map +1 -1
  367. package/build/dist/UI/Components/Filters/FilterViewer.js +19 -4
  368. package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
  369. package/build/dist/UI/Components/List/List.js +1 -1
  370. package/build/dist/UI/Components/List/List.js.map +1 -1
  371. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +235 -89
  372. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  373. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js +96 -0
  374. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js.map +1 -0
  375. package/build/dist/UI/Components/Navbar/NavBar.js +14 -2
  376. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  377. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +3 -2
  378. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  379. package/build/dist/UI/Utils/Navigation.js +9 -0
  380. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  381. package/build/dist/UI/Utils/TableFilterUrlState.js +159 -15
  382. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  383. package/build/dist/UI/Utils/TableViewUrlState.js +103 -0
  384. package/build/dist/UI/Utils/TableViewUrlState.js.map +1 -0
  385. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +93 -0
  386. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -0
  387. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  388. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  389. package/build/dist/Utils/IpCanonicalUtil.js +110 -0
  390. package/build/dist/Utils/IpCanonicalUtil.js.map +1 -0
  391. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js +311 -0
  392. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js.map +1 -0
  393. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +98 -5
  394. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  395. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +222 -0
  396. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -0
  397. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js +89 -0
  398. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js.map +1 -0
  399. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +60 -0
  400. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -0
  401. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +76 -0
  402. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -0
  403. package/build/dist/Utils/Slo/SloBurnRateRuleState.js +35 -0
  404. package/build/dist/Utils/Slo/SloBurnRateRuleState.js.map +1 -0
  405. package/build/dist/Utils/Slo/SloDuration.js +87 -0
  406. package/build/dist/Utils/Slo/SloDuration.js.map +1 -0
  407. package/build/dist/Utils/Slo/SloEvaluation.js +21 -0
  408. package/build/dist/Utils/Slo/SloEvaluation.js.map +1 -0
  409. package/build/dist/Utils/Slo/SloHealth.js +179 -0
  410. package/build/dist/Utils/Slo/SloHealth.js.map +1 -0
  411. package/build/dist/Utils/Slo/SloStatusColor.js +18 -0
  412. package/build/dist/Utils/Slo/SloStatusColor.js.map +1 -0
  413. package/build/dist/Utils/Slo/SloUtil.js +393 -0
  414. package/build/dist/Utils/Slo/SloUtil.js.map +1 -0
  415. package/build/dist/Utils/Slo/SloWidgetFormat.js +174 -0
  416. package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -0
  417. package/package.json +2 -2
  418. package/Types/Dashboard/DashboardComponents/Index.ts +0 -7
  419. package/build/dist/Types/Dashboard/DashboardComponents/Index.js +0 -8
  420. package/build/dist/Types/Dashboard/DashboardComponents/Index.js.map +0 -1
@@ -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
  });
@@ -0,0 +1,183 @@
1
+ import MonitorSteps from "../../../Types/Monitor/MonitorSteps";
2
+ import MonitorStep from "../../../Types/Monitor/MonitorStep";
3
+ import MonitorType from "../../../Types/Monitor/MonitorType";
4
+ import ObjectID from "../../../Types/ObjectID";
5
+ import { JSONObject, ObjectType } from "../../../Types/JSON";
6
+ import BadDataException from "../../../Types/Exception/BadDataException";
7
+
8
+ /*
9
+ * MonitorSteps is the top-level DatabaseProperty stored on a Monitor: an array
10
+ * of MonitorStep plus the default monitor status. These tests lock in the
11
+ * factory shape, toJSON/fromJSON round-trip (including the deliberately lenient
12
+ * fromJSON(undefined) -> empty instance), and the validation contract.
13
+ */
14
+
15
+ const buildDefaultSteps: () => MonitorSteps = (): MonitorSteps => {
16
+ return MonitorSteps.getDefaultMonitorSteps({
17
+ defaultMonitorStatusId: new ObjectID("100000000000000000000001"),
18
+ monitorType: MonitorType.Manual,
19
+ monitorName: "My Monitor",
20
+ onlineMonitorStatusId: new ObjectID("100000000000000000000002"),
21
+ offlineMonitorStatusId: new ObjectID("100000000000000000000003"),
22
+ defaultIncidentSeverityId: new ObjectID("100000000000000000000004"),
23
+ defaultAlertSeverityId: new ObjectID("100000000000000000000005"),
24
+ });
25
+ };
26
+
27
+ describe("MonitorSteps", () => {
28
+ describe("getNewMonitorStepsAsJSON", () => {
29
+ test("wraps a single default step under the MonitorSteps type", () => {
30
+ const json: JSONObject = MonitorSteps.getNewMonitorStepsAsJSON();
31
+ expect(json["_type"]).toBe(ObjectType.MonitorSteps);
32
+ const value: JSONObject = json["value"] as JSONObject;
33
+ expect(Array.isArray(value["monitorStepsInstanceArray"])).toBe(true);
34
+ expect(
35
+ (value["monitorStepsInstanceArray"] as Array<unknown>).length,
36
+ ).toBe(1);
37
+ expect(value["defaultMonitorStatusId"]).toBeUndefined();
38
+ });
39
+ });
40
+
41
+ describe("getDefaultMonitorSteps", () => {
42
+ test("creates one step and carries the default monitor status id", () => {
43
+ const steps: MonitorSteps = buildDefaultSteps();
44
+ expect(steps.data?.monitorStepsInstanceArray).toHaveLength(1);
45
+ expect(steps.data?.monitorStepsInstanceArray[0]).toBeInstanceOf(
46
+ MonitorStep,
47
+ );
48
+ expect(steps.data?.defaultMonitorStatusId?.toString()).toBe(
49
+ "100000000000000000000001",
50
+ );
51
+ });
52
+ });
53
+
54
+ describe("toJSON / fromJSON round-trip", () => {
55
+ test("serializes with the MonitorSteps type wrapper", () => {
56
+ const steps: MonitorSteps = buildDefaultSteps();
57
+ const json: JSONObject = steps.toJSON();
58
+ expect(json["_type"]).toBe(ObjectType.MonitorSteps);
59
+ expect((json["value"] as JSONObject)["defaultMonitorStatusId"]).toBe(
60
+ "100000000000000000000001",
61
+ );
62
+ });
63
+
64
+ test("round-trips the default status id and step count", () => {
65
+ const steps: MonitorSteps = buildDefaultSteps();
66
+ const restored: MonitorSteps = MonitorSteps.fromJSON(steps.toJSON());
67
+ expect(restored.data?.defaultMonitorStatusId?.toString()).toBe(
68
+ "100000000000000000000001",
69
+ );
70
+ expect(restored.data?.monitorStepsInstanceArray).toHaveLength(1);
71
+ expect(restored.data?.monitorStepsInstanceArray[0]).toBeInstanceOf(
72
+ MonitorStep,
73
+ );
74
+ });
75
+
76
+ test("toString returns a JSON string of the serialized value", () => {
77
+ const steps: MonitorSteps = buildDefaultSteps();
78
+ const asString: string = steps.toString();
79
+ const parsed: JSONObject = JSON.parse(asString) as JSONObject;
80
+ expect(parsed["_type"]).toBe(ObjectType.MonitorSteps);
81
+ });
82
+ });
83
+
84
+ describe("fromJSON leniency and validation", () => {
85
+ test("returns an empty instance for undefined input", () => {
86
+ const steps: MonitorSteps = MonitorSteps.fromJSON(undefined);
87
+ expect(steps).toBeInstanceOf(MonitorSteps);
88
+ });
89
+
90
+ test("returns the same instance when given a MonitorSteps", () => {
91
+ const steps: MonitorSteps = buildDefaultSteps();
92
+ expect(MonitorSteps.fromJSON(steps)).toBe(steps);
93
+ });
94
+
95
+ test("throws on a wrong _type", () => {
96
+ expect(() => {
97
+ return MonitorSteps.fromJSON({ _type: "Nope", value: {} });
98
+ }).toThrow(BadDataException);
99
+ });
100
+
101
+ test("throws when value is missing", () => {
102
+ expect(() => {
103
+ return MonitorSteps.fromJSON({ _type: "MonitorSteps" });
104
+ }).toThrow(BadDataException);
105
+ });
106
+
107
+ test("throws when monitorStepsInstanceArray is missing", () => {
108
+ expect(() => {
109
+ return MonitorSteps.fromJSON({
110
+ _type: "MonitorSteps",
111
+ value: { defaultMonitorStatusId: undefined },
112
+ });
113
+ }).toThrow(BadDataException);
114
+ });
115
+ });
116
+
117
+ describe("getValidationError", () => {
118
+ test("errors when data is missing", () => {
119
+ const steps: MonitorSteps = new MonitorSteps();
120
+ steps.data = undefined;
121
+ expect(MonitorSteps.getValidationError(steps, MonitorType.Manual)).toBe(
122
+ "Monitor Steps is required",
123
+ );
124
+ });
125
+
126
+ test("errors when the step array is empty", () => {
127
+ const steps: MonitorSteps = new MonitorSteps();
128
+ steps.data = {
129
+ monitorStepsInstanceArray: [],
130
+ defaultMonitorStatusId: new ObjectID("100000000000000000000001"),
131
+ };
132
+ expect(MonitorSteps.getValidationError(steps, MonitorType.Manual)).toBe(
133
+ "Monitor Steps is required",
134
+ );
135
+ });
136
+
137
+ test("errors when the default monitor status id is missing", () => {
138
+ const steps: MonitorSteps = buildDefaultSteps();
139
+ steps.data!.defaultMonitorStatusId = undefined;
140
+ expect(MonitorSteps.getValidationError(steps, MonitorType.Manual)).toBe(
141
+ "Default Monitor Status is required",
142
+ );
143
+ });
144
+ });
145
+
146
+ describe("clone and setters", () => {
147
+ test("clone produces an independent copy", () => {
148
+ const steps: MonitorSteps = buildDefaultSteps();
149
+ const cloned: MonitorSteps = MonitorSteps.clone(steps);
150
+ expect(cloned).not.toBe(steps);
151
+ expect(cloned.data?.defaultMonitorStatusId?.toString()).toBe(
152
+ steps.data?.defaultMonitorStatusId?.toString(),
153
+ );
154
+
155
+ cloned.setDefaultMonitorStatusId(
156
+ new ObjectID("200000000000000000000009"),
157
+ );
158
+ // Original must be unaffected by the clone's mutation.
159
+ expect(steps.data?.defaultMonitorStatusId?.toString()).toBe(
160
+ "100000000000000000000001",
161
+ );
162
+ });
163
+
164
+ test("setDefaultMonitorStatusId mutates and returns this", () => {
165
+ const steps: MonitorSteps = new MonitorSteps();
166
+ const returned: MonitorSteps = steps.setDefaultMonitorStatusId(
167
+ new ObjectID("300000000000000000000000"),
168
+ );
169
+ expect(returned).toBe(steps);
170
+ expect(steps.data?.defaultMonitorStatusId?.toString()).toBe(
171
+ "300000000000000000000000",
172
+ );
173
+ });
174
+
175
+ test("setMonitorStepsInstanceArray replaces the step list", () => {
176
+ const steps: MonitorSteps = buildDefaultSteps();
177
+ const newStep: MonitorStep = new MonitorStep();
178
+ steps.setMonitorStepsInstanceArray([newStep]);
179
+ expect(steps.data?.monitorStepsInstanceArray).toHaveLength(1);
180
+ expect(steps.data?.monitorStepsInstanceArray[0]).toBe(newStep);
181
+ });
182
+ });
183
+ });
@@ -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
+ });