@oneuptime/common 12.0.30 → 12.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
- package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
- package/Models/DatabaseModels/AlertSeverity.ts +44 -0
- package/Models/DatabaseModels/DetectionRule.ts +16 -5
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
- package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/NetworkDevice.ts +113 -3
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
- package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +499 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
- package/Server/API/GlobalConfigAPI.ts +362 -183
- package/Server/API/TelemetryAPI.ts +42 -4
- package/Server/EnvironmentConfig.ts +112 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Middleware/MultipartFormData.ts +118 -32
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertGroupingEngineService.ts +9 -1
- package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertReminderRuleService.ts +9 -1
- package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
- package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/HostLabelRuleEngineService.ts +9 -1
- package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentGroupingEngineService.ts +9 -1
- package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentReminderRuleService.ts +9 -1
- package/Server/Services/IncidentSlaRuleService.ts +9 -1
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesResourceService.ts +5 -1
- package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
- package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceService.ts +209 -1
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
- package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
- package/Server/Services/TelemetrySourceMapService.ts +266 -23
- package/Server/Services/UserService.ts +27 -0
- package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
- package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
- package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
- package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
- package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
- package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
- package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
- package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
- package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
- package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +469 -0
- package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
- package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
- package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
- package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
- package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
- package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
- package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
- package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
- package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
- package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
- package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
- package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
- package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
- package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
- package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
- package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
- package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
- package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
- package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
- package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
- package/Tests/UI/Components/XAxis.test.ts +270 -5
- package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
- package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
- package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
- package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
- package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
- package/Types/Date.ts +39 -0
- package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
- package/Types/Permission.ts +96 -0
- package/Types/Rum/SessionReplay.ts +21 -0
- package/Types/Telemetry/SourceMap.ts +8 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +491 -544
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +324 -372
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +487 -540
- package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
- package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
- package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
- package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
- package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
- package/UI/Components/Charts/Utils/XAxis.ts +125 -18
- package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
- package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
- package/UI/Components/Feed/FeedItem.tsx +4 -5
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
- package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
- package/UI/Components/Image/Image.tsx +20 -3
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +150 -24
- package/UI/Components/Table/TableHeader.tsx +64 -48
- package/UI/Components/Table/TableRow.tsx +13 -3
- package/UI/Styles/Theme.css +38 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
- package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
- package/Utils/Rules/RuleEngineLimits.ts +32 -0
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +115 -3
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +519 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +31 -3
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +83 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
- package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +25 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
- package/build/dist/Types/Date.js +27 -0
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
- package/build/dist/Types/Permission.js +86 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +19 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +213 -233
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +139 -152
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +212 -232
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
- package/build/dist/UI/Components/Image/Image.js +6 -1
- package/build/dist/UI/Components/Image/Image.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +104 -23
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +20 -22
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +13 -4
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
- package/jest.config.json +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
import EnterpriseLicenseInstanceSummary from "../../Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary";
|
|
2
|
+
import EnterpriseLicenseSeatsUtil, {
|
|
3
|
+
SeatUsage,
|
|
4
|
+
SeatUsageInput,
|
|
5
|
+
} from "../../Utils/EnterpriseLicense/EnterpriseLicenseSeats";
|
|
6
|
+
import { describe, expect, it } from "@jest/globals";
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* The arithmetic behind "you cannot add another user".
|
|
10
|
+
*
|
|
11
|
+
* An enterprise license is bought for a number of users and shared by every
|
|
12
|
+
* instance the customer runs on that key. Until now nothing on the customer's
|
|
13
|
+
* side acted on that number — the limit was mirrored into GlobalConfig, drawn
|
|
14
|
+
* on a progress bar, and otherwise ignored, so a 50-seat license and a 5000-
|
|
15
|
+
* seat license behaved identically.
|
|
16
|
+
*
|
|
17
|
+
* Deciding whether one more user fits is not a comparison, because neither
|
|
18
|
+
* number this installation holds is the answer:
|
|
19
|
+
*
|
|
20
|
+
* localUserCount live, and blind to the customer's other instances.
|
|
21
|
+
* aggregatedUserCount deduplicated across every instance, and up to a day
|
|
22
|
+
* old — so it does not know about the person being
|
|
23
|
+
* invited right now, which is the only person the check
|
|
24
|
+
* is about.
|
|
25
|
+
*
|
|
26
|
+
* These tests pin how those are combined, and — at least as importantly — pin
|
|
27
|
+
* which way every "cannot tell" case is allowed to fall. Under-enforcing is
|
|
28
|
+
* corrected by the next daily report. Over-enforcing locks a paying customer
|
|
29
|
+
* out of their own installation, so no missing, malformed or contradictory
|
|
30
|
+
* field is allowed to invent seats that are not there.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
type MakeInstanceFunction = (
|
|
34
|
+
overrides?: Partial<EnterpriseLicenseInstanceSummary>,
|
|
35
|
+
) => EnterpriseLicenseInstanceSummary;
|
|
36
|
+
|
|
37
|
+
const makeInstance: MakeInstanceFunction = (
|
|
38
|
+
overrides?: Partial<EnterpriseLicenseInstanceSummary>,
|
|
39
|
+
): EnterpriseLicenseInstanceSummary => {
|
|
40
|
+
return {
|
|
41
|
+
instanceId: "instance-1",
|
|
42
|
+
host: "oneuptime.acme.internal",
|
|
43
|
+
userCount: 10,
|
|
44
|
+
lastReportedAt: "2026-01-01T00:00:00.000Z",
|
|
45
|
+
version: "12.0.30",
|
|
46
|
+
...overrides,
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
type SeatsFunction = (input: Partial<SeatUsageInput>) => SeatUsage;
|
|
51
|
+
|
|
52
|
+
const seats: SeatsFunction = (input: Partial<SeatUsageInput>): SeatUsage => {
|
|
53
|
+
return EnterpriseLicenseSeatsUtil.getSeatUsage({
|
|
54
|
+
localUserCount: 0,
|
|
55
|
+
...input,
|
|
56
|
+
} as SeatUsageInput);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
describe("EnterpriseLicenseSeatsUtil - is there a limit at all", () => {
|
|
60
|
+
it("does not enforce when the license carries no seat limit", () => {
|
|
61
|
+
const usage: SeatUsage = seats({ userLimit: null, localUserCount: 9999 });
|
|
62
|
+
|
|
63
|
+
expect(usage.isEnforced).toBe(false);
|
|
64
|
+
expect(usage.userLimit).toBeNull();
|
|
65
|
+
expect(usage.seatsRemaining).toBeNull();
|
|
66
|
+
expect(usage.hasSeatForNewUser).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("does not enforce when the seat limit was never set", () => {
|
|
70
|
+
expect(seats({ localUserCount: 9999 }).isEnforced).toBe(false);
|
|
71
|
+
expect(
|
|
72
|
+
seats({ userLimit: undefined, localUserCount: 9999 }).isEnforced,
|
|
73
|
+
).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
* Zero is read as "no limit", matching the license modal and the breach
|
|
78
|
+
* notification job, both of which treat userLimit <= 0 as nothing to measure
|
|
79
|
+
* against. Reading it as "nobody may have an account" would leave a stray
|
|
80
|
+
* zero — a bad import, a half-filled form on oneuptime.com — unable to create
|
|
81
|
+
* even the first user of an installation.
|
|
82
|
+
*/
|
|
83
|
+
it("treats a zero seat limit as no limit rather than no seats", () => {
|
|
84
|
+
const usage: SeatUsage = seats({ userLimit: 0, localUserCount: 0 });
|
|
85
|
+
|
|
86
|
+
expect(usage.isEnforced).toBe(false);
|
|
87
|
+
expect(usage.hasSeatForNewUser).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("ignores a negative seat limit", () => {
|
|
91
|
+
expect(seats({ userLimit: -10, localUserCount: 5 }).isEnforced).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it.each([
|
|
95
|
+
["a fractional limit", 10.5],
|
|
96
|
+
["infinity", Number.POSITIVE_INFINITY],
|
|
97
|
+
["NaN", Number.NaN],
|
|
98
|
+
])("ignores %s as a seat limit", (_label: string, userLimit: number) => {
|
|
99
|
+
expect(seats({ userLimit: userLimit, localUserCount: 5 }).isEnforced).toBe(
|
|
100
|
+
false,
|
|
101
|
+
);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("ignores a seat limit that is not a number at all", () => {
|
|
105
|
+
expect(
|
|
106
|
+
seats({
|
|
107
|
+
userLimit: "150" as unknown as number,
|
|
108
|
+
localUserCount: 5,
|
|
109
|
+
}).isEnforced,
|
|
110
|
+
).toBe(false);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("enforces the smallest real limit there is", () => {
|
|
114
|
+
expect(seats({ userLimit: 1, localUserCount: 0 }).hasSeatForNewUser).toBe(
|
|
115
|
+
true,
|
|
116
|
+
);
|
|
117
|
+
expect(seats({ userLimit: 1, localUserCount: 1 }).hasSeatForNewUser).toBe(
|
|
118
|
+
false,
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe("EnterpriseLicenseSeatsUtil - a single instance", () => {
|
|
124
|
+
it("has room while users are below the limit", () => {
|
|
125
|
+
const usage: SeatUsage = seats({ userLimit: 10, localUserCount: 7 });
|
|
126
|
+
|
|
127
|
+
expect(usage.isEnforced).toBe(true);
|
|
128
|
+
expect(usage.seatsInUse).toBe(7);
|
|
129
|
+
expect(usage.seatsRemaining).toBe(3);
|
|
130
|
+
expect(usage.hasSeatForNewUser).toBe(true);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
/*
|
|
134
|
+
* The boundary the whole feature turns on. A license bought for 10 users
|
|
135
|
+
* covers the 10th; it is the 11th that has to be refused.
|
|
136
|
+
*/
|
|
137
|
+
it("refuses the user that would step past the limit", () => {
|
|
138
|
+
expect(seats({ userLimit: 10, localUserCount: 9 }).hasSeatForNewUser).toBe(
|
|
139
|
+
true,
|
|
140
|
+
);
|
|
141
|
+
expect(seats({ userLimit: 10, localUserCount: 10 }).hasSeatForNewUser).toBe(
|
|
142
|
+
false,
|
|
143
|
+
);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it("reports no seats remaining rather than a negative number when over the limit", () => {
|
|
147
|
+
const usage: SeatUsage = seats({ userLimit: 10, localUserCount: 25 });
|
|
148
|
+
|
|
149
|
+
expect(usage.seatsInUse).toBe(25);
|
|
150
|
+
expect(usage.seatsRemaining).toBe(0);
|
|
151
|
+
expect(usage.hasSeatForNewUser).toBe(false);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it("still reports usage on an unlimited license, it just never blocks", () => {
|
|
155
|
+
const usage: SeatUsage = seats({ userLimit: null, localUserCount: 25 });
|
|
156
|
+
|
|
157
|
+
expect(usage.seatsInUse).toBe(25);
|
|
158
|
+
expect(usage.hasSeatForNewUser).toBe(true);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it.each([
|
|
162
|
+
["a negative count", -5],
|
|
163
|
+
["a fractional count", 4.5],
|
|
164
|
+
["NaN", Number.NaN],
|
|
165
|
+
])(
|
|
166
|
+
"falls back to zero local users for %s",
|
|
167
|
+
(_label: string, localUserCount: number) => {
|
|
168
|
+
expect(
|
|
169
|
+
seats({ userLimit: 10, localUserCount: localUserCount }).seatsInUse,
|
|
170
|
+
).toBe(0);
|
|
171
|
+
},
|
|
172
|
+
);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
describe("EnterpriseLicenseSeatsUtil - the licence-wide count", () => {
|
|
176
|
+
/*
|
|
177
|
+
* The aggregate is the only number that knows about the customer's other
|
|
178
|
+
* instances, so it has to be able to exhaust the limit on its own — even
|
|
179
|
+
* though this installation has barely any users of its own.
|
|
180
|
+
*/
|
|
181
|
+
it("blocks on the licence-wide count even when this instance is nearly empty", () => {
|
|
182
|
+
const usage: SeatUsage = seats({
|
|
183
|
+
userLimit: 100,
|
|
184
|
+
localUserCount: 3,
|
|
185
|
+
aggregatedUserCount: 100,
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
expect(usage.seatsInUse).toBe(100);
|
|
189
|
+
expect(usage.hasSeatForNewUser).toBe(false);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
/*
|
|
193
|
+
* And the live local count has to be able to exhaust it on its own too: the
|
|
194
|
+
* aggregate is up to a day old, so it is systematically behind on exactly
|
|
195
|
+
* the users this check exists to catch.
|
|
196
|
+
*/
|
|
197
|
+
it("blocks on the live local count even when the last report was lower", () => {
|
|
198
|
+
const usage: SeatUsage = seats({
|
|
199
|
+
userLimit: 100,
|
|
200
|
+
localUserCount: 100,
|
|
201
|
+
aggregatedUserCount: 12,
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
expect(usage.seatsInUse).toBe(100);
|
|
205
|
+
expect(usage.hasSeatForNewUser).toBe(false);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it.each([
|
|
209
|
+
["null", null],
|
|
210
|
+
["undefined", undefined],
|
|
211
|
+
["a negative number", -1],
|
|
212
|
+
["a fraction", 12.5],
|
|
213
|
+
["a string", "12" as unknown as number],
|
|
214
|
+
])(
|
|
215
|
+
"ignores a licence-wide count of %s and falls back to the local one",
|
|
216
|
+
(_label: string, aggregatedUserCount: number | null | undefined) => {
|
|
217
|
+
const usage: SeatUsage = seats({
|
|
218
|
+
userLimit: 100,
|
|
219
|
+
localUserCount: 40,
|
|
220
|
+
aggregatedUserCount: aggregatedUserCount,
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
expect(usage.seatsInUse).toBe(40);
|
|
224
|
+
expect(usage.hasSeatForNewUser).toBe(true);
|
|
225
|
+
},
|
|
226
|
+
);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
describe("EnterpriseLicenseSeatsUtil - several instances on one licence", () => {
|
|
230
|
+
/*
|
|
231
|
+
* The case the whole instance breakdown exists for. Two instances share a
|
|
232
|
+
* 100-seat license: this one has 60 users, the other 30, and 10 people have
|
|
233
|
+
* accounts on both. oneuptime.com deduplicates that to 80.
|
|
234
|
+
*
|
|
235
|
+
* Neither number alone is right here — 60 lets the customer overshoot, 80 is
|
|
236
|
+
* a day stale. Subtracting this instance's last reported count from the
|
|
237
|
+
* aggregate leaves the 20 seats that are somebody else's, and adding the
|
|
238
|
+
* live local count back gives a figure that is current here and complete
|
|
239
|
+
* everywhere else.
|
|
240
|
+
*/
|
|
241
|
+
it("adds this instance's live users to the seats other instances hold", () => {
|
|
242
|
+
const usage: SeatUsage = seats({
|
|
243
|
+
userLimit: 100,
|
|
244
|
+
localUserCount: 60,
|
|
245
|
+
aggregatedUserCount: 80,
|
|
246
|
+
thisInstanceId: "instance-1",
|
|
247
|
+
instances: [
|
|
248
|
+
makeInstance({ instanceId: "instance-1", userCount: 60 }),
|
|
249
|
+
makeInstance({ instanceId: "instance-2", userCount: 30 }),
|
|
250
|
+
],
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
expect(usage.seatsUsedByOtherInstances).toBe(20);
|
|
254
|
+
expect(usage.seatsInUse).toBe(80);
|
|
255
|
+
expect(usage.seatsRemaining).toBe(20);
|
|
256
|
+
expect(usage.hasSeatForNewUser).toBe(true);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
it("sees users added here since the last report, which the aggregate cannot", () => {
|
|
260
|
+
const usage: SeatUsage = seats({
|
|
261
|
+
userLimit: 100,
|
|
262
|
+
// 25 people signed up since the report that said 60.
|
|
263
|
+
localUserCount: 85,
|
|
264
|
+
aggregatedUserCount: 80,
|
|
265
|
+
thisInstanceId: "instance-1",
|
|
266
|
+
instances: [
|
|
267
|
+
makeInstance({ instanceId: "instance-1", userCount: 60 }),
|
|
268
|
+
makeInstance({ instanceId: "instance-2", userCount: 30 }),
|
|
269
|
+
],
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
expect(usage.seatsInUse).toBe(105);
|
|
273
|
+
expect(usage.seatsRemaining).toBe(0);
|
|
274
|
+
expect(usage.hasSeatForNewUser).toBe(false);
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
it("counts users deleted here since the last report back off the total", () => {
|
|
278
|
+
const usage: SeatUsage = seats({
|
|
279
|
+
userLimit: 100,
|
|
280
|
+
localUserCount: 40,
|
|
281
|
+
aggregatedUserCount: 80,
|
|
282
|
+
thisInstanceId: "instance-1",
|
|
283
|
+
instances: [
|
|
284
|
+
makeInstance({ instanceId: "instance-1", userCount: 60 }),
|
|
285
|
+
makeInstance({ instanceId: "instance-2", userCount: 30 }),
|
|
286
|
+
],
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
// 20 seats elsewhere + 40 live here. The stale 80 no longer decides it.
|
|
290
|
+
expect(usage.seatsInUse).toBe(60);
|
|
291
|
+
expect(usage.hasSeatForNewUser).toBe(true);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
/*
|
|
295
|
+
* Complete overlap: the same 60 people on both instances is 60 seats, not
|
|
296
|
+
* 120. Subtracting our own reported count is what stops this instance being
|
|
297
|
+
* charged twice for its own users.
|
|
298
|
+
*/
|
|
299
|
+
it("does not double-count users who exist on more than one instance", () => {
|
|
300
|
+
const usage: SeatUsage = seats({
|
|
301
|
+
userLimit: 100,
|
|
302
|
+
localUserCount: 60,
|
|
303
|
+
aggregatedUserCount: 60,
|
|
304
|
+
thisInstanceId: "instance-1",
|
|
305
|
+
instances: [
|
|
306
|
+
makeInstance({ instanceId: "instance-1", userCount: 60 }),
|
|
307
|
+
makeInstance({ instanceId: "instance-2", userCount: 60 }),
|
|
308
|
+
],
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
expect(usage.seatsUsedByOtherInstances).toBe(0);
|
|
312
|
+
expect(usage.seatsInUse).toBe(60);
|
|
313
|
+
expect(usage.hasSeatForNewUser).toBe(true);
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
/*
|
|
317
|
+
* The stale licence-wide figure is deliberately NOT allowed to outvote the
|
|
318
|
+
* live local count once the breakdown makes it decomposable. Freeing seats by
|
|
319
|
+
* deleting users has to free them now, not at the next daily report - which
|
|
320
|
+
* is the difference between a limit and a lockout.
|
|
321
|
+
*/
|
|
322
|
+
it("does not let the stale licence-wide figure hold seats that were just freed", () => {
|
|
323
|
+
const usage: SeatUsage = seats({
|
|
324
|
+
userLimit: 80,
|
|
325
|
+
localUserCount: 40,
|
|
326
|
+
aggregatedUserCount: 80,
|
|
327
|
+
thisInstanceId: "instance-1",
|
|
328
|
+
instances: [
|
|
329
|
+
makeInstance({ instanceId: "instance-1", userCount: 60 }),
|
|
330
|
+
makeInstance({ instanceId: "instance-2", userCount: 30 }),
|
|
331
|
+
],
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
expect(usage.seatsInUse).toBe(60);
|
|
335
|
+
expect(usage.hasSeatForNewUser).toBe(true);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it("never lets other instances hold a negative number of seats", () => {
|
|
339
|
+
const usage: SeatUsage = seats({
|
|
340
|
+
userLimit: 100,
|
|
341
|
+
localUserCount: 70,
|
|
342
|
+
// Our own last report is somehow larger than the licence-wide total.
|
|
343
|
+
aggregatedUserCount: 40,
|
|
344
|
+
thisInstanceId: "instance-1",
|
|
345
|
+
instances: [makeInstance({ instanceId: "instance-1", userCount: 70 })],
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
expect(usage.seatsUsedByOtherInstances).toBe(0);
|
|
349
|
+
expect(usage.seatsInUse).toBe(70);
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
describe("EnterpriseLicenseSeatsUtil - when the topology cannot be read", () => {
|
|
354
|
+
/*
|
|
355
|
+
* Every branch here resolves to "assume nothing is held elsewhere". That is
|
|
356
|
+
* the under-enforcing direction on purpose: the daily report corrects an
|
|
357
|
+
* undercount, and nothing corrects an installation that has wrongly locked
|
|
358
|
+
* its administrator out of adding users.
|
|
359
|
+
*/
|
|
360
|
+
it.each([
|
|
361
|
+
["there is no instance list", undefined],
|
|
362
|
+
["the instance list is null", null],
|
|
363
|
+
["the instance list is empty", []],
|
|
364
|
+
])(
|
|
365
|
+
"attributes nothing to other instances when %s",
|
|
366
|
+
(
|
|
367
|
+
_label: string,
|
|
368
|
+
instances: Array<EnterpriseLicenseInstanceSummary> | null | undefined,
|
|
369
|
+
) => {
|
|
370
|
+
const usage: SeatUsage = seats({
|
|
371
|
+
userLimit: 100,
|
|
372
|
+
localUserCount: 20,
|
|
373
|
+
aggregatedUserCount: 80,
|
|
374
|
+
thisInstanceId: "instance-1",
|
|
375
|
+
instances: instances,
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
expect(usage.seatsUsedByOtherInstances).toBe(0);
|
|
379
|
+
expect(usage.seatsInUse).toBe(80);
|
|
380
|
+
},
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
it("attributes nothing to other instances when this instance has no id", () => {
|
|
384
|
+
const usage: SeatUsage = seats({
|
|
385
|
+
userLimit: 100,
|
|
386
|
+
localUserCount: 20,
|
|
387
|
+
aggregatedUserCount: 80,
|
|
388
|
+
thisInstanceId: null,
|
|
389
|
+
instances: [makeInstance({ instanceId: "instance-2", userCount: 80 })],
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
expect(usage.seatsUsedByOtherInstances).toBe(0);
|
|
393
|
+
expect(usage.seatsInUse).toBe(80);
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
/*
|
|
397
|
+
* The dangerous reading of "we are not in the list" is "then the whole
|
|
398
|
+
* aggregate belongs to somebody else". It is right for an instance that has
|
|
399
|
+
* genuinely never registered, and catastrophic for one whose instance id
|
|
400
|
+
* changed after its users had already been counted under the old one — that
|
|
401
|
+
* installation would be charged twice for every user it has and could lock
|
|
402
|
+
* itself out. It is not taken.
|
|
403
|
+
*/
|
|
404
|
+
it("does not assume the whole aggregate is somebody else's when this instance is missing from the list", () => {
|
|
405
|
+
const usage: SeatUsage = seats({
|
|
406
|
+
userLimit: 100,
|
|
407
|
+
localUserCount: 80,
|
|
408
|
+
aggregatedUserCount: 80,
|
|
409
|
+
thisInstanceId: "instance-that-was-renamed",
|
|
410
|
+
instances: [makeInstance({ instanceId: "instance-1", userCount: 80 })],
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
expect(usage.seatsUsedByOtherInstances).toBe(0);
|
|
414
|
+
expect(usage.seatsInUse).toBe(80);
|
|
415
|
+
expect(usage.hasSeatForNewUser).toBe(true);
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
it.each([
|
|
419
|
+
["null", null],
|
|
420
|
+
["a fraction", 12.5 as unknown as number],
|
|
421
|
+
["a string", "60" as unknown as number],
|
|
422
|
+
])(
|
|
423
|
+
"attributes nothing to other instances when our own reported count is %s",
|
|
424
|
+
(_label: string, userCount: number | null) => {
|
|
425
|
+
const usage: SeatUsage = seats({
|
|
426
|
+
userLimit: 100,
|
|
427
|
+
localUserCount: 20,
|
|
428
|
+
aggregatedUserCount: 80,
|
|
429
|
+
thisInstanceId: "instance-1",
|
|
430
|
+
instances: [
|
|
431
|
+
makeInstance({ instanceId: "instance-1", userCount: userCount }),
|
|
432
|
+
],
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
expect(usage.seatsUsedByOtherInstances).toBe(0);
|
|
436
|
+
expect(usage.seatsInUse).toBe(80);
|
|
437
|
+
},
|
|
438
|
+
);
|
|
439
|
+
|
|
440
|
+
it("survives a malformed entry in the instance list", () => {
|
|
441
|
+
const usage: SeatUsage = seats({
|
|
442
|
+
userLimit: 100,
|
|
443
|
+
localUserCount: 60,
|
|
444
|
+
aggregatedUserCount: 80,
|
|
445
|
+
thisInstanceId: "instance-1",
|
|
446
|
+
instances: [
|
|
447
|
+
null as unknown as EnterpriseLicenseInstanceSummary,
|
|
448
|
+
makeInstance({ instanceId: "instance-1", userCount: 60 }),
|
|
449
|
+
],
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
expect(usage.seatsUsedByOtherInstances).toBe(20);
|
|
453
|
+
expect(usage.seatsInUse).toBe(80);
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
it("matches this instance by its id even with surrounding whitespace", () => {
|
|
457
|
+
const usage: SeatUsage = seats({
|
|
458
|
+
userLimit: 100,
|
|
459
|
+
localUserCount: 60,
|
|
460
|
+
aggregatedUserCount: 80,
|
|
461
|
+
thisInstanceId: " instance-1 ",
|
|
462
|
+
instances: [makeInstance({ instanceId: "instance-1", userCount: 60 })],
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
expect(usage.seatsUsedByOtherInstances).toBe(20);
|
|
466
|
+
});
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
describe("EnterpriseLicenseSeatsUtil - the message an administrator reads", () => {
|
|
470
|
+
it("names the limit, the usage and what to do about it", () => {
|
|
471
|
+
const message: string =
|
|
472
|
+
EnterpriseLicenseSeatsUtil.getSeatLimitReachedMessage({
|
|
473
|
+
seatsInUse: 150,
|
|
474
|
+
userLimit: 150,
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
expect(message).toContain("150");
|
|
478
|
+
expect(message).toContain("sales@oneuptime.com");
|
|
479
|
+
expect(message).toContain("Refresh license");
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
it("does not say 1 users", () => {
|
|
483
|
+
const message: string =
|
|
484
|
+
EnterpriseLicenseSeatsUtil.getSeatLimitReachedMessage({
|
|
485
|
+
seatsInUse: 1,
|
|
486
|
+
userLimit: 1,
|
|
487
|
+
});
|
|
488
|
+
|
|
489
|
+
expect(message).toContain("1-user limit");
|
|
490
|
+
expect(message).not.toContain("1 users");
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
/*
|
|
494
|
+
* The message is shown to a person who is being told no. It must not read
|
|
495
|
+
* like a bug, so it always states both halves of the arithmetic.
|
|
496
|
+
*/
|
|
497
|
+
it("states the usage even when it exceeds the limit", () => {
|
|
498
|
+
const message: string =
|
|
499
|
+
EnterpriseLicenseSeatsUtil.getSeatLimitReachedMessage({
|
|
500
|
+
seatsInUse: 212,
|
|
501
|
+
userLimit: 150,
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
expect(message).toContain("150");
|
|
505
|
+
expect(message).toContain("212");
|
|
506
|
+
});
|
|
507
|
+
});
|