Module: tools Branch: master Commit: ccf23fd22fa8491a6abf026a989c855669cac2d8 URL: http://source.winehq.org/git/tools.git/?a=commit;h=ccf23fd22fa8491a6abf026a9...
Author: Francois Gouget fgouget@codeweavers.com Date: Thu Oct 19 14:54:41 2017 +0200
testbot: Power off Libvirt domains in one operation.
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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 f8caffa..9ca98eb 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;