diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 793a43c69cf9c636c61eef65322a160664919653..7831c3b3bfb66483e0d67c1e03fcae4a6db3e1fb 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 5ba2036d6d8c56e92143ca2fca67b3f1789bb298..62446eadbb9725e12a6dc56ac37c0b7eef033749 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 f311ed1022f14a7083e06a6a68b162eb7aef2bcf..fd7411c677ea66529cf8f9267e164b01d11c0ee8 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, };