[pve-devel] [RFC v3 pve-ha-manager 3/4] Replacing hardcoded qemu commands with plugin calls

Thomas Lamprecht t.lamprecht at proxmox.com
Wed Sep 2 17:52:32 CEST 2015


Now a service specific plugin gets loaded and the calls to commands
like 'migrate' or 'stop' will be handled by the plugin.

Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---
 src/PVE/HA/Env/PVE2.pm | 94 ++++++++++++++++++++++----------------------------
 1 file changed, 41 insertions(+), 53 deletions(-)

diff --git a/src/PVE/HA/Env/PVE2.pm b/src/PVE/HA/Env/PVE2.pm
index 4193f49..2df80ab 100644
--- a/src/PVE/HA/Env/PVE2.pm
+++ b/src/PVE/HA/Env/PVE2.pm
@@ -16,8 +16,6 @@ use PVE::HA::Tools;
 use PVE::HA::Env;
 use PVE::HA::Config;
 
-use PVE::QemuServer;
-use PVE::API2::Qemu;
 
 my $lockdir = "/etc/pve/priv/lock";
 
@@ -99,7 +97,7 @@ sub read_service_config {
 	my $d = $res->{ids}->{$sid};
 	my (undef, undef, $name) = PVE::HA::Tools::parse_sid($sid);
 	$d->{state} = 'enabled' if !defined($d->{state});
-	if ($d->{type} eq 'vm') {
+	if (PVE::HA::Resources->lookup($d->{type})) {
 	    if (my $vmd = $vmlist->{ids}->{$name}) {
 		if (!$vmd) {
 		    warn "no such VM '$name'\n";
@@ -125,9 +123,9 @@ sub change_service_location {
 
     my (undef, $type, $name) = PVE::HA::Tools::parse_sid($sid);
 
-    if ($type eq 'vm') {
-	my $old = PVE::QemuServer::config_file($name, $current_node);
-	my $new = PVE::QemuServer::config_file($name, $new_node);
+    if(my $plugin = PVE::HA::Resources->lookup($type)) {
+	my $old = $plugin->config_file($name, $current_node);
+	my $new = $plugin->config_file($name, $new_node);
 	rename($old, $new) ||
 	    die "rename '$old' to '$new' failed - $!\n";
     } else {
@@ -382,16 +380,17 @@ sub exec_resource_agent {
 
     my (undef, $service_type, $service_name) = PVE::HA::Tools::parse_sid($sid);
 
-    die "service type '$service_type'not implemented" if $service_type ne 'vm';
+    my $plugin = PVE::HA::Resources->lookup($service_type);
+    die "service type '$service_type' not implemented" if !$plugin;
+
+    # fixme: return valid_exit code
+    die "service '$sid' not on this node" if $service_config->{node} ne $nodename;
 
     my $vmid = $service_name;
 
-    my $running = PVE::QemuServer::check_running($vmid, 1);
- 
-    if ($cmd eq 'started') {
+    my $running = $plugin->check_running($vmid);
 
-	# fixme: return valid_exit code
-	die "service '$sid' not on this node" if $service_config->{node} ne $nodename;
+    if ($cmd eq 'started') {
 
 	# fixme: count failures
 	
@@ -399,10 +398,14 @@ sub exec_resource_agent {
 
 	$self->log("info", "starting service $sid");
 
-	my $upid = PVE::API2::Qemu->vm_start({node => $nodename, vmid => $vmid});
-	$self->upid_wait($upid);
+	my $params = {
+	    node => $nodename,
+	    vmid => $vmid
+	};
+
+	$plugin->start($self, $params);
 
-	$running = PVE::QemuServer::check_running($vmid, 1);
+	$running = $plugin->check_running($vmid);
 
 	if ($running) {
 	    $self->log("info", "service status $sid started");
@@ -414,26 +417,22 @@ sub exec_resource_agent {
 
     } elsif ($cmd eq 'request_stop' || $cmd eq 'stopped') {
 
-	# fixme: return valid_exit code
-	die "service '$sid' not on this node" if $service_config->{node} ne $nodename;
-
 	return 0 if !$running;
 
 	$self->log("info", "stopping service $sid");
 
 	my $timeout = 60; # fixme: make this configurable
-	
-	my $param = {
-	    node => $nodename, 
-	    vmid => $vmid, 
+
+	my $params = {
+	    node => $nodename,
+	    vmid => $vmid,
 	    timeout => $timeout,
 	    forceStop => 1,
 	};
 
-	my $upid = PVE::API2::Qemu->vm_shutdown($param);
-	$self->upid_wait($upid);
+	$plugin->shutdown($self, $params);
 
-	$running = PVE::QemuServer::check_running($vmid, 1);
+	$running = $plugin->check_running($vmid);
 
 	if (!$running) {
 	    $self->log("info", "service status $sid stopped");
@@ -447,42 +446,31 @@ sub exec_resource_agent {
 	my $target = $params[0];
 	die "$cmd '$sid' failed - missing target\n" if !defined($target);
 
-	# fixme: return valid_exit code
-	die "service '$sid' not on this node" if $service_config->{node} ne $nodename;
-	
 	if ($service_config->{node} eq $target) {
 	    # already there
 	    return 0;
-	} 
-	
-	if (!$running) {
-	    $self->change_service_location($sid, $nodename, $target);
-	    $self->log("info", "service $sid moved to node '$target'");
-	    return 0;
-	} else {
-	    # we alwas do live migration if VM is online
+	}
 
-	    my $params = {
-		node => $nodename, 
-		vmid => $vmid,
-		target => $target,
-		online => 1,
-	    };
+	# we always do (live) migration
+	my $params = {
+	    node => $nodename,
+	    vmid => $vmid,
+	    target => $target,
+	    online => 1,
+	};
 
-	    my $oldconfig = PVE::QemuServer::config_file($vmid, $nodename);
+	my $oldconfig = $plugin->config_file($vmid, $nodename);
 
-	    my $upid = PVE::API2::Qemu->migrate_vm($params);
-	    $self->upid_wait($upid);
+	$plugin->migrate($self, $params);
 
-	    # something went wrong if old config file is still there
-	    if (-f $oldconfig) {
-		$self->log("err", "service $sid not moved (migration error)");
-		return 1;
-	    }
-	    
-	    return 0;
+	# something went wrong if old config file is still there
+	if (-f $oldconfig) {
+	    $self->log("err", "service $sid not moved (migration error)");
+	    return 1;
 	}
-	
+
+	return 0;
+
     }
 
     die "implement me (cmd '$cmd')";
-- 
2.1.4



More information about the pve-devel mailing list