From 3415eeb53ea42483894b50e4a80fd62b54772d6f Mon Sep 17 00:00:00 2001 From: Thibault Vincent Date: Tue, 22 Mar 2011 21:12:36 +0800 Subject: [PATCH] qemu: add two hook script events "prepare" and "release" 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 | 26 ++++++++++++++++++++++++++ src/util/hooks.c | 4 +++- src/util/hooks.h | 2 ++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 793a43c69c..7831c3b3bf 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -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; diff --git a/src/util/hooks.c b/src/util/hooks.c index 5ba2036d6d..62446eadbb 100644 --- a/src/util/hooks.c +++ b/src/util/hooks.c @@ -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", diff --git a/src/util/hooks.h b/src/util/hooks.h index f311ed1022..fd7411c677 100644 --- a/src/util/hooks.h +++ b/src/util/hooks.h @@ -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, }; -- GitLab