[virt-tools-list] [PATCH virt-manager 1/2] virtManager: read the reason for the domain state

Cole Robinson crobinso at redhat.com
Tue Mar 18 19:31:13 UTC 2014


On 03/18/2014 10:38 AM, Giuseppe Scrivano wrote:
> Signed-off-by: Giuseppe Scrivano <gscrivan at redhat.com>
> ---
>  virtManager/domain.py | 65 +++++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 61 insertions(+), 4 deletions(-)
> 
> diff --git a/virtManager/domain.py b/virtManager/domain.py
> index a308aab..6543919 100644
> --- a/virtManager/domain.py
> +++ b/virtManager/domain.py
> @@ -232,6 +232,54 @@ class vmmDomain(vmmLibvirtObject):
>          logging.debug("Unknown status %d, returning 'Unknown'", status)
>          return _("Unknown")
>  
> +    @staticmethod
> +    def pretty_status_reason(status, reason):
> +        reasons = {
> +            libvirt.VIR_DOMAIN_RUNNING : {
> +                      libvirt.VIR_DOMAIN_RUNNING_BOOTED :  _("Booted"),
> +                      libvirt.VIR_DOMAIN_RUNNING_MIGRATED : _("Migrated"),
> +                      libvirt.VIR_DOMAIN_RUNNING_RESTORED : _("Restored"),
> +                      libvirt.VIR_DOMAIN_RUNNING_FROM_SNAPSHOT :
> +                _("From snapshot"),
> +                      libvirt.VIR_DOMAIN_RUNNING_UNPAUSED : _("Unpaused"),
> +                      libvirt.VIR_DOMAIN_RUNNING_MIGRATION_CANCELED :
> +                _("Migration canceled"),
> +                      libvirt.VIR_DOMAIN_RUNNING_SAVE_CANCELED :
> +                _("Save canceled"),
> +                      libvirt.VIR_DOMAIN_RUNNING_WAKEUP : _("Event wakeup"),
> +                      libvirt.VIR_DOMAIN_RUNNING_CRASHED : _("Crashed")
> +            },

Inconsistent indent with rest of the dictionary.

Also, accessing libvirt.VIR_DOMAIN... directly means we will fail to start on
a host with libvirt that doesn't have all those states available. Basically it
bumps our host libvirt dep to whenever the latest reason was added.

So I think we have to do

getattr(libvirt, "VIR_DOMAIN_PAUSED_USER", $actual_enum_value)

Or do what the libvirt-python event-loop.py example does and just stuff all
the strings in a list or tuple, and do lookup by list index.

> +            libvirt.VIR_DOMAIN_PAUSED : {
> +                libvirt.VIR_DOMAIN_PAUSED_USER : _("User"),
> +                libvirt.VIR_DOMAIN_PAUSED_MIGRATION : _("Migrating"),
> +                libvirt.VIR_DOMAIN_PAUSED_SAVE : _("Saving"),
> +                libvirt.VIR_DOMAIN_PAUSED_DUMP : _("Dumping"),
> +                libvirt.VIR_DOMAIN_PAUSED_IOERROR : _("I/O error"),
> +                libvirt.VIR_DOMAIN_PAUSED_WATCHDOG : _("Watchdog"),
> +                libvirt.VIR_DOMAIN_PAUSED_FROM_SNAPSHOT : _("From snapshot"),
> +                libvirt.VIR_DOMAIN_PAUSED_SHUTTING_DOWN : _("Shutting down"),
> +                libvirt.VIR_DOMAIN_PAUSED_SNAPSHOT : _("Creating snapshot"),
> +                libvirt.VIR_DOMAIN_PAUSED_CRASHED : _("Crashed"),
> +            },
> +            libvirt.VIR_DOMAIN_SHUTDOWN : {
> +                libvirt.VIR_DOMAIN_SHUTDOWN_USER : _("User")
> +            },
> +            libvirt.VIR_DOMAIN_SHUTOFF : {
> +                libvirt.VIR_DOMAIN_SHUTOFF_SHUTDOWN: _("Shutdown"),
> +                libvirt.VIR_DOMAIN_SHUTOFF_DESTROYED : _("Destroyed"),
> +                libvirt.VIR_DOMAIN_SHUTOFF_CRASHED : _("Crashed"),
> +                libvirt.VIR_DOMAIN_SHUTOFF_MIGRATED : _("Migrated"),
> +                libvirt.VIR_DOMAIN_SHUTOFF_SAVED : _("Saved"),
> +                libvirt.VIR_DOMAIN_SHUTOFF_FAILED : _("Failed"),
> +                libvirt.VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT : _("From snapshot")
> +            },
> +            libvirt.VIR_DOMAIN_CRASHED : {
> +                libvirt.VIR_DOMAIN_CRASHED_PANICKED : _("Panicked")
> +            }
> +        }
> +        return (reasons.get(status) and reasons[status].get(reason)
> +                or _("Unknown"))
> +
>      def __init__(self, conn, backend, key):
>          vmmLibvirtObject.__init__(self, conn, backend, key, Guest)
>  
> @@ -254,6 +302,7 @@ class vmmDomain(vmmLibvirtObject):
>          self._snapshot_list = None
>  
>          self.lastStatus = libvirt.VIR_DOMAIN_SHUTOFF
> +        self.lastStatusReason = libvirt.VIR_DOMAIN_SHUTOFF_SHUTDOWN
> 

I know you were being consistent here, but if we are adding a status_reason
function, make this self._lastStatusReason since it's private.

>          self.managedsave_supported = False
>          self.remote_console_supported = False
> @@ -373,6 +422,9 @@ class vmmDomain(vmmLibvirtObject):
>      def status(self):
>          return self.lastStatus
>  
> +    def status_reason(self):
> +        return self.lastStatusReason
> +
>      def get_cloning(self):
>          return self.cloning
>      def set_cloning(self, val):
> @@ -1647,6 +1699,10 @@ class vmmDomain(vmmLibvirtObject):
>  
>      def run_status(self):
>          return self.pretty_run_status(self.status(), self.hasSavedImage())
> +
> +    def run_status_reason(self):
> +        return self.pretty_status_reason(self.status(), self.status_reason())
> +
>      def run_status_icon_name(self):
>          status = self.status()
>          if status not in vm_status_icons:
> @@ -1663,7 +1719,7 @@ class vmmDomain(vmmLibvirtObject):
>  
>          try:
>              info = self._backend.info()
> -            self._update_status(info[0])
> +            self._update_status(info)
>          except libvirt.libvirtError:
>              # Transient domain might have disappeared, tell the connection
>              # to update the domain list
> @@ -1671,18 +1727,19 @@ class vmmDomain(vmmLibvirtObject):
>                  "list refresh")
>              self.conn.schedule_priority_tick(pollvm=True, force=True)
>  
> -    def _update_status(self, status):
> +    def _update_status(self, info):
>          """
>          Internal helper to change cached status to 'status' and signal
>          clients if we actually changed state
>          """
> -        status = self._normalize_status(status)
> +        status = self._normalize_status(info[0])
>  
>          if status == self.lastStatus:
>              return
>  
>          oldstatus = self.lastStatus
>          self.lastStatus = status
> +        self.lastStatusReason = info[3]
> 

Huh? virDomainGetInfo returns the status reason? Or am I misreading things?

According to libvirt.h, info[3] should be the number of CPUs allocated to the VM.

- Cole

>          # Send 'config-changed' before a status-update, so users
>          # are operating with fresh XML
> @@ -1867,7 +1924,7 @@ class vmmDomain(vmmLibvirtObject):
>              self._tick_stats(info)
>  
>          if not self._using_events():
> -            self._update_status(info[0])
> +            self._update_status(info)
>  
>          if stats_update:
>              self.idle_emit("resources-sampled")
> 




More information about the virt-tools-list mailing list