Left 2 comments inline, just some minor nits.

On 7/4/25 20:16, Daniel Kral wrote:
> Migrate the currently configured groups to node affinity rules
> in-memory, so that they can be applied as such in the next patches and
> therefore replace HA groups internally.
> 
> HA node affinity rules in their initial implementation are designed to
> be as restrictive as HA groups, i.e. only allow a HA resource to be used
> in a single node affinity rule, to ease the migration between them.
> 
> HA groups map directly to node affinity rules, except that the
> 'restricted' property is renamed to 'strict' and that the 'failback'
> property is moved to the HA resources config.
> 
> The 'nofailback' property is moved to the HA resources config, because
> it allows users to set it more granularly for individual HA resources
> and allows the node affinity rules to be more extendible in the future,
> e.g. multiple node affinity rules for a single HA resource.
> 
> Signed-off-by: Daniel Kral <d.k...@proxmox.com>
> ---
>  src/PVE/HA/Config.pm  |  3 ++-
>  src/PVE/HA/Groups.pm  | 48 +++++++++++++++++++++++++++++++++++++++++++
>  src/PVE/HA/Manager.pm | 18 ++++++++++++++--
>  3 files changed, 66 insertions(+), 3 deletions(-)
> 
> diff --git a/src/PVE/HA/Config.pm b/src/PVE/HA/Config.pm
> index 7d071f3..424a6e1 100644
> --- a/src/PVE/HA/Config.pm
> +++ b/src/PVE/HA/Config.pm
> @@ -131,7 +131,8 @@ sub read_and_check_resources_config {
>          }
>      }
>  
> -    return $conf;
> +    # TODO PVE 10: Remove digest when HA groups have been fully migrated to 
> rules
> +    return wantarray ? ($conf, $res->{digest}) : $conf;
>  }
>  
>  sub update_resources_config {
> diff --git a/src/PVE/HA/Groups.pm b/src/PVE/HA/Groups.pm
> index 821d969..f065732 100644
> --- a/src/PVE/HA/Groups.pm
> +++ b/src/PVE/HA/Groups.pm
> @@ -6,6 +6,7 @@ use warnings;
>  use PVE::JSONSchema qw(get_standard_option);
>  use PVE::SectionConfig;
>  use PVE::HA::Tools;
> +use PVE::HA::Rules;
>  
>  use base qw(PVE::SectionConfig);
>  
> @@ -107,4 +108,51 @@ sub parse_section_header {
>  __PACKAGE__->register();
>  __PACKAGE__->init();
>  
> +# Migrate nofailback flag from $groups to $resources

nit: don't know if this comment is really necessary

> +sub migrate_groups_to_resources {
> +    my ($groups, $resources) = @_;
> +
> +    for my $sid (keys %$resources) {
> +        my $groupid = $resources->{$sid}->{group}
> +            or next; # skip resources without groups
> +
> +        $resources->{$sid}->{failback} = 
> !$groups->{ids}->{$groupid}->{nofailback};
> +    }
> +}
> +
> +# Migrate groups from groups from $groups and $resources to node affinity 
> rules in $rules

nit: same here. I also assume this should be "Migrate groups from
$groups and $resources..."?

> +sub migrate_groups_to_rules {
> +    my ($rules, $groups, $resources) = @_;
> +
> +    my $group_resources = {};
> +
> +    for my $sid (keys %$resources) {
> +        my $groupid = $resources->{$sid}->{group}
> +            or next; # skip resources without groups
> +
> +        $group_resources->{$groupid}->{$sid} = 1;
> +    }
> +
> +    while (my ($group, $resources) = each %$group_resources) {
> +        next if !$groups->{ids}->{$group}; # skip non-existant groups
> +
> +        my $new_ruleid = "ha-group-$group";
> +        my $nodes = {};
> +        for my $entry (keys $groups->{ids}->{$group}->{nodes}->%*) {
> +            my ($node, $priority) = 
> PVE::HA::Tools::parse_node_priority($entry);
> +
> +            $nodes->{$node} = { priority => $priority };
> +        }
> +
> +        $rules->{ids}->{$new_ruleid} = {
> +            type => 'node-affinity',
> +            resources => $resources,
> +            nodes => $nodes,
> +            strict => $groups->{ids}->{$group}->{restricted},
> +            comment => "Generated from HA group '$group'.",
> +        };
> +        $rules->{order}->{$new_ruleid} = 
> PVE::HA::Rules::get_next_ordinal($rules);
> +    }
> +}
> +
>  1;
> diff --git a/src/PVE/HA/Manager.pm b/src/PVE/HA/Manager.pm
> index 88ff4a6..148447d 100644
> --- a/src/PVE/HA/Manager.pm
> +++ b/src/PVE/HA/Manager.pm
> @@ -6,6 +6,7 @@ use warnings;
>  use Digest::MD5 qw(md5_base64);
>  
>  use PVE::Tools;
> +use PVE::HA::Groups;
>  use PVE::HA::Tools ':exit_codes';
>  use PVE::HA::NodeStatus;
>  use PVE::HA::Rules;
> @@ -47,6 +48,8 @@ sub new {
>          haenv => $haenv,
>          crs => {},
>          last_rules_digest => '',
> +        last_groups_digest => '',
> +        last_services_digest => '',
>      }, $class;
>  
>      my $old_ms = $haenv->read_manager_status();
> @@ -529,7 +532,7 @@ sub manage {
>  
>      $self->update_crs_scheduler_mode();
>  
> -    my $sc = $haenv->read_service_config();
> +    my ($sc, $services_digest) = $haenv->read_service_config();
>  
>      $self->{groups} = $haenv->read_group_config(); # update
>  
> @@ -564,7 +567,16 @@ sub manage {
>  
>      my $new_rules = $haenv->read_rules_config();
>  
> -    if ($new_rules->{digest} ne $self->{last_rules_digest}) {
> +    # TODO PVE 10: Remove group migration when HA groups have been fully 
> migrated to rules
> +    PVE::HA::Groups::migrate_groups_to_resources($self->{groups}, $sc);
> +
> +    if (
> +        !$self->{rules}
> +        || $new_rules->{digest} ne $self->{last_rules_digest}
> +        || $self->{groups}->{digest} ne $self->{last_groups_digest}
> +        || $services_digest && $services_digest ne 
> $self->{last_services_digest}
> +    ) {
> +        PVE::HA::Groups::migrate_groups_to_rules($new_rules, 
> $self->{groups}, $sc);
>  
>          my $messages = PVE::HA::Rules->canonicalize($new_rules);
>          $haenv->log('info', $_) for @$messages;
> @@ -572,6 +584,8 @@ sub manage {
>          $self->{rules} = $new_rules;
>  
>          $self->{last_rules_digest} = $self->{rules}->{digest};
> +        $self->{last_groups_digest} = $self->{groups}->{digest};
> +        $self->{last_services_digest} = $services_digest;
>      }
>  
>      $self->update_crm_commands();



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to