From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 67B731FF133 for ; Mon, 11 May 2026 11:49:17 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 872DD115C4; Mon, 11 May 2026 11:48:02 +0200 (CEST) From: Daniel Kral To: pve-devel@lists.proxmox.com Subject: [PATCH-SERIES container/ha-manager/manager/qemu-server v3 00/17] HA node affinity blockers (#1497) Date: Mon, 11 May 2026 11:46:21 +0200 Message-ID: <20260511094707.142930-1-d.kral@proxmox.com> X-Mailer: git-send-email 2.47.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1778492722742 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.077 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: T2DBQJTYTY6N37GPFDKHWHOIOWRQOD5T X-Message-ID-Hash: T2DBQJTYTY6N37GPFDKHWHOIOWRQOD5T X-MailFrom: d.kral@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: v1: https://lore.proxmox.com/pve-devel/20251215155334.476984-1-d.kral@proxmox.com/ v2: https://lore.proxmox.com/pve-devel/20260120152755.499037-1-d.kral@proxmox.com/ Changes v2 -> v3: - rebase on master (relevant: {dis,}arm-ha and load balancer) - add 'fix #1497' prefix to relevant patches - add patch to make service config hash global and remove a duplicate service config read from the Manager class Changes v1 -> v2 (Thanks @Fiona!): - rebase on master - fix initial node assignments in test case descriptions - make get_resource_motion_info(...) only read files once (introducing 3 additional patches) Tested changes with strict & non-strict HA node affinity rules and manual migrations (in the CLI & web interface) as well as failback set and cleared and ran `git rebase master --exec 'make clean && make deb' and `make tidy` on all repositories. If pve-ha-manager is applied but not the other packages, it might show that the HA resource cannot be moved because of resource affinity rules, which is wrong though. So it might be nice to have a version bump here. This patch series implements node affinity rule migration blockers similar to the blockers introduced with resource affinity rules. The node affinity rule migraton blockers prevent users from migrating HA resources to nodes, which would make them migrate somewhere else immediately afterwards. This includes: - online nodes, which are not part of the strict node affinity rule's allowed node set at all, or - if the HA resource has failback set, online nodes, which are not in the currently highest priority group of the strict or non-strict node affinity rule. The first few patches are some overall cleanup for things the series touches + deduplicating the resource_motion_info logic and sharing it between the Manager and the public PVE::HA::Config::get_resource_motion_info(...), as well as exposing these in the relevant VM/LXC API handlers and web interface. ha-manager: Daniel Kral (14): ha: put source files on individual new lines d/pve-ha-manager.install: remove duplicate Config.pm config: group and sort use statements manager: group and sort use statements manager: report all reasons when resources are blocked from migration config, manager: factor out resource motion info logic tests: add test cases for migrating resources with node affinity rules fix #1497: handle strict node affinity rules in manual migrations config: improve variable names in read_and_check_resources_config config: factor out checked_resources_config helper manager: store global reference to service config hash manager: remove duplicate service config read in update_crm_commands fix #1497: handle node affinity rules with failback in manual migrations config: remove duplicate config reads in get_resource_motion_info debian/pve-ha-manager.install | 2 +- src/PVE/API2/HA/Resources.pm | 4 +- src/PVE/CLI/ha_manager.pm | 14 +-- src/PVE/HA/Config.pm | 88 ++++++++----------- src/PVE/HA/Helpers.pm | 63 +++++++++++++ src/PVE/HA/Makefile | 16 +++- src/PVE/HA/Manager.pm | 72 ++++++++------- .../test-node-affinity-nonstrict1/log.expect | 16 +--- src/test/test-node-affinity-nonstrict7/README | 9 ++ .../test-node-affinity-nonstrict7/cmdlist | 9 ++ .../hardware_status | 5 ++ .../test-node-affinity-nonstrict7/log.expect | 65 ++++++++++++++ .../manager_status | 1 + .../rules_config | 7 ++ .../service_config | 4 + .../test-node-affinity-strict1/log.expect | 16 +--- .../test-node-affinity-strict2/log.expect | 16 +--- src/test/test-node-affinity-strict7/README | 9 ++ src/test/test-node-affinity-strict7/cmdlist | 9 ++ .../hardware_status | 5 ++ .../test-node-affinity-strict7/log.expect | 51 +++++++++++ .../test-node-affinity-strict7/manager_status | 1 + .../test-node-affinity-strict7/rules_config | 9 ++ .../test-node-affinity-strict7/service_config | 4 + src/test/test-recovery4/log.expect | 2 +- 25 files changed, 355 insertions(+), 142 deletions(-) create mode 100644 src/PVE/HA/Helpers.pm create mode 100644 src/test/test-node-affinity-nonstrict7/README create mode 100644 src/test/test-node-affinity-nonstrict7/cmdlist create mode 100644 src/test/test-node-affinity-nonstrict7/hardware_status create mode 100644 src/test/test-node-affinity-nonstrict7/log.expect create mode 100644 src/test/test-node-affinity-nonstrict7/manager_status create mode 100644 src/test/test-node-affinity-nonstrict7/rules_config create mode 100644 src/test/test-node-affinity-nonstrict7/service_config create mode 100644 src/test/test-node-affinity-strict7/README create mode 100644 src/test/test-node-affinity-strict7/cmdlist create mode 100644 src/test/test-node-affinity-strict7/hardware_status create mode 100644 src/test/test-node-affinity-strict7/log.expect create mode 100644 src/test/test-node-affinity-strict7/manager_status create mode 100644 src/test/test-node-affinity-strict7/rules_config create mode 100644 src/test/test-node-affinity-strict7/service_config qemu-server: Daniel Kral (1): api: migration preconditions: add node affinity as blocking cause src/PVE/API2/Qemu.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) container: Daniel Kral (1): api: migration preconditions: add node affinity as blocking cause src/PVE/API2/LXC.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) manager: Daniel Kral (1): ui: migrate: display precondition messages for ha node affinity www/manager6/window/Migrate.js | 10 ++++++++++ 1 file changed, 10 insertions(+) Summary over all repositories: 28 files changed, 367 insertions(+), 144 deletions(-) -- Generated by murpp 0.11.0