]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: add two hook script events "prepare" and "release"
authorThibault Vincent <thibault.vincent@smartjog.com>
Tue, 22 Mar 2011 13:12:36 +0000 (21:12 +0800)
committerDaniel Veillard <veillard@redhat.com>
Tue, 22 Mar 2011 13:12:36 +0000 (21:12 +0800)
Fix for bug https://bugzilla.redhat.com/show_bug.cgi?id=618970

The "prepare" hook is called very early in the VM statup process
before device labeling, so that it can allocate ressources not
managed by libvirt, such as DRBD, or for instance create missing
bridges and vlan interfaces.
* src/util/hooks.c src/util/hooks.h: add definitions for new hooks
  VIR_HOOK_QEMU_OP_PREPARE and VIR_HOOK_QEMU_OP_RELEASE
* src/qemu/qemu_process.c: use them in qemuProcessStart and
  qemuProcessStop()

src/qemu/qemu_process.c
src/util/hooks.c
src/util/hooks.h

index 793a43c69cf9c636c61eef65322a160664919653..7831c3b3bfb66483e0d67c1e03fcae4a6db3e1fb 100644 (file)
@@ -1927,6 +1927,22 @@ int qemuProcessStart(virConnectPtr conn,
 
     vm->def->id = driver->nextvmid++;
 
+    /* Run a early hook to set-up missing devices */
+    if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
+        char *xml = virDomainDefFormat(vm->def, 0);
+        int hookret;
+
+        hookret = virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
+                    VIR_HOOK_QEMU_OP_PREPARE, VIR_HOOK_SUBOP_BEGIN, NULL, xml);
+        VIR_FREE(xml);
+
+        /*
+         * If the script raised an error abort the launch
+         */
+        if (hookret < 0)
+            goto cleanup;
+    }
+
     /* Must be run before security labelling */
     VIR_DEBUG0("Preparing host devices");
     if (qemuPrepareHostDevices(driver, vm->def) < 0)
@@ -2419,6 +2435,16 @@ retry:
     VIR_FREE(priv->vcpupids);
     priv->nvcpupids = 0;
 
+    /* The "release" hook cleans up additional ressources */
+    if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
+        char *xml = virDomainDefFormat(vm->def, 0);
+
+        /* we can't stop the operation even if the script raised an error */
+        virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
+                    VIR_HOOK_QEMU_OP_RELEASE, VIR_HOOK_SUBOP_END, NULL, xml);
+        VIR_FREE(xml);
+    }
+
     if (vm->newDef) {
         virDomainDefFree(vm->def);
         vm->def = vm->newDef;
index 5ba2036d6d8c56e92143ca2fca67b3f1789bb298..62446eadbb9725e12a6dc56ac37c0b7eef033749 100644 (file)
@@ -71,7 +71,9 @@ VIR_ENUM_IMPL(virHookSubop, VIR_HOOK_SUBOP_LAST,
 
 VIR_ENUM_IMPL(virHookQemuOp, VIR_HOOK_QEMU_OP_LAST,
               "start",
-              "stopped")
+              "stopped",
+              "prepare",
+              "release")
 
 VIR_ENUM_IMPL(virHookLxcOp, VIR_HOOK_LXC_OP_LAST,
               "start",
index f311ed1022f14a7083e06a6a68b162eb7aef2bcf..fd7411c677ea66529cf8f9267e164b01d11c0ee8 100644 (file)
@@ -54,6 +54,8 @@ enum virHookSubopType {
 enum virHookQemuOpType {
     VIR_HOOK_QEMU_OP_START,            /* domain is about to start */
     VIR_HOOK_QEMU_OP_STOPPED,          /* domain has stopped */
+    VIR_HOOK_QEMU_OP_PREPARE,          /* domain startup initiated */
+    VIR_HOOK_QEMU_OP_RELEASE,          /* domain destruction is over */
 
     VIR_HOOK_QEMU_OP_LAST,
 };