From 88fc87b467a55056278dffe8a522cc6f17a0e107 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Tue, 27 Mar 2012 10:37:39 +0200 Subject: [PATCH] fix bug #97: execute 'clusvcadm' commands for HA managed VMs --- Makefile | 2 +- PVE/API2/Qemu.pm | 120 ++++++++++++++++++++++++++++++++++++----------- changelog.Debian | 6 +++ 3 files changed, 100 insertions(+), 28 deletions(-) diff --git a/Makefile b/Makefile index a1ad6f9..ce08549 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ RELEASE=2.0 VERSION=2.0 PACKAGE=qemu-server -PKGREL=28 +PKGREL=29 DESTDIR= PREFIX=/usr diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm index 4978fb3..001344a 100644 --- a/PVE/API2/Qemu.pm +++ b/PVE/API2/Qemu.pm @@ -1089,6 +1089,16 @@ __PACKAGE__->register_method({ return $res; }}); +my $vm_is_ha_managed = sub { + my ($vmid) = @_; + + my $cc = PVE::Cluster::cfs_read_file('cluster.conf'); + if (PVE::Cluster::cluster_conf_lookup_pvevm($cc, 0, $vmid, 1)) { + return 1; + } + return 0; +}; + __PACKAGE__->register_method({ name => 'vm_status', path => '{vmid}/status/current', @@ -1116,12 +1126,7 @@ __PACKAGE__->register_method({ my $vmstatus = PVE::QemuServer::vmstatus($param->{vmid}); my $status = $vmstatus->{$param->{vmid}}; - my $cc = PVE::Cluster::cfs_read_file('cluster.conf'); - if (PVE::Cluster::cluster_conf_lookup_pvevm($cc, 0, $param->{vmid}, 1)) { - $status->{ha} = 1; - } else { - $status->{ha} = 0; - } + $status->{ha} = &$vm_is_ha_managed($param->{vmid}); return $status; }}); @@ -1169,17 +1174,38 @@ __PACKAGE__->register_method({ my $storecfg = PVE::Storage::config(); - my $realcmd = sub { - my $upid = shift; + if (&$vm_is_ha_managed($vmid)) { - syslog('info', "start VM $vmid: $upid\n"); + my $hacmd = sub { + my $upid = shift; - PVE::QemuServer::vm_start($storecfg, $vmid, $stateuri, $skiplock); + my $service = "pvevm:$vmid"; - return; - }; + my $cmd = ['clusvcadm', '-e', $service, '-m', $node]; + + print "Executing HA start for VM $vmid\n"; + + PVE::Tools::run_command($cmd); + + return; + }; + + return $rpcenv->fork_worker('hastart', $vmid, $authuser, $hacmd); + + } else { + + my $realcmd = sub { + my $upid = shift; + + syslog('info', "start VM $vmid: $upid\n"); + + PVE::QemuServer::vm_start($storecfg, $vmid, $stateuri, $skiplock); + + return; + }; - return $rpcenv->fork_worker('qmstart', $vmid, $authuser, $realcmd); + return $rpcenv->fork_worker('qmstart', $vmid, $authuser, $realcmd); + } }}); __PACKAGE__->register_method({ @@ -1236,18 +1262,38 @@ __PACKAGE__->register_method({ my $storecfg = PVE::Storage::config(); - my $realcmd = sub { - my $upid = shift; + if (&$vm_is_ha_managed($vmid)) { - syslog('info', "stop VM $vmid: $upid\n"); + my $hacmd = sub { + my $upid = shift; - PVE::QemuServer::vm_stop($storecfg, $vmid, $skiplock, 0, - $param->{timeout}, 0, 1, $keepActive); + my $service = "pvevm:$vmid"; - return; - }; + my $cmd = ['clusvcadm', '-d', $service]; + + print "Executing HA stop for VM $vmid\n"; + + PVE::Tools::run_command($cmd); - return $rpcenv->fork_worker('qmstop', $vmid, $authuser, $realcmd); + return; + }; + + return $rpcenv->fork_worker('hastop', $vmid, $authuser, $hacmd); + + } else { + my $realcmd = sub { + my $upid = shift; + + syslog('info', "stop VM $vmid: $upid\n"); + + PVE::QemuServer::vm_stop($storecfg, $vmid, $skiplock, 0, + $param->{timeout}, 0, 1, $keepActive); + + return; + }; + + return $rpcenv->fork_worker('qmstop', $vmid, $authuser, $realcmd); + } }}); __PACKAGE__->register_method({ @@ -1585,15 +1631,35 @@ __PACKAGE__->register_method({ if !$param->{online}; } - my $realcmd = sub { - my $upid = shift; + if (&$vm_is_ha_managed($vmid)) { - PVE::QemuMigrate->migrate($target, $targetip, $vmid, $param); - }; + my $hacmd = sub { + my $upid = shift; - my $upid = $rpcenv->fork_worker('qmigrate', $vmid, $authuser, $realcmd); + my $service = "pvevm:$vmid"; + + my $cmd = ['clusvcadm', '-M', $service, '-m', $target]; + + print "Executing HA migrate for VM $vmid to node $target\n"; + + PVE::Tools::run_command($cmd); + + return; + }; + + return $rpcenv->fork_worker('hamigrate', $vmid, $authuser, $hacmd); + + } else { + + my $realcmd = sub { + my $upid = shift; + + PVE::QemuMigrate->migrate($target, $targetip, $vmid, $param); + }; + + return $rpcenv->fork_worker('qmigrate', $vmid, $authuser, $realcmd); + } - return $upid; }}); __PACKAGE__->register_method({ diff --git a/changelog.Debian b/changelog.Debian index 3aa308c..13de167 100644 --- a/changelog.Debian +++ b/changelog.Debian @@ -1,3 +1,9 @@ +qemu-server (2.0-29) unstable; urgency=low + + * fix bug #97: execute 'clusvcadm' commands for HA managed VMs + + -- Proxmox Support Team Tue, 27 Mar 2012 10:36:23 +0200 + qemu-server (2.0-28) unstable; urgency=low * use Digest::SHA instead of Digest::SHA1 -- 2.39.2