From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id D8AE71FF141 for ; Tue, 02 Jun 2026 12:03:41 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 2C898E4B3; Tue, 2 Jun 2026 12:03:10 +0200 (CEST) From: Daniel Kral To: pve-devel@lists.proxmox.com Subject: [PATCH-SERIES docs/ha-manager/manager v2 00/12] Negative Node Affinity Rules Date: Tue, 2 Jun 2026 12:01:04 +0200 Message-ID: <20260602100226.180071-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: 1780394515167 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.075 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 URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [proxmox.com,hashtools.pm,rules.pm,resourceaffinity.pm,nodeaffinity.pm,groups.pm] Message-ID-Hash: 5LB5TFTRR2N26OWLBU7UPUBFNLGHIFOI X-Message-ID-Hash: 5LB5TFTRR2N26OWLBU7UPUBFNLGHIFOI 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: RFC v1: https://lore.proxmox.com/pve-devel/20251219133643.295514-1-d.kral@proxmox.com/ changes since v1: - rebase on master - add documentation - add web interface integration - disallow node priorities by satisfiability check (Thanks @Fiona!) - disallow all cluster nodes in negative node affinity rules - make the code clearer (Thanks @Fiona!) Patches have been tested in a real cluster and patches have been tested with `git rebase master --exec 'make clean && make deb'`. For larger HA clusters, specifying the nodes in simple* node affinity rules as opt-out (negative) instead of opt-in (positive) can make the rule set easier to follow and implement by users. * simple = without priority groups There's no web interface integration yet, because I'm not entirely sure yet how to integrate it with the concept of priority groups for positive node affinity rules, which do not make sense in this context as the specified nodes will be removed from the effective node set. As the conversion is pretty straightforward, we could even allow users to convert between positive and negative node affinity rules (e.g. when switching the affinity type in the web interface?). Negative node affinity rules can be declared manually in the rules.cfg now with these two small patches: node-affinity: ha-rule-name affinity negative nodes node1,node2 resources vm:100,vm:101 In a cluster with node1,...,node5 this will result in the identical positive node affinity rule: node-affinity: ha-rule-name-dual affinity positive nodes node3,node4,node5 resources vm:100,vm:101 ha-manager: Daniel Kral (3): rules: node affinity: add affinity property to node affinity rules rules: rename ambiguous argument nodes to cluster nodes rules: node affinity: implement negative node affinity rules src/PVE/HA/Groups.pm | 1 + src/PVE/HA/HashTools.pm | 20 ++ src/PVE/HA/Rules.pm | 39 ++-- src/PVE/HA/Rules/NodeAffinity.pm | 171 +++++++++++++++++- src/PVE/HA/Rules/ResourceAffinity.pm | 17 +- .../defaults-for-node-affinity-rules.cfg | 23 ++- ...efaults-for-node-affinity-rules.cfg.expect | 62 ++++++- ...nt-node-resource-affinity-rules.cfg.expect | 3 + ...effective-negative-node-affinity-rules.cfg | 12 ++ ...ve-negative-node-affinity-rules.cfg.expect | 17 ++ ...ositive-resource-affinity-rules.cfg.expect | 4 + ...ty-with-resource-affinity-rules.cfg.expect | 2 + ...rce-refs-in-node-affinity-rules.cfg.expect | 3 + ...iority-in-negative-node-affinity-rules.cfg | 11 ++ ...in-negative-node-affinity-rules.cfg.expect | 45 +++++ 15 files changed, 397 insertions(+), 33 deletions(-) create mode 100644 src/test/rules_cfgs/ineffective-negative-node-affinity-rules.cfg create mode 100644 src/test/rules_cfgs/ineffective-negative-node-affinity-rules.cfg.expect create mode 100644 src/test/rules_cfgs/node-priority-in-negative-node-affinity-rules.cfg create mode 100644 src/test/rules_cfgs/node-priority-in-negative-node-affinity-rules.cfg.expect base-commit: ecaa0330ee6ab576856082c7f944feef4a14a3e0 manager: Daniel Kral (5): ui: ha: node affinity: handle non-existent nodes ui: ha: node affinity: do update node selection all at once ui: ha: node affinity: move node priority selector into separate component ui: ha: node affinity: allow setting affinity for node affinity rules ui: ha: node affinity: do not send default node affinity rule values www/manager6/Makefile | 1 + www/manager6/ha/NodePrioritySelector.js | 228 ++++++++++++++++++ www/manager6/ha/rules/NodeAffinityRuleEdit.js | 157 +++--------- www/manager6/ha/rules/NodeAffinityRules.js | 5 + 4 files changed, 273 insertions(+), 118 deletions(-) create mode 100644 www/manager6/ha/NodePrioritySelector.js base-commit: 0eca62095a62a740401db796056892cf3d65e70e prerequisite-patch-id: 4d56fc30265d266904dbe5bbbe2ddca6f27504e6 prerequisite-patch-id: ebc40a1e1c303b92895a03fdda36a934ad76f1f8 docs: Daniel Kral (4): ha-manager: rules: use the correct article for terms starting with HA ha-manager: rules: improve resource affinity rule short description ha-manager: rules: adapt rule configuration examples ha-manager: rules: add negative node affinity rule descriptions ha-manager.adoc | 77 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 24 deletions(-) Summary over all repositories: 20 files changed, 723 insertions(+), 175 deletions(-) -- Generated by murpp 0.12.0