}
}
+int
+libxlDomainHookRun(libxlDriverPrivate *driver,
+ virDomainDef *def,
+ unsigned int def_fmtflags,
+ int hookop,
+ int hooksubop,
+ char **output)
+{
+ g_autofree char *xml = NULL;
+
+ if (!virHookPresent(VIR_HOOK_DRIVER_LIBXL))
+ return 0;
+
+ xml = virDomainDefFormat(def, driver->xmlopt, def_fmtflags);
+ return virHookCall(VIR_HOOK_DRIVER_LIBXL, def->name,
+ hookop, hooksubop,
+ NULL, xml, output);
+}
+
/*
* Internal domain destroy function.
*
hostdev_flags |= VIR_HOSTDEV_SP_USB;
- /* now that we know it's stopped call the hook if present */
- if (virHookPresent(VIR_HOOK_DRIVER_LIBXL)) {
- char *xml = virDomainDefFormat(vm->def, driver->xmlopt, 0);
-
- /* we can't stop the operation even if the script raised an error */
- ignore_value(virHookCall(VIR_HOOK_DRIVER_LIBXL, vm->def->name,
- VIR_HOOK_LIBXL_OP_STOPPED, VIR_HOOK_SUBOP_END,
- NULL, xml, NULL));
- VIR_FREE(xml);
- }
+ /* Call hook with stopped operation. Ignore error and continue with cleanup */
+ ignore_value(libxlDomainHookRun(driver, vm->def, 0,
+ VIR_HOOK_LIBXL_OP_STOPPED,
+ VIR_HOOK_SUBOP_END, NULL));
virHostdevReAttachDomainDevices(hostdev_mgr, LIBXL_DRIVER_INTERNAL_NAME,
vm->def, hostdev_flags);
VIR_DEBUG("Failed to remove domain XML for %s", vm->def->name);
VIR_FREE(file);
- /* The "release" hook cleans up additional resources */
- if (virHookPresent(VIR_HOOK_DRIVER_LIBXL)) {
- char *xml = virDomainDefFormat(vm->def, driver->xmlopt, 0);
-
- /* we can't stop the operation even if the script raised an error */
- ignore_value(virHookCall(VIR_HOOK_DRIVER_LIBXL, vm->def->name,
- VIR_HOOK_LIBXL_OP_RELEASE, VIR_HOOK_SUBOP_END,
- NULL, xml, NULL));
- VIR_FREE(xml);
- }
+ /* Call hook with release operation. Ignore error and continue with cleanup */
+ ignore_value(libxlDomainHookRun(driver, vm->def, 0,
+ VIR_HOOK_LIBXL_OP_RELEASE,
+ VIR_HOOK_SUBOP_END, NULL));
virDomainObjRemoveTransientDef(vm);
}
return -1;
/* Run an early hook to set-up missing devices */
- if (virHookPresent(VIR_HOOK_DRIVER_LIBXL)) {
- g_autofree char *xml = virDomainDefFormat(vm->def, driver->xmlopt, 0);
- int hookret;
-
- hookret = virHookCall(VIR_HOOK_DRIVER_LIBXL, vm->def->name,
- VIR_HOOK_LIBXL_OP_PREPARE, VIR_HOOK_SUBOP_BEGIN,
- NULL, xml, NULL);
- /*
- * If the script raised an error abort the launch
- */
- if (hookret < 0)
- goto error;
- }
+ if (libxlDomainHookRun(driver, vm->def, 0,
+ VIR_HOOK_LIBXL_OP_PREPARE,
+ VIR_HOOK_SUBOP_BEGIN, NULL) < 0)
+ goto error;
if (virDomainLockProcessStart(driver->lockManager,
"xen:///system",
goto cleanup;
/* now that we know it is about to start call the hook if present */
- if (virHookPresent(VIR_HOOK_DRIVER_LIBXL)) {
- char *xml = virDomainDefFormat(vm->def, driver->xmlopt, 0);
- int hookret;
-
- hookret = virHookCall(VIR_HOOK_DRIVER_LIBXL, vm->def->name,
- VIR_HOOK_LIBXL_OP_START, VIR_HOOK_SUBOP_BEGIN,
- NULL, xml, NULL);
- VIR_FREE(xml);
-
- /*
- * If the script raised an error abort the launch
- */
- if (hookret < 0)
- goto cleanup;
- }
+ if (libxlDomainHookRun(driver, vm->def, 0,
+ VIR_HOOK_LIBXL_OP_START,
+ VIR_HOOK_SUBOP_BEGIN, NULL) < 0)
+ goto cleanup;
if (priv->hookRun) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
goto destroy_dom;
/* finally we can call the 'started' hook script if any */
- if (virHookPresent(VIR_HOOK_DRIVER_LIBXL)) {
- char *xml = virDomainDefFormat(vm->def, driver->xmlopt, 0);
- int hookret;
-
- hookret = virHookCall(VIR_HOOK_DRIVER_LIBXL, vm->def->name,
- VIR_HOOK_LIBXL_OP_STARTED, VIR_HOOK_SUBOP_BEGIN,
- NULL, xml, NULL);
- VIR_FREE(xml);
-
- /*
- * If the script raised an error abort the launch
- */
- if (hookret < 0)
- goto destroy_dom;
- }
+ if (libxlDomainHookRun(driver, vm->def, 0,
+ VIR_HOOK_LIBXL_OP_STARTED,
+ VIR_HOOK_SUBOP_BEGIN, NULL) < 0)
+ goto destroy_dom;
ret = 0;
goto cleanup;
if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0)
VIR_WARN("Cannot update XML for running Xen guest %s", vm->def->name);
- /* now that we know it's reconnected call the hook if present */
- if (virHookPresent(VIR_HOOK_DRIVER_LIBXL) &&
- STRNEQ("Domain-0", vm->def->name)) {
- char *xml = virDomainDefFormat(vm->def, driver->xmlopt, 0);
- int hookret;
-
- /* we can't stop the operation even if the script raised an error */
- hookret = virHookCall(VIR_HOOK_DRIVER_LIBXL, vm->def->name,
- VIR_HOOK_LIBXL_OP_RECONNECT, VIR_HOOK_SUBOP_BEGIN,
- NULL, xml, NULL);
- VIR_FREE(xml);
- if (hookret < 0) {
- /* Stop the domain if the hook failed */
- if (virDomainObjIsActive(vm)) {
- libxlDomainDestroyInternal(driver, vm);
- virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_FAILED);
- }
- goto error;
- }
- }
+ /* now that we know it's reconnected call the hook */
+ if (STRNEQ("Domain-0", vm->def->name) &&
+ (libxlDomainHookRun(driver, vm->def, 0,
+ VIR_HOOK_LIBXL_OP_RECONNECT,
+ VIR_HOOK_SUBOP_BEGIN, NULL) < 0))
+ goto error;
ret = 0;