Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
24 changes: 24 additions & 0 deletions console-web/lib/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@ import type {
PoolDetails,
AddPoolRequest,
AddPoolResponse,
CancelPoolDecommissionRequest,
DeletePoolResponse,
PoolDecommissionRequestResponse,
PodListResponse,
PodDetails,
StartPoolDecommissionRequest,
DeletePodResponse,
NodeListResponse,
NamespaceListResponse,
Expand Down Expand Up @@ -120,6 +123,27 @@ export async function deletePool(namespace: string, tenantName: string, poolName
return apiClient.delete<DeletePoolResponse>(`${pool(namespace, tenantName, poolName)}`)
}

export async function startPoolDecommission(
namespace: string,
tenantName: string,
poolName: string,
body: StartPoolDecommissionRequest,
): Promise<PoolDecommissionRequestResponse> {
return apiClient.post<PoolDecommissionRequestResponse>(`${pool(namespace, tenantName, poolName)}/decommission`, body)
}

export async function cancelPoolDecommission(
namespace: string,
tenantName: string,
poolName: string,
body: CancelPoolDecommissionRequest,
): Promise<PoolDecommissionRequestResponse> {
return apiClient.post<PoolDecommissionRequestResponse>(
`${pool(namespace, tenantName, poolName)}/decommission/cancel`,
body,
)
}

// ----- Pods -----
export async function listPods(namespace: string, tenantName: string): Promise<PodListResponse> {
return apiClient.get<PodListResponse>(`${pods(namespace, tenantName)}`)
Expand Down
28 changes: 28 additions & 0 deletions console-web/types/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,16 @@ export interface PoolDetails {
current_revision: string | null
update_revision: string | null
state: string
lifecycle_state: string | null
workload_state: string | null
decommission_phase: string | null
decommission_objects_migrated: number | null
decommission_bytes_migrated: number | null
decommission_objects_failed: number | null
decommission_bytes_failed: number | null
decommission_cleanup_state: string | null
decommission_last_error: string | null
decommission_last_poll_time: string | null
created_at: string | null
}

Expand Down Expand Up @@ -195,6 +205,24 @@ export interface DeletePoolResponse {
warning?: string
}

export interface StartPoolDecommissionRequest {
requestId: string
reason?: string
}

export interface CancelPoolDecommissionRequest {
requestId: string
reason?: string
}

export interface PoolDecommissionRequestResponse {
success: boolean
message: string
poolName: string
requestId: string
action: string
}

// ----- Pod -----
export interface PodListItem {
name: string
Expand Down
140 changes: 140 additions & 0 deletions deploy/rustfs-operator/crds/tenant-crd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,45 @@ spec:
- null
nullable: true
type: string
poolLifecycle:
description: Explicit lifecycle requests for pool decommissioning.
nullable: true
properties:
decommissionRequests:
items:
properties:
action:
enum:
- Start
- Cancel
type: string
cancelRequestedAt:
nullable: true
type: string
poolName:
type: string
reason:
nullable: true
type: string
requestId:
type: string
requestedAt:
nullable: true
type: string
required:
- action
- poolName
- requestId
type: object
type: array
pvcRetentionPolicy:
enum:
- Retain
type: string
type: object
x-kubernetes-validations:
- message: decommissionRequests must contain at most one entry per poolName
rule: '!has(self.decommissionRequests) || self.decommissionRequests.all(r, self.decommissionRequests.exists_one(other, other.poolName == r.poolName))'
pools:
items:
description: |-
Expand Down Expand Up @@ -1603,10 +1642,106 @@ spec:
description: Current revision hash of the StatefulSet
nullable: true
type: string
decommission:
description: Decommission progress and cleanup status for this pool.
nullable: true
properties:
cleanup:
nullable: true
properties:
pvcRetentionPolicy:
nullable: true
type: string
state:
enum:
- Pending
- StatefulSetDeleting
- PvcRetained
type: string
statefulSetDeletedAt:
nullable: true
type: string
required:
- state
type: object
completedAt:
nullable: true
type: string
endpointSetHash:
nullable: true
type: string
lastError:
nullable: true
properties:
message:
nullable: true
type: string
reason:
nullable: true
type: string
type: object
lastPollTime:
nullable: true
type: string
phase:
enum:
- Pending
- Running
- Complete
- Canceled
- Failed
- null
nullable: true
type: string
progress:
nullable: true
properties:
bytesFailed:
format: int64
nullable: true
type: integer
bytesMigrated:
format: int64
nullable: true
type: integer
objectsFailed:
format: int64
nullable: true
type: integer
objectsMigrated:
format: int64
nullable: true
type: integer
type: object
requestId:
nullable: true
type: string
rustfsPoolId:
nullable: true
type: string
startedAt:
nullable: true
type: string
type: object
lastUpdateTime:
description: Last time the pool status was updated
nullable: true
type: string
lifecycleState:
description: Lifecycle state of the pool, separate from StatefulSet rollout state.
enum:
- Active
- Decommissioning
- Decommissioned
- DecommissionCanceled
- DecommissionFailed
- null
nullable: true
type: string
name:
description: Pool name from Tenant spec. Optional for backward compatibility with older status.
nullable: true
type: string
readyReplicas:
description: Number of pods with Ready condition
format: int32
Expand All @@ -1632,6 +1767,10 @@ spec:
format: int32
nullable: true
type: integer
workloadState:
description: Workload rollout state of this pool. Mirrors `state` for compatibility.
nullable: true
type: string
required:
- ssName
- state
Expand All @@ -1650,3 +1789,4 @@ spec:
storage: true
subresources:
status: {}
---
Loading
Loading