docs(g15d): add dynamic PVC QA instruction

This commit is contained in:
pingqiu
2026-05-03 11:23:28 -07:00
parent 8a964c50f2
commit 19f9e87966
2 changed files with 136 additions and 1 deletions
@@ -0,0 +1,127 @@
# V3 Phase 15 G15d QA Test Instruction
Date: 2026-05-03
Status: QA-ready on `p15-g15d/blockvolume-launcher@0265b60`
Scope: Kubernetes dynamic PVC smoke through launcher-generated blockvolume workload
## Headline
At `p15-g15d/blockvolume-launcher@0265b60`, G15d should prove a dynamic
PVC can create a V3 lifecycle volume intent, trigger blockmaster's launcher to
generate a blockvolume Deployment, apply that generated workload, and complete
a pod filesystem checksum write/read through CSI + iSCSI.
This is the first no-precreated-PV / no-hand-started-blockvolume Kubernetes
path. It is still a single-node lab smoke, not a production operator.
## Preconditions
- M02 or equivalent k3s node is available.
- Images are built and loaded as `sw-block:local` and `sw-block-csi:local`.
- `kubectl` points at the test cluster.
- iSCSI TCP module is loadable on the host. The CSI node init container runs
`modprobe iscsi_tcp || true`.
## Command
From the seaweed_block checkout at `0265b60`:
```bash
bash scripts/run-g15d-k8s-dynamic.sh "$PWD"
```
Optional artifact directory override:
```bash
G15D_ARTIFACT_DIR=/mnt/smb/work/share/g15d-k8s/runs/<run-id> \
bash scripts/run-g15d-k8s-dynamic.sh "$PWD"
```
## Expected PASS
The script should print:
```text
[g15d] PASS: dynamic PVC pod completed checksum write/read
```
The pod log should contain:
```text
/data/payload.bin: OK
```
The generated manifest artifact should exist:
```text
generated-blockvolume.yaml
```
It must contain a Deployment named like:
```text
sw-blockvolume-<dynamic-volume-id>-r1
```
## Scenarios
1. Dynamic PVC has no pre-created PV.
Backing files:
`deploy/k8s/g15d/dynamic-pvc-pod.yaml`,
`cmd/blockcsi/g15d_manifest_test.go::TestG15d_K8sDynamicPVC_UsesStorageClassNoPrecreatedPV`
2. External provisioner is present.
Backing files:
`deploy/k8s/g15d/csi-controller.yaml`,
`cmd/blockcsi/g15d_manifest_test.go::TestG15d_K8sCSIController_IncludesExternalProvisioner`
3. Product stack does not pre-create blockvolume workloads.
Backing files:
`deploy/k8s/g15d/block-stack.yaml`,
`cmd/blockcsi/g15d_manifest_test.go::TestG15d_K8sBlockStack_HasLauncherButNoPrecreatedBlockvolume`
4. Launcher-generated manifest is applied by harness after CreateVolume.
Backing files:
`scripts/run-g15d-k8s-dynamic.sh`,
`cmd/blockcsi/g15d_manifest_test.go::TestG15d_K8sRunner_AppliesLauncherGeneratedManifest`
5. Pod writes 4 KiB, syncs, and verifies checksum through mounted PVC.
Backing file:
`deploy/k8s/g15d/dynamic-pvc-pod.yaml`
## Artifacts
The script preserves:
- `run.log`
- `block-stack.rendered.yaml`
- `generated-blockvolume.yaml`
- `blockmaster.log`
- `blockcsi-controller.log`
- `csi-provisioner.log`
- `csi-attacher.log`
- `blockvolume-generated.log`
- `pod.log`
- `pod.describe.txt`
- `app-storage.txt`
- `kube-system-pods-deploys.txt`
- `cleanup.log`
## Non-Claims
- No multi-node Kubernetes claim.
- No operator/controller reconciliation claim.
- No automatic deletion of dynamically-created blockvolume workloads beyond
this harness cleanup path.
- No failover during mounted dynamic PVC.
- No snapshot, resize, block-mode, or topology-aware scheduling claim.
- No performance claim.
## QA Sign
Pending QA M02 run.
@@ -1,7 +1,7 @@
# V3 Phase 15 G15d Mini-Plan — BlockVolume Launcher MVP
Date: 2026-05-03
Status: planner + renderer + node inventory + replica-id materialization + manifest writer loop landed on `p15-g15d/blockvolume-launcher`
Status: dynamic PVC K8s harness ready for QA on `p15-g15d/blockvolume-launcher`
Depends on: G15c `CreateVolume -> lifecycle desired intent`
## 0. Product Sentence
@@ -49,6 +49,7 @@ Commits:
- `ae2cd1a G15d: import cluster spec node inventory`
- `1848099 G15d: materialize launcher replica identities`
- `109edd8 G15d: write launcher blockvolume manifests`
- `0265b60 G15d: add dynamic PVC K8s harness`
Implemented:
- `core/lifecycle.BlockVolumeWorkloadPlan`
@@ -64,6 +65,7 @@ Implemented:
- master-side workload planning tick converts blank-pool placements into concrete replica workload identities and writes those replica IDs back as existing-replica placement intent
- dynamic-volume assignment subscriptions can fall back to lifecycle placement slots when static accepted topology does not yet contain the volume
- `blockmaster` can run an optional launcher loop that writes rendered blockvolume Deployment YAMLs to `--launcher-manifest-dir`; it does not call `kubectl apply`
- G15d K8s dynamic harness exists: dynamic StorageClass/PVC/pod -> CSI CreateVolume -> master lifecycle -> launcher manifest -> script applies generated blockvolume -> pod checksum
Verification:
@@ -71,6 +73,7 @@ Verification:
go test ./core/lifecycle -count=1
go test ./core/lifecycle ./core/launcher -count=1
go test ./cmd/blockmaster ./core/lifecycle ./core/host/master ./core/launcher -count=1
go test ./cmd/blockcsi ./core/launcher ./cmd/blockmaster ./core/host/master ./core/lifecycle -count=1
```
## 4. Next Slices
@@ -90,6 +93,11 @@ G15d-D — M02 dynamic PVC:
- external-provisioner calls CSI CreateVolume.
- launcher starts blockvolume workload.
- pod writes 4 KiB + sync + checksum read-back OK.
- QA command:
```bash
bash scripts/run-g15d-k8s-dynamic.sh "$PWD"
```
## 5. Close Criteria