[libvirt] [PATCH 1/7] conf: Generalize life cycle actions to event actions

Jiri Denemark jdenemar at redhat.com
Thu Sep 27 14:41:31 UTC 2012


While current on_{poweroff,reboot,crash} action configuration is about
configuring life cycle actions, they can all be considered events and
actions that need to be done on a particular event. Let's generalize the
code this way so that it can be reused later for non-lifecycle events.
---
 docs/formatdomain.html.in     | 15 ++++++----
 docs/schemas/domaincommon.rng |  8 +++---
 src/conf/domain_conf.c        | 66 +++++++++++++++++++++++--------------------
 src/conf/domain_conf.h        |  4 +--
 4 files changed, 51 insertions(+), 42 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index bc4cc4a..57444fb 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -907,15 +907,11 @@
       This guest NUMA specification is currently available only for QEMU/KVM.
     </p>
 
-    <h3><a name="elementsLifecycle">Lifecycle control</a></h3>
+    <h3><a name="elementsEvents">Events configuration</a></h3>
 
     <p>
       It is sometimes necessary to override the default actions taken
-      when a guest OS triggers a lifecycle operation. The following
-      collections of elements allow the actions to be specified. A
-      common use case is to force a reboot to be treated as a poweroff
-      when doing the initial OS installation. This allows the VM to be
-      re-configured for the first post-install bootup.
+      on various events.
     </p>
 
 <pre>
@@ -925,6 +921,13 @@
   <on_crash>restart</on_crash>
   ...</pre>
 
+    <p>
+      The following collections of elements allow the actions to be
+      specified when a guest OS triggers a lifecycle operation. A
+      common use case is to force a reboot to be treated as a poweroff
+      when doing the initial OS installation. This allows the VM to be
+      re-configured for the first post-install bootup.
+    </p>
     <dl>
       <dt><code>on_poweroff</code></dt>
       <dd>The content of this element specifies the action to take when
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index f47fdad..ab8d4a1 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -51,7 +51,7 @@
         <ref name="clock"/>
         <ref name="resources"/>
         <ref name="features"/>
-        <ref name="termination"/>
+        <ref name="events"/>
         <optional>
           <ref name="pm"/>
         </optional>
@@ -2226,10 +2226,10 @@
     </element>
   </define>
   <!--
-      When a domain terminates multiple policies can be applied depending
-      on how it ended:
+      When a certain event happens, multiple policies can be applied
+      depends on what happened:
     -->
-  <define name="termination">
+  <define name="events">
     <interleave>
       <optional>
         <element name="on_reboot">
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 33e1e7f..40abf39 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -7518,11 +7518,12 @@ error:
     return NULL;
 }
 
-static int virDomainLifecycleParseXML(xmlXPathContextPtr ctxt,
-                                      const char *xpath,
-                                      int *val,
-                                      int defaultVal,
-                                      virLifecycleFromStringFunc convFunc)
+static int virDomainEventActionParseXML(xmlXPathContextPtr ctxt,
+                                        const char *name,
+                                        const char *xpath,
+                                        int *val,
+                                        int defaultVal,
+                                        virEventActionFromStringFunc convFunc)
 {
     char *tmp = virXPathString(xpath, ctxt);
     if (tmp == NULL) {
@@ -7531,7 +7532,7 @@ static int virDomainLifecycleParseXML(xmlXPathContextPtr ctxt,
         *val = convFunc(tmp);
         if (*val < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("unknown lifecycle action %s"), tmp);
+                           _("unknown %s action: %s"), name, tmp);
             VIR_FREE(tmp);
             return -1;
         }
@@ -8941,20 +8942,25 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
         VIR_FREE(nodes);
     }
 
-    if (virDomainLifecycleParseXML(ctxt, "string(./on_reboot[1])",
-                                   &def->onReboot, VIR_DOMAIN_LIFECYCLE_RESTART,
-                                   virDomainLifecycleTypeFromString) < 0)
+    if (virDomainEventActionParseXML(ctxt, "on_reboot",
+                                     "string(./on_reboot[1])",
+                                     &def->onReboot,
+                                     VIR_DOMAIN_LIFECYCLE_RESTART,
+                                     virDomainLifecycleTypeFromString) < 0)
         goto error;
 
-    if (virDomainLifecycleParseXML(ctxt, "string(./on_poweroff[1])",
-                                   &def->onPoweroff, VIR_DOMAIN_LIFECYCLE_DESTROY,
-                                   virDomainLifecycleTypeFromString) < 0)
+    if (virDomainEventActionParseXML(ctxt, "on_poweroff",
+                                     "string(./on_poweroff[1])",
+                                     &def->onPoweroff,
+                                     VIR_DOMAIN_LIFECYCLE_DESTROY,
+                                     virDomainLifecycleTypeFromString) < 0)
         goto error;
 
-    if (virDomainLifecycleParseXML(ctxt, "string(./on_crash[1])",
-                                        &def->onCrash,
-                                   VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY,
-                                   virDomainLifecycleCrashTypeFromString) < 0)
+    if (virDomainEventActionParseXML(ctxt, "on_crash",
+                                     "string(./on_crash[1])",
+                                     &def->onCrash,
+                                     VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY,
+                                     virDomainLifecycleCrashTypeFromString) < 0)
         goto error;
 
     if (virDomainPMStateParseXML(ctxt,
@@ -11452,15 +11458,15 @@ virDomainEmulatorPinDel(virDomainDefPtr def)
 }
 
 static int
-virDomainLifecycleDefFormat(virBufferPtr buf,
-                            int type,
-                            const char *name,
-                            virLifecycleToStringFunc convFunc)
+virDomainEventActionDefFormat(virBufferPtr buf,
+                              int type,
+                              const char *name,
+                              virEventActionToStringFunc convFunc)
 {
     const char *typeStr = convFunc(type);
     if (!typeStr) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("unexpected lifecycle type %d"), type);
+                       _("unexpected %s action: %d"), name, type);
         return -1;
     }
 
@@ -13674,17 +13680,17 @@ virDomainDefFormatInternal(virDomainDefPtr def,
         virBufferAddLit(buf, "  </clock>\n");
     }
 
-    if (virDomainLifecycleDefFormat(buf, def->onPoweroff,
-                                    "on_poweroff",
-                                    virDomainLifecycleTypeToString) < 0)
+    if (virDomainEventActionDefFormat(buf, def->onPoweroff,
+                                      "on_poweroff",
+                                      virDomainLifecycleTypeToString) < 0)
         goto cleanup;
-    if (virDomainLifecycleDefFormat(buf, def->onReboot,
-                                    "on_reboot",
-                                    virDomainLifecycleTypeToString) < 0)
+    if (virDomainEventActionDefFormat(buf, def->onReboot,
+                                      "on_reboot",
+                                      virDomainLifecycleTypeToString) < 0)
         goto cleanup;
-    if (virDomainLifecycleDefFormat(buf, def->onCrash,
-                                    "on_crash",
-                                    virDomainLifecycleCrashTypeToString) < 0)
+    if (virDomainEventActionDefFormat(buf, def->onCrash,
+                                      "on_crash",
+                                      virDomainLifecycleCrashTypeToString) < 0)
         goto cleanup;
 
     if (def->pm.s3 || def->pm.s4) {
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 14dead3..0ae6e48 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2144,8 +2144,8 @@ virDomainChrDefGetSecurityLabelDef(virDomainChrDefPtr def, const char *model);
 virSecurityLabelDefPtr
 virDomainDefAddSecurityLabelDef(virDomainDefPtr def, const char *model);
 
-typedef const char* (*virLifecycleToStringFunc)(int type);
-typedef int (*virLifecycleFromStringFunc)(const char *type);
+typedef const char* (*virEventActionToStringFunc)(int type);
+typedef int (*virEventActionFromStringFunc)(const char *type);
 
 VIR_ENUM_DECL(virDomainTaint)
 
-- 
1.7.12




More information about the libvir-list mailing list