Normally GetSnapshotName() returns undef when the domain is busy reverting. But that's an undocumented feature and the the VM may end up in a state where GetSnapshotName() returns undef despite the VM being usable (e.g. powered off after a failed revert). So check the Libvirt domain state instead.
Signed-off-by: Francois Gouget fgouget@codeweavers.com --- testbot/bin/LibvirtTool.pl | 46 ++++++++---------------- testbot/lib/WineTestBot/LibvirtDomain.pm | 21 +++++++++++ 2 files changed, 35 insertions(+), 32 deletions(-)
diff --git a/testbot/bin/LibvirtTool.pl b/testbot/bin/LibvirtTool.pl index f15bab70b..dca5a921e 100755 --- a/testbot/bin/LibvirtTool.pl +++ b/testbot/bin/LibvirtTool.pl @@ -282,42 +282,24 @@ sub Monitor() return 0; }
- my ($ErrMessage, $SnapshotName) = $VM->GetDomain()->GetSnapshotName(); - if (defined $ErrMessage) - { - Error "$ErrMessage\n"; - } - else + my $IsReady = $VM->GetDomain()->IsReady(); + if ($IsReady and $VM->GetDomain()->IsPoweredOn()) { - my $IsPoweredOn; - if (!defined $SnapshotName) - { - Debug("$VMKey has no snapshot (reverting?)\n"); - $IsPoweredOn = undef; - } - elsif (!defined $SnapshotName or $SnapshotName ne $VM->IdleSnapshot) - { - $IsPoweredOn = 0; - } - else - { - $IsPoweredOn = $VM->GetDomain()->IsPoweredOn(); - if ($IsPoweredOn) - { - $ErrMessage = $VM->GetDomain()->PowerOff(); - Error "$ErrMessage\n" if (defined $ErrMessage); - $IsPoweredOn = undef; - } - } - if (defined $IsPoweredOn) + my $ErrMessage = $VM->GetDomain()->PowerOff(); + if (defined $ErrMessage) { - return 1 if (ChangeStatus("offline", "off", "done")); - NotifyAdministrator("The $VMKey VM is working again", - "The $VMKey VM started working again after ". - PrettyElapsed($Start) ."."); - return 0; + Error "$ErrMessage\n"; + $IsReady = undef; } } + if ($IsReady) + { + return 1 if (ChangeStatus("offline", "off", "done")); + NotifyAdministrator("The $VMKey VM is working again", + "The $VMKey VM started working again after ". + PrettyElapsed($Start) ."."); + return 0; + }
Debug(Elapsed($Start), " $VMKey is still unreachable\n"); sleep(60); diff --git a/testbot/lib/WineTestBot/LibvirtDomain.pm b/testbot/lib/WineTestBot/LibvirtDomain.pm index d6c07408c..4e1c4ee07 100644 --- a/testbot/lib/WineTestBot/LibvirtDomain.pm +++ b/testbot/lib/WineTestBot/LibvirtDomain.pm @@ -365,6 +365,27 @@ sub IsPoweredOn($) return ($State == Sys::Virt::Domain::STATE_RUNNING); }
+sub IsReady($) +{ + my ($self) = @_; + + my ($ErrMessage, $Domain) = $self->_GetDomain(); + if (defined $ErrMessage) + { + $@ = $ErrMessage; + return undef; + } + + my ($State, $_Reason); + eval { ($State, $_Reason) = $Domain->get_state() }; + return $self->_Reset(undef) if ($@); + return ($State == Sys::Virt::Domain::STATE_RUNNING or + $State == Sys::Virt::Domain::STATE_SHUTOFF or + $State == Sys::Virt::Domain::STATE_CRASHED or + $State == Sys::Virt::Domain::STATE_PMSUSPENDED + ); +} + sub _GetStateName($) { my ($State) = @_;