[PATCH] testbot/LibvirtTool: Provide a more complete domain state description.

Francois Gouget fgouget at codeweavers.com
Thu Sep 12 07:31:32 CDT 2019


Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
 testbot/lib/WineTestBot/LibvirtDomain.pm | 110 ++++++++++++++++++++++-
 1 file changed, 107 insertions(+), 3 deletions(-)

diff --git a/testbot/lib/WineTestBot/LibvirtDomain.pm b/testbot/lib/WineTestBot/LibvirtDomain.pm
index 0ae7aaed3..d6c07408c 100644
--- a/testbot/lib/WineTestBot/LibvirtDomain.pm
+++ b/testbot/lib/WineTestBot/LibvirtDomain.pm
@@ -44,6 +44,110 @@ my $HackVirtURI = 1;
 my %_Hypervisors;
 my %_Domains;
 
+
+#
+# Domain state description
+#
+
+my %_StateNameReasons = (
+  Sys::Virt::Domain::STATE_NOSTATE => ["no state",
+    {
+      Sys::Virt::Domain::STATE_NOSTATE_UNKNOWN => "unknown",
+    }],
+  Sys::Virt::Domain::STATE_RUNNING => ["running",
+    {
+      Sys::Virt::Domain::STATE_RUNNING_BOOTED => "booted",
+      Sys::Virt::Domain::STATE_RUNNING_FROM_SNAPSHOT => "snapshot",
+      Sys::Virt::Domain::STATE_RUNNING_MIGRATED => "migrated",
+      Sys::Virt::Domain::STATE_RUNNING_MIGRATION_CANCELED => "migration canceled",
+      Sys::Virt::Domain::STATE_RUNNING_RESTORED => "restored",
+      Sys::Virt::Domain::STATE_RUNNING_SAVE_CANCELED => "save canceled",
+      Sys::Virt::Domain::STATE_RUNNING_UNKNOWN => "unknown",
+      Sys::Virt::Domain::STATE_RUNNING_UNPAUSED => "unpaused",
+      Sys::Virt::Domain::STATE_RUNNING_WAKEUP => "wakeup",
+      Sys::Virt::Domain::STATE_RUNNING_CRASHED => "crashed",
+      Sys::Virt::Domain::STATE_RUNNING_POSTCOPY => "postcopy",
+    }],
+  Sys::Virt::Domain::STATE_BLOCKED => ["blocked",
+    {
+      Sys::Virt::Domain::STATE_BLOCKED_UNKNOWN => "unknown",
+    }],
+  Sys::Virt::Domain::STATE_PAUSED => ["paused",
+    {
+      Sys::Virt::Domain::STATE_PAUSED_DUMP => "dump",
+      Sys::Virt::Domain::STATE_PAUSED_FROM_SNAPSHOT => "from snapshot",
+      Sys::Virt::Domain::STATE_PAUSED_IOERROR => "ioerror",
+      Sys::Virt::Domain::STATE_PAUSED_MIGRATION => "migration",
+      Sys::Virt::Domain::STATE_PAUSED_SAVE => "save",
+      Sys::Virt::Domain::STATE_PAUSED_UNKNOWN => "unknown",
+      Sys::Virt::Domain::STATE_PAUSED_USER => "user",
+      Sys::Virt::Domain::STATE_PAUSED_WATCHDOG => "watchdog",
+      Sys::Virt::Domain::STATE_PAUSED_SHUTTING_DOWN => "shutting down",
+      Sys::Virt::Domain::STATE_PAUSED_SNAPSHOT => "snapshot",
+      Sys::Virt::Domain::STATE_PAUSED_CRASHED => "crashed",
+      Sys::Virt::Domain::STATE_PAUSED_STARTING_UP => "starting up",
+      Sys::Virt::Domain::STATE_PAUSED_POSTCOPY => "postcopy",
+      Sys::Virt::Domain::STATE_PAUSED_POSTCOPY_FAILED => "postcopy failed",
+    }],
+  Sys::Virt::Domain::STATE_SHUTDOWN => ["shutdown",
+    {
+      Sys::Virt::Domain::STATE_SHUTDOWN_UNKNOWN => "unknown",
+    }],
+  Sys::Virt::Domain::STATE_SHUTOFF => ["shutoff",
+    {
+      Sys::Virt::Domain::STATE_SHUTOFF_CRASHED => "crashed",
+      Sys::Virt::Domain::STATE_SHUTOFF_DESTROYED => "destroyed",
+      Sys::Virt::Domain::STATE_SHUTOFF_FAILED => "failed",
+      Sys::Virt::Domain::STATE_SHUTOFF_FROM_SNAPSHOT => "from snapshot",
+      Sys::Virt::Domain::STATE_SHUTOFF_MIGRATED => "migrated",
+      Sys::Virt::Domain::STATE_SHUTOFF_SAVED => "saved",
+      Sys::Virt::Domain::STATE_SHUTOFF_SHUTDOWN => "shutdown",
+      Sys::Virt::Domain::STATE_SHUTOFF_UNKNOWN => "unknown",
+      Sys::Virt::Domain::STATE_SHUTOFF_DAEMON => "daemon",
+    }],
+  Sys::Virt::Domain::STATE_CRASHED => ["crashed",
+    {
+      Sys::Virt::Domain::STATE_CRASHED_UNKNOWN => "unknown",
+      Sys::Virt::Domain::STATE_CRASHED_PANICKED => "panicked",
+    }],
+  Sys::Virt::Domain::STATE_PMSUSPENDED => ["pmsuspended",
+    {
+      Sys::Virt::Domain::STATE_PMSUSPENDED_UNKNOWN => "unknown",
+      Sys::Virt::Domain::STATE_PMSUSPENDED_DISK_UNKNOWN => "disk unknown",
+    }],
+);
+
+=pod
+=over 12
+
+=item C<_GetStateDescription()>
+
+Provides a description of the domain state for diagnostics.
+
+=back
+=cut
+
+sub _GetStateDescription($$)
+{
+  my ($State, $Reason) = @_;
+
+  my $StateInfo = $_StateNameReasons{$State};
+  my ($StateName, $ReasonName);
+  if ($StateInfo)
+  {
+    $StateName = $StateInfo->[0];
+    $ReasonName = $StateInfo->[1]->{$Reason};
+  }
+
+  return join(":", $StateName || sprintf("%d", $State),
+                   $ReasonName || sprintf("%d", $Reason));
+}
+
+
+#
+# LibvirtDomain class
+#
+
 sub new($$)
 {
   my ($class, $VM) = @_;
@@ -292,8 +396,8 @@ sub PowerOff($)
   # 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() };
+  my ($State, $Reason);
+  eval { ($State, $Reason) = $Domain->get_state() };
   if ($@)
   {
     # Only return the initial error
@@ -304,7 +408,7 @@ sub PowerOff($)
     # This is what we wanted so ignore past errors
     return undef;
   }
-  return $self->_Reset($self->{VM}->Name ." is not off (". _GetStateName($State)  ."): $ErrMessage");
+  return $self->_Reset($self->{VM}->Name ." is not off (". _GetStateDescription($State, $Reason)  ."): $ErrMessage");
 }
 
 my %_StreamData;
-- 
2.20.1



More information about the wine-devel mailing list