From: Daniel Kral <d.kral@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH ha-manager v2 09/12] rules: allow same resources in node and resource affinity rules
Date: Fri, 1 Aug 2025 18:22:24 +0200 [thread overview]
Message-ID: <20250801162230.296214-10-d.kral@proxmox.com> (raw)
In-Reply-To: <20250801162230.296214-1-d.kral@proxmox.com>
In preparation of the next patch, remove the overly restrictive checker,
which disallows that resources are used in node affinity rules and
resource affinity rules at the same time.
Signed-off-by: Daniel Kral <d.kral@proxmox.com>
---
This could be squashed into the next, but I figured it's good measure
for documentation to have its own patch.
src/PVE/HA/Rules.pm | 70 -----------
.../multiple-resource-refs-in-rules.cfg | 52 --------
...multiple-resource-refs-in-rules.cfg.expect | 111 ------------------
3 files changed, 233 deletions(-)
delete mode 100644 src/test/rules_cfgs/multiple-resource-refs-in-rules.cfg
delete mode 100644 src/test/rules_cfgs/multiple-resource-refs-in-rules.cfg.expect
diff --git a/src/PVE/HA/Rules.pm b/src/PVE/HA/Rules.pm
index e2b77215..64dae1e4 100644
--- a/src/PVE/HA/Rules.pm
+++ b/src/PVE/HA/Rules.pm
@@ -475,74 +475,4 @@ sub get_next_ordinal : prototype($) {
return $current_order + 1;
}
-=head1 INTER-PLUGIN RULE CHECKERS
-
-=cut
-
-=head3 check_single_global_resource_reference($node_affinity_rules, $resource_affinity_rules)
-
-Returns all rules in C<$node_affinity_rules> and C<$resource_affinity_rules> as
-a list of lists, each consisting of the rule id and the resource id, where one
-of the resources is used in both a node affinity rule and resource affinity rule
-at the same time.
-
-If there are none, the returned list is empty.
-
-=cut
-
-sub check_single_global_resource_reference {
- my ($node_affinity_rules, $resource_affinity_rules) = @_;
-
- my @conflicts = ();
- my $resource_ruleids = {};
-
- while (my ($ruleid, $rule) = each %$node_affinity_rules) {
- for my $sid (keys $rule->{resources}->%*) {
- push $resource_ruleids->{$sid}->{node_affinity}->@*, $ruleid;
- }
- }
- while (my ($ruleid, $rule) = each %$resource_affinity_rules) {
- for my $sid (keys $rule->{resources}->%*) {
- push $resource_ruleids->{$sid}->{resource_affinity}->@*, $ruleid;
- }
- }
-
- for my $sid (keys %$resource_ruleids) {
- my $node_affinity_ruleids = $resource_ruleids->{$sid}->{node_affinity} // [];
- my $resource_affinity_ruleids = $resource_ruleids->{$sid}->{resource_affinity} // [];
-
- next if @$node_affinity_ruleids > 0 && !@$resource_affinity_ruleids;
- next if @$resource_affinity_ruleids > 0 && !@$node_affinity_ruleids;
-
- for my $ruleid (@$node_affinity_ruleids, @$resource_affinity_ruleids) {
- push @conflicts, [$ruleid, $sid];
- }
- }
-
- @conflicts = sort { $a->[0] cmp $b->[0] || $a->[1] cmp $b->[1] } @conflicts;
- return \@conflicts;
-}
-
-__PACKAGE__->register_check(
- sub {
- my ($args) = @_;
-
- return check_single_global_resource_reference(
- $args->{node_affinity_rules},
- $args->{resource_affinity_rules},
- );
- },
- sub {
- my ($conflicts, $errors) = @_;
-
- for my $conflict (@$conflicts) {
- my ($ruleid, $sid) = @$conflict;
-
- push $errors->{$ruleid}->{resources}->@*,
- "resource '$sid' cannot be used in both a node affinity rule"
- . " and a resource affinity rule at the same time";
- }
- },
-);
-
1;
diff --git a/src/test/rules_cfgs/multiple-resource-refs-in-rules.cfg b/src/test/rules_cfgs/multiple-resource-refs-in-rules.cfg
deleted file mode 100644
index 6608a5c3..00000000
--- a/src/test/rules_cfgs/multiple-resource-refs-in-rules.cfg
+++ /dev/null
@@ -1,52 +0,0 @@
-# Case 1: Do not remove node/resource affinity rules, which do not share resources between these types.
-node-affinity: different-resource1
- resources vm:101,vm:102,vm:103
- nodes node1,node2:2
- strict 0
-
-resource-affinity: different-resource2
- resources vm:104,vm:105
- affinity positive
-
-node-affinity: different-resource3
- resources vm:106
- nodes node1,node2:2
- strict 1
-
-resource-affinity: different-resource4
- resources vm:107,vm:109
- affinity negative
-
-# Case 2: Remove rules, which share the same resource(s) between different rule types.
-node-affinity: same-resource1
- resources vm:201
- nodes node1,node2:2
- strict 0
-
-resource-affinity: same-resource2
- resources vm:201,vm:205
- affinity negative
-
-resource-affinity: same-resource3
- resources vm:201,vm:203,vm:204
- affinity negative
-
-node-affinity: same-resource4
- resources vm:205,vm:206,vm:207
- nodes node1:2,node3:3
- strict 1
-
-# Case 3: Do not remove rules, which do not share resources between them.
-node-affinity: other-different-resource1
- resources vm:301,vm:308
- nodes node1,node2:2
- strict 0
-
-resource-affinity: other-different-resource2
- resources vm:302,vm:304,vm:305
- affinity positive
-
-node-affinity: other-different-resource3
- resources vm:303,vm:306,vm:309
- nodes node1,node2:2
- strict 1
diff --git a/src/test/rules_cfgs/multiple-resource-refs-in-rules.cfg.expect b/src/test/rules_cfgs/multiple-resource-refs-in-rules.cfg.expect
deleted file mode 100644
index 972c042d..00000000
--- a/src/test/rules_cfgs/multiple-resource-refs-in-rules.cfg.expect
+++ /dev/null
@@ -1,111 +0,0 @@
---- Log ---
-Drop rule 'same-resource1', because resource 'vm:201' cannot be used in both a node affinity rule and a resource affinity rule at the same time.
-Drop rule 'same-resource2', because resource 'vm:201' cannot be used in both a node affinity rule and a resource affinity rule at the same time.
-Drop rule 'same-resource2', because resource 'vm:205' cannot be used in both a node affinity rule and a resource affinity rule at the same time.
-Drop rule 'same-resource3', because resource 'vm:201' cannot be used in both a node affinity rule and a resource affinity rule at the same time.
-Drop rule 'same-resource4', because resource 'vm:205' cannot be used in both a node affinity rule and a resource affinity rule at the same time.
---- Config ---
-$VAR1 = {
- 'digest' => 'fcbdf84d442d38b4c901d989c211fb62024c5515',
- 'ids' => {
- 'different-resource1' => {
- 'nodes' => {
- 'node1' => {
- 'priority' => 0
- },
- 'node2' => {
- 'priority' => 2
- }
- },
- 'resources' => {
- 'vm:101' => 1,
- 'vm:102' => 1,
- 'vm:103' => 1
- },
- 'strict' => 0,
- 'type' => 'node-affinity'
- },
- 'different-resource2' => {
- 'affinity' => 'positive',
- 'resources' => {
- 'vm:104' => 1,
- 'vm:105' => 1
- },
- 'type' => 'resource-affinity'
- },
- 'different-resource3' => {
- 'nodes' => {
- 'node1' => {
- 'priority' => 0
- },
- 'node2' => {
- 'priority' => 2
- }
- },
- 'resources' => {
- 'vm:106' => 1
- },
- 'strict' => 1,
- 'type' => 'node-affinity'
- },
- 'different-resource4' => {
- 'affinity' => 'negative',
- 'resources' => {
- 'vm:107' => 1,
- 'vm:109' => 1
- },
- 'type' => 'resource-affinity'
- },
- 'other-different-resource1' => {
- 'nodes' => {
- 'node1' => {
- 'priority' => 0
- },
- 'node2' => {
- 'priority' => 2
- }
- },
- 'resources' => {
- 'vm:301' => 1,
- 'vm:308' => 1
- },
- 'strict' => 0,
- 'type' => 'node-affinity'
- },
- 'other-different-resource2' => {
- 'affinity' => 'positive',
- 'resources' => {
- 'vm:302' => 1,
- 'vm:304' => 1,
- 'vm:305' => 1
- },
- 'type' => 'resource-affinity'
- },
- 'other-different-resource3' => {
- 'nodes' => {
- 'node1' => {
- 'priority' => 0
- },
- 'node2' => {
- 'priority' => 2
- }
- },
- 'resources' => {
- 'vm:303' => 1,
- 'vm:306' => 1,
- 'vm:309' => 1
- },
- 'strict' => 1,
- 'type' => 'node-affinity'
- }
- },
- 'order' => {
- 'different-resource1' => 1,
- 'different-resource2' => 2,
- 'different-resource3' => 3,
- 'different-resource4' => 4,
- 'other-different-resource1' => 9,
- 'other-different-resource2' => 10,
- 'other-different-resource3' => 11
- }
- };
--
2.47.2
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next prev parent reply other threads:[~2025-08-01 16:22 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-01 16:22 [pve-devel] [PATCH ha-manager v2 00/12] HA rules follow up (part 1) Daniel Kral
2025-08-01 16:22 ` [pve-devel] [PATCH ha-manager v2 01/12] manager: fix ~revision version check for ha groups migration Daniel Kral
2025-08-01 16:22 ` [pve-devel] [PATCH ha-manager v2 02/12] test: ha tester: add ha groups migration tests with runtime upgrades Daniel Kral
2025-08-01 16:22 ` [pve-devel] [PATCH ha-manager v2 03/12] tree-wide: pass optional parameters as hash values for for_each_rule helper Daniel Kral
2025-08-01 16:22 ` [pve-devel] [PATCH ha-manager v2 04/12] api: rules: add missing return schema for the read_rule api endpoint Daniel Kral
2025-08-01 16:22 ` [pve-devel] [PATCH ha-manager v2 05/12] api: rules: ignore disable parameter if it is set to a falsy value Daniel Kral
2025-08-01 16:22 ` [pve-devel] [PATCH ha-manager v2 06/12] rules: resource affinity: make message in inter-consistency check clearer Daniel Kral
2025-08-01 16:22 ` [pve-devel] [PATCH ha-manager v2 07/12] config, manager: do not check ignored resources with affinity when migrating Daniel Kral
2025-08-01 16:22 ` [pve-devel] [PATCH ha-manager v2 08/12] rules: make positive affinity resources migrate on single resource fail Daniel Kral
2025-08-01 16:22 ` Daniel Kral [this message]
2025-08-01 16:22 ` [pve-devel] [PATCH ha-manager v2 10/12] rules: restrict inter-plugin resource references to simple cases Daniel Kral
2025-08-01 16:22 ` [pve-devel] [PATCH ha-manager v2 11/12] test: rules: add test cases for inter-plugin checks allowing simple use cases Daniel Kral
2025-08-01 16:22 ` [pve-devel] [PATCH ha-manager v2 12/12] test: ha tester: add resource affinity test cases mixed with node affinity rules Daniel Kral
2025-08-01 17:36 ` [pve-devel] applied: [PATCH ha-manager v2 00/12] HA rules follow up (part 1) Thomas Lamprecht
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=20250801162230.296214-10-d.kral@proxmox.com \
--to=d.kral@proxmox.com \
--cc=pve-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