@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
@@ -0,0 +1,259 @@
1
+ import {
2
+ ComponentArgument,
3
+ ComponentInputType,
4
+ EntityFilterModelType,
5
+ } from "../../../Types/Dashboard/DashboardComponents/ComponentArgument";
6
+ import DashboardBaseComponent from "../../../Types/Dashboard/DashboardComponents/DashboardBaseComponent";
7
+ import DashboardSloComponent, {
8
+ SloWidgetDisplayType,
9
+ SloWidgetMetric,
10
+ } from "../../../Types/Dashboard/DashboardComponents/DashboardSloComponent";
11
+ import DashboardComponentType from "../../../Types/Dashboard/DashboardComponentType";
12
+ import { ObjectType } from "../../../Types/JSON";
13
+ import DashboardComponentsUtil from "../../../Utils/Dashboard/Components/Index";
14
+ import DashboardSloComponentUtil from "../../../Utils/Dashboard/Components/DashboardSloComponent";
15
+
16
+ type ArgumentIds = keyof DashboardSloComponent["arguments"];
17
+
18
+ function getArguments(): Array<ComponentArgument<DashboardSloComponent>> {
19
+ return DashboardSloComponentUtil.getComponentConfigArguments();
20
+ }
21
+
22
+ function getArgumentById(
23
+ id: ArgumentIds,
24
+ ): ComponentArgument<DashboardSloComponent> {
25
+ const found: ComponentArgument<DashboardSloComponent> | undefined =
26
+ getArguments().find((arg: ComponentArgument<DashboardSloComponent>) => {
27
+ return arg.id === id;
28
+ });
29
+
30
+ if (!found) {
31
+ throw new Error(`No SLO widget argument declared with id "${id}"`);
32
+ }
33
+
34
+ return found;
35
+ }
36
+
37
+ describe("DashboardSloComponentUtil", () => {
38
+ describe("getDefaultComponent", () => {
39
+ it("declares its componentType as Slo so the renderer dispatch matches", () => {
40
+ expect(
41
+ DashboardSloComponentUtil.getDefaultComponent().componentType,
42
+ ).toBe(DashboardComponentType.Slo);
43
+ });
44
+
45
+ it("marks itself as a dashboard component so it survives config serialization", () => {
46
+ expect(DashboardSloComponentUtil.getDefaultComponent()._type).toBe(
47
+ ObjectType.DashboardComponent,
48
+ );
49
+ });
50
+
51
+ it("defaults to a 3x3 tile placed at the canvas origin", () => {
52
+ const component: DashboardSloComponent =
53
+ DashboardSloComponentUtil.getDefaultComponent();
54
+
55
+ expect(component.widthInDashboardUnits).toBe(3);
56
+ expect(component.heightInDashboardUnits).toBe(3);
57
+ expect(component.topInDashboardUnits).toBe(0);
58
+ expect(component.leftInDashboardUnits).toBe(0);
59
+ });
60
+
61
+ it("cannot be resized smaller than its 2x2 minimum", () => {
62
+ const component: DashboardSloComponent =
63
+ DashboardSloComponentUtil.getDefaultComponent();
64
+
65
+ expect(component.minWidthInDashboardUnits).toBe(2);
66
+ expect(component.minHeightInDashboardUnits).toBe(2);
67
+ expect(component.minWidthInDashboardUnits).toBeLessThanOrEqual(
68
+ component.widthInDashboardUnits,
69
+ );
70
+ expect(component.minHeightInDashboardUnits).toBeLessThanOrEqual(
71
+ component.heightInDashboardUnits,
72
+ );
73
+ });
74
+
75
+ it("defaults the metric to SLI and the display to Tile", () => {
76
+ const component: DashboardSloComponent =
77
+ DashboardSloComponentUtil.getDefaultComponent();
78
+
79
+ expect(component.arguments.sloMetric).toBe(SloWidgetMetric.Sli);
80
+ expect(component.arguments.displayType).toBe(SloWidgetDisplayType.Tile);
81
+ });
82
+
83
+ it("leaves the SLO unselected so the widget renders its setup state", () => {
84
+ const component: DashboardSloComponent =
85
+ DashboardSloComponentUtil.getDefaultComponent();
86
+
87
+ expect(component.arguments.serviceLevelObjectiveId).toBeUndefined();
88
+ expect(component.arguments.widgetTitle).toBeUndefined();
89
+ });
90
+
91
+ it("generates a distinct componentId per call so two widgets never collide", () => {
92
+ const first: DashboardSloComponent =
93
+ DashboardSloComponentUtil.getDefaultComponent();
94
+ const second: DashboardSloComponent =
95
+ DashboardSloComponentUtil.getDefaultComponent();
96
+
97
+ expect(first.componentId.toString()).not.toBe(
98
+ second.componentId.toString(),
99
+ );
100
+ });
101
+ });
102
+
103
+ describe("getComponentConfigArguments", () => {
104
+ it("declares exactly the four documented arguments", () => {
105
+ expect(
106
+ getArguments().map((arg: ComponentArgument<DashboardSloComponent>) => {
107
+ return arg.id;
108
+ }),
109
+ ).toEqual([
110
+ "serviceLevelObjectiveId",
111
+ "sloMetric",
112
+ "displayType",
113
+ "widgetTitle",
114
+ ]);
115
+ });
116
+
117
+ it("gives every argument a name, description, input type and required flag", () => {
118
+ for (const arg of getArguments()) {
119
+ expect(typeof arg.name).toBe("string");
120
+ expect(arg.name.length).toBeGreaterThan(0);
121
+ expect(typeof arg.description).toBe("string");
122
+ expect(arg.description.length).toBeGreaterThan(0);
123
+ expect(Object.values(ComponentInputType)).toContain(arg.type);
124
+ expect(typeof arg.required).toBe("boolean");
125
+ }
126
+ });
127
+
128
+ it("puts every argument in a section so the settings panel can group them", () => {
129
+ for (const arg of getArguments()) {
130
+ expect(arg.section).toBeDefined();
131
+ expect(arg.section?.name.length).toBeGreaterThan(0);
132
+ expect(typeof arg.section?.order).toBe("number");
133
+ }
134
+ });
135
+
136
+ it("picks the SLO with a model-backed entity dropdown", () => {
137
+ const arg: ComponentArgument<DashboardSloComponent> = getArgumentById(
138
+ "serviceLevelObjectiveId",
139
+ );
140
+
141
+ expect(arg.type).toBe(ComponentInputType.EntityDropdown);
142
+ expect(arg.entityFilterModelType).toBe(
143
+ EntityFilterModelType.ServiceLevelObjective,
144
+ );
145
+ expect(arg.required).toBe(true);
146
+ });
147
+
148
+ it("offers all three SLO metrics in the metric dropdown", () => {
149
+ const arg: ComponentArgument<DashboardSloComponent> =
150
+ getArgumentById("sloMetric");
151
+
152
+ expect(arg.type).toBe(ComponentInputType.Dropdown);
153
+ expect(
154
+ arg.dropdownOptions?.map((option: { value: unknown }) => {
155
+ return option.value;
156
+ }),
157
+ ).toEqual([
158
+ SloWidgetMetric.Sli,
159
+ SloWidgetMetric.ErrorBudgetRemaining,
160
+ SloWidgetMetric.BurnRate,
161
+ ]);
162
+ });
163
+
164
+ it("offers both display types in the display dropdown", () => {
165
+ const arg: ComponentArgument<DashboardSloComponent> =
166
+ getArgumentById("displayType");
167
+
168
+ expect(arg.type).toBe(ComponentInputType.Dropdown);
169
+ expect(
170
+ arg.dropdownOptions?.map((option: { value: unknown }) => {
171
+ return option.value;
172
+ }),
173
+ ).toEqual([SloWidgetDisplayType.Tile, SloWidgetDisplayType.Chart]);
174
+ });
175
+
176
+ it("keeps the title optional because it falls back to the SLO name", () => {
177
+ const arg: ComponentArgument<DashboardSloComponent> =
178
+ getArgumentById("widgetTitle");
179
+
180
+ expect(arg.type).toBe(ComponentInputType.Text);
181
+ expect(arg.required).toBe(false);
182
+ });
183
+
184
+ it("gives every dropdown argument a non-empty option list", () => {
185
+ const dropdownArgs: Array<ComponentArgument<DashboardSloComponent>> =
186
+ getArguments().filter(
187
+ (arg: ComponentArgument<DashboardSloComponent>) => {
188
+ return arg.type === ComponentInputType.Dropdown;
189
+ },
190
+ );
191
+
192
+ expect(dropdownArgs.length).toBeGreaterThan(0);
193
+
194
+ for (const arg of dropdownArgs) {
195
+ expect(arg.dropdownOptions?.length).toBeGreaterThan(0);
196
+
197
+ for (const option of arg.dropdownOptions || []) {
198
+ expect(typeof option.label).toBe("string");
199
+ expect((option.label as string).length).toBeGreaterThan(0);
200
+ expect(option.value).toBeTruthy();
201
+ }
202
+ }
203
+ });
204
+
205
+ it("declares no duplicate argument ids", () => {
206
+ const ids: Array<unknown> = getArguments().map(
207
+ (arg: ComponentArgument<DashboardSloComponent>) => {
208
+ return arg.id;
209
+ },
210
+ );
211
+
212
+ expect(new Set(ids).size).toBe(ids.length);
213
+ });
214
+ });
215
+
216
+ /*
217
+ * These go through the registry's public lookup rather than the util
218
+ * directly, so forgetting to wire DashboardComponentType.Slo into
219
+ * Common/Utils/Dashboard/Components/Index.ts fails the suite.
220
+ */
221
+ describe("registration in DashboardComponentsUtil", () => {
222
+ it("resolves DashboardComponentType.Slo instead of throwing for an unknown type", () => {
223
+ expect(() => {
224
+ return DashboardComponentsUtil.getComponentSettingsArguments(
225
+ DashboardComponentType.Slo,
226
+ );
227
+ }).not.toThrow();
228
+ });
229
+
230
+ it("returns the SLO widget's own arguments for DashboardComponentType.Slo", () => {
231
+ const fromRegistry: Array<ComponentArgument<DashboardBaseComponent>> =
232
+ DashboardComponentsUtil.getComponentSettingsArguments(
233
+ DashboardComponentType.Slo,
234
+ );
235
+
236
+ expect(
237
+ fromRegistry.map(
238
+ (arg: ComponentArgument<DashboardBaseComponent>): unknown => {
239
+ return arg.id;
240
+ },
241
+ ),
242
+ ).toEqual(
243
+ getArguments().map(
244
+ (arg: ComponentArgument<DashboardSloComponent>): unknown => {
245
+ return arg.id;
246
+ },
247
+ ),
248
+ );
249
+ });
250
+
251
+ it("still throws for a component type that is not registered", () => {
252
+ expect(() => {
253
+ return DashboardComponentsUtil.getComponentSettingsArguments(
254
+ "NotARealWidget" as DashboardComponentType,
255
+ );
256
+ }).toThrow();
257
+ });
258
+ });
259
+ });
@@ -0,0 +1,162 @@
1
+ import Includes from "../../../Types/BaseDatabase/Includes";
2
+ import DashboardVariable, {
3
+ DashboardVariableType,
4
+ } from "../../../Types/Dashboard/DashboardVariable";
5
+ import DashboardModelQueryInterpolation, {
6
+ AttributeToColumnMap,
7
+ } from "../../../Utils/Dashboard/ModelQueryVariableInterpolation";
8
+ import { describe, expect, test } from "@jest/globals";
9
+
10
+ /*
11
+ * DashboardModelQueryInterpolation rewrites a Postgres model query so a list
12
+ * widget honours the dashboard's telemetry-attribute variables — mapping the
13
+ * OTel attribute key (host.name) to the model column (hostname) and writing
14
+ * the predicate. Key behaviors under test: it only touches mapped
15
+ * TelemetryAttribute variables, single vs multi select produce scalar vs
16
+ * Includes predicates, an empty selection clears a prior filter, and the input
17
+ * query object is never mutated (a fresh object is returned only on change).
18
+ */
19
+
20
+ function attrVariable(
21
+ attributeKey: string,
22
+ overrides: Partial<DashboardVariable>,
23
+ ): DashboardVariable {
24
+ return {
25
+ id: attributeKey,
26
+ name: attributeKey,
27
+ type: DashboardVariableType.TelemetryAttribute,
28
+ attributeKey,
29
+ ...overrides,
30
+ };
31
+ }
32
+
33
+ const MAP: AttributeToColumnMap = {
34
+ "host.name": "hostname",
35
+ "k8s.namespace.name": "namespace",
36
+ };
37
+
38
+ describe("DashboardModelQueryInterpolation.applyToQuery - no-ops", () => {
39
+ test("returns the same query object when there are no variables", () => {
40
+ const query: Record<string, unknown> = { foo: "bar" };
41
+ expect(
42
+ DashboardModelQueryInterpolation.applyToQuery(query, undefined, MAP),
43
+ ).toBe(query);
44
+ expect(DashboardModelQueryInterpolation.applyToQuery(query, [], MAP)).toBe(
45
+ query,
46
+ );
47
+ });
48
+
49
+ test("returns the same query object when the attribute map is empty", () => {
50
+ const query: Record<string, unknown> = { foo: "bar" };
51
+ const variables: Array<DashboardVariable> = [
52
+ attrVariable("host.name", { selectedValue: "web1" }),
53
+ ];
54
+ expect(
55
+ DashboardModelQueryInterpolation.applyToQuery(query, variables, {}),
56
+ ).toBe(query);
57
+ });
58
+
59
+ test("ignores non-TelemetryAttribute variables and unmapped keys", () => {
60
+ const query: Record<string, unknown> = { foo: "bar" };
61
+ const variables: Array<DashboardVariable> = [
62
+ {
63
+ id: "t",
64
+ name: "t",
65
+ type: DashboardVariableType.TextInput,
66
+ selectedValue: "x",
67
+ },
68
+ attrVariable("unmapped.key", { selectedValue: "y" }),
69
+ ];
70
+ expect(
71
+ DashboardModelQueryInterpolation.applyToQuery(query, variables, MAP),
72
+ ).toBe(query);
73
+ });
74
+ });
75
+
76
+ describe("DashboardModelQueryInterpolation.applyToQuery - writing predicates", () => {
77
+ test("writes a scalar predicate for a single-select variable", () => {
78
+ const query: Record<string, unknown> = {};
79
+ const result: Record<string, unknown> =
80
+ DashboardModelQueryInterpolation.applyToQuery(
81
+ query,
82
+ [attrVariable("host.name", { selectedValue: "web1" })],
83
+ MAP,
84
+ );
85
+
86
+ expect(result).not.toBe(query); // fresh object
87
+ expect(query).toEqual({}); // input untouched
88
+ expect(result["hostname"]).toBe("web1");
89
+ });
90
+
91
+ test("writes an Includes predicate for a multi-select variable", () => {
92
+ const result: Record<string, unknown> =
93
+ DashboardModelQueryInterpolation.applyToQuery(
94
+ {},
95
+ [
96
+ attrVariable("host.name", {
97
+ isMultiSelect: true,
98
+ selectedValues: ["web1", "web2"],
99
+ }),
100
+ ],
101
+ MAP,
102
+ );
103
+
104
+ expect(result["hostname"]).toBeInstanceOf(Includes);
105
+ expect((result["hostname"] as Includes).values).toEqual(["web1", "web2"]);
106
+ });
107
+
108
+ test("maps two variables onto their respective columns", () => {
109
+ const result: Record<string, unknown> =
110
+ DashboardModelQueryInterpolation.applyToQuery(
111
+ {},
112
+ [
113
+ attrVariable("host.name", { selectedValue: "web1" }),
114
+ attrVariable("k8s.namespace.name", { selectedValue: "prod" }),
115
+ ],
116
+ MAP,
117
+ );
118
+
119
+ expect(result["hostname"]).toBe("web1");
120
+ expect(result["namespace"]).toBe("prod");
121
+ });
122
+ });
123
+
124
+ describe("DashboardModelQueryInterpolation.applyToQuery - clearing predicates", () => {
125
+ test("an empty selection removes a prior filter on that column", () => {
126
+ const query: Record<string, unknown> = { hostname: "old" };
127
+ const result: Record<string, unknown> =
128
+ DashboardModelQueryInterpolation.applyToQuery(
129
+ query,
130
+ [attrVariable("host.name", { selectedValue: "" })],
131
+ MAP,
132
+ );
133
+
134
+ expect(result).not.toBe(query);
135
+ expect(result).not.toHaveProperty("hostname");
136
+ // input query left intact
137
+ expect(query["hostname"]).toBe("old");
138
+ });
139
+
140
+ test("an empty selection with no prior filter is a no-op (same object)", () => {
141
+ const query: Record<string, unknown> = { other: "x" };
142
+ const result: Record<string, unknown> =
143
+ DashboardModelQueryInterpolation.applyToQuery(
144
+ query,
145
+ [attrVariable("host.name", { selectedValue: "" })],
146
+ MAP,
147
+ );
148
+
149
+ expect(result).toBe(query);
150
+ });
151
+
152
+ test("falls back to defaultValue when nothing is selected", () => {
153
+ const result: Record<string, unknown> =
154
+ DashboardModelQueryInterpolation.applyToQuery(
155
+ {},
156
+ [attrVariable("host.name", { defaultValue: "default-host" })],
157
+ MAP,
158
+ );
159
+
160
+ expect(result["hostname"]).toBe("default-host");
161
+ });
162
+ });
@@ -0,0 +1,54 @@
1
+ import EnumUtil from "../../Utils/Enum";
2
+
3
+ enum StringEnum {
4
+ First = "First",
5
+ Second = "second-value",
6
+ }
7
+
8
+ enum NumericEnum {
9
+ Zero,
10
+ One,
11
+ }
12
+
13
+ describe("EnumUtil", () => {
14
+ describe("getValues", () => {
15
+ test("should return the values of a string enum", () => {
16
+ expect(EnumUtil.getValues(StringEnum)).toEqual(["First", "second-value"]);
17
+ });
18
+
19
+ test("should return an empty array for an empty object", () => {
20
+ expect(EnumUtil.getValues({})).toEqual([]);
21
+ });
22
+
23
+ test("should include reverse mapped keys for numeric enums", () => {
24
+ /*
25
+ * TypeScript numeric enums are bidirectional, so Object.values() contains
26
+ * both the names and the numbers.
27
+ */
28
+ const values: Array<string> = EnumUtil.getValues(NumericEnum);
29
+
30
+ expect(values).toContain("Zero");
31
+ expect(values).toContain("One");
32
+ expect(values).toContain(0 as unknown as string);
33
+ expect(values).toContain(1 as unknown as string);
34
+ });
35
+ });
36
+
37
+ describe("isValidEnumValue", () => {
38
+ test("should return true for a value in the enum", () => {
39
+ expect(EnumUtil.isValidEnumValue(StringEnum, "First")).toBe(true);
40
+ expect(EnumUtil.isValidEnumValue(StringEnum, "second-value")).toBe(true);
41
+ });
42
+
43
+ test("should return false for the enum key when it differs from the value", () => {
44
+ expect(EnumUtil.isValidEnumValue(StringEnum, "Second")).toBe(false);
45
+ });
46
+
47
+ test("should return false for values not in the enum", () => {
48
+ expect(EnumUtil.isValidEnumValue(StringEnum, "Third")).toBe(false);
49
+ expect(EnumUtil.isValidEnumValue(StringEnum, null)).toBe(false);
50
+ expect(EnumUtil.isValidEnumValue(StringEnum, undefined)).toBe(false);
51
+ expect(EnumUtil.isValidEnumValue(StringEnum, 0)).toBe(false);
52
+ });
53
+ });
54
+ });
@@ -0,0 +1,85 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import IpCanonicalUtil from "../../Utils/IpCanonicalUtil";
3
+
4
+ /*
5
+ * Trap/syslog correlation compares datagram source addresses (Node's
6
+ * normalized lowercase-compressed form) against user-typed device
7
+ * hostnames. These pin the RFC 5952 canonicalization that makes every
8
+ * spelling of the same IPv6 address compare equal — without it, an
9
+ * IPv6-registered device silently never matches its own traps.
10
+ */
11
+
12
+ describe("IpCanonicalUtil.canonicalize", () => {
13
+ test("IPv4 passes through", () => {
14
+ expect(IpCanonicalUtil.canonicalize("192.168.1.10")).toBe("192.168.1.10");
15
+ expect(IpCanonicalUtil.canonicalize(" 10.0.0.1 ")).toBe("10.0.0.1");
16
+ });
17
+
18
+ test("non-IP input is returned unchanged", () => {
19
+ expect(IpCanonicalUtil.canonicalize("switch-01.example.com")).toBe(
20
+ "switch-01.example.com",
21
+ );
22
+ expect(IpCanonicalUtil.canonicalize("")).toBe("");
23
+ });
24
+
25
+ test("uppercase IPv6 lowers", () => {
26
+ expect(IpCanonicalUtil.canonicalize("2001:DB8::1")).toBe("2001:db8::1");
27
+ });
28
+
29
+ test("fully expanded IPv6 compresses per RFC 5952", () => {
30
+ expect(IpCanonicalUtil.canonicalize("2001:db8:0:0:0:0:0:1")).toBe(
31
+ "2001:db8::1",
32
+ );
33
+ });
34
+
35
+ test("leading zeros are stripped", () => {
36
+ expect(IpCanonicalUtil.canonicalize("2001:0db8::0001")).toBe("2001:db8::1");
37
+ });
38
+
39
+ test("longest zero run wins; leftmost on ties", () => {
40
+ expect(IpCanonicalUtil.canonicalize("2001:0:0:1:0:0:0:1")).toBe(
41
+ "2001:0:0:1::1",
42
+ );
43
+ expect(IpCanonicalUtil.canonicalize("2001:db8:0:0:1:0:0:1")).toBe(
44
+ "2001:db8::1:0:0:1",
45
+ );
46
+ });
47
+
48
+ test("a single zero group is not compressed", () => {
49
+ expect(IpCanonicalUtil.canonicalize("2001:db8:0:1:1:1:1:1")).toBe(
50
+ "2001:db8:0:1:1:1:1:1",
51
+ );
52
+ });
53
+
54
+ test("all-zeros and loopback", () => {
55
+ expect(IpCanonicalUtil.canonicalize("0:0:0:0:0:0:0:0")).toBe("::");
56
+ expect(IpCanonicalUtil.canonicalize("0:0:0:0:0:0:0:1")).toBe("::1");
57
+ expect(IpCanonicalUtil.canonicalize("::1")).toBe("::1");
58
+ });
59
+
60
+ test("IPv4-mapped tails fold into hex groups", () => {
61
+ expect(IpCanonicalUtil.canonicalize("::ffff:192.168.1.1")).toBe(
62
+ IpCanonicalUtil.canonicalize("::ffff:c0a8:101"),
63
+ );
64
+ });
65
+ });
66
+
67
+ describe("IpCanonicalUtil.areSameIpAddress", () => {
68
+ test("matches different spellings of one IPv6 address", () => {
69
+ expect(
70
+ IpCanonicalUtil.areSameIpAddress("2001:DB8::1", "2001:db8:0:0:0:0:0:1"),
71
+ ).toBe(true);
72
+ });
73
+
74
+ test("distinct addresses do not match", () => {
75
+ expect(IpCanonicalUtil.areSameIpAddress("2001:db8::1", "2001:db8::2")).toBe(
76
+ false,
77
+ );
78
+ });
79
+
80
+ test("DNS names never match as IPs", () => {
81
+ expect(
82
+ IpCanonicalUtil.areSameIpAddress("switch.example.com", "2001:db8::1"),
83
+ ).toBe(false);
84
+ });
85
+ });
@@ -0,0 +1,44 @@
1
+ import MemoryUtil from "../../Utils/Memory";
2
+
3
+ /*
4
+ * MemoryUtil.convertToGb turns a raw byte count into gibibytes (bytes / 1024^3)
5
+ * rounded to two decimal places. These tests pin the unit (GiB, not GB), the
6
+ * rounding, and the boundary/edge behaviour.
7
+ */
8
+ describe("MemoryUtil.convertToGb", () => {
9
+ const GIB: number = 1024 * 1024 * 1024;
10
+
11
+ test("converts exactly one GiB to 1", () => {
12
+ expect(MemoryUtil.convertToGb(GIB)).toBe(1);
13
+ });
14
+
15
+ test("converts whole GiB multiples", () => {
16
+ expect(MemoryUtil.convertToGb(4 * GIB)).toBe(4);
17
+ expect(MemoryUtil.convertToGb(16 * GIB)).toBe(16);
18
+ });
19
+
20
+ test("returns 0 for 0 bytes", () => {
21
+ expect(MemoryUtil.convertToGb(0)).toBe(0);
22
+ });
23
+
24
+ test("rounds to two decimal places", () => {
25
+ // 1.5 GiB -> 1.5
26
+ expect(MemoryUtil.convertToGb(1.5 * GIB)).toBe(1.5);
27
+ // 1.234 GiB rounds to 1.23
28
+ expect(MemoryUtil.convertToGb(1.234 * GIB)).toBe(1.23);
29
+ // 1.235 GiB rounds up to 1.24 (round-half-up)
30
+ expect(MemoryUtil.convertToGb(1.235 * GIB)).toBe(1.24);
31
+ });
32
+
33
+ test("handles sub-GiB values", () => {
34
+ // 512 MiB is half a GiB.
35
+ expect(MemoryUtil.convertToGb(512 * 1024 * 1024)).toBe(0.5);
36
+ // A single byte rounds down to 0.
37
+ expect(MemoryUtil.convertToGb(1)).toBe(0);
38
+ });
39
+
40
+ test("uses GiB (1024^3), not GB (1000^3)", () => {
41
+ // One billion bytes is < 1 GiB, so it must not round to 1.
42
+ expect(MemoryUtil.convertToGb(1_000_000_000)).toBe(0.93);
43
+ });
44
+ });