[libvirt] RFC: Add a 'reason' argument for domain events ?

Daniel P. Berrange berrange at redhat.com
Fri Nov 14 11:18:48 UTC 2008


We currently have a set of domain lifecycle events

      VIR_DOMAIN_EVENT_ADDED = 0,
      VIR_DOMAIN_EVENT_REMOVED = 1,
      VIR_DOMAIN_EVENT_STARTED = 2,
      VIR_DOMAIN_EVENT_SUSPENDED = 3,
      VIR_DOMAIN_EVENT_RESUMED = 4,
      VIR_DOMAIN_EVENT_STOPPED = 5,
      VIR_DOMAIN_EVENT_SAVED = 6,
      VIR_DOMAIN_EVENT_RESTORED = 7,

And a couple more I proposed last week to allow distinguishing of new
domains which are transient vs persistent

      VIR_DOMAIN_EVENT_DEFINED = 8,
      VIR_DOMAIN_EVENT_UNDEFINED = 9,

Previously Stefan has suggested we should consider having an event for
migration, and though I rejected that at the time, I'm now inclined to
agree that this info would be useful here. I'm also thinking I'd like
to have more information about STOPPED & STARTED events in general.

eg, there are a number of reasons why an domain may have started

 - explicitly booted on the host
 - restored from a saved image
 - incoming migration operation

and there are a number of reasons why a domain might have stopped

 - forcably destroyed by host admin
 - shutdown by host admin
 - shutdown by guest admin
 - host emulator process crashed
 - killed by mgmt after host emulation hung
 - migrated to another host
 - saved to a memory image

We have explicit events for the SAVED/RESTORED reasons, but what should
we do about the other reasons ?

One option is to add alot more events

  VIR_DOMAIN_MIGRATED_IN   (migrated to another node)
  VIR_DOMAIN_MIGRATED_OUT  (migrated from another node)
  VIR_DOMAIN_SHUTDOWN      (graceful shutdown by host admin)
  VIR_DOMAIN_DESTROYED     (force destroyed by host admin)
  VIR_DOMAIN_CRASHED       (guest kernel crashed)
  VIR_DOMAIN_HUNG          (host emulator hung)

leaving STOPPED to just be a generic stop event, with no particular
reason.

The downside with this, is if an application just wants to know about 
whether a domain shutdown, not why, then they have to track lots and
lots of events.

Also, not every driver  would be able to provide all of these events,
so would often have to fallback on a generic STOPPED event 

So one alternative is to provide a generic 'char * reason' with each 
event with provides scope on the cause of the lifecycle operation.
So you'd get

  VIR_DOMAIN_STOPPED  ("crashed", "shutdown", "destroyed",
                       "quit", "hung", "migrated", "saved")
  VIR_DOMAIN_STARTED  ("booted", "migrated", "restored")

nb, we could remove the explicit SAVED and RESTORED events in this style.

With such a 'reason' arg, we could possibly avoid adding the DEFINED
and UNDEFINED events I suggested. Instead, adding a reason for ADDED
and REMOVED events,

   VIR_DOMAIN_ADDED    ("started", "defined")
   VIR_DOMAIN_REMOVED  ("shutdown", "undefined")

which lets you distinguish transient from persistent domains. The downside
of this though, is that we can't explicitly track when a configuration
file is 're-defined', eg adding a config file for an existing running
guest.

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list