[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