[pve-devel] [PATCH qemu 3/3] add migration precondition api endpoint

Tim Marx t.marx at proxmox.com
Wed May 22 15:25:36 CEST 2019


Signed-off-by: Tim Marx <t.marx at proxmox.com>
---
 PVE/API2/Qemu.pm | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index fa4ff63..47dd2d4 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -3186,6 +3186,102 @@ my $check_vm_disks_local = sub {
 	    $local_disks->{$volid}->{volid} = $volid;
 	}
     });
+
+    return $local_disks;
+};
+
+__PACKAGE__->register_method({
+    name => 'migrate_vm_precondition',
+    path => '{vmid}/migrate',
+    method => 'GET',
+    protected => 1,
+    proxyto => 'node',
+    description => "Get preconditions for migration.",
+    permissions => {
+	check => ['perm', '/vms/{vmid}', [ 'VM.Migrate' ]],
+    },
+    parameters => {
+	additionalProperties => 0,
+	properties => {
+	    node => get_standard_option('pve-node'),
+	    vmid => get_standard_option('pve-vmid', { completion => \&PVE::QemuServer::complete_vmid }),
+	    target => get_standard_option('pve-node', {
+		description => "Target node.",
+		completion =>  \&PVE::Cluster::complete_migration_target,
+		optional => 1,
+	    }),
+	},
+    },
+    returns => {
+	type => "object",
+	properties => {
+	    running => { type => 'boolean' },
+	    allowed_nodes => {
+		type => 'array',
+		optional => 1,
+		description => "List nodes allowed for offline migration with same local storage as source node, only passed if VM is offline"
+	    },
+	    local_disks => {
+		type => 'array',
+		description => "List local disks including CD-Rom, unsused and not referenced disks"
+	    },
+	    local_resources => {
+		type => 'array',
+		description => "List local resources e.g. pci, usb"
+	    }
+	},
+    },
+    code => sub {
+	my ($param) = @_;
+
+	my $rpcenv = PVE::RPCEnvironment::get();
+
+	my $authuser = $rpcenv->get_user();
+
+	PVE::Cluster::check_cfs_quorum();
+
+	my $res = {};
+
+	my $vmid = extract_param($param, 'vmid');
+	my $target = extract_param($param, 'target');
+	my $localnode = PVE::INotify::nodename();
+
+
+	# test if VM exists
+	my $vmconf = PVE::QemuConfig->load_config($vmid);
+	my $storecfg = PVE::Storage::config();
+
+
+	# try to detect errors early
+	PVE::QemuConfig->check_lock($vmconf);
+
+	$res->{'running'} = PVE::QemuServer::check_running($vmid) ? 1:0;
+
+	# if vm is not running, return target nodes where local storage is available
+	# for offline migration
+	if (!$res->{'running'}) {
+	    my $shared_nodes = PVE::QemuServer::shared_nodes($vmconf, $storecfg);
+
+	    delete $shared_nodes->{$localnode} if $shared_nodes->{$localnode};
+
+	    my @allowed_nodes = keys %$shared_nodes;
+	    $res->{'allowed_nodes'} = \@allowed_nodes;
+	}
+
+
+	my $local_disks = &$check_vm_disks_local($storecfg, $vmconf, $vmid);
+	my @local_disks_array = values %$local_disks;
+	$res->{'local_disks'} = \@local_disks_array;
+
+	my $local_resources =  PVE::QemuServer::check_local_resources($vmconf, 1);
+
+	$res->{'local_resources'} = $local_resources;
+
+	return $res;
+
+
+    }});
+
 __PACKAGE__->register_method({
     name => 'migrate_vm',
     path => '{vmid}/migrate',
-- 
2.11.0




More information about the pve-devel mailing list