diff --git a/docs/kubernetes/installation/k8s-storage-plane.md b/docs/kubernetes/installation/k8s-storage-plane.md index 2ccfec3d..bd749af1 100644 --- a/docs/kubernetes/installation/k8s-storage-plane.md +++ b/docs/kubernetes/installation/k8s-storage-plane.md @@ -118,7 +118,7 @@ metadata: namespace: simplyblock spec: clusterName: simplyblock-cluster - maxLogicalVolumeCount: 20 + maxSubsystemCount: 20 partitions: 0 corePercentage: 50 workerNodes: @@ -178,12 +178,12 @@ For a full list of configuration options see [Simplyblock Operator: StorageNodeS ## Create a Storage Pool -A storage pool is a grouping of logical volumes and capacity limits within the cluster. An initial `Pool` resource must +A storage pool is a grouping of logical volumes and capacity limits within the cluster. An initial `StoragePool` resource must be created to define a storage pool before being able to provision volumes. ```yaml title="storage-pool.yaml" apiVersion: storage.simplyblock.io/v1alpha1 -kind: Pool +kind: StoragePool metadata: name: production-pool namespace: simplyblock @@ -199,7 +199,7 @@ kubectl apply -f storage-pool.yaml The status of the storage pool can be checked with: ```bash title="Check the pool status" -kubectl get simplyblockpool -n simplyblock +kubectl get storagepools -n simplyblock ``` Once the pool is active, the operator automatically creates a StorageClass named @@ -207,7 +207,7 @@ Once the pool is active, the operator automatically creates a StorageClass named `simplyblock-simplyblock-cluster-production-pool`. The StorageClass is automatically removed when the storage pool is deleted. For full details and customization options -are available at [Simplyblock Operator: Storage Pool](../../reference/operator/reference.md#pool). +are available at [Simplyblock Operator: Storage Pool](../../reference/operator/reference.md#storagepool). ```bash title="Check the StorageClass" kubectl get storageclass simplyblock-simplyblock-production-my-pool diff --git a/docs/kubernetes/operations/scaling/expanding-storage-cluster.md b/docs/kubernetes/operations/scaling/expanding-storage-cluster.md index f50f4527..ffd5a43f 100644 --- a/docs/kubernetes/operations/scaling/expanding-storage-cluster.md +++ b/docs/kubernetes/operations/scaling/expanding-storage-cluster.md @@ -56,7 +56,7 @@ metadata: spec: clusterName: simplyblock-cluster expand: true - maxLogicalVolumeCount: 20 + maxSubsystemCount: 20 partitions: 0 corePercentage: 50 workerNodes: @@ -75,7 +75,7 @@ metadata: spec: clusterName: simplyblock-cluster expand: true - maxLogicalVolumeCount: 20 + maxSubsystemCount: 20 partitions: 0 corePercentage: 50 workerNodes: @@ -104,7 +104,7 @@ kubectl get storagenodes -n simplyblock ### Option B: Add a Single Node via StorageNode CR -For cases that need per-node overrides (custom `maxLogicalVolumeCount`, `spdkSystemMemory`, etc.) or a +For cases that need per-node overrides (custom `maxSubsystemCount`, `spdkSystemMemory`, etc.) or a single node added manually, create a `StorageNode` CR directly. Set `overrides.expand: true` so the backend treats it as an expansion add rather than a fresh cluster node. @@ -123,7 +123,7 @@ spec: socketIndex: 0 overrides: expand: true - maxLogicalVolumeCount: 20 + maxSubsystemCount: 20 ``` ```bash title="Apply the StorageNode CR" diff --git a/docs/reference/operator/index.md b/docs/reference/operator/index.md index 60f730d6..b8c392cd 100644 --- a/docs/reference/operator/index.md +++ b/docs/reference/operator/index.md @@ -19,7 +19,7 @@ The operator manages the following Custom Resource Definitions (CRDs): | [`StorageNodeSet`](reference.md#storagenodeset) | - | Fleet-level declarative management of storage nodes across workers | | [`StorageNode`](reference.md#storagenode) | - | Represents a single backend storage node instance (auto-created) | | [`StorageNodeOps`](reference.md#storagenodeops) | - | One-shot operational action targeting a single storage node | -| [`Pool`](reference.md#pool) | - | Creates and manages storage pools | +| [`StoragePool`](reference.md#storagepool) | - | Creates and manages storage pools | | [`Task`](reference.md#task) | - | Monitors cluster tasks and their status | | [`StorageBackup`](reference.md#storagebackup) | - | Creates a one-time backup of a PVC to S3 | | [`BackupRestore`](reference.md#backuprestore) | - | Restores a backup into a new PVC | @@ -72,7 +72,7 @@ metadata: namespace: simplyblock spec: clusterName: simplyblock-cluster - maxLogicalVolumeCount: 20 + maxSubsystemCount: 20 partitions: 0 corePercentage: 50 workerNodes: @@ -114,7 +114,7 @@ over fleet defaults. They can be set in two ways: | Field | Type | Description | |-------------------------|----------|----------------------------------------------------------------------------------------------| -| `maxLogicalVolumeCount` | int | Maximum logical volumes for this node. | +| `maxSubsystemCount` | int | Maximum NVMe-oF subsystems for this node. | | `maxSize` | string | Maximum allocatable huge pages memory (e.g., `16G`). | | `spdkImage` | string | SPDK image override (e.g., for phased rollouts of a new image version). | | `spdkProxyImage` | string | SPDK proxy image override. | @@ -168,7 +168,7 @@ Limit the number of volumes on a specific node that has fewer or smaller devices ```yaml nodeConfigs: small-worker.example.com: - maxLogicalVolumeCount: 5 + maxSubsystemCount: 5 ``` **Expansion add (manual StorageNode CR)** @@ -188,7 +188,7 @@ spec: socketIndex: 0 overrides: expand: true - maxLogicalVolumeCount: 20 + maxSubsystemCount: 20 spdkSystemMemory: "4G" failureDomain: 2 ``` @@ -309,13 +309,13 @@ See [Pinned Volume Migration During Node Removal](../../kubernetes/operations/no ## Storage Pool -The `Pool` resource creates and manages storage pools. When a pool becomes active, the operator automatically +The `StoragePool` resource creates and manages storage pools. When a pool becomes active, the operator automatically creates a Kubernetes `StorageClass` named `simplyblock---`. The StorageClass is deleted when the pool is deleted. ```yaml title="Example: Create a storage pool" apiVersion: storage.simplyblock.io/v1alpha1 -kind: Pool +kind: StoragePool metadata: name: production-pool namespace: simplyblock @@ -330,11 +330,11 @@ spec: write: 1024 ``` -The complete set of `Pool` fields is available in [Pool reference](reference.md#pool). +The complete set of `StoragePool` fields is available in [StoragePool reference](reference.md#storagepool). ### Auto-Created StorageClass -The pool identifier is the `Pool` resource name (`metadata.name`). The operator uses that name as the backend pool +The pool identifier is the `StoragePool` resource name (`metadata.name`). The operator uses that name as the backend pool name and as the `pool_name` CSI StorageClass parameter. When the pool reaches an active state, the operator creates a `StorageClass` with: diff --git a/docs/reference/operator/reference.md b/docs/reference/operator/reference.md index 8ff552f3..857aae7e 100644 --- a/docs/reference/operator/reference.md +++ b/docs/reference/operator/reference.md @@ -24,13 +24,13 @@ Package v1alpha1 contains API Schema definitions for the simplyblock v1alpha1 AP - [BackupPolicy](#backuppolicy) - [BackupRestore](#backuprestore) - [ControlPlane](#controlplane) -- [Pool](#pool) - [SnapshotReplication](#snapshotreplication) - [StorageBackup](#storagebackup) - [StorageCluster](#storagecluster) - [StorageNode](#storagenode) - [StorageNodeOps](#storagenodeops) - [StorageNodeSet](#storagenodeset) +- [StoragePool](#storagepool) - [Task](#task) - [VolumeMigration](#volumemigration) @@ -1065,275 +1065,6 @@ namespace: string | `namespace` _string_ | Namespace overrides the backup resource namespace for the PVC lookup. | | | -#### Pool - - - -Pool is the Schema for the pools API - - - - - -_Example:_ - -```yaml -apiVersion: storage.simplyblock.io/v1alpha1 -kind: Pool -metadata: - name: string -spec: - clusterName: string - status: string - capacityLimit: string - logicalVolumeMaxSize: string - dhchap: boolean - allowedNodes: - - string - qos: - iops: integer - throughput: - read: integer - readWrite: integer - write: integer - action: string - storageClassParameters: - qosRwIops: string - qosRwMbytes: string - qosRMbytes: string - qosWMbytes: string - compression: string - encryption: boolean - replicate: boolean - numDataChunks: string - numParityChunks: string - lvolPriorityClass: string - fabric: string - maxNamespacePerSubsys: string - tune2fsReservedBlocks: string -status: - uuid: string - status: string - qos: - host: string - iops: integer - throughput: - read: integer - readWrite: integer - write: integer - allowedNodes: - - string -``` - -| Field | Description | Default | Validation | -| --- | --- | --- | --- | -| `apiVersion` _string_ | `storage.simplyblock.io/v1alpha1` | | | -| `kind` _string_ | `Pool` | | | -| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.36/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | | Optional: \{\}
| -| `spec` _[PoolSpec](#poolspec)_ | spec defines the desired state of Pool | | Required: \{\}
| -| `status` _[PoolStatus](#poolstatus)_ | status defines the observed state of Pool | | Optional: \{\}
| - - -#### PoolQoSSpec - - - -PoolQoSSpec defines pool QosSpec limits. - - - -_Appears in:_ -- [PoolSpec](#poolspec) - -_Example:_ - -```yaml -iops: integer -throughput: - read: integer - readWrite: integer - write: integer -``` - -| Field | Description | Default | Validation | -| --- | --- | --- | --- | -| `iops` _integer_ | IOPS is the IOPS limit for the pool. | | | -| `throughput` _[PoolQoSThroughputSpec](#poolqosthroughputspec)_ | Throughput contains throughput limits for the pool. | | | - - -#### PoolQoSStatus - - - -PoolQoSStatus defines observed pool QosSpec values. - - - -_Appears in:_ -- [PoolStatus](#poolstatus) - -_Example:_ - -```yaml -host: string -iops: integer -throughput: - read: integer - readWrite: integer - write: integer -``` - -| Field | Description | Default | Validation | -| --- | --- | --- | --- | -| `host` _string_ | Host is the backend host handling pool QosSpec enforcement. | | | -| `iops` _integer_ | IOPS is the observed/configured IOPS value. | | | -| `throughput` _[PoolQoSThroughputStatus](#poolqosthroughputstatus)_ | Throughput contains observed/configured throughput values. | | | - - -#### PoolQoSThroughputSpec - - - -PoolQoSThroughputSpec defines throughput QosSpec limits in MiB/s. - - - -_Appears in:_ -- [PoolQoSSpec](#poolqosspec) - -_Example:_ - -```yaml -read: integer -readWrite: integer -write: integer -``` - -| Field | Description | Default | Validation | -| --- | --- | --- | --- | -| `read` _integer_ | Read is the read throughput limit for the pool. | | | -| `readWrite` _integer_ | ReadWrite is the combined read/write throughput limit for the pool. | | | -| `write` _integer_ | Write is the write throughput limit for the pool. | | | - - -#### PoolQoSThroughputStatus - - - -PoolQoSThroughputStatus defines observed throughput QosSpec values in MiB/s. - - - -_Appears in:_ -- [PoolQoSStatus](#poolqosstatus) - -_Example:_ - -```yaml -read: integer -readWrite: integer -write: integer -``` - -| Field | Description | Default | Validation | -| --- | --- | --- | --- | -| `read` _integer_ | Read is the observed/configured read throughput value. | | | -| `readWrite` _integer_ | ReadWrite is the observed/configured combined read/write throughput value. | | | -| `write` _integer_ | Write is the observed/configured write throughput value. | | | - - -#### PoolSpec - - - -PoolSpec defines the desired state of Pool - - - -_Appears in:_ -- [Pool](#pool) - -_Example:_ - -```yaml -clusterName: string -status: string -capacityLimit: string -logicalVolumeMaxSize: string -dhchap: boolean -allowedNodes: - - string -qos: - iops: integer - throughput: - read: integer - readWrite: integer - write: integer -action: string -storageClassParameters: - qosRwIops: string - qosRwMbytes: string - qosRMbytes: string - qosWMbytes: string - compression: string - encryption: boolean - replicate: boolean - numDataChunks: string - numParityChunks: string - lvolPriorityClass: string - fabric: string - maxNamespacePerSubsys: string - tune2fsReservedBlocks: string -``` - -| Field | Description | Default | Validation | -| --- | --- | --- | --- | -| `clusterName` _string_ | ClusterName is the target storage cluster name. | | | -| `status` _string_ | Status is an optional desired-status hint for backend workflows.
FIXME: Unused for now | | | -| `capacityLimit` _string_ | CapacityLimit is the maximum aggregate capacity that can be allocated from this pool.
This maps to sbctl pool add --pool-max. Use sizes like 20M, 20G, or 0 for unlimited. | | | -| `logicalVolumeMaxSize` _string_ | LogicalVolumeMaxSize is the maximum size allowed for any single logical volume
created in this pool. This maps to sbctl pool add --lvol-max. Use sizes like
20M, 20G, or 0 for unlimited. | | | -| `dhchap` _boolean_ | DHCHAP enables DH-HMAC-CHAP key generation for the pool. Authentication is only
enforced when allowedNodes is non-empty | false | | -| `allowedNodes` _string array_ | AllowedNodes is the list of Kubernetes worker node names allowed to access volumes
in this pool. The operator resolves each node name to a deterministic NQN derived
from the node's UID: nqn.2014-08.io.simplyblock:uuid:.
The CSI node uses the same formula so no manual NQN management is required. | | | -| `qos` _[PoolQoSSpec](#poolqosspec)_ | QosSpec defines QosSpec limits for the pool. | | | -| `action` _string_ | Action triggers an imperative pool operation.
FIXME: Unused for now | | | -| `storageClassParameters` _[StorageClassParameters](#storageclassparameters)_ | StorageClassParameters sets default StorageClass parameter values for volumes in this pool. | \{ \} | | - - -#### PoolStatus - - - -PoolStatus defines the observed state of Pool. - - - -_Appears in:_ -- [Pool](#pool) - -_Example:_ - -```yaml -uuid: string -status: string -qos: - host: string - iops: integer - throughput: - read: integer - readWrite: integer - write: integer -allowedNodes: - - string -``` - -| Field | Description | Default | Validation | -| --- | --- | --- | --- | -| `uuid` _string_ | UUID is the backend pool UUID. | | | -| `status` _string_ | Status is the backend lifecycle status. | | | -| `qos` _[PoolQoSStatus](#poolqosstatus)_ | QoS contains observed/configured QoS values. | | | -| `allowedNodes` _string array_ | AllowedNodes lists the Kubernetes node names currently registered on the backend. | | | - - #### RebalancingMetrics @@ -1699,7 +1430,7 @@ cluster_id and pool_name are always set automatically and cannot be overridden h _Appears in:_ -- [PoolSpec](#poolspec) +- [StoragePoolSpec](#storagepoolspec) _Example:_ @@ -2091,7 +1822,7 @@ spec: nodeIndex: integer socketIndex: integer overrides: - maxLogicalVolumeCount: integer + maxSubsystemCount: integer maxSize: string spdkImage: string spdkProxyImage: string @@ -2339,7 +2070,7 @@ _Appears in:_ _Example:_ ```yaml -maxLogicalVolumeCount: integer +maxSubsystemCount: integer maxSize: string spdkImage: string spdkProxyImage: string @@ -2366,7 +2097,7 @@ expand: boolean | Field | Description | Default | Validation | | --- | --- | --- | --- | -| `maxLogicalVolumeCount` _integer_ | MaxLogicalVolumeCount overrides the maximum number of logical volumes for this node. | | Optional: \{\}
| +| `maxSubsystemCount` _integer_ | MaxSubsystemCount overrides the maximum number of NVMe-oF subsystems for this node. | | Optional: \{\}
| | `maxSize` _string_ | MaxSize overrides the maximum allocatable size of huge pages for this node. | | Optional: \{\}
| | `spdkImage` _string_ | SpdkImage overrides the SPDK image for this node (e.g. for phased rollouts). | | Optional: \{\}
| | `spdkProxyImage` _string_ | SpdkProxyImage overrides the SPDK proxy image for this node. | | Optional: \{\}
| @@ -2462,7 +2193,7 @@ metadata: spec: clusterName: string clusterImage: '^($|(quay\.io/simplyblock-io|docker\.io/simplyblock|public\.ecr\.aws/simply-block)/[a-z0-9][a-z0-9._-]*:[a-zA-Z0-9][a-zA-Z0-9._-]*(@sha256:[a-f0-9]{64})?)$' - maxLogicalVolumeCount: integer + maxSubsystemCount: integer maxSize: string spdkImage: '^($|(quay\.io/simplyblock-io|docker\.io/simplyblock|public\.ecr\.aws/simply-block)/[a-z0-9][a-z0-9._-]*:[a-zA-Z0-9][a-zA-Z0-9._-]*(@sha256:[a-f0-9]{64})?)$' spdkProxyImage: '^($|(quay\.io/simplyblock-io|docker\.io/simplyblock|public\.ecr\.aws/simply-block)/[a-z0-9][a-z0-9._-]*:[a-zA-Z0-9][a-zA-Z0-9._-]*(@sha256:[a-f0-9]{64})?)$' @@ -2506,7 +2237,7 @@ spec: expand: boolean nodeConfigs: string: - maxLogicalVolumeCount: integer + maxSubsystemCount: integer maxSize: string spdkImage: string spdkProxyImage: string @@ -2593,7 +2324,7 @@ _Example:_ ```yaml clusterName: string clusterImage: '^($|(quay\.io/simplyblock-io|docker\.io/simplyblock|public\.ecr\.aws/simply-block)/[a-z0-9][a-z0-9._-]*:[a-zA-Z0-9][a-zA-Z0-9._-]*(@sha256:[a-f0-9]{64})?)$' -maxLogicalVolumeCount: integer +maxSubsystemCount: integer maxSize: string spdkImage: '^($|(quay\.io/simplyblock-io|docker\.io/simplyblock|public\.ecr\.aws/simply-block)/[a-z0-9][a-z0-9._-]*:[a-zA-Z0-9][a-zA-Z0-9._-]*(@sha256:[a-f0-9]{64})?)$' spdkProxyImage: '^($|(quay\.io/simplyblock-io|docker\.io/simplyblock|public\.ecr\.aws/simply-block)/[a-z0-9][a-z0-9._-]*:[a-zA-Z0-9][a-zA-Z0-9._-]*(@sha256:[a-f0-9]{64})?)$' @@ -2637,7 +2368,7 @@ nodeFailureDomains: expand: boolean nodeConfigs: string: - maxLogicalVolumeCount: integer + maxSubsystemCount: integer maxSize: string spdkImage: string spdkProxyImage: string @@ -2666,7 +2397,7 @@ nodeConfigs: | --- | --- | --- | --- | | `clusterName` _string_ | ClusterName is the target storage cluster name. | | | | `clusterImage` _string_ | ClusterImage is the container image used for storage-node workloads.
Must reference one of the trusted registries (quay.io/simplyblock-io, docker.io/simplyblock, public.ecr.aws/simply-block); digest pinning (@sha256:...) is recommended. | | Pattern: `^($\|(quay\.io/simplyblock-io\|docker\.io/simplyblock\|public\.ecr\.aws/simply-block)/[a-z0-9][a-z0-9._-]*:[a-zA-Z0-9][a-zA-Z0-9._-]*(@sha256:[a-f0-9]\{64\})?)$`
| -| `maxLogicalVolumeCount` _integer_ | MaxLogicalVolumeCount is the maximum number of logical volumes per node. | | | +| `maxSubsystemCount` _integer_ | MaxSubsystemCount is the maximum number of NVMe-oF subsystems per node. | | | | `maxSize` _string_ | MaxSize is the maximum allocatable size of huge pages. | | | | `spdkImage` _string_ | SpdkImage is the SPDK image reference used by node services.
Must reference one of the trusted registries (quay.io/simplyblock-io, docker.io/simplyblock, public.ecr.aws/simply-block); digest pinning (@sha256:...) is recommended. | | Pattern: `^($\|(quay\.io/simplyblock-io\|docker\.io/simplyblock\|public\.ecr\.aws/simply-block)/[a-z0-9][a-z0-9._-]*:[a-zA-Z0-9][a-zA-Z0-9._-]*(@sha256:[a-f0-9]\{64\})?)$`
| | `spdkProxyImage` _string_ | SpdkProxyImage is the SPDK proxy image reference used by node services.
Must reference one of the trusted registries (quay.io/simplyblock-io, docker.io/simplyblock, public.ecr.aws/simply-block); digest pinning (@sha256:...) is recommended. | | Pattern: `^($\|(quay\.io/simplyblock-io\|docker\.io/simplyblock\|public\.ecr\.aws/simply-block)/[a-z0-9][a-z0-9._-]*:[a-zA-Z0-9][a-zA-Z0-9._-]*(@sha256:[a-f0-9]\{64\})?)$`
| @@ -2788,7 +2519,7 @@ socketId: string nodeIndex: integer socketIndex: integer overrides: - maxLogicalVolumeCount: integer + maxSubsystemCount: integer maxSize: string spdkImage: string spdkProxyImage: string @@ -2880,6 +2611,273 @@ latencyMetrics: +#### StoragePool + + + +StoragePool is the Schema for the storagepools API + + + + + +_Example:_ + +```yaml +apiVersion: storage.simplyblock.io/v1alpha1 +kind: StoragePool +metadata: + name: string +spec: + clusterName: string + status: string + capacityLimit: string + logicalVolumeMaxSize: string + dhchap: boolean + allowedNodes: + - string + qos: + iops: integer + throughput: + read: integer + readWrite: integer + write: integer + action: string + storageClassParameters: + qosRwIops: string + qosRwMbytes: string + qosRMbytes: string + qosWMbytes: string + compression: string + encryption: boolean + replicate: boolean + lvolPriorityClass: string + fabric: string + maxNamespacePerSubsys: string + tune2fsReservedBlocks: string + filesystem: string +status: + uuid: string + status: string + qos: + host: string + iops: integer + throughput: + read: integer + readWrite: integer + write: integer + allowedNodes: + - string +``` + +| Field | Description | Default | Validation | +| --- | --- | --- | --- | +| `apiVersion` _string_ | `storage.simplyblock.io/v1alpha1` | | | +| `kind` _string_ | `StoragePool` | | | +| `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.36/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | | Optional: \{\}
| +| `spec` _[StoragePoolSpec](#storagepoolspec)_ | spec defines the desired state of StoragePool | | Required: \{\}
| +| `status` _[StoragePoolStatus](#storagepoolstatus)_ | status defines the observed state of StoragePool | | Optional: \{\}
| + + +#### StoragePoolQoSSpec + + + +StoragePoolQoSSpec defines pool QosSpec limits. + + + +_Appears in:_ +- [StoragePoolSpec](#storagepoolspec) + +_Example:_ + +```yaml +iops: integer +throughput: + read: integer + readWrite: integer + write: integer +``` + +| Field | Description | Default | Validation | +| --- | --- | --- | --- | +| `iops` _integer_ | IOPS is the IOPS limit for the pool. | | | +| `throughput` _[StoragePoolQoSThroughputSpec](#storagepoolqosthroughputspec)_ | Throughput contains throughput limits for the pool. | | | + + +#### StoragePoolQoSStatus + + + +StoragePoolQoSStatus defines observed pool QosSpec values. + + + +_Appears in:_ +- [StoragePoolStatus](#storagepoolstatus) + +_Example:_ + +```yaml +host: string +iops: integer +throughput: + read: integer + readWrite: integer + write: integer +``` + +| Field | Description | Default | Validation | +| --- | --- | --- | --- | +| `host` _string_ | Host is the backend host handling pool QosSpec enforcement. | | | +| `iops` _integer_ | IOPS is the observed/configured IOPS value. | | | +| `throughput` _[StoragePoolQoSThroughputStatus](#storagepoolqosthroughputstatus)_ | Throughput contains observed/configured throughput values. | | | + + +#### StoragePoolQoSThroughputSpec + + + +StoragePoolQoSThroughputSpec defines throughput QosSpec limits in MiB/s. + + + +_Appears in:_ +- [StoragePoolQoSSpec](#storagepoolqosspec) + +_Example:_ + +```yaml +read: integer +readWrite: integer +write: integer +``` + +| Field | Description | Default | Validation | +| --- | --- | --- | --- | +| `read` _integer_ | Read is the read throughput limit for the pool. | | | +| `readWrite` _integer_ | ReadWrite is the combined read/write throughput limit for the pool. | | | +| `write` _integer_ | Write is the write throughput limit for the pool. | | | + + +#### StoragePoolQoSThroughputStatus + + + +StoragePoolQoSThroughputStatus defines observed throughput QosSpec values in MiB/s. + + + +_Appears in:_ +- [StoragePoolQoSStatus](#storagepoolqosstatus) + +_Example:_ + +```yaml +read: integer +readWrite: integer +write: integer +``` + +| Field | Description | Default | Validation | +| --- | --- | --- | --- | +| `read` _integer_ | Read is the observed/configured read throughput value. | | | +| `readWrite` _integer_ | ReadWrite is the observed/configured combined read/write throughput value. | | | +| `write` _integer_ | Write is the observed/configured write throughput value. | | | + + +#### StoragePoolSpec + + + +StoragePoolSpec defines the desired state of StoragePool + + + +_Appears in:_ +- [StoragePool](#storagepool) + +_Example:_ + +```yaml +clusterName: string +status: string +capacityLimit: string +logicalVolumeMaxSize: string +dhchap: boolean +allowedNodes: + - string +qos: + iops: integer + throughput: + read: integer + readWrite: integer + write: integer +action: string +storageClassParameters: + qosRwIops: string + qosRwMbytes: string + qosRMbytes: string + qosWMbytes: string + compression: string + encryption: boolean + replicate: boolean + lvolPriorityClass: string + fabric: string + maxNamespacePerSubsys: string + tune2fsReservedBlocks: string + filesystem: string +``` + +| Field | Description | Default | Validation | +| --- | --- | --- | --- | +| `clusterName` _string_ | ClusterName is the target storage cluster name. | | | +| `status` _string_ | Status is an optional desired-status hint for backend workflows.
FIXME: Unused for now | | | +| `capacityLimit` _string_ | CapacityLimit is the maximum aggregate capacity that can be allocated from this pool.
This maps to sbctl pool add --pool-max. Use sizes like 20M, 20G, or 0 for unlimited. | | | +| `logicalVolumeMaxSize` _string_ | LogicalVolumeMaxSize is the maximum size allowed for any single logical volume
created in this pool. This maps to sbctl pool add --lvol-max. Use sizes like
20M, 20G, or 0 for unlimited. | | | +| `dhchap` _boolean_ | DHCHAP enables DH-HMAC-CHAP key generation for the pool. Authentication is only
enforced when allowedNodes is non-empty. Also controls whether the StoragePool's StorageClass
gets an allowedTopologies restriction, which — like StorageClass Parameters — is
immutable in the Kubernetes API, hence this field is immutable too. | false | | +| `allowedNodes` _string array_ | AllowedNodes is the list of Kubernetes worker node names allowed to access volumes
in this pool. The operator resolves each node name to a deterministic NQN derived
from the node's UID: nqn.2014-08.io.simplyblock:uuid:.
The CSI node uses the same formula so no manual NQN management is required. | | | +| `qos` _[StoragePoolQoSSpec](#storagepoolqosspec)_ | QosSpec defines QosSpec limits for the pool. | | | +| `action` _string_ | Action triggers an imperative pool operation.
FIXME: Unused for now | | | +| `storageClassParameters` _[StorageClassParameters](#storageclassparameters)_ | StorageClassParameters sets default StorageClass parameter values for volumes in this pool.
Immutable: the underlying StorageClass's Parameters/AllowedTopologies cannot be patched in
the Kubernetes API once created, so there is no supported way to change these after the
fact. Create a new StoragePool to provision volumes with different settings. | \{ \} | | + + +#### StoragePoolStatus + + + +StoragePoolStatus defines the observed state of StoragePool. + + + +_Appears in:_ +- [StoragePool](#storagepool) + +_Example:_ + +```yaml +uuid: string +status: string +qos: + host: string + iops: integer + throughput: + read: integer + readWrite: integer + write: integer +allowedNodes: + - string +``` + +| Field | Description | Default | Validation | +| --- | --- | --- | --- | +| `uuid` _string_ | UUID is the backend pool UUID. | | | +| `status` _string_ | Status is the backend lifecycle status. | | | +| `qos` _[StoragePoolQoSStatus](#storagepoolqosstatus)_ | QoS contains observed/configured QoS values. | | | +| `allowedNodes` _string array_ | AllowedNodes lists the Kubernetes node names currently registered on the backend. | | | + +