[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