qemu: domain: Extract preparation of hostdev specific data to a separate function

Historically we've prepared secrets for all objects in one place. This
doesn't make much sense and it's semantically more appealing to prepare
everything for a single device type in one place.

Move the setup of the (iSCSI|SCSI) hostdev secrets into a new function
which will be used to setup other things as well in the future.

This is a similar approach we do for disks.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2020-09-10 12:32:04 +02:00
parent 82b60ec8ce
commit 3673bdbe13
4 changed files with 78 additions and 8 deletions

View File

@ -1596,13 +1596,7 @@ qemuDomainSecretPrepare(virQEMUDriverPtr driver,
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
size_t i; size_t i;
/* disk secrets are prepared when preparing disks */ /* disk and hostdev secrets are prepared when preparing internal data */
for (i = 0; i < vm->def->nhostdevs; i++) {
if (qemuDomainSecretHostdevPrepare(priv,
vm->def->hostdevs[i]) < 0)
return -1;
}
for (i = 0; i < vm->def->nserials; i++) { for (i = 0; i < vm->def->nserials; i++) {
if (qemuDomainSecretChardevPrepare(cfg, priv, if (qemuDomainSecretChardevPrepare(cfg, priv,
@ -10455,6 +10449,57 @@ qemuDomainPrepareDiskSource(virDomainDiskDefPtr disk,
} }
int
qemuDomainPrepareHostdev(virDomainHostdevDefPtr hostdev,
qemuDomainObjPrivatePtr priv)
{
if (virHostdevIsSCSIDevice(hostdev)) {
virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
virStorageSourcePtr src = NULL;
switch ((virDomainHostdevSCSIProtocolType) scsisrc->protocol) {
case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_NONE:
break;
case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI:
src = scsisrc->u.iscsi.src;
break;
case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_LAST:
default:
virReportEnumRangeError(virDomainHostdevSCSIProtocolType, scsisrc->protocol);
return -1;
}
if (src) {
if (src->auth) {
bool iscsiHasPS = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_ISCSI_PASSWORD_SECRET);
virSecretUsageType usageType = VIR_SECRET_USAGE_TYPE_ISCSI;
qemuDomainStorageSourcePrivatePtr srcPriv = qemuDomainStorageSourcePrivateFetch(src);
if (!qemuDomainSupportsEncryptedSecret(priv) || !iscsiHasPS) {
srcPriv->secinfo = qemuDomainSecretInfoNewPlain(usageType,
src->auth->username,
&src->auth->seclookupdef);
} else {
srcPriv->secinfo = qemuDomainSecretAESSetupFromSecret(priv,
hostdev->info->alias,
NULL,
usageType,
src->auth->username,
&src->auth->seclookupdef);
}
if (!srcPriv->secinfo)
return -1;
}
}
}
return 0;
}
/** /**
* qemuDomainDiskCachemodeFlags: * qemuDomainDiskCachemodeFlags:
* *

View File

@ -970,6 +970,10 @@ qemuDomainDiskCachemodeFlags(int cachemode,
bool *direct, bool *direct,
bool *noflush); bool *noflush);
int
qemuDomainPrepareHostdev(virDomainHostdevDefPtr hostdev,
qemuDomainObjPrivatePtr priv);
char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv); char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv);
bool qemuDomainDefHasManagedPR(virDomainObjPtr vm); bool qemuDomainDefHasManagedPR(virDomainObjPtr vm);

View File

@ -2604,7 +2604,7 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriverPtr driver,
if (qemuAssignDeviceHostdevAlias(vm->def, &hostdev->info->alias, -1) < 0) if (qemuAssignDeviceHostdevAlias(vm->def, &hostdev->info->alias, -1) < 0)
goto cleanup; goto cleanup;
if (qemuDomainSecretHostdevPrepare(priv, hostdev) < 0) if (qemuDomainPrepareHostdev(hostdev, priv) < 0)
goto cleanup; goto cleanup;
if (!(data = qemuBuildHostdevSCSIAttachPrepare(hostdev, &backendalias, if (!(data = qemuBuildHostdevSCSIAttachPrepare(hostdev, &backendalias,

View File

@ -6213,6 +6213,23 @@ qemuProcessPrepareDomainStorage(virQEMUDriverPtr driver,
} }
static int
qemuProcessPrepareDomainHostdevs(virDomainObjPtr vm,
qemuDomainObjPrivatePtr priv)
{
size_t i;
for (i = 0; i < vm->def->nhostdevs; i++) {
virDomainHostdevDefPtr hostdev = vm->def->hostdevs[i];
if (qemuDomainPrepareHostdev(hostdev, priv) < 0)
return -1;
}
return 0;
}
static void static void
qemuProcessPrepareAllowReboot(virDomainObjPtr vm) qemuProcessPrepareAllowReboot(virDomainObjPtr vm)
{ {
@ -6315,6 +6332,10 @@ qemuProcessPrepareDomain(virQEMUDriverPtr driver,
if (qemuProcessPrepareDomainStorage(driver, vm, priv, cfg, flags) < 0) if (qemuProcessPrepareDomainStorage(driver, vm, priv, cfg, flags) < 0)
return -1; return -1;
VIR_DEBUG("Setting up host devices");
if (qemuProcessPrepareDomainHostdevs(vm, priv) < 0)
return -1;
VIR_DEBUG("Prepare chardev source backends for TLS"); VIR_DEBUG("Prepare chardev source backends for TLS");
qemuDomainPrepareChardevSource(vm->def, cfg); qemuDomainPrepareChardevSource(vm->def, cfg);