>();
export const APP_SHELL_ROUTE_PRELOAD_PATHS = [
ROOT_PROXMOX_PATH,
- ROOT_WORKLOADS_PATH,
- RECOVERY_ROUTE_PATH,
PATROL_PATH,
ALERTS_PATH,
- STORAGE_PATH,
SETTINGS_PATH,
] as const;
@@ -77,30 +66,6 @@ const ROUTE_PRELOADERS: readonly RoutePreloader[] = [
preload: () =>
import('@/pages/Vmware').then(() => undefined),
},
- {
- id: 'infrastructure',
- matches: (route) => route === ROOT_INFRASTRUCTURE_PATH,
- preload: () =>
- import('@/pages/Infrastructure').then(() => undefined),
- },
- {
- id: 'workloads',
- matches: (route) => route === ROOT_WORKLOADS_PATH,
- preload: () =>
- import('@/pages/Workloads').then(() => undefined),
- },
- {
- id: 'storage',
- matches: (route) => route === STORAGE_PATH,
- preload: () =>
- import('@/pages/Storage').then(() => undefined),
- },
- {
- id: 'recovery',
- matches: (route) => route === RECOVERY_ROUTE_PATH,
- preload: () =>
- import('@/pages/Recovery').then(() => undefined),
- },
{
id: 'alerts',
matches: (route) => route === ALERTS_PATH || route.startsWith(`${ALERTS_PATH}/`),
diff --git a/frontend-modern/src/utils/__tests__/frontendResourceTypeBoundaries.test.ts b/frontend-modern/src/utils/__tests__/frontendResourceTypeBoundaries.test.ts
index 62992bef3..6577fb2aa 100644
--- a/frontend-modern/src/utils/__tests__/frontendResourceTypeBoundaries.test.ts
+++ b/frontend-modern/src/utils/__tests__/frontendResourceTypeBoundaries.test.ts
@@ -140,7 +140,6 @@ import updatesPresentationSource from '@/utils/updatesPresentation.ts?raw';
import environmentLockBadgeSource from '@/components/shared/EnvironmentLockBadge.tsx?raw';
import environmentLockPresentationSource from '@/utils/environmentLockPresentation.ts?raw';
import dockerRuntimeSettingsCardSource from '@/components/Settings/DockerRuntimeSettingsCard.tsx?raw';
-import infrastructurePageShellSource from '@/pages/Infrastructure.tsx?raw';
import operationsPageRouteSource from '@/pages/Operations.tsx?raw';
import discoveryTargetSource from '@/utils/discoveryTarget.ts?raw';
import infrastructureEmptyStatePresentationSource from '@/utils/infrastructureEmptyStatePresentation.ts?raw';
@@ -350,8 +349,6 @@ import nodeModalSetupGuideSectionSource from '@/components/Settings/NodeModalSet
import nodeModalStatusFooterSource from '@/components/Settings/NodeModalStatusFooter.tsx?raw';
import nodeModalStateSource from '@/components/Settings/useNodeModalState.ts?raw';
import nodeModalPresentationSource from '@/utils/nodeModalPresentation.ts?raw';
-import cephPageSource from '@/pages/Ceph.tsx?raw';
-import cephServiceIconSource from '@/components/Ceph/CephServiceIcon.tsx?raw';
import diskPresentationSource from '@/features/storageBackups/diskPresentation.ts?raw';
import diskLiveMetricPresentationSource from '@/features/storageBackups/diskLiveMetricPresentation.ts?raw';
import storageDetailPresentationSource from '@/features/storageBackups/detailPresentation.ts?raw';
@@ -604,7 +601,6 @@ const resourceDetailDrawerSource = [
].join('\n');
const infrastructurePageSource = [
- infrastructurePageShellSource,
infrastructurePageSurfaceSource,
infrastructurePageRouteStateSource,
infrastructurePageStateSource,
@@ -949,7 +945,9 @@ describe('frontend resource type boundaries', () => {
expect(guestRowSource).not.toContain('function NetworkInfoCell(');
expect(guestRowSource).not.toContain('function OSInfoCell(');
expect(guestRowStateSource).toContain('getCanonicalWorkloadId');
- expect(guestRowStateSource).toContain("from '@/routing/resourceLinks'");
+ // The legacy cross-jump to /infrastructure?... was retired; guestRowState
+ // no longer needs anything from resourceLinks.
+ expect(guestRowStateSource).not.toContain("from '@/routing/resourceLinks'");
expect(guestRowStateSource).not.toContain('./infrastructureLink');
expect(guestRowModelSource).toContain('export const GUEST_COLUMNS');
expect(guestRowCellsSource).toContain('function NetworkInfoCell(');
@@ -3348,27 +3346,14 @@ describe('frontend resource type boundaries', () => {
expect(nodeModalPresentationSource).toContain(
'export function buildNodeModalMonitoringPayload',
);
- expect(cephPageSource).toContain('getCephServiceStatusPresentation');
- expect(cephPageSource).toContain('getCephLoadingStatePresentation');
- expect(cephPageSource).toContain('getCephDisconnectedStatePresentation');
- expect(cephPageSource).toContain('getCephNoClustersStatePresentation');
- expect(cephPageSource).toContain('getCephPoolsSearchEmptyStatePresentation');
- expect(cephPageSource).toContain('CephServiceIcon');
- expect(cephPageSource).not.toContain('{`.overflow-x-auto::-webkit-scrollbar { display: none; }`}',
- );
- expect(cephPageSource).not.toContain('const getServiceStatus =');
- expect(cephPageSource).not.toContain('const ServiceIcon: Component');
- expect(cephPageSource).not.toContain('Loading Ceph data...');
- expect(cephPageSource).not.toContain('No Ceph Clusters Detected');
- expect(cephPageSource).not.toContain('No pools match "');
+ // Canonical Ceph presentation helpers still live in storageDomain and
+ // are consumed by ProxmoxCephTable / ProxmoxCephClusterDrawer now that
+ // the standalone /ceph page has been retired.
expect(storageDomainSource).toContain('export const getCephServiceStatusPresentation');
expect(storageDomainSource).toContain('export const getCephLoadingStatePresentation');
expect(storageDomainSource).toContain('export const getCephDisconnectedStatePresentation');
expect(storageDomainSource).toContain('export const getCephNoClustersStatePresentation');
expect(storageDomainSource).toContain('export const getCephPoolsSearchEmptyStatePresentation');
- expect(cephServiceIconSource).toContain('export const CephServiceIcon');
expect(deployStatusBadgeSource).toContain('getDeployStatusPresentation');
expect(deployStatusBadgeSource).not.toContain('const statusConfig: Record str:
RECOVERY_PRODUCT_SURFACE_EXACT_FILES = [
"frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx",
- "frontend-modern/src/pages/__tests__/Recovery.test.tsx",
"frontend-modern/src/utils/__tests__/frontendResourceTypeBoundaries.test.ts",
"tests/integration/tests/17-recovery-layout.spec.ts",
]
@@ -769,8 +768,6 @@ class CanonicalCompletionGuardTest(unittest.TestCase):
"frontend-modern/src/features/infrastructure/__tests__/InfrastructurePageSurface.guardrails.test.ts",
"frontend-modern/src/features/infrastructure/__tests__/infrastructurePageModel.test.ts",
"frontend-modern/src/hooks/__tests__/useUnifiedResources.test.ts",
- "frontend-modern/src/pages/__tests__/Infrastructure.empty-state.test.tsx",
- "frontend-modern/src/pages/__tests__/Infrastructure.pbs-pmg.test.tsx",
"frontend-modern/src/routing/__tests__/resourceLinks.test.ts",
"frontend-modern/src/stores/__tests__/websocket-unified.test.ts",
"frontend-modern/src/types/__tests__/resource.test.ts",
@@ -1120,8 +1117,14 @@ class CanonicalCompletionGuardTest(unittest.TestCase):
],
)
- def test_recovery_route_change_requires_storage_recovery_contract(self):
- required = infer_impacted_subsystems(["frontend-modern/src/pages/Recovery.tsx"])
+ def test_recovery_surface_change_requires_storage_recovery_contract(self):
+ # The legacy /recovery route shell (pages/Recovery.tsx) was retired
+ # with the platform-first migration; the canonical Recovery surface
+ # now lives at components/Recovery/Recovery.tsx and is embedded inside
+ # platform pages.
+ required = infer_impacted_subsystems(
+ ["frontend-modern/src/components/Recovery/Recovery.tsx"]
+ )
self.assertEqual(set(required), {"storage-recovery"})
recovery = required["storage-recovery"]
@@ -1131,7 +1134,7 @@ class CanonicalCompletionGuardTest(unittest.TestCase):
)
self.assertEqual(
recovery["touched_runtime_files"],
- ["frontend-modern/src/pages/Recovery.tsx"],
+ ["frontend-modern/src/components/Recovery/Recovery.tsx"],
)
self.assertEqual(
recovery["verification_requirements"],
@@ -1139,7 +1142,9 @@ class CanonicalCompletionGuardTest(unittest.TestCase):
{
"id": "recovery-product-surface",
"label": "recovery product surface proof",
- "touched_runtime_files": ["frontend-modern/src/pages/Recovery.tsx"],
+ "touched_runtime_files": [
+ "frontend-modern/src/components/Recovery/Recovery.tsx"
+ ],
"allow_same_subsystem_tests": False,
"test_prefixes": [],
"exact_files": RECOVERY_PRODUCT_SURFACE_EXACT_FILES,
@@ -1286,7 +1291,6 @@ class CanonicalCompletionGuardTest(unittest.TestCase):
"frontend-modern/src/features/storageBackups/__tests__/storageModelCore.test.ts",
"frontend-modern/src/features/storageBackups/__tests__/storagePagePresentation.test.ts",
"frontend-modern/src/features/storageBackups/__tests__/storagePoolsTablePresentation.test.ts",
- "frontend-modern/src/pages/__tests__/Storage.helpers.test.ts",
"frontend-modern/src/utils/__tests__/frontendResourceTypeBoundaries.test.ts",
],
}
@@ -1299,8 +1303,14 @@ class CanonicalCompletionGuardTest(unittest.TestCase):
)
self.assertEqual(required, {})
- def test_storage_page_route_change_requires_storage_recovery_contract(self):
- required = infer_impacted_subsystems(["frontend-modern/src/pages/Storage.tsx"])
+ def test_storage_surface_change_requires_storage_recovery_contract(self):
+ # The legacy /storage route shell (pages/Storage.tsx) was retired
+ # with the platform-first migration; the canonical Storage surface
+ # now lives at components/Storage/Storage.tsx and is embedded inside
+ # platform pages.
+ required = infer_impacted_subsystems(
+ ["frontend-modern/src/components/Storage/Storage.tsx"]
+ )
self.assertEqual(set(required), {"storage-recovery"})
recovery = required["storage-recovery"]
@@ -1310,7 +1320,7 @@ class CanonicalCompletionGuardTest(unittest.TestCase):
)
self.assertEqual(
recovery["touched_runtime_files"],
- ["frontend-modern/src/pages/Storage.tsx"],
+ ["frontend-modern/src/components/Storage/Storage.tsx"],
)
self.assertEqual(
recovery["verification_requirements"][0]["id"],
@@ -3044,7 +3054,6 @@ index 1111111..2222222 100644
"frontend-modern/src/components/Workloads/__tests__/workloadTopology.test.ts",
"frontend-modern/src/components/Workloads/__tests__/workloadUrlSyncModel.test.ts",
"frontend-modern/src/hooks/__tests__/useWorkloads.test.ts",
- "frontend-modern/src/pages/__tests__/Workloads.helpers.test.ts",
"frontend-modern/src/utils/__tests__/thresholdSliderPresentation.test.ts",
"frontend-modern/src/utils/__tests__/workloadsSummaryCache.test.ts",
],
diff --git a/scripts/release_control/subsystem_lookup_test.py b/scripts/release_control/subsystem_lookup_test.py
index 98743024e..d3b264c53 100644
--- a/scripts/release_control/subsystem_lookup_test.py
+++ b/scripts/release_control/subsystem_lookup_test.py
@@ -7,7 +7,6 @@ from subsystem_lookup import lookup_paths, parse_args, render_pretty
RECOVERY_PRODUCT_SURFACE_EXACT_FILES = [
"frontend-modern/src/components/Recovery/__tests__/Recovery.test.tsx",
- "frontend-modern/src/pages/__tests__/Recovery.test.tsx",
"frontend-modern/src/utils/__tests__/frontendResourceTypeBoundaries.test.ts",
"tests/integration/tests/17-recovery-layout.spec.ts",
]
@@ -733,8 +732,11 @@ class SubsystemLookupTest(unittest.TestCase):
"relay-frontend-surfaces",
)
- def test_lookup_paths_assigns_recovery_route_to_storage_recovery(self) -> None:
- result = lookup_paths(["frontend-modern/src/pages/Recovery.tsx"])
+ def test_lookup_paths_assigns_recovery_surface_to_storage_recovery(self) -> None:
+ # The legacy /recovery route shell (pages/Recovery.tsx) was retired
+ # with the platform-first migration; recovery is now exercised via
+ # the embedded surface at components/Recovery/Recovery.tsx.
+ result = lookup_paths(["frontend-modern/src/components/Recovery/Recovery.tsx"])
self.assertEqual(result["unowned_runtime_files"], [])
self.assertEqual(
{item["subsystem"] for item in result["impacted_subsystems"]},
@@ -924,7 +926,6 @@ class SubsystemLookupTest(unittest.TestCase):
"frontend-modern/src/features/storageBackups/__tests__/storageModelCore.test.ts",
"frontend-modern/src/features/storageBackups/__tests__/storagePagePresentation.test.ts",
"frontend-modern/src/features/storageBackups/__tests__/storagePoolsTablePresentation.test.ts",
- "frontend-modern/src/pages/__tests__/Storage.helpers.test.ts",
"frontend-modern/src/utils/__tests__/frontendResourceTypeBoundaries.test.ts",
],
)
@@ -938,8 +939,11 @@ class SubsystemLookupTest(unittest.TestCase):
self.assertEqual(file_entry["classification"], "runtime")
self.assertEqual(file_entry["matches"], [])
- def test_lookup_paths_assigns_storage_page_to_storage_recovery(self) -> None:
- result = lookup_paths(["frontend-modern/src/pages/Storage.tsx"])
+ def test_lookup_paths_assigns_storage_surface_to_storage_recovery(self) -> None:
+ # The legacy /storage route shell (pages/Storage.tsx) was retired
+ # with the platform-first migration; storage is now exercised via
+ # the embedded surface at components/Storage/Storage.tsx.
+ result = lookup_paths(["frontend-modern/src/components/Storage/Storage.tsx"])
self.assertEqual(result["unowned_runtime_files"], [])
self.assertEqual(
{item["subsystem"] for item in result["impacted_subsystems"]},
@@ -4832,8 +4836,6 @@ class SubsystemLookupTest(unittest.TestCase):
"frontend-modern/src/features/infrastructure/__tests__/InfrastructurePageSurface.guardrails.test.ts",
"frontend-modern/src/features/infrastructure/__tests__/infrastructurePageModel.test.ts",
"frontend-modern/src/hooks/__tests__/useUnifiedResources.test.ts",
- "frontend-modern/src/pages/__tests__/Infrastructure.empty-state.test.tsx",
- "frontend-modern/src/pages/__tests__/Infrastructure.pbs-pmg.test.tsx",
"frontend-modern/src/routing/__tests__/resourceLinks.test.ts",
"frontend-modern/src/stores/__tests__/websocket-unified.test.ts",
"frontend-modern/src/types/__tests__/resource.test.ts",