[Tools 3/3] testbot: Power off Libvirt domains in one operation.
Francois Gouget
fgouget at codeweavers.com
Thu Oct 19 07:54:41 CDT 2017
When all goes well. In case of trouble use get_state() to check if the
virtual machine is powered off anyway.
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
testbot/lib/WineTestBot/LibvirtDomain.pm | 48 +++++++++++++++++++++++---------
1 file changed, 35 insertions(+), 13 deletions(-)
diff --git a/testbot/lib/WineTestBot/LibvirtDomain.pm b/testbot/lib/WineTestBot/LibvirtDomain.pm
index f8caffa3..9ca98eb9 100644
--- a/testbot/lib/WineTestBot/LibvirtDomain.pm
+++ b/testbot/lib/WineTestBot/LibvirtDomain.pm
@@ -253,6 +253,23 @@ sub IsPoweredOn($)
return ($State == Sys::Virt::Domain::STATE_RUNNING);
}
+sub _GetStateName($)
+{
+ my ($State) = @_;
+
+ my %StateNames = {
+ Sys::Virt::Domain::STATE_NOSTATE => "no state",
+ Sys::Virt::Domain::STATE_RUNNING => "running",
+ Sys::Virt::Domain::STATE_BLOCKED => "blocked",
+ Sys::Virt::Domain::STATE_PAUSED => "paused",
+ Sys::Virt::Domain::STATE_SHUTDOWN => "shutdown",
+ Sys::Virt::Domain::STATE_SHUTOFF => "shutoff",
+ Sys::Virt::Domain::STATE_CRASHED => "crashed",
+ Sys::Virt::Domain::STATE_PMSUSPENDED => "pmsuspended",
+ };
+ return $StateNames{$State} || "unknown";
+}
+
sub PowerOff($)
{
my ($self) = @_;
@@ -260,21 +277,26 @@ sub PowerOff($)
my ($ErrMessage, $Domain) = $self->_GetDomain();
return $ErrMessage if (defined $ErrMessage);
- if ($self->IsPoweredOn())
+ eval { $Domain->destroy() };
+ return undef if (!$@); # Success
+ $ErrMessage = _eval_err();
+
+ # destroy() sets $@->code to Sys::Virt::Error::ERR_OPERATION_INVALID (55)
+ # if the domain was already off. But this could happen for other reasons so
+ # just check the domain state.
+ my ($State, $_Reason);
+ eval { ($State, $_Reason) = $Domain->get_state() };
+ if ($@)
{
- eval { $Domain->destroy() };
- if ($@)
- {
- $ErrMessage = _eval_err();
- }
- elsif ($self->IsPoweredOn())
- {
- $ErrMessage = "The VM is still active";
- }
+ # Only return the initial error
+ return $self->_Reset("Could not power off ". $self->{VM}->Name .": $ErrMessage");
}
-
- return undef if (!defined $ErrMessage);
- return $self->_Reset("Could not power off ". $self->{VM}->Name .": $ErrMessage");
+ if ($State == Sys::Virt::Domain::STATE_SHUTOFF)
+ {
+ # This is what we wanted so ignore past errors
+ return undef;
+ }
+ return $self->_Reset($self->{VM}->Name ." is not off (". _GetStateName($State) ."): $ErrMessage");
}
my %_StreamData;
--
2.14.2
More information about the wine-patches
mailing list