On 12/16/2015 09:04 AM, Dietmar Maurer wrote:
Signed-off-by: Dietmar Maurer <[email protected]>
---
  src/PVE/HA/Sim/TestHardware.pm        | 43 +++++++++++++++++++++++++++++++----
  src/test/test-reboot1/cmdlist         |  4 ++++
  src/test/test-reboot1/hardware_status |  5 ++++
  src/test/test-reboot1/log.expect      | 35 ++++++++++++++++++++++++++++
  src/test/test-reboot1/manager_status  |  1 +
  src/test/test-reboot1/service_config  |  3 +++
  6 files changed, 86 insertions(+), 5 deletions(-)
  create mode 100644 src/test/test-reboot1/cmdlist
  create mode 100644 src/test/test-reboot1/hardware_status
  create mode 100644 src/test/test-reboot1/log.expect
  create mode 100644 src/test/test-reboot1/manager_status
  create mode 100644 src/test/test-reboot1/service_config

diff --git a/src/PVE/HA/Sim/TestHardware.pm b/src/PVE/HA/Sim/TestHardware.pm
index d49d9c0..06a3208 100644
--- a/src/PVE/HA/Sim/TestHardware.pm
+++ b/src/PVE/HA/Sim/TestHardware.pm
@@ -84,6 +84,8 @@ sub log {
  # simulate hardware commands
  # power <node> <on|off>
  # network <node> <on|off>
+# reboot <node>
+# shutdown <node>
sub sim_hardware_cmd {
      my ($self, $cmdstr, $logid) = @_;
@@ -95,7 +97,6 @@ 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)$/;
my $d = $self->{nodes}->{$node};
        die "sim_hardware_cmd: no such node '$node'\n" if !$d;
@@ -103,6 +104,7 @@ sub sim_hardware_cmd {
        $self->log('info', "execute $cmdstr", $logid);
        
        if ($cmd eq 'power') {
+           die "sim_hardware_cmd: unknown action '$action'" if $action !~ 
m/^(on|off)$/;
            if ($cstatus->{$node}->{power} ne $action) {
                if ($action eq 'on') {  
                    $d->{crm} = PVE::HA::CRM->new($d->{crm_env}) if !$d->{crm};
@@ -121,14 +123,29 @@ sub sim_hardware_cmd {
$cstatus->{$node}->{power} = $action;
            $cstatus->{$node}->{network} = $action;
+           $cstatus->{$node}->{shutdown} = undef;
+
+           $self->write_hardware_status_nolock($cstatus);
} elsif ($cmd eq 'network') {
-               $cstatus->{$node}->{network} = $action;
+           die "sim_hardware_cmd: unknown action '$action'" if $action !~ 
m/^(on|off)$/;
+           $cstatus->{$node}->{network} = $action;
+
+           $self->write_hardware_status_nolock($cstatus);
+
+       } elsif ($cmd eq 'reboot' || $cmd eq 'shutdown') {
+           $cstatus->{$node}->{shutdown} = $cmd;
+
+           $self->write_hardware_status_nolock($cstatus);
+
+           if ($d->{lrm}) {
+               $d->{lrm_env}->log('info', "got shutdown request");
+               $d->{lrm}->shutdown_request();
+           }
        } else {
-           die "sim_hardware_cmd: unknown command '$cmd'\n";
+           die "sim_hardware_cmd: unknown command '$cmdstr'\n";
        }
- $self->write_hardware_status_nolock($cstatus);
      };
return $self->global_lock($code);
@@ -174,12 +191,28 @@ sub run {
$d->{lrm_env}->loop_start_hook($self->get_time()); - die "implement me (LRM exit)" if !$lrm->do_one_iteration();
+               my $exit_lrm = !$lrm->do_one_iteration();
$d->{lrm_env}->loop_end_hook(); my $nodetime = $d->{lrm_env}->get_time();
                $self->{cur_time} = $nodetime if $nodetime > $self->{cur_time};
+
+               if ($exit_lrm) {
+                   $d->{lrm_env}->log('info', "exit (loop end)");
+                   $d->{lrm} = undef;
+                   my $cstatus = $self->read_hardware_status_nolock();
+                   my $nstatus = $cstatus->{$node} || die "no node status for node 
'$node'";
+                   my $shutdown = $nstatus->{shutdown};
maybe better:

my $shutdown = $nstatus->{shutdown} || '';

to avoid undef warnings, else everything is OK (and quite a lot simpler) in my opinion.

+                   if ($shutdown eq 'reboot') {
+                       $self->sim_hardware_cmd("power $node off", 'reboot');
+                       $self->sim_hardware_cmd("power $node on", 'reboot');
+                   } elsif ($shutdown eq 'shutdown') {
+                       $self->sim_hardware_cmd("power $node off", 'shutdown');
+                   } else {
+                       die "unexpected LRM exit - not implemented"
+                   }
+               }
            }
foreach my $n (@nodes) {
diff --git a/src/test/test-reboot1/cmdlist b/src/test/test-reboot1/cmdlist
new file mode 100644
index 0000000..8558351
--- /dev/null
+++ b/src/test/test-reboot1/cmdlist
@@ -0,0 +1,4 @@
+[
+    [ "power node1 on", "power node2 on", "power node3 on"],
+    [ "reboot node3" ]
+]
diff --git a/src/test/test-reboot1/hardware_status 
b/src/test/test-reboot1/hardware_status
new file mode 100644
index 0000000..119b81c
--- /dev/null
+++ b/src/test/test-reboot1/hardware_status
@@ -0,0 +1,5 @@
+{
+  "node1": { "power": "off", "network": "off" },
+  "node2": { "power": "off", "network": "off" },
+  "node3": { "power": "off", "network": "off" }
+}
\ No newline at end of file
diff --git a/src/test/test-reboot1/log.expect b/src/test/test-reboot1/log.expect
new file mode 100644
index 0000000..d9d8771
--- /dev/null
+++ b/src/test/test-reboot1/log.expect
@@ -0,0 +1,35 @@
+info      0     hardware: starting simulation
+info     20      cmdlist: execute power node1 on
+info     20    node1/crm: status change startup => wait_for_quorum
+info     20    node1/lrm: status change startup => wait_for_agent_lock
+info     20      cmdlist: execute power node2 on
+info     20    node2/crm: status change startup => wait_for_quorum
+info     20    node2/lrm: status change startup => wait_for_agent_lock
+info     20      cmdlist: execute power node3 on
+info     20    node3/crm: status change startup => wait_for_quorum
+info     20    node3/lrm: status change startup => wait_for_agent_lock
+info     20    node1/crm: got lock 'ha_manager_lock'
+info     20    node1/crm: status change wait_for_quorum => master
+info     20    node1/crm: node 'node1': state changed from 'unknown' => 
'online'
+info     20    node1/crm: node 'node2': state changed from 'unknown' => 
'online'
+info     20    node1/crm: node 'node3': state changed from 'unknown' => 
'online'
+info     20    node1/crm: adding new service 'vm:103' on node 'node3'
+info     22    node2/crm: status change wait_for_quorum => slave
+info     24    node3/crm: status change wait_for_quorum => slave
+info     25    node3/lrm: got lock 'ha_agent_node3_lock'
+info     25    node3/lrm: status change wait_for_agent_lock => active
+info     25    node3/lrm: starting service vm:103
+info     25    node3/lrm: service status vm:103 started
+info    120      cmdlist: execute reboot node3
+info    120    node3/lrm: got shutdown request
+info    120    node1/crm: service 'vm:103': state changed from 'started' to 
'freeze'
+info    126    node3/lrm: exit (loop end)
+info    126       reboot: execute power node3 off
+info    125    node3/crm: killed by poweroff
+info    126       reboot: execute power node3 on
+info    125    node3/crm: status change startup => wait_for_quorum
+info    126    node3/lrm: status change startup => wait_for_agent_lock
+info    144    node3/crm: status change wait_for_quorum => slave
+info    160    node1/crm: service 'vm:103': state changed from 'freeze' to 
'started'
+info    165    node3/lrm: status change wait_for_agent_lock => active
+info    720     hardware: exit simulation - done
diff --git a/src/test/test-reboot1/manager_status 
b/src/test/test-reboot1/manager_status
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/src/test/test-reboot1/manager_status
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/src/test/test-reboot1/service_config 
b/src/test/test-reboot1/service_config
new file mode 100644
index 0000000..c3b22c8
--- /dev/null
+++ b/src/test/test-reboot1/service_config
@@ -0,0 +1,3 @@
+{
+    "vm:103": { "node": "node3", "state": "enabled" }
+}
\ No newline at end of file


_______________________________________________
pve-devel mailing list
[email protected]
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to