[pve-devel] [RFC v2 pve-ha-manager 4/9] TestHardware: implement 'restart' & 'shutdown' action

Thomas Lamprecht t.lamprecht at proxmox.com
Mon Dec 14 15:29:56 CET 2015


Add two graceful actions to the TestHardware:
*) shutdown: this executes a shutdown_request() to the lrm and
   powers the node off 5 time slices later.
   The plan is to not freeze services during that period so fencing
   kicks in, if the node does not comes back up fast enough, this
   will be implemented in the next patches.

*) restart: this makes an transition from on to off to on, where
   the transition isn't instantly but delayed by 5 time
   slices each.
   Here the services should be freezed and thus not fenced, which
   is the default case now.

Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---
 src/PVE/HA/Sim/TestHardware.pm | 47 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 42 insertions(+), 5 deletions(-)

diff --git a/src/PVE/HA/Sim/TestHardware.pm b/src/PVE/HA/Sim/TestHardware.pm
index 1e1f20c..5c8a0cd 100644
--- a/src/PVE/HA/Sim/TestHardware.pm
+++ b/src/PVE/HA/Sim/TestHardware.pm
@@ -131,18 +131,40 @@ sub sim_hardware_cmd {
 	my ($cmd, $node, $action) = split(/\s+/, $cmdstr);
 
 	die "sim_hardware_cmd: no node specified" if !$node;
-	die "sim_hardware_cmd: unknown action '$action'" if $action !~ m/^(on|off)$/;
+	die "sim_hardware_cmd: unknown action '$action'"
+	    if $action !~ m/^(on|off|shutdown|restart)$/;
 
 	my $d = $self->{nodes}->{$node};
 	die "sim_hardware_cmd: no such node '$node'\n" if !$d;
 
 	$self->log('info', "execute $cmdstr", $logid);
-	
+
+	# write current action earlier so that the current state is known to
+	# the Env, does not violate anything as we're in a locked context
+	$cstatus->{$node}->{currentaction} = $action;
+	$self->write_hardware_status_nolock($cstatus);
+
 	if ($cmd eq 'power') {
 	    if ($cstatus->{$node}->{power} ne $action) {
 		if ($action eq 'on') {	      
 		    $d->{crm} = PVE::HA::CRM->new($d->{crm_env}) if !$d->{crm};
 		    $d->{lrm} = PVE::HA::LRM->new($d->{lrm_env}) if !$d->{lrm};
+		} elsif ($action eq 'restart') {
+		    if ($d->{lrm}) {
+			$d->{lrm_env}->log('info', "reboot node");
+			$d->{lrm}->shutdown_request();
+			&$add_helper_cmd($self, $self->{cur_time}+5, "power $node off");
+			&$add_helper_cmd($self, $self->{cur_time}+10, "power $node on");
+		    }
+		} elsif ($action eq 'shutdown') {
+		    if ($d->{lrm}) {
+			$d->{lrm}->shutdown_request();
+			$d->{lrm_env}->log('info', "graceful shutdown");
+			&$add_helper_cmd($self, $self->{cur_time}+5, "power $node off");
+		    }
+		    if ($d->{crm}) {
+			$d->{crm_env}->log('info', "graceful shutdown");
+		    }
 		} else {
 		    if ($d->{crm}) {
 			$d->{crm_env}->log('info', "killed by poweroff");
@@ -192,13 +214,22 @@ sub run {
 
 	foreach my $node (@nodes) {
 
+	    my $cstatus = $self->read_hardware_status_nolock();
+
 	    my $d = $self->{nodes}->{$node};
 	    
 	    if (my $crm = $d->{crm}) {
 
 		$d->{crm_env}->loop_start_hook($self->get_time());
 
-		die "implement me (CRM exit)" if !$crm->do_one_iteration();
+		if (!$crm->do_one_iteration()) {
+		    if($cstatus->{$node}->{power} ne 'on') {
+			$self->log('info', "stopped CRM on '$node'");
+			$d->{crm} = undef;
+		    } else {
+			die "implement me (CRM '$node' exit)";
+		    }
+		}
 
 		$d->{crm_env}->loop_end_hook();
 
@@ -210,8 +241,14 @@ sub run {
 
 		$d->{lrm_env}->loop_start_hook($self->get_time());
 
-		die "implement me (LRM exit)" if !$lrm->do_one_iteration();
-
+		if (!$lrm->do_one_iteration()) {
+		    if ($cstatus->{$node}->{power} ne 'on') {
+			$self->log('info', "stopped LRM on '$node'");
+			$d->{lrm} = undef;
+		    } else {
+			die "implement me (LRM '$node' exit)";
+		    }
+		}
 		$d->{lrm_env}->loop_end_hook();
 
 		my $nodetime = $d->{lrm_env}->get_time();
-- 
2.1.4





More information about the pve-devel mailing list