[pve-devel] [PATCH qemu-server v3 1/1] api: migration preconditions: add checks for ha resource affinity rules

Daniel Kral d.kral at proxmox.com
Fri Jul 4 20:21:02 CEST 2025


Add information about positive and negative ha resource affinity rules,
which the VM is part of, to the migration precondition API endpoint.
These inform callees about any comigrated resources or blocking
resources that are caused by the resource affinity rules.

Signed-off-by: Daniel Kral <d.kral at proxmox.com>
---
 src/PVE/API2/Qemu.pm | 49 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/src/PVE/API2/Qemu.pm b/src/PVE/API2/Qemu.pm
index 2e6358e4..8a122cfb 100644
--- a/src/PVE/API2/Qemu.pm
+++ b/src/PVE/API2/Qemu.pm
@@ -5094,6 +5094,28 @@ __PACKAGE__->register_method({
                             description => 'A storage',
                         },
                     },
+                    'blocking-ha-resources' => {
+                        description => "HA resources, which are blocking the"
+                            . " VM from being migrated to the node.",
+                        type => 'array',
+                        optional => 1,
+                        items => {
+                            description => "A blocking HA resource",
+                            type => 'object',
+                            properties => {
+                                sid => {
+                                    type => 'string',
+                                    description => "The blocking HA resource id",
+                                },
+                                cause => {
+                                    type => 'string',
+                                    description => "The reason why the HA"
+                                        . " resource is blocking the migration.",
+                                    enum => ['resource-affinity'],
+                                },
+                            },
+                        },
+                    },
                 },
                 description => "List of not allowed nodes with additional information.",
             },
@@ -5146,6 +5168,17 @@ __PACKAGE__->register_method({
                 description =>
                     "Object of mapped resources with additional information such if they're live migratable.",
             },
+            'comigrated-ha-resources' => {
+                description => "HA resources, which will be migrated to the"
+                    . " same target node as the VM, because these are in"
+                    . " positive affinity with the VM.",
+                type => 'array',
+                optional => 1,
+                items => {
+                    type => 'string',
+                    description => "A comigrated HA resource",
+                },
+            },
         },
     },
     code => sub {
@@ -5186,6 +5219,14 @@ __PACKAGE__->register_method({
         my $storage_nodehash =
             PVE::QemuServer::check_local_storage_availability($vmconf, $storecfg);
 
+        my $comigrated_ha_resources = {};
+        my $blocking_ha_resources_by_node = {};
+
+        if (PVE::HA::Config::vm_is_ha_managed($vmid)) {
+            ($comigrated_ha_resources, $blocking_ha_resources_by_node) =
+                PVE::HA::Config::get_resource_motion_info("vm:$vmid");
+        }
+
         my $nodelist = PVE::Cluster::get_nodelist();
         for my $node ($nodelist->@*) {
             next if $node eq $localnode;
@@ -5202,6 +5243,12 @@ __PACKAGE__->register_method({
                     $missing_mappings;
             }
 
+            # extracting blocking resources for current node
+            if (my $blocking_ha_resources = $blocking_ha_resources_by_node->{$node}) {
+                $res->{not_allowed_nodes}->{$node}->{'blocking-ha-resources'} =
+                    $blocking_ha_resources;
+            }
+
             # if nothing came up, add it to the allowed nodes
             if (scalar($res->{not_allowed_nodes}->{$node}->%*) == 0) {
                 push $res->{allowed_nodes}->@*, $node;
@@ -5215,6 +5262,8 @@ __PACKAGE__->register_method({
         $res->{'mapped-resources'} = [sort keys $mapped_resources->%*];
         $res->{'mapped-resource-info'} = $mapped_resources;
 
+        $res->{'comigrated-ha-resources'} = $comigrated_ha_resources;
+
         return $res;
 
     },
-- 
2.39.5





More information about the pve-devel mailing list