Skip to content
Merged
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
6ecf724
feat(ceph): extend backend to return full container metadata
KirylSAP May 20, 2026
59e2b9e
feat(ceph): add Swift-like UI with ListToolbar, virtualization, and b…
KirylSAP May 20, 2026
b99ab4a
refactor(ceph): remove Ceph-specific routes, use shared $provider route
KirylSAP May 20, 2026
c7c0bc6
refactor(ceph): improve region resolution and add JSDoc comments
KirylSAP May 20, 2026
cfa83d8
refactor: code styles
KirylSAP May 20, 2026
25fa4f6
refactor: ceph doc
KirylSAP May 20, 2026
f4b4504
refactor: ceph doc
KirylSAP May 20, 2026
f079147
test(ceph): add comprehensive unit test coverage for Ceph storage
KirylSAP May 21, 2026
9265975
refactor(test): replace 'any' with proper types in Ceph tests
KirylSAP May 21, 2026
787925c
test(ceph): add frontend tests for container toast notifications and …
KirylSAP May 21, 2026
9ba0ad2
test(ceph): add modal tests for CreateBucket and DeleteBucket
KirylSAP May 21, 2026
b1fd0b0
test(ceph): add modal tests for EmptyBucket and EmptyBuckets
KirylSAP May 21, 2026
879304a
test(ceph): add ContainerTableView component tests
KirylSAP May 21, 2026
ba580d5
test(ceph): add ContainerListView component tests
KirylSAP May 21, 2026
8d7f8cf
refactor: merge main branch
KirylSAP May 21, 2026
797540d
fix(ceph): correct last_modified comparator for stable sorting
KirylSAP May 21, 2026
ed08971
fix(ceph): validate object keys before deletion in deleteAll
KirylSAP May 21, 2026
aa2c6fa
perf(ceph): add optional metadata fetching with concurrency control
KirylSAP May 21, 2026
fbe51be
feat(ceph): use includeMetadata flag in frontend components
KirylSAP May 21, 2026
6b4593c
docs(ceph): document metadata estimation limitations
KirylSAP May 21, 2026
5ca17ea
refactor(ceph): remove misleading TODO about pagination
KirylSAP May 21, 2026
2b8b8ba
refactor(storage): organize routers into ceph/ and swift/ subdirectories
KirylSAP May 21, 2026
148029b
fix(i18n): remove duplicate translation message IDs
KirylSAP May 21, 2026
791270e
refactor: code style
KirylSAP May 22, 2026
44dda68
fix: merge conflict
KirylSAP May 22, 2026
e2ca53a
fix: merge conflict
KirylSAP May 22, 2026
5500afa
refactor: translations
KirylSAP May 22, 2026
2ff29e7
refactor: code styles
KirylSAP May 22, 2026
00ef56a
fix: merge conflicts
KirylSAP May 22, 2026
6d8de1a
refactor(storage): simplify Ceph service resolution in resolveS3Config
KirylSAP May 22, 2026
66dbe92
refactor(storage): extract S3 MaxKeys value to constant
KirylSAP May 22, 2026
2f7c753
fix(ceph): show creationDate when last_modified is missing for empty …
KirylSAP May 25, 2026
b8f5105
refactor: modals
KirylSAP May 25, 2026
a3dbd8d
refactor: data grid
KirylSAP May 25, 2026
24d2b3d
fix(ceph): localize delete bucket button title in ContainerListView
KirylSAP May 25, 2026
62a1a3c
fix(ceph): avoid dereferencing bucket in async mutation callbacks
KirylSAP May 25, 2026
f879e0b
fix: merge conflicts
KirylSAP May 27, 2026
3b7669a
refactor: env ceph region variable
KirylSAP May 27, 2026
cf3ab7d
test(ceph): update tests to use CEPH_REGION env variable
KirylSAP May 27, 2026
54566ab
test(ceph): add CEPH_REGION env to containerRouter and objectRouter t…
KirylSAP May 27, 2026
70bc181
fix: merge conflicts
KirylSAP May 28, 2026
c42cdad
fix: merge conflicts
KirylSAP May 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 33 additions & 11 deletions apps/aurora-portal/docs/009_ceph_s3_bff.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,32 @@ The `createS3Client` factory:

1. Validates that `access` and `secret` are non-empty
2. Resolves the S3 endpoint:
- **Primary:** Extract from Ceph service catalog (removes `/swift/v1/...` suffix)
- **Fallback:** `CEPH_S3_ENDPOINT` environment variable
3. Resolves the region: `CEPH_REGION` env var or `"default"`
- Extract from Ceph service catalog (removes `/swift/v1/...` suffix)
3. Resolves the region from OpenStack service catalog:
- Extracts the OpenStack region from Ceph service endpoint (e.g., `qa-de-1`, `eu-de-2`)
- Constructs Ceph-compatible region identifier:
- Standard format: `ceph-objectstore-st1-{region}` (e.g., `ceph-objectstore-st1-eu-de-2`)
- Special case: `qa-de-1` uses `ceph-objectstore-ec-st1-qa-de-1` (with "ec" prefix for historical reasons)
- This identifier is used for:
- AWS Signature V4 request signing (region field in Authorization header)
- LocationConstraint in CreateBucket API calls
4. Returns a configured AWS SDK v3 `S3Client` with:
- `forcePathStyle: true` (required for Ceph RGW — it does not support virtual-hosted-style URLs)
- Static credentials (access key ID + secret access key)

**Region Configuration:**

Region identifiers are automatically constructed from the OpenStack service catalog:

- Extracts region from Ceph service endpoint (e.g., `qa-de-1`, `eu-de-2`, `staging`)
- Constructs Ceph-compatible identifier using the pattern from Go SDK / Terraform:
- Standard: `ceph-objectstore-st1-{region}` (e.g., `ceph-objectstore-st1-eu-de-2`)
- Exception: `qa-de-1` → `ceph-objectstore-ec-st1-qa-de-1` (uses "ec" prefix for historical reasons)
- Used for AWS Signature V4 request signing and LocationConstraint in CreateBucket
- No environment variable override needed — region is auto-detected

See: https://documentation.global.cloud.sap/docs/customer/storage/obj-v2-ceph/ceph-storage-options/

### 3. Middleware Layers

#### `cephCredentialMiddleware`
Expand Down Expand Up @@ -571,11 +590,10 @@ try {

### Environment Variables

#### Optional
None required. All configuration is resolved from the OpenStack service catalog:

- **`CEPH_REGION`**
- S3 region name (default: `"default"`)
- Used for AWS SDK signature calculation
- S3 endpoint: extracted from Ceph service endpoints
- Region: auto-constructed from OpenStack region identifier

### Service Catalog Endpoint Resolution

Expand All @@ -586,9 +604,13 @@ The BFF resolves the S3 endpoint from the OpenStack service catalog:
3. If the URL contains `/swift/`, remove that suffix:
- Swift: `https://rgw.example.com/swift/v1/AUTH_xxx`
- S3: `https://rgw.example.com` (base URL)
4. Return the base URL
4. Extract the region from the Ceph service endpoint (e.g., `qa-de-1`)
5. Construct the Ceph-compatible region identifier:
- Standard: `ceph-objectstore-st1-{region}`
- Exception: `qa-de-1` → `ceph-objectstore-ec-st1-qa-de-1`
6. Return the base URL and region identifier

**Important:** The Ceph service **must** be registered in the OpenStack service catalog. Environment variable fallbacks (e.g., `CEPH_S3_ENDPOINT`) are **not supported** — all configuration comes from the service catalog to ensure consistency across deployments.
**Important:** The Ceph service **must** be registered in the OpenStack service catalog. All configuration comes from the service catalog to ensure consistency across deployments.

---

Expand Down Expand Up @@ -799,8 +821,8 @@ Both can coexist — Ceph RGW supports **both Swift and S3 APIs** on the same cl
### Not Yet Implemented

1. **Bucket Management**
- Create bucket (`CreateBucketCommand`)
- Delete bucket (`DeleteBucketCommand`)
- ~~Create bucket (`CreateBucketCommand`)~~ ✅ Implemented
- ~~Delete bucket (`DeleteBucketCommand`)~~ ✅ Implemented
- Configure bucket policies, CORS, lifecycle rules
Comment thread
KirylSAP marked this conversation as resolved.

2. **Object Upload/Download**
Expand Down
71 changes: 0 additions & 71 deletions apps/aurora-portal/src/client/routeTree.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,16 @@ import { Route as AuthProjectsProjectIdNetworkOverviewRouteImport } from "./rout
import { Route as AuthProjectsProjectIdComputeOverviewRouteImport } from "./routes/_auth/projects/$projectId/compute/overview"
import { Route as AuthProjectsProjectIdComputeImagesRouteImport } from "./routes/_auth/projects/$projectId/compute/images"
import { Route as AuthProjectsProjectIdComputeFlavorsRouteImport } from "./routes/_auth/projects/$projectId/compute/flavors"
import { Route as AuthProjectsProjectIdStorageCephIndexRouteImport } from "./routes/_auth/projects/$projectId/storage/ceph/index"
import { Route as AuthProjectsProjectIdServicesPcaIndexRouteImport } from "./routes/_auth/projects/$projectId/services/pca/index"
import { Route as AuthProjectsProjectIdNetworkSecuritygroupsIndexRouteImport } from "./routes/_auth/projects/$projectId/network/securitygroups/index"
import { Route as AuthProjectsProjectIdNetworkFloatingipsIndexRouteImport } from "./routes/_auth/projects/$projectId/network/floatingips/index"
import { Route as AuthProjectsProjectIdComputeImagesIndexRouteImport } from "./routes/_auth/projects/$projectId/compute/images/index"
import { Route as AuthProjectsProjectIdComputeFlavorsIndexRouteImport } from "./routes/_auth/projects/$projectId/compute/flavors/index"
import { Route as AuthProjectsProjectIdComputeImagesImageIdRouteImport } from "./routes/_auth/projects/$projectId/compute/images/$imageId"
import { Route as AuthProjectsProjectIdComputeFlavorsFlavorIdRouteImport } from "./routes/_auth/projects/$projectId/compute/flavors/$flavorId"
import { Route as AuthProjectsProjectIdStorageCephContainersIndexRouteImport } from "./routes/_auth/projects/$projectId/storage/ceph/containers/index"
import { Route as AuthProjectsProjectIdStorageProviderContainersIndexRouteImport } from "./routes/_auth/projects/$projectId/storage/$provider/containers/index"
import { Route as AuthProjectsProjectIdNetworkSecuritygroupsSecurityGroupIdIndexRouteImport } from "./routes/_auth/projects/$projectId/network/securitygroups/$securityGroupId/index"
import { Route as AuthProjectsProjectIdNetworkFloatingipsFloatingIpIdIndexRouteImport } from "./routes/_auth/projects/$projectId/network/floatingips/$floatingIpId/index"
import { Route as AuthProjectsProjectIdStorageCephContainersContainerNameObjectsIndexRouteImport } from "./routes/_auth/projects/$projectId/storage/ceph/containers/$containerName/objects/index"
import { Route as AuthProjectsProjectIdStorageProviderContainersContainerNameObjectsIndexRouteImport } from "./routes/_auth/projects/$projectId/storage/$provider/containers/$containerName/objects/index"

const AboutRoute = AboutRouteImport.update({
Expand Down Expand Up @@ -135,12 +132,6 @@ const AuthProjectsProjectIdComputeFlavorsRoute =
path: "/compute/flavors",
getParentRoute: () => AuthProjectsProjectIdRoute,
} as any)
const AuthProjectsProjectIdStorageCephIndexRoute =
AuthProjectsProjectIdStorageCephIndexRouteImport.update({
id: "/storage/ceph/",
path: "/storage/ceph/",
getParentRoute: () => AuthProjectsProjectIdRoute,
} as any)
const AuthProjectsProjectIdServicesPcaIndexRoute =
AuthProjectsProjectIdServicesPcaIndexRouteImport.update({
id: "/services/pca/",
Expand Down Expand Up @@ -183,12 +174,6 @@ const AuthProjectsProjectIdComputeFlavorsFlavorIdRoute =
path: "/$flavorId",
getParentRoute: () => AuthProjectsProjectIdComputeFlavorsRoute,
} as any)
const AuthProjectsProjectIdStorageCephContainersIndexRoute =
AuthProjectsProjectIdStorageCephContainersIndexRouteImport.update({
id: "/storage/ceph/containers/",
path: "/storage/ceph/containers/",
getParentRoute: () => AuthProjectsProjectIdRoute,
} as any)
const AuthProjectsProjectIdStorageProviderContainersIndexRoute =
AuthProjectsProjectIdStorageProviderContainersIndexRouteImport.update({
id: "/storage/$provider/containers/",
Expand All @@ -209,14 +194,6 @@ const AuthProjectsProjectIdNetworkFloatingipsFloatingIpIdIndexRoute =
path: "/floatingips/$floatingIpId/",
getParentRoute: () => AuthProjectsProjectIdNetworkRoute,
} as any)
const AuthProjectsProjectIdStorageCephContainersContainerNameObjectsIndexRoute =
AuthProjectsProjectIdStorageCephContainersContainerNameObjectsIndexRouteImport.update(
{
id: "/storage/ceph/containers/$containerName/objects/",
path: "/storage/ceph/containers/$containerName/objects/",
getParentRoute: () => AuthProjectsProjectIdRoute,
} as any,
)
const AuthProjectsProjectIdStorageProviderContainersContainerNameObjectsIndexRoute =
AuthProjectsProjectIdStorageProviderContainersContainerNameObjectsIndexRouteImport.update(
{
Expand Down Expand Up @@ -250,13 +227,10 @@ export interface FileRoutesByFullPath {
"/projects/$projectId/network/floatingips/": typeof AuthProjectsProjectIdNetworkFloatingipsIndexRoute
"/projects/$projectId/network/securitygroups/": typeof AuthProjectsProjectIdNetworkSecuritygroupsIndexRoute
"/projects/$projectId/services/pca/": typeof AuthProjectsProjectIdServicesPcaIndexRoute
"/projects/$projectId/storage/ceph/": typeof AuthProjectsProjectIdStorageCephIndexRoute
"/projects/$projectId/network/floatingips/$floatingIpId/": typeof AuthProjectsProjectIdNetworkFloatingipsFloatingIpIdIndexRoute
"/projects/$projectId/network/securitygroups/$securityGroupId/": typeof AuthProjectsProjectIdNetworkSecuritygroupsSecurityGroupIdIndexRoute
"/projects/$projectId/storage/$provider/containers/": typeof AuthProjectsProjectIdStorageProviderContainersIndexRoute
"/projects/$projectId/storage/ceph/containers/": typeof AuthProjectsProjectIdStorageCephContainersIndexRoute
"/projects/$projectId/storage/$provider/containers/$containerName/objects/": typeof AuthProjectsProjectIdStorageProviderContainersContainerNameObjectsIndexRoute
"/projects/$projectId/storage/ceph/containers/$containerName/objects/": typeof AuthProjectsProjectIdStorageCephContainersContainerNameObjectsIndexRoute
}
export interface FileRoutesByTo {
"/": typeof IndexRoute
Expand All @@ -278,13 +252,10 @@ export interface FileRoutesByTo {
"/projects/$projectId/network/floatingips": typeof AuthProjectsProjectIdNetworkFloatingipsIndexRoute
"/projects/$projectId/network/securitygroups": typeof AuthProjectsProjectIdNetworkSecuritygroupsIndexRoute
"/projects/$projectId/services/pca": typeof AuthProjectsProjectIdServicesPcaIndexRoute
"/projects/$projectId/storage/ceph": typeof AuthProjectsProjectIdStorageCephIndexRoute
"/projects/$projectId/network/floatingips/$floatingIpId": typeof AuthProjectsProjectIdNetworkFloatingipsFloatingIpIdIndexRoute
"/projects/$projectId/network/securitygroups/$securityGroupId": typeof AuthProjectsProjectIdNetworkSecuritygroupsSecurityGroupIdIndexRoute
"/projects/$projectId/storage/$provider/containers": typeof AuthProjectsProjectIdStorageProviderContainersIndexRoute
"/projects/$projectId/storage/ceph/containers": typeof AuthProjectsProjectIdStorageCephContainersIndexRoute
"/projects/$projectId/storage/$provider/containers/$containerName/objects": typeof AuthProjectsProjectIdStorageProviderContainersContainerNameObjectsIndexRoute
"/projects/$projectId/storage/ceph/containers/$containerName/objects": typeof AuthProjectsProjectIdStorageCephContainersContainerNameObjectsIndexRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
Expand Down Expand Up @@ -312,13 +283,10 @@ export interface FileRoutesById {
"/_auth/projects/$projectId/network/floatingips/": typeof AuthProjectsProjectIdNetworkFloatingipsIndexRoute
"/_auth/projects/$projectId/network/securitygroups/": typeof AuthProjectsProjectIdNetworkSecuritygroupsIndexRoute
"/_auth/projects/$projectId/services/pca/": typeof AuthProjectsProjectIdServicesPcaIndexRoute
"/_auth/projects/$projectId/storage/ceph/": typeof AuthProjectsProjectIdStorageCephIndexRoute
"/_auth/projects/$projectId/network/floatingips/$floatingIpId/": typeof AuthProjectsProjectIdNetworkFloatingipsFloatingIpIdIndexRoute
"/_auth/projects/$projectId/network/securitygroups/$securityGroupId/": typeof AuthProjectsProjectIdNetworkSecuritygroupsSecurityGroupIdIndexRoute
"/_auth/projects/$projectId/storage/$provider/containers/": typeof AuthProjectsProjectIdStorageProviderContainersIndexRoute
"/_auth/projects/$projectId/storage/ceph/containers/": typeof AuthProjectsProjectIdStorageCephContainersIndexRoute
"/_auth/projects/$projectId/storage/$provider/containers/$containerName/objects/": typeof AuthProjectsProjectIdStorageProviderContainersContainerNameObjectsIndexRoute
"/_auth/projects/$projectId/storage/ceph/containers/$containerName/objects/": typeof AuthProjectsProjectIdStorageCephContainersContainerNameObjectsIndexRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
Expand Down Expand Up @@ -346,13 +314,10 @@ export interface FileRouteTypes {
| "/projects/$projectId/network/floatingips/"
| "/projects/$projectId/network/securitygroups/"
| "/projects/$projectId/services/pca/"
| "/projects/$projectId/storage/ceph/"
| "/projects/$projectId/network/floatingips/$floatingIpId/"
| "/projects/$projectId/network/securitygroups/$securityGroupId/"
| "/projects/$projectId/storage/$provider/containers/"
| "/projects/$projectId/storage/ceph/containers/"
| "/projects/$projectId/storage/$provider/containers/$containerName/objects/"
| "/projects/$projectId/storage/ceph/containers/$containerName/objects/"
fileRoutesByTo: FileRoutesByTo
to:
| "/"
Expand All @@ -374,13 +339,10 @@ export interface FileRouteTypes {
| "/projects/$projectId/network/floatingips"
| "/projects/$projectId/network/securitygroups"
| "/projects/$projectId/services/pca"
| "/projects/$projectId/storage/ceph"
| "/projects/$projectId/network/floatingips/$floatingIpId"
| "/projects/$projectId/network/securitygroups/$securityGroupId"
| "/projects/$projectId/storage/$provider/containers"
| "/projects/$projectId/storage/ceph/containers"
| "/projects/$projectId/storage/$provider/containers/$containerName/objects"
| "/projects/$projectId/storage/ceph/containers/$containerName/objects"
id:
| "__root__"
| "/"
Expand All @@ -407,13 +369,10 @@ export interface FileRouteTypes {
| "/_auth/projects/$projectId/network/floatingips/"
| "/_auth/projects/$projectId/network/securitygroups/"
| "/_auth/projects/$projectId/services/pca/"
| "/_auth/projects/$projectId/storage/ceph/"
| "/_auth/projects/$projectId/network/floatingips/$floatingIpId/"
| "/_auth/projects/$projectId/network/securitygroups/$securityGroupId/"
| "/_auth/projects/$projectId/storage/$provider/containers/"
| "/_auth/projects/$projectId/storage/ceph/containers/"
| "/_auth/projects/$projectId/storage/$provider/containers/$containerName/objects/"
| "/_auth/projects/$projectId/storage/ceph/containers/$containerName/objects/"
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
Expand Down Expand Up @@ -543,13 +502,6 @@ declare module "@tanstack/react-router" {
preLoaderRoute: typeof AuthProjectsProjectIdComputeFlavorsRouteImport
parentRoute: typeof AuthProjectsProjectIdRoute
}
"/_auth/projects/$projectId/storage/ceph/": {
id: "/_auth/projects/$projectId/storage/ceph/"
path: "/storage/ceph"
fullPath: "/projects/$projectId/storage/ceph/"
preLoaderRoute: typeof AuthProjectsProjectIdStorageCephIndexRouteImport
parentRoute: typeof AuthProjectsProjectIdRoute
}
"/_auth/projects/$projectId/services/pca/": {
id: "/_auth/projects/$projectId/services/pca/"
path: "/services/pca"
Expand Down Expand Up @@ -599,13 +551,6 @@ declare module "@tanstack/react-router" {
preLoaderRoute: typeof AuthProjectsProjectIdComputeFlavorsFlavorIdRouteImport
parentRoute: typeof AuthProjectsProjectIdComputeFlavorsRoute
}
"/_auth/projects/$projectId/storage/ceph/containers/": {
id: "/_auth/projects/$projectId/storage/ceph/containers/"
path: "/storage/ceph/containers"
fullPath: "/projects/$projectId/storage/ceph/containers/"
preLoaderRoute: typeof AuthProjectsProjectIdStorageCephContainersIndexRouteImport
parentRoute: typeof AuthProjectsProjectIdRoute
}
"/_auth/projects/$projectId/storage/$provider/containers/": {
id: "/_auth/projects/$projectId/storage/$provider/containers/"
path: "/storage/$provider/containers"
Expand All @@ -627,13 +572,6 @@ declare module "@tanstack/react-router" {
preLoaderRoute: typeof AuthProjectsProjectIdNetworkFloatingipsFloatingIpIdIndexRouteImport
parentRoute: typeof AuthProjectsProjectIdNetworkRoute
}
"/_auth/projects/$projectId/storage/ceph/containers/$containerName/objects/": {
id: "/_auth/projects/$projectId/storage/ceph/containers/$containerName/objects/"
path: "/storage/ceph/containers/$containerName/objects"
fullPath: "/projects/$projectId/storage/ceph/containers/$containerName/objects/"
preLoaderRoute: typeof AuthProjectsProjectIdStorageCephContainersContainerNameObjectsIndexRouteImport
parentRoute: typeof AuthProjectsProjectIdRoute
}
"/_auth/projects/$projectId/storage/$provider/containers/$containerName/objects/": {
id: "/_auth/projects/$projectId/storage/$provider/containers/$containerName/objects/"
path: "/storage/$provider/containers/$containerName/objects"
Expand Down Expand Up @@ -720,11 +658,8 @@ interface AuthProjectsProjectIdRouteChildren {
AuthProjectsProjectIdComputeIndexRoute: typeof AuthProjectsProjectIdComputeIndexRoute
AuthProjectsProjectIdServicesIndexRoute: typeof AuthProjectsProjectIdServicesIndexRoute
AuthProjectsProjectIdServicesPcaIndexRoute: typeof AuthProjectsProjectIdServicesPcaIndexRoute
AuthProjectsProjectIdStorageCephIndexRoute: typeof AuthProjectsProjectIdStorageCephIndexRoute
AuthProjectsProjectIdStorageProviderContainersIndexRoute: typeof AuthProjectsProjectIdStorageProviderContainersIndexRoute
AuthProjectsProjectIdStorageCephContainersIndexRoute: typeof AuthProjectsProjectIdStorageCephContainersIndexRoute
AuthProjectsProjectIdStorageProviderContainersContainerNameObjectsIndexRoute: typeof AuthProjectsProjectIdStorageProviderContainersContainerNameObjectsIndexRoute
AuthProjectsProjectIdStorageCephContainersContainerNameObjectsIndexRoute: typeof AuthProjectsProjectIdStorageCephContainersContainerNameObjectsIndexRoute
}

const AuthProjectsProjectIdRouteChildren: AuthProjectsProjectIdRouteChildren = {
Expand All @@ -745,16 +680,10 @@ const AuthProjectsProjectIdRouteChildren: AuthProjectsProjectIdRouteChildren = {
AuthProjectsProjectIdServicesIndexRoute,
AuthProjectsProjectIdServicesPcaIndexRoute:
AuthProjectsProjectIdServicesPcaIndexRoute,
AuthProjectsProjectIdStorageCephIndexRoute:
AuthProjectsProjectIdStorageCephIndexRoute,
AuthProjectsProjectIdStorageProviderContainersIndexRoute:
AuthProjectsProjectIdStorageProviderContainersIndexRoute,
AuthProjectsProjectIdStorageCephContainersIndexRoute:
AuthProjectsProjectIdStorageCephContainersIndexRoute,
AuthProjectsProjectIdStorageProviderContainersContainerNameObjectsIndexRoute:
AuthProjectsProjectIdStorageProviderContainersContainerNameObjectsIndexRoute,
AuthProjectsProjectIdStorageCephContainersContainerNameObjectsIndexRoute:
AuthProjectsProjectIdStorageCephContainersContainerNameObjectsIndexRoute,
}

const AuthProjectsProjectIdRouteWithChildren =
Expand Down
Loading
Loading