From 19f9e879662c9d9e94482e65e1df4b3614ee9f18 Mon Sep 17 00:00:00 2001 From: pingqiu Date: Sun, 3 May 2026 11:23:28 -0700 Subject: [PATCH] docs(g15d): add dynamic PVC QA instruction --- .../v3-phase-15-g15d-qa-test-instruction.md | 127 ++++++++++++++++++ ...-15-g15d-blockvolume-launcher-mini-plan.md | 10 +- 2 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 sw-block/design/test/v3-phase-15-g15d-qa-test-instruction.md diff --git a/sw-block/design/test/v3-phase-15-g15d-qa-test-instruction.md b/sw-block/design/test/v3-phase-15-g15d-qa-test-instruction.md new file mode 100644 index 000000000..598d1a071 --- /dev/null +++ b/sw-block/design/test/v3-phase-15-g15d-qa-test-instruction.md @@ -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/ \ + 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--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. diff --git a/sw-block/design/v3-phase-15-g15d-blockvolume-launcher-mini-plan.md b/sw-block/design/v3-phase-15-g15d-blockvolume-launcher-mini-plan.md index 724eab023..3f35b83d4 100644 --- a/sw-block/design/v3-phase-15-g15d-blockvolume-launcher-mini-plan.md +++ b/sw-block/design/v3-phase-15-g15d-blockvolume-launcher-mini-plan.md @@ -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