[pve-devel] [PATCH manager 1/3] add onlineonly and sharedonly to migrateall api call

Dominik Csapak d.csapak at proxmox.com
Thu Dec 1 17:21:40 CET 2016


this adds two optional filters to the migrateall api call:

onlineonly:

migrates only vms/ct which are online, ct now in restart mode

sharedonly:

migrates only vms/ct which have all disks/volumes/mp on shared storage
or marked as shared

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 PVE/API2/Nodes.pm | 35 ++++++++++++++++++++++++++++++-----
 1 file changed, 30 insertions(+), 5 deletions(-)

diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index 457263a..8fe825f 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -1211,11 +1211,17 @@ __PACKAGE__->register_method({
     }});
 
 my $get_start_stop_list = sub {
-    my ($nodename, $autostart) = @_;
+    my ($nodename, $autostart, $sharedonly) = @_;
 
     my $vmlist = PVE::Cluster::get_vmlist();
 
     my $resList = {};
+
+    # read storage config only one time
+    my $scfg;
+    if ($sharedonly) {
+	$scfg = PVE::Storage::config();
+    }
     foreach my $vmid (keys %{$vmlist->{ids}}) {
 	my $d = $vmlist->{ids}->{$vmid};
 	my $startup;
@@ -1228,12 +1234,15 @@ my $get_start_stop_list = sub {
 	    my $conf;
 	    if ($d->{type} eq 'lxc') {
 		$conf = PVE::LXC::Config->load_config($vmid);
+		return if $sharedonly && !PVE::LXC::Config->is_shared_only($conf, $scfg);
 	    } elsif ($d->{type} eq 'qemu') {
 		$conf = PVE::QemuConfig->load_config($vmid);
+		return if $sharedonly && !PVE::QemuConfig->is_shared_only($conf, $scfg);
 	    } else {
 		die "unknown VM type '$d->{type}'\n";
 	    }
 
+
 	    return if $autostart && !$conf->{onboot};
 
 	    if ($conf->{startup}) {
@@ -1493,16 +1502,22 @@ __PACKAGE__->register_method ({
     }});
 
 my $create_migrate_worker = sub {
-    my ($nodename, $type, $vmid, $target) = @_;
+    my ($nodename, $type, $vmid, $target, $onlineonly) = @_;
 
     my $upid;
     if ($type eq 'lxc') {
 	my $online = PVE::LXC::check_running($vmid) ? 1 : 0;
+
+	return undef if $onlineonly && !$online;
+
 	print STDERR "Migrating CT $vmid\n";
 	$upid = PVE::API2::LXC->migrate_vm({node => $nodename, vmid => $vmid, target => $target,
-					    online => $online });
+					    restart => $online });
     } elsif ($type eq 'qemu') {
 	my $online = PVE::QemuServer::check_running($vmid, 1) ? 1 : 0;
+
+	return undef if $onlineonly && !$online;
+
 	print STDERR "Migrating VM $vmid\n";
 	$upid = PVE::API2::Qemu->migrate_vm({node => $nodename, vmid => $vmid, target => $target,
 					     online => $online });
@@ -1538,6 +1553,16 @@ __PACKAGE__->register_method ({
                 type => 'integer',
                 minimum => 1
             },
+	    sharedonly => {
+		description => "Migrate only those guests with only shared storage",
+		optional => 1,
+		type => 'boolean'
+	    },
+	    onlineonly => {
+		description => "Migrate only those guests with only shared storage",
+		optional => 1,
+		type => 'boolean'
+	    },
 	},
     },
     returns => {
@@ -1563,7 +1588,7 @@ __PACKAGE__->register_method ({
 
 	    $rpcenv->{type} = 'priv'; # to start tasks in background
 
-	    my $migrateList = &$get_start_stop_list($nodename);
+	    my $migrateList = &$get_start_stop_list($nodename, undef, $param->{sharedonly});
 
 	    foreach my $order (sort {$b <=> $a} keys %$migrateList) {
 		my $vmlist = $migrateList->{$order};
@@ -1571,7 +1596,7 @@ __PACKAGE__->register_method ({
 		foreach my $vmid (sort {$b <=> $a} keys %$vmlist) {
 		    my $d = $vmlist->{$vmid};
 		    my $pid;
-		    eval { $pid = &$create_migrate_worker($nodename, $d->{type}, $vmid, $target); };
+		    eval { $pid = &$create_migrate_worker($nodename, $d->{type}, $vmid, $target, $param->{onlineonly}); };
 		    warn $@ if $@;
 		    next if !$pid;
 
-- 
2.1.4





More information about the pve-devel mailing list