mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 22:55:23 +00:00
qemu: implement startupPolicy
This patch implements on_missing feature in qemu driver. Upon qemu startup process an accessibility of CDROMs and floppy disks is checked. The source might get dropped if unavailable and on_missing is set accordingly. No event is emit thought. Look for follow up patch.
This commit is contained in:
parent
b8fbe5d5ba
commit
12ba43222d
@ -1608,3 +1608,69 @@ qemuDomainSetFakeReboot(struct qemud_driver *driver,
|
|||||||
if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
|
if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
|
||||||
VIR_WARN("Failed to save status on vm %s", vm->def->name);
|
VIR_WARN("Failed to save status on vm %s", vm->def->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
qemuDomainCheckDiskPresence(struct qemud_driver *driver,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
bool start_with_state)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
int i;
|
||||||
|
int accessRet;
|
||||||
|
virDomainDiskDefPtr disk;
|
||||||
|
char uuid[VIR_UUID_STRING_BUFLEN] ATTRIBUTE_UNUSED;
|
||||||
|
|
||||||
|
virUUIDFormat(vm->def->uuid, uuid);
|
||||||
|
|
||||||
|
for (i = 0; i < vm->def->ndisks; i++) {
|
||||||
|
disk = vm->def->disks[i];
|
||||||
|
|
||||||
|
if (!disk->startupPolicy || !disk->src)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ((accessRet = virFileAccessibleAs(disk->src, F_OK,
|
||||||
|
driver->user,
|
||||||
|
driver->group)) >= 0) {
|
||||||
|
/* disk accessible or virFileAccessibleAs()
|
||||||
|
* terminated with signal*/
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ((enum virDomainStartupPolicy) disk->startupPolicy) {
|
||||||
|
case VIR_DOMAIN_STARTUP_POLICY_OPTIONAL:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_STARTUP_POLICY_MANDATORY:
|
||||||
|
virReportSystemError(-accessRet,
|
||||||
|
_("cannot access file '%s'"),
|
||||||
|
disk->src);
|
||||||
|
goto cleanup;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_STARTUP_POLICY_REQUISITE:
|
||||||
|
if (!start_with_state) {
|
||||||
|
virReportSystemError(-accessRet,
|
||||||
|
_("cannot access file '%s'"),
|
||||||
|
disk->src);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_STARTUP_POLICY_DEFAULT:
|
||||||
|
case VIR_DOMAIN_STARTUP_POLICY_LAST:
|
||||||
|
/* this should never happen */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_DEBUG("Droping disk '%s' on domain '%s' (UUID '%s') "
|
||||||
|
"due to not accessible source '%s'",
|
||||||
|
disk->dst, vm->def->name, uuid, disk->src);
|
||||||
|
|
||||||
|
VIR_FREE(disk->src);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@ -280,4 +280,8 @@ void qemuDomainSetFakeReboot(struct qemud_driver *driver,
|
|||||||
|
|
||||||
bool qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv,
|
bool qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv,
|
||||||
enum qemuDomainJob job);
|
enum qemuDomainJob job);
|
||||||
|
|
||||||
|
int qemuDomainCheckDiskPresence(struct qemud_driver *driver,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
bool start_with_state);
|
||||||
#endif /* __QEMU_DOMAIN_H__ */
|
#endif /* __QEMU_DOMAIN_H__ */
|
||||||
|
@ -2880,6 +2880,13 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
NULL) < 0)
|
NULL) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (qemuAssignDeviceAliases(vm->def, priv->qemuCaps) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
VIR_DEBUG("Checking for CDROM and floppy presence");
|
||||||
|
if (qemuDomainCheckDiskPresence(driver, vm, migrateFrom != NULL) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
/* If you are using a SecurityDriver with dynamic labelling,
|
/* If you are using a SecurityDriver with dynamic labelling,
|
||||||
then generate a security label for isolation */
|
then generate a security label for isolation */
|
||||||
VIR_DEBUG("Generating domain security label (if required)");
|
VIR_DEBUG("Generating domain security label (if required)");
|
||||||
@ -3015,9 +3022,6 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
priv->persistentAddrs = 0;
|
priv->persistentAddrs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemuAssignDeviceAliases(vm->def, priv->qemuCaps) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
VIR_DEBUG("Building emulator command line");
|
VIR_DEBUG("Building emulator command line");
|
||||||
if (!(cmd = qemuBuildCommandLine(conn, driver, vm->def, priv->monConfig,
|
if (!(cmd = qemuBuildCommandLine(conn, driver, vm->def, priv->monConfig,
|
||||||
priv->monJSON != 0, priv->qemuCaps,
|
priv->monJSON != 0, priv->qemuCaps,
|
||||||
|
Loading…
Reference in New Issue
Block a user