mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 06:35:24 +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)
|
||||
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,
|
||||
enum qemuDomainJob job);
|
||||
|
||||
int qemuDomainCheckDiskPresence(struct qemud_driver *driver,
|
||||
virDomainObjPtr vm,
|
||||
bool start_with_state);
|
||||
#endif /* __QEMU_DOMAIN_H__ */
|
||||
|
@ -2880,6 +2880,13 @@ int qemuProcessStart(virConnectPtr conn,
|
||||
NULL) < 0)
|
||||
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,
|
||||
then generate a security label for isolation */
|
||||
VIR_DEBUG("Generating domain security label (if required)");
|
||||
@ -3015,9 +3022,6 @@ int qemuProcessStart(virConnectPtr conn,
|
||||
priv->persistentAddrs = 0;
|
||||
}
|
||||
|
||||
if (qemuAssignDeviceAliases(vm->def, priv->qemuCaps) < 0)
|
||||
goto cleanup;
|
||||
|
||||
VIR_DEBUG("Building emulator command line");
|
||||
if (!(cmd = qemuBuildCommandLine(conn, driver, vm->def, priv->monConfig,
|
||||
priv->monJSON != 0, priv->qemuCaps,
|
||||
|
Loading…
Reference in New Issue
Block a user