mirror of
https://github.com/ivenator1/proxmox-management.git
synced 2026-07-18 11:28:21 +08:00
[PR #23] [MERGED] Feature roadmap: history CLI, notifiers, targeting, custom-flow snapshots, canary rollout, --scan, run lock #23
Labels
No labels
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
pull-request
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
ivenator1/proxmox-management#23
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/ivenator1/proxmox-management/pull/23
Author: @ivenator1
Created: 6/11/2026
Status: ✅ Merged
Merged: 6/11/2026
Merged by: @ivenator1
Base:
main← Head:claude/feature-enhancement-planning-i63dw2📝 Commits (10+)
9aa962aAdd feature enhancement roadmap (2 small / 2 medium / 2 large)0150b47Add --history / --history-show CLI to view persisted runs (S1)916ff0fAdd generic webhook and Telegram notifier types (S2)71ea158Add --limit and --phases run targeting (M1)2927765Add PVE snapshot/rollback to the custom_update flow (M2, config v2)3b8cb3dAdd canary / staged rollout to remote, lxc, and vm phases (L1)816039dAdd fleet-update --scan: read-only pending-updates snapshot (L2 part 1)72c2d16Mark roadmap implementation status (S1-L1 done, L2 scan done)a9913a2Add fleet-wide run lock and pending-snapshot readers (L2 part 2 groundwork)6e5f239fix: defer lock dir mkdir to acquire time; bypass lock in cli/wrapper tests📊 Changes
34 files changed (+3846 additions, -110 deletions)
View changed files
📝
.github/workflows/ci.yml(+1 -0)📝
CLAUDE.md(+55 -10)📝
config_templates/custom_system.yml.example(+13 -0)➕
docs/FEATURE_ROADMAP.md(+183 -0)📝
fleet-update.py(+75 -3)📝
proxmox_fleet/cli.py(+130 -3)📝
proxmox_fleet/driver.py(+352 -71)📝
proxmox_fleet/flows/custom.py(+81 -7)📝
proxmox_fleet/history.py(+58 -1)📝
proxmox_fleet/inventory.py(+15 -0)➕
proxmox_fleet/lock.py(+121 -0)📝
proxmox_fleet/models/config.py(+19 -0)📝
proxmox_fleet/models/settings.py(+21 -0)📝
proxmox_fleet/notifiers.py(+35 -1)➕
proxmox_fleet/scan.py(+372 -0)📝
proxmox_fleet/status.py(+18 -0)➕
roles/custom_update/molecule/custom_update_rollback/converge.yml(+18 -0)➕
roles/custom_update/molecule/custom_update_rollback/molecule.yml(+36 -0)➕
roles/custom_update/molecule/custom_update_rollback/prepare.yml(+110 -0)➕
roles/custom_update/molecule/custom_update_rollback/verify.yml(+54 -0)...and 14 more files
📄 Description
Implements the feature roadmap (
docs/FEATURE_ROADMAP.md) — five complete features plus the groundwork for the web dashboard. Every commit shipped with unit tests, mypy/ruff/yamllint clean; the full suite grew from 640 to 770+ passing tests.Small
--history/--history-show: view persisted runs from the CLI. Newhistory_summary()/read_run()readers inhistory.py; table of past runs or replay of a stored briefing. Works without ansible-runner installed.notifiers:types — generic JSON webhook ({title, body, failed, timestamp}+ custom headers) and TelegramsendMessage(plain text by default). No new dependencies.Medium
--limit/--phasestargeting: restrict a run to named hosts and/or LXC/VM ids, or to specific phases (remote,custom,lxc,vm,node,manager); pre-flight and notify always run. LXC limit mixes node names (whole node) and bare ids; the manager self-update is addressable via themanagertoken; unknown phase names fail loud.pve_vmid/pve_node/pve_typeconfig keys givecustom_updatehosts the sameBEFORE_UPDATE_AUTOsnapshot → rollback-on-failure → delete-in-finally safety net as the lxc/vm flows (statusesFAILED + ROLLED BACK/FAILED (NO SNAPSHOT));rollback_commandremains the legacy fallback. Newcustom_update_rollbackmolecule scenario (verified locally, added to the CI matrix).Large
canary=true(inventory/host_vars) or listed incanary_hostsupdate first in the remote/lxc/vm phases; the rest run only if no canary failed and the post-soak Uptime Kuma checks pass (canary_soak_minutes), otherwise they're recorded asSKIPPED (canary failed). The LXC phase now discovers all nodes up-front so the canary wave spans nodes; with no canaries behavior is byte-identical to before.fleet-update --scan: strictly read-only pending-updates snapshot — per-host pending OS packages (apt-s dist-upgrade/ dnfcheck-update/ apkversion -l '<') plus per-LXC community-script appcurrent → latest, written aspending-*.jsonnext to the run history. Stopped CTs/templates are never started.proxmox_fleet/lock.pyhonored by both entry points for runs and scans (overlapping invocations exit 1 loudly; read-only commands unaffected), pluspending_summary()/read_pending()readers anddashboard_*settings. The FastAPIfleet-dashboardapp itself (0.0.0.0:8421, token-protected trigger, SSE console, Pico.css UI) follows on this foundation — design recorded in the roadmap.CLAUDE.md,
vars.yml.example, andconfig_templates/custom_system.yml.exampledocument every new flag, setting, and config key.https://claude.ai/code/session_01HASE4GGnyrVztYbWQaajdn
Generated by Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
[PR #23] Feature roadmap: history CLI, notifiers, targeting, custom-flow snapshots, canary rollout, --scan, run lockto [PR #23] [MERGED] Feature roadmap: history CLI, notifiers, targeting, custom-flow snapshots, canary rollout, --scan, run lock