From: Thomas Lamprecht <t.lamprecht@proxmox.com>
To: pdm-devel@lists.proxmox.com
Subject: superseded: [PATCH datacenter-manager v2 0/8] subscription: add central key pool registry with reissue support
Date: Fri, 15 May 2026 09:48:03 +0200 [thread overview]
Message-ID: <5643ff88-45a3-4104-add3-ec57bf43ed03@proxmox.com> (raw)
In-Reply-To: <20260507082943.2749725-1-t.lamprecht@proxmox.com>
Superseded-by: https://lore.proxmox.com/all/20260515074623.766766-1-t.lamprecht@proxmox.com/
On 07/05/2026 10:29, Thomas Lamprecht wrote:
> Add a Subscription Registry to PDM: a central pool of PVE and PBS
> subscription keys that an operator can assign to remote nodes from one
> place, with an explicit Apply/Clear lifecycle for staged changes plus a
> Reissue Key action for freeing a key bound to a node so it can be
> reassigned elsewhere.
>
> Motivation: managing subscriptions across many remotes today means
> doing this for each node individually. PDM already has the remote
> inventory; with a key pool plus per-remote query data we can show "which
> nodes need a subscription" and "which keys are unused" together, and let
> an admin batch-assign and tear down from one place.
> In the near/mid-term we can also make polling keys from customers more
> integrated, but that needs a bit adaption in our shop infa and does not
> block the base work here in anyway. Actually, the implementation here
> was split out from a more complete work, so most parts of it are already
> prepared to adopt this relatively easily.
>
> Design points worth flagging for review:
>
> * Storage layout. subscriptions.cfg holds key entries via the typed
> section-config layer, with `product-type` as the section type so PVE
> and PBS sections live side-by-side.
> The subscriptions.shadow file is reserved for a future shop-bundle
> import flow (signed info blobs) and stays empty for manually-added
> keys. I can drop that part for now too, but figured it might be nice
> and potentially relevant for review to see the direction this probably
> goes now already.
>
> * Endpoints take PRIV_SYS_AUDIT/MODIFY at the macro
> level for the pool itself, with per-remote PRIV_RESOURCE_* enforced
> inside the handlers when a specific remote is touched.
> A dedicated subscription privilege seemed not like a necessity and
> also not fit that well into our general priv approach in PDM.
>
> * The pending lifecycle goes like: Pool entries with a (remote, node)
> * binding whose
> live state does not match are "pending push"; entries with the new
> pending-reissue flag are "pending removal". Apply Pending walks both
> queues; Clear Pending drops the queue without touching any remote
> (binding-clear for push, flag-only for reissue so the operator can
> retry without re-importing the key).
> The per-remote subscription cache is invalidated after each successful
> apply step so the next panel load reflects the change rather than a
> 5-minute-stale snapshot, which is highly confusing UI/UX wise. This
> might warrant a closer look though, might be currently done in a
> rather heavier handed fashion as potentially needed (had no time to
> recheck).
>
> * Locking is best-effort, but here that should be fine in practice given
> that another entity can always alter the state on a remote node in
> parallel anyway.
>
> The lib/pdm-api-types/tests/test_import.rs test should provide basic
> coverage for section-config roundtrip for both subscription.cfg and the
> shadow file (which is why I'd be fine with keeping it, but not _that_
> hard feelings), schema acceptance and rejection (for now only accept
> PVE/PBS; everything else rejected), ProductType classification, the
> SubscriptionLevel display/from-str backward-compat (single-letter and
> full-name forms both parse), and pick_best_pve_socket_key edge cases.
>
> Open follow-ups deliberately out of scope here:
> * Auto-import existing remote-side keys into the pool on first
> observation (the reissue path already adopts; an explicit import for
> legacy onboarding would be cleaner).
> * Make reissue a full reissue, if it goes in like this it should be
> rather called "Clear Key", but that can be handled on applying too, if
> really nothing else comes up (which I doubt)
> * A shop-bundle import path (the shadow file plumbing is already in),
> either manual copy+paste or through an api token.
> * Some polishing code and ui/ux wise (e.g., a reload button), but wante
> to finally get this out now.
> * ...
>
> changes v1 -> v2:
> * cleanly adopt (naughty) in-patch edit that broke docs changes of
> subsequent patch.
> * add correct subjectprefix
>
> Thomas Lamprecht (8):
> api: subscription cache: ensure max_age=0 forces a fresh fetch
> api types: subscription level: render full names
> subscription: add key pool data model and config layer
> subscription: add key pool and node status API endpoints
> ui: add subscription registry with key pool and node status
> cli: add subscription key pool management subcommands
> docs: add subscription registry chapter
> subscription: add Reissue Key action with pending-reissue queue
>
> cli/client/src/subscriptions.rs | 226 +++-
> docs/index.rst | 1 +
> docs/subscription-registry.rst | 64 +
> lib/pdm-api-types/Cargo.toml | 4 +
> lib/pdm-api-types/src/subscription.rs | 422 +++++-
> lib/pdm-api-types/tests/test_import.rs | 310 +++++
> lib/pdm-client/src/lib.rs | 157 ++-
> lib/pdm-config/src/lib.rs | 1 +
> lib/pdm-config/src/subscriptions.rs | 102 ++
> server/src/api/mod.rs | 2 +
> server/src/api/resources.rs | 13 +-
> server/src/api/subscriptions/mod.rs | 1199 +++++++++++++++++
> server/src/context.rs | 7 +
> ui/src/configuration/mod.rs | 2 +
> ui/src/configuration/subscription_keys.rs | 458 +++++++
> ui/src/configuration/subscription_registry.rs | 791 +++++++++++
> ui/src/dashboard/subscriptions_list.rs | 18 +-
> ui/src/main_menu.rs | 10 +
> 18 files changed, 3751 insertions(+), 36 deletions(-)
> create mode 100644 docs/subscription-registry.rst
> create mode 100644 lib/pdm-api-types/tests/test_import.rs
> create mode 100644 lib/pdm-config/src/subscriptions.rs
> create mode 100644 server/src/api/subscriptions/mod.rs
> create mode 100644 ui/src/configuration/subscription_keys.rs
> create mode 100644 ui/src/configuration/subscription_registry.rs
>
prev parent reply other threads:[~2026-05-15 7:48 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-07 8:26 [PATCH datacenter-manager v2 0/8] subscription: add central key pool registry with reissue support Thomas Lamprecht
2026-05-07 8:26 ` [PATCH datacenter-manager v2 1/8] api: subscription cache: ensure max_age=0 forces a fresh fetch Thomas Lamprecht
2026-05-07 13:23 ` Lukas Wagner
2026-05-08 12:43 ` applied: " Lukas Wagner
2026-05-07 8:26 ` [PATCH datacenter-manager v2 2/8] api types: subscription level: render full names Thomas Lamprecht
2026-05-07 13:23 ` Lukas Wagner
2026-05-07 8:26 ` [PATCH datacenter-manager v2 3/8] subscription: add key pool data model and config layer Thomas Lamprecht
2026-05-12 9:51 ` Lukas Wagner
2026-05-07 8:26 ` [PATCH datacenter-manager v2 4/8] subscription: add key pool and node status API endpoints Thomas Lamprecht
2026-05-07 13:23 ` Lukas Wagner
2026-05-12 12:21 ` Lukas Wagner
2026-05-07 8:26 ` [PATCH datacenter-manager v2 5/8] ui: add subscription registry with key pool and node status Thomas Lamprecht
2026-05-12 14:45 ` Lukas Wagner
2026-05-07 8:26 ` [PATCH datacenter-manager v2 6/8] cli: add subscription key pool management subcommands Thomas Lamprecht
2026-05-12 12:56 ` Lukas Wagner
2026-05-07 8:26 ` [PATCH datacenter-manager v2 7/8] docs: add subscription registry chapter Thomas Lamprecht
2026-05-07 8:26 ` [PATCH datacenter-manager v2 8/8] subscription: add Reissue Key action with pending-reissue queue Thomas Lamprecht
2026-05-12 13:57 ` Lukas Wagner
2026-05-07 8:34 ` [PATCH datacenter-manager v2 9/9] fixup! ui: add subscription registry with key pool and node status Thomas Lamprecht
2026-05-07 13:23 ` [PATCH datacenter-manager v2 0/8] subscription: add central key pool registry with reissue support Lukas Wagner
2026-05-15 7:48 ` Thomas Lamprecht [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5643ff88-45a3-4104-add3-ec57bf43ed03@proxmox.com \
--to=t.lamprecht@proxmox.com \
--cc=pdm-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox