Files
zosstorage/TODO.md

99 lines
7.4 KiB
Markdown

# TODO checklist
Project status: first-draft preview is implemented and committed. This checklist tracks remaining work to reach end-to-end provisioning (apply mode), plus follow-ups and QA.
Conventions:
- [x] Completed
- [-] In progress
- [ ] Pending
Core execution
- [-] Add “apply mode” switch to orchestrator to perform destructive actions after preview validation
- [x] Introduce CLI flag --apply guarded by clear logs and safety checks (not preview) [src/cli/args.rs](src/cli/args.rs)
- [x] Wire partition application and udev settle [orchestrator::run()](src/orchestrator/run.rs:1) → [partition::apply_partitions()](src/partition/plan.rs:1)
- [-] Wire mkfs → mount → maybe write fstab → build/write report [src/orchestrator/run.rs](src/orchestrator/run.rs)
- [x] Wire mkfs: plan_filesystems + make_filesystems [src/orchestrator/run.rs](src/orchestrator/run.rs) + [src/fs/plan.rs](src/fs/plan.rs)
- [ ] Wire mounts (plan/apply) [src/mount/ops.rs](src/mount/ops.rs)
- [ ] maybe write fstab [src/mount/ops.rs](src/mount/ops.rs)
- [ ] build/write report [src/report/state.rs](src/report/state.rs)
- [x] Partition application (destructive) in [partition::apply_partitions()](src/partition/plan.rs:1)
- [x] Boot mode detection and BIOS boot policy
- [x] Implement UEFI detection via /sys/firmware/efi: [is_efi_boot()](src/util/mod.rs:151)
- [x] Planner skips BIOS boot partition when UEFI-booted: [partition::plan_partitions()](src/partition/plan.rs:133)
- [ ] Future: revisit bootblock/bootloader specifics for BIOS vs EFI (confirm if any BIOS-targets require bios_boot) [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
- [x] Translate [PartitionPlan](src/partition/plan.rs:1) to sgdisk commands (create GPT, partitions in order with alignment and names)
- [x] Enforce idempotency when required via [idempotency::is_empty_disk()](src/idempotency/mod.rs:1); abort on non-empty
- [x] Capture partition GUIDs, names, device paths via sgdisk -i parsing; map to PartitionResult
- [x] Call [util::udev_settle()](src/util/mod.rs:1) after changes; consistent Error::Tool/Error::Partition mapping
- [-] Filesystem creation in [fn make_filesystems(...)](src/fs/plan.rs:182)
- [x] Base mkfs implemented for vfat/btrfs/bcachefs (UUID capture via blkid)
- [x] Apply btrfs RAID profile when topology requires it (multi-device): pass -m raid1 -d raid1 in mkfs.btrfs [src/fs/plan.rs](src/fs/plan.rs)
- [x] Force mkfs.btrfs in apply path with -f to handle leftover signatures from partial runs [src/fs/plan.rs](src/fs/plan.rs)
- [ ] Compression/tuning mapping from config
- [ ] btrfs: apply compression as mount options during mounting phase [src/mount/ops.rs](src/mount/ops.rs)
- [ ] bcachefs: map compression/checksum/cache_mode to format flags (deferred) [src/fs/plan.rs](src/fs/plan.rs)
- [ ] Consider verifying UUID consistency across multi-device filesystems and improve error messages
- [ ] Mount planning and application in [mount::ops](src/mount/ops.rs:1)
- [ ] Implement [fn plan_mounts(...)](src/mount/ops.rs:68): map FsResult UUIDs into `/var/cache/{UUID}` using [cfg.mount.base_dir](src/types.rs:136), and synthesize options per FS kind
- [ ] Implement [fn apply_mounts(...)](src/mount/ops.rs:75): mkdir -p targets, perform mount syscalls (nix), structured errors
- [ ] Implement [fn maybe_write_fstab(...)](src/mount/ops.rs:81): deterministic entries + idempotent writes when enabled in config
- [ ] Option synthesis (btrfs: compress=zstd:3, ssd/ssd_spread when appropriate; vfat defaults) [src/mount/ops.rs](src/mount/ops.rs:31)
- [ ] Reporting implementation in [report::state](src/report/state.rs:1)
- [ ] Implement [fn build_report(...)](src/report/state.rs:67): include disks, partitions (with GUIDs), filesystems (uuid, label, kind), mounts, and status
- [ ] Implement [fn write_report(...)](src/report/state.rs:77): atomic write via tempfile + rename, robust IO error mapping
- [ ] Consider monotonic sequence number or boot-epoch marker [src/report/state.rs](src/report/state.rs:27)
Discovery, idempotency, safety
- [x] Device discovery with removable policy: exclude `/sys/class/block/*/removable == 1` by default; allow via `--allow-removable` [src/device/discovery.rs](src/device/discovery.rs:61)
- [x] Idempotency detection via blkid; filesystem label / PARTLABEL checks [src/idempotency/mod.rs](src/idempotency/mod.rs:42)
- [x] Emptiness checks (idempotency::is_empty_disk) and skip during preview mode [src/orchestrator/run.rs](src/orchestrator/run.rs:140)
- [ ] Optional: additional include/exclude helpers (e.g. path allowlist) and stronger heuristics for device class selection (NVMe/SATA only, etc.)
CLI, config, defaults
- [x] Built-in sensible defaults (no YAML required) [src/config/loader.rs](src/config/loader.rs:320)
- [x] Overlays from CLI: log level, file logging, fstab, removable policy, topology [src/config/loader.rs](src/config/loader.rs:247)
- [x] Preview flags (`--show`, `--report`) and topology selection (`-t/--topology`) [src/cli/args.rs](src/cli/args.rs:55)
- [x] Add `--apply` flag to toggle execute mode and keep preview non-destructive by default [src/cli/args.rs](src/cli/args.rs)
- [ ] Consider environment variable overlays [src/config/loader.rs](src/config/loader.rs:39)
- [ ] Consider hidden/dev flags behind features (e.g., `--dry-run-verbose`, `--trace-io`) [src/cli/args.rs](src/cli/args.rs:26)
Orchestrator tracing and spans
- [ ] Add per-phase timing/spans in [orchestrator::run](src/orchestrator/run.rs:97) (discovery, plan, partition apply, mkfs, mount, report)
- [x] Preview JSON includes filesystems_planned and mount scheme [src/orchestrator/run.rs](src/orchestrator/run.rs:170)
Logging/utilities
- [x] which_tool/run_cmd/run_cmd_capture/udev_settle implemented [src/util/mod.rs](src/util/mod.rs:58)
- [ ] Optional: enrich debug spans around all shell-outs (command-line echo with redactions if needed)
- [ ] Confirm file logging idempotence and guard path creation [src/logging/mod.rs](src/logging/mod.rs:1)
Docs and tests
- [x] Exhaustive README with usage and JSON shapes [README.md](README.md:1)
- [ ] Audit rustdoc coverage for all public functions and important helpers; beef up where minimal
- [ ] Topology planning tests (unit-level) for single/dual/raid1/ssd+hdd setups [src/partition/plan.rs](src/partition/plan.rs:112)
- [ ] Filesystem planning tests for RAID1 aggregation and bcachefs mapping [src/fs/plan.rs](src/fs/plan.rs:98)
- [ ] Orchestrator preview tests (JSON contains filesystems_planned/mount section) [src/orchestrator/run.rs](src/orchestrator/run.rs:170)
- [ ] Integration tests in QEMU/KVM matrix; exercise `/dev/vd*` topologies and ensure safe abort on unexpected signatures
Packaging and integration
- [ ] Provide build profile for static musl and Alpine initramfs integration (Cargo config + CI)
- [ ] Add minimal init script / docs for integrating into early boot
Stretch goals and polish
- [ ] Dry-run mode that outputs proposed sgdisk/mkfs/mount commands in detail with “why” annotations
- [ ] Richer structured report schema (typed disks/partitions/filesystems/mounts) and tooling to diff reports across runs
- [ ] Optional telemetry hooks / metrics (phase durations, device counts) behind features
Stale TODOs to review/remove
- [ ] Validate and remove TODOs in:
- [src/fs/plan.rs](src/fs/plan.rs:31) (mapping/mkfs largely implemented)
- [src/util/mod.rs](src/util/mod.rs:30) (helpers implemented)
- [src/logging/mod.rs](src/logging/mod.rs:26) (if file layer is already idempotent)