Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
e67b536
docs: add three-tier StorageNodeSet/StorageNode/StorageNodeOps design…
geoffrey1330 Jul 13, 2026
8206aa2
operator: introduce StorageNode and StorageNodeOps three-tier model (…
geoffrey1330 Jul 14, 2026
c3b37e4
Merge branch 'main' into three-tier-storage-node-model
geoffrey1330 Jul 14, 2026
4e55fe5
test: fix drain unit tests after StorageNodeSet action field removal
geoffrey1330 Jul 14, 2026
2d9327b
fix: resolve all golangci-lint issues in new StorageNode and StorageN…
geoffrey1330 Jul 14, 2026
cf5ca36
fix: resolve remaining golangci-lint issues in StorageNodeOps controller
geoffrey1330 Jul 14, 2026
74b9474
formatted file internal/controller/simplyblockstoragenodeset_controll…
geoffrey1330 Jul 14, 2026
a9cd6a8
fix: stop duplicate storage node POSTs by bridging UUID from StorageN…
geoffrey1330 Jul 14, 2026
e58c843
operator: move storage node provisioning ownership to StorageNodeReco…
geoffrey1330 Jul 14, 2026
b65b6a8
fix: always set socketIndex on StorageNode CRs and remove unused func…
geoffrey1330 Jul 14, 2026
603760e
operator: add Total/Online/Offline printcolumns to StorageNodeSet
geoffrey1330 Jul 14, 2026
03c01ce
operator: add granular status counts (suspended/creating/removed) to …
geoffrey1330 Jul 14, 2026
20d450b
Ran make operator-build-installer
geoffrey1330 Jul 14, 2026
0998dd7
operator: validate nodeConfigs keys match workerNodes and workerNodes…
geoffrey1330 Jul 15, 2026
9480926
operator: bound CEL rule cost with MaxItems/MaxProperties on workerNo…
geoffrey1330 Jul 15, 2026
4522e12
operator: enforce workerNodes uniqueness via listType=set instead of …
geoffrey1330 Jul 15, 2026
dc3e220
operator: implement per-node ConfigMap and DaemonSet init container f…
geoffrey1330 Jul 15, 2026
60fa7aa
fix: replace WriteString(fmt.Sprintf) with fmt.Fprintf in buildPerNod…
geoffrey1330 Jul 15, 2026
d40c13c
refactor: extract node-env-writer shell script into named variable fo…
geoffrey1330 Jul 15, 2026
8090876
fix: create per-node ConfigMap before DaemonSet to prevent empty env …
geoffrey1330 Jul 15, 2026
a5de793
formatted file internal/controller/simplyblockstoragenodeset_controll…
geoffrey1330 Jul 15, 2026
1fd41be
operator: mirror worker-specific events from StorageNodeOps and Stora…
geoffrey1330 Jul 15, 2026
d89dba5
operator: support manually created StorageNode CRs referencing an exi…
geoffrey1330 Jul 15, 2026
e6e7961
operator: label manually created StorageNode worker nodes so DaemonSe…
geoffrey1330 Jul 15, 2026
81f12ba
operator: include manually created StorageNode workers in EndpointSli…
geoffrey1330 Jul 15, 2026
8c6b419
operator: poll backend by IP/socket to resolve UUID for manually crea…
geoffrey1330 Jul 15, 2026
19d95d4
operator: enforce parallel node add limits and FDB sequential constra…
geoffrey1330 Jul 15, 2026
5f8c361
docs: update design document to Phase 2 complete and extract test pla…
geoffrey1330 Jul 15, 2026
e28aca2
fix: remove unused sns parameter from isFDBWorkerBlocked
geoffrey1330 Jul 15, 2026
64a2bd2
Merge branch 'main' into three-tier-storage-node-model
geoffrey1330 Jul 15, 2026
49862f3
test: add 20 unit tests for StorageNode naming, per-node config, UUID…
geoffrey1330 Jul 15, 2026
4274354
fix: disable RestartOnSecretRefresh to prevent cert rotator crash loo…
geoffrey1330 Jul 15, 2026
ad81b1b
fix: resolve remaining lint issues and register field indexes in test…
geoffrey1330 Jul 15, 2026
b7a7895
fix: replace remaining online string literals with utils.NodeStatusOn…
geoffrey1330 Jul 15, 2026
0b08155
fix: replace online string literals with utils.NodeStatusOnline const…
geoffrey1330 Jul 15, 2026
56dc53b
fixed cyclomatic import
geoffrey1330 Jul 15, 2026
ba18ed9
operator: enforce FDB sequential node add at StorageNode CR creation …
geoffrey1330 Jul 15, 2026
3c53f01
operator: pre-populate StorageNode status from legacy StorageNodeSet.…
geoffrey1330 Jul 15, 2026
16f52a4
fix: add StorageNode, StorageNodeOps, BackupImport, and ControlPlane …
geoffrey1330 Jul 15, 2026
08612b9
Ran make operator-build-installer
geoffrey1330 Jul 15, 2026
25283b3
operator: nest StorageNode status into resources/ports groups per rev…
geoffrey1330 Jul 16, 2026
b85a981
docs: update design document with nested StorageNode status structure…
geoffrey1330 Jul 16, 2026
f7d3e69
operator: create StorageNode CRs per socket per nodeIndex with unambi…
geoffrey1330 Jul 16, 2026
744e036
docs: update design document with s{socket}-n{nodeIdx} naming, nodesP…
geoffrey1330 Jul 16, 2026
4084408
operator: add expand field to StorageNodeSet and StorageNodeOverrides…
geoffrey1330 Jul 16, 2026
a16d77e
added storagenodes and storagenodeops crds to helm-chart
geoffrey1330 Jul 17, 2026
a5a5788
fix: clear stale UUID on 404 from syncStatus to trigger re-adoption o…
geoffrey1330 Jul 17, 2026
cc33cae
fix: preserve PostedAt when clearing stale UUID on 404 to prevent dup…
geoffrey1330 Jul 17, 2026
9798e3f
added cluster-expand service
geoffrey1330 Jul 17, 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
18 changes: 9 additions & 9 deletions atlas-lib/nvme/sysfs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,15 @@ func vm17Fixture(t *testing.T) string {
ns + "/dev": "259:1",
ns + "/queue/logical_block_size": "4096",
// controller nvme0 (path A -> vm19)
"class/nvme/nvme0/subsysnqn": nqn,
"class/nvme/nvme0/transport": "tcp",
"class/nvme/nvme0/state": "live",
"class/nvme/nvme0/cntrltype": "io",
"class/nvme/nvme0/cntlid": "1",
"class/nvme/nvme0/address": "traddr=192.168.10.69,trsvcid=4426,src_addr=192.168.10.67",
"class/nvme/nvme0/numa_node": "-1",
"class/nvme/nvme0/queue_count": "15",
"class/nvme/nvme0/dev": "238:0",
"class/nvme/nvme0/subsysnqn": nqn,
"class/nvme/nvme0/transport": "tcp",
"class/nvme/nvme0/state": "live",
"class/nvme/nvme0/cntrltype": "io",
"class/nvme/nvme0/cntlid": "1",
"class/nvme/nvme0/address": "traddr=192.168.10.69,trsvcid=4426,src_addr=192.168.10.67",
"class/nvme/nvme0/numa_node": "-1",
"class/nvme/nvme0/queue_count": "15",
"class/nvme/nvme0/dev": "238:0",
// controller nvme1 (path B -> vm17)
"class/nvme/nvme1/subsysnqn": nqn,
"class/nvme/nvme1/transport": "tcp",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.21.0
name: storagenodeops.storage.simplyblock.io
spec:
group: storage.simplyblock.io
names:
kind: StorageNodeOps
listKind: StorageNodeOpsList
plural: storagenodeops
shortNames:
- snops
singular: storagenodeops
scope: Namespaced
versions:
- additionalPrinterColumns:
- jsonPath: .spec.storageNodeRef
name: Node
type: string
- jsonPath: .spec.action
name: Action
type: string
- jsonPath: .status.phase
name: Phase
type: string
- jsonPath: .status.subPhase
name: SubPhase
type: string
- jsonPath: .status.message
name: Message
type: string
- jsonPath: .metadata.creationTimestamp
name: Age
type: date
name: v1alpha1
schema:
openAPIV3Schema:
description: |-
StorageNodeOps is a one-shot operational CR targeting a single StorageNode.
Analogous to a Kubernetes Job — it drives an action (shutdown, restart, suspend,
resume, remove/drain) to completion and records the result. Only one
StorageNodeOps can be active per StorageNode at a time.
properties:
apiVersion:
description: |-
APIVersion defines the versioned schema of this representation of an object.
Servers should convert recognized schemas to the latest internal value, and
may reject unrecognized values.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
type: string
kind:
description: |-
Kind is a string value representing the REST resource this object represents.
Servers may infer this from the endpoint the client submits requests to.
Cannot be updated.
In CamelCase.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
type: string
metadata:
type: object
spec:
description: StorageNodeOpsSpec defines the desired state of a StorageNodeOps.
properties:
action:
description: Action is the operation to perform. Immutable.
enum:
- shutdown
- restart
- suspend
- resume
- remove
type: string
x-kubernetes-validations:
- message: field is immutable
rule: self == oldSelf
drain:
description: Drain configures the drain workflow. Only applicable
when action=remove.
properties:
systemVolumeFilterRegex:
description: |-
SystemVolumeFilterRegex is a Go regular expression matched against backend
volume names. Matching volumes are treated as system volumes: excluded from
drain migration and deleted inline during the Verifying phase.
Defaults to "^sb-fio-baseline-.*".
type: string
type: object
force:
description: Force enables forced execution where the backend supports
it.
type: boolean
reattachVolume:
description: |-
ReattachVolume reattaches volumes during restart.
Only applicable when action=restart.
type: boolean
storageNodeRef:
description: StorageNodeRef is the name of the target StorageNode.
Immutable.
type: string
x-kubernetes-validations:
- message: field is immutable
rule: self == oldSelf
required:
- action
- storageNodeRef
type: object
status:
description: StorageNodeOpsStatus holds the observed state of a StorageNodeOps.
properties:
completedAt:
description: CompletedAt is when the operation finished (successfully
or not).
format: date-time
type: string
message:
description: Message is a human-readable description of the current
state or failure reason.
type: string
phase:
description: Phase is the high-level lifecycle phase.
enum:
- Pending
- Running
- Succeeded
- Failed
type: string
startedAt:
description: StartedAt is when the operation began.
format: date-time
type: string
subPhase:
description: SubPhase tracks the active drain step when action=remove
and phase=Running.
enum:
- Validating
- Suspending
- Migrating
- Verifying
- Removing
type: string
triggered:
description: |-
Triggered indicates the backend action POST has been sent (used during
Suspending to avoid duplicate POSTs across reconcile iterations).
type: boolean
volumesMigrated:
description: VolumesMigrated is the count of volumes successfully
migrated (drain only).
type: integer
volumesPending:
description: VolumesPending is the count of volumes awaiting migration
(drain only).
type: integer
type: object
type: object
served: true
storage: true
subresources:
status: {}
Loading
Loading