From: David Riley <d.riley@proxmox.com>
To: Daniel Kral <d.kral@proxmox.com>, pve-devel@lists.proxmox.com
Subject: Re: [PATCH ha-manager v2 02/12] rules: rename ambiguous argument nodes to cluster nodes
Date: Mon, 13 Jul 2026 14:41:29 +0200 [thread overview]
Message-ID: <9b5d0cf3-18f5-4012-9922-5420409d2af2@proxmox.com> (raw)
In-Reply-To: <20260602100226.180071-3-d.kral@proxmox.com>
Looks good to me.
Consider this:
Reviewed-by: David Riley <d.riley@proxmox.com>
On 6/2/26 12:03 PM, Daniel Kral wrote:
> Rename any argument instances, which expects a list of currently
> configured cluster nodes. This reduces the ambiguity which node list
> should be supplied.
>
> Furthermore, rename the global rule checker property 'nodes' to
> 'cluster-nodes' as well for the same reason.
>
> Signed-off-by: Daniel Kral<d.kral@proxmox.com>
> ---
> changes since v1:
> - new! (prep for using 'cluster-nodes' in transform as well)
>
> src/PVE/HA/Rules.pm | 37 ++++++++++++++--------------
> src/PVE/HA/Rules/NodeAffinity.pm | 4 +--
> src/PVE/HA/Rules/ResourceAffinity.pm | 17 +++++++------
> 3 files changed, 30 insertions(+), 28 deletions(-)
>
> diff --git a/src/PVE/HA/Rules.pm b/src/PVE/HA/Rules.pm
> index 3a14eeb3..2b48cb60 100644
> --- a/src/PVE/HA/Rules.pm
> +++ b/src/PVE/HA/Rules.pm
> @@ -385,13 +385,14 @@ sub get_check_arguments {
> return $global_args;
> }
>
> -=head3 $class->check_feasibility($rules, $nodes)
> +=head3 $class->check_feasibility($rules, $cluster_nodes)
>
> Checks whether the given C<$rules> are feasible by running all checks, which
> were registered with C<L<< register_check()|/$class->register_check(...) >>>,
> and returns a hash map of erroneous rules.
>
> -C<$nodes> is a list of the configured cluster nodes.
> +C<$cluster_nodes> is a list of the configured cluster nodes, which is added as
> +an argument for the registered rule feasibility checkers.
>
> The checks are run in the order in which the rule plugins were registered,
> while global checks, i.e. checks between different rule types, are run at the
> @@ -400,14 +401,14 @@ very last.
> =cut
>
> sub check_feasibility {
> - my ($class, $rules, $nodes) = @_;
> + my ($class, $rules, $cluster_nodes) = @_;
>
> my $global_errors = {};
> my $removable_ruleids = [];
>
> my $global_args = $class->get_check_arguments($rules);
>
> - $global_args->{nodes} = $nodes;
> + $global_args->{'cluster-nodes'} = $cluster_nodes;
>
> for my $type (@$types, 'global') {
> for my $entry (@{ $checkdef->{$type} }) {
> @@ -421,11 +422,11 @@ sub check_feasibility {
> return $global_errors;
> }
>
> -=head3 $class->transform($rules, $nodes)
> +=head3 $class->transform($rules, $cluster_nodes)
>
> Modifies C<$rules> to contain only feasible rules.
>
> -C<$nodes> is a list of the configured cluster nodes.
> +C<$cluster_nodes> is a list of the configured cluster nodes.
>
> This is done by running all checks, which were registered with
> C<L<< register_check()|/$class->register_check(...) >>> and removing any
> @@ -438,10 +439,10 @@ Returns a list of messages with the reasons why rules were removed.
> =cut
>
> sub transform {
> - my ($class, $rules, $nodes) = @_;
> + my ($class, $rules, $cluster_nodes) = @_;
>
> my $messages = [];
> - my $global_errors = $class->check_feasibility($rules, $nodes);
> + my $global_errors = $class->check_feasibility($rules, $cluster_nodes);
>
> for my $ruleid (keys %$global_errors) {
> delete $rules->{ids}->{$ruleid};
> @@ -469,33 +470,33 @@ sub transform {
>
> =head3 $class->plugin_compile(...)
>
> -=head3 $class->plugin_compile($rules, $nodes)
> +=head3 $class->plugin_compile($rules, $cluster_nodes)
>
> B<MANDATORY:> Must be implemented in a I<rule plugin>.
>
> -Called in C<$class->compile($rules, $nodes)> in order to get a more compact
> -representation of the rule plugin's rules in C<$rules>, which holds only the
> -relevant information for the scheduler and other users.
> +Called in C<$class->compile($rules, $cluster_nodes)> in order to get a more
> +compact representation of the rule plugin's rules in C<$rules>, which holds only
> +the relevant information for the scheduler and other users.
>
> -C<$nodes> is a list of the configured cluster nodes.
> +C<$cluster_nodes> is a list of the configured cluster nodes.
>
> =cut
>
> sub plugin_compile {
> - my ($class, $rules, $nodes) = @_;
> + my ($class, $rules, $cluster_nodes) = @_;
>
> die "implement in subclass";
> }
>
> =head3 $class->compile(...)
>
> -=head3 $class->compile($rules, $nodes)
> +=head3 $class->compile($rules, $cluster_nodes)
>
> Compiles and returns a hash, where each key-value pair represents a rule
> plugin's more compact representation compiled from the more verbose rules
> defined in C<$rules>.
>
> -C<$nodes> is a list of the configured cluster nodes.
> +C<$cluster_nodes> is a list of the configured cluster nodes.
>
> The transformation to the compact representation for each rule plugin is
> implemented in C<L<< plugin_compile()|/$class->plugin_compile(...) >>>.
> @@ -503,13 +504,13 @@ implemented in C<L<< plugin_compile()|/$class->plugin_compile(...) >>>.
> =cut
>
> sub compile {
> - my ($class, $rules, $nodes) = @_;
> + my ($class, $rules, $cluster_nodes) = @_;
>
> my $compiled_rules = {};
>
> for my $type (@$types) {
> my $plugin = $class->lookup($type);
> - my $compiled_plugin_rules = $plugin->plugin_compile($rules, $nodes);
> + my $compiled_plugin_rules = $plugin->plugin_compile($rules, $cluster_nodes);
>
> die "plugin_compile(...) of type '$type' must return hash reference\n"
> if ref($compiled_plugin_rules) ne 'HASH';
> diff --git a/src/PVE/HA/Rules/NodeAffinity.pm b/src/PVE/HA/Rules/NodeAffinity.pm
> index 1f15ae2d..5d4401f6 100644
> --- a/src/PVE/HA/Rules/NodeAffinity.pm
> +++ b/src/PVE/HA/Rules/NodeAffinity.pm
> @@ -165,7 +165,7 @@ sub get_plugin_check_arguments {
> }
>
> sub plugin_compile {
> - my ($class, $rules, $nodes) = @_;
> + my ($class, $rules, $cluster_nodes) = @_;
>
> my $node_affinity = {};
>
> @@ -178,7 +178,7 @@ sub plugin_compile {
>
> # add remaining nodes with low priority for non-strict node affinity
> if (!$rule->{strict}) {
> - for my $node (@$nodes) {
> + for my $node (@$cluster_nodes) {
> next if defined($effective_nodes->{$node});
>
> $effective_nodes->{$node} = { priority => -1 };
> diff --git a/src/PVE/HA/Rules/ResourceAffinity.pm b/src/PVE/HA/Rules/ResourceAffinity.pm
> index 474d3000..6c43d5ff 100644
> --- a/src/PVE/HA/Rules/ResourceAffinity.pm
> +++ b/src/PVE/HA/Rules/ResourceAffinity.pm
> @@ -102,7 +102,7 @@ sub get_plugin_check_arguments {
> }
>
> sub plugin_compile {
> - my ($class, $rules, $nodes) = @_;
> + my ($class, $rules, $cluster_nodes) = @_;
>
> my $positive = {};
> my $negative = {};
> @@ -173,23 +173,24 @@ __PACKAGE__->register_check(
> },
> );
>
> -=head3 check_negative_resource_affinity_resources_count($negative_rules, $nodes)
> +=head3 check_negative_resource_affinity_resources_count($negative_rules, $cluster_nodes)
>
> Returns a list of negative resource affinity rule ids, defined in
> -C<$negative_rules>, which do have more resources defined than available according
> -to the node list C<$nodes>, i.e., there are not enough nodes to separate the
> -resources on, even if all nodes are available.
> +C<$negative_rules>, which do have more resources defined than available
> +according to the currently configured cluster node list C<$cluster_nodes>, i.e.,
> +there are not enough nodes to separate the resources on, even if all nodes are
> +available.
>
> If there are none, the returned list is empty.
>
> =cut
>
> sub check_negative_resource_affinity_resources_count {
> - my ($negative_rules, $nodes) = @_;
> + my ($negative_rules, $cluster_nodes) = @_;
>
> my @conflicts = ();
>
> - my $total_node_count = @$nodes;
> + my $total_node_count = @$cluster_nodes;
>
> while (my ($negativeid, $negative_rule) = each %$negative_rules) {
> push @conflicts, $negativeid if keys $negative_rule->{resources}->%* > $total_node_count;
> @@ -205,7 +206,7 @@ __PACKAGE__->register_check(
>
> return check_negative_resource_affinity_resources_count(
> $args->{negative_rules},
> - $args->{nodes},
> + $args->{'cluster-nodes'},
> );
> },
> sub {
next prev parent reply other threads:[~2026-07-13 12:41 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-02 10:01 [PATCH-SERIES docs/ha-manager/manager v2 00/12] Negative Node Affinity Rules Daniel Kral
2026-06-02 10:01 ` [PATCH ha-manager v2 01/12] rules: node affinity: add affinity property to node affinity rules Daniel Kral
2026-06-02 10:01 ` [PATCH ha-manager v2 02/12] rules: rename ambiguous argument nodes to cluster nodes Daniel Kral
2026-07-13 12:41 ` David Riley [this message]
2026-06-02 10:01 ` [PATCH ha-manager v2 03/12] rules: node affinity: implement negative node affinity rules Daniel Kral
2026-07-13 12:43 ` David Riley
2026-07-14 7:36 ` Daniel Kral
2026-06-02 10:01 ` [PATCH manager v2 04/12] ui: ha: node affinity: handle non-existent nodes Daniel Kral
2026-06-02 10:01 ` [PATCH manager v2 05/12] ui: ha: node affinity: do update node selection all at once Daniel Kral
2026-06-02 10:01 ` [PATCH manager v2 06/12] ui: ha: node affinity: move node priority selector into separate component Daniel Kral
2026-07-13 12:43 ` David Riley
2026-07-14 7:57 ` Daniel Kral
2026-07-14 8:51 ` David Riley
2026-06-02 10:01 ` [PATCH manager v2 07/12] ui: ha: node affinity: allow setting affinity for node affinity rules Daniel Kral
2026-07-13 12:43 ` David Riley
2026-07-14 8:39 ` Daniel Kral
2026-06-02 10:01 ` [PATCH manager v2 08/12] ui: ha: node affinity: do not send default node affinity rule values Daniel Kral
2026-07-13 12:43 ` David Riley
2026-06-02 10:01 ` [PATCH docs v2 09/12] ha-manager: rules: use the correct article for terms starting with HA Daniel Kral
2026-07-13 12:43 ` David Riley
2026-06-02 10:01 ` [PATCH docs v2 10/12] ha-manager: rules: improve resource affinity rule short description Daniel Kral
2026-07-13 12:44 ` David Riley
2026-06-02 10:01 ` [PATCH docs v2 11/12] ha-manager: rules: adapt rule configuration examples Daniel Kral
2026-07-13 12:44 ` David Riley
2026-06-02 10:01 ` [PATCH docs v2 12/12] ha-manager: rules: add negative node affinity rule descriptions Daniel Kral
2026-07-13 12:44 ` David Riley
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=9b5d0cf3-18f5-4012-9922-5420409d2af2@proxmox.com \
--to=d.riley@proxmox.com \
--cc=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