mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
Parallels: implement domainAttachDeviceFlags
Parallels Cloud Server supports block devices and virtual NIC live attachment. I implemented that function for block devices so OpenStack volume attachment is now works. Signed-off-by: Alexander Burluka <aburluka@parallels.com>
This commit is contained in:
parent
92b54f1c4a
commit
fcba57b2ec
@ -1094,6 +1094,70 @@ parallelsDomainManagedSaveRemove(virDomainPtr domain, unsigned int flags)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int parallelsDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
|
||||
unsigned int flags)
|
||||
{
|
||||
int ret = -1;
|
||||
parallelsConnPtr privconn = dom->conn->privateData;
|
||||
virDomainDeviceDefPtr dev = NULL;
|
||||
virDomainObjPtr privdom = NULL;
|
||||
bool domactive = false;
|
||||
|
||||
virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
|
||||
VIR_DOMAIN_AFFECT_CONFIG, -1);
|
||||
|
||||
privdom = virDomainObjListFindByUUID(privconn->domains, dom->uuid);
|
||||
if (privdom == NULL) {
|
||||
parallelsDomNotFoundError(dom);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!(flags & VIR_DOMAIN_AFFECT_CONFIG)) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||
_("device attach needs VIR_DOMAIN_AFFECT_CONFIG "
|
||||
"flag to be set"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
domactive = virDomainObjIsActive(privdom);
|
||||
if (!domactive && (flags & VIR_DOMAIN_AFFECT_LIVE)) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||
_("cannot do live update a device on "
|
||||
"inactive domain"));
|
||||
goto cleanup;
|
||||
}
|
||||
if (domactive && !(flags & VIR_DOMAIN_AFFECT_LIVE)) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||
_("Updates on a running domain need "
|
||||
"VIR_DOMAIN_AFFECT_LIVE flag"));
|
||||
}
|
||||
|
||||
dev = virDomainDeviceDefParse(xml, privdom->def, privconn->caps,
|
||||
privconn->xmlopt, VIR_DOMAIN_XML_INACTIVE);
|
||||
if (dev == NULL)
|
||||
goto cleanup;
|
||||
|
||||
switch (dev->type) {
|
||||
case VIR_DOMAIN_DEVICE_DISK:
|
||||
ret = prlsdkAttachVolume(dom->conn, privdom, dev->data.disk);
|
||||
if (ret) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("disk attach failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
|
||||
_("device type '%s' cannot be detached"),
|
||||
virDomainDeviceTypeToString(dev->type));
|
||||
break;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static virHypervisorDriver parallelsDriver = {
|
||||
.name = "Parallels",
|
||||
.connectOpen = parallelsConnectOpen, /* 0.10.0 */
|
||||
@ -1128,6 +1192,7 @@ static virHypervisorDriver parallelsDriver = {
|
||||
.domainDefineXMLFlags = parallelsDomainDefineXMLFlags, /* 1.2.12 */
|
||||
.domainUndefine = parallelsDomainUndefine, /* 1.2.10 */
|
||||
.domainUndefineFlags = parallelsDomainUndefineFlags, /* 1.2.10 */
|
||||
.domainAttachDeviceFlags = parallelsDomainAttachDeviceFlags, /* 1.2.15 */
|
||||
.domainIsActive = parallelsDomainIsActive, /* 1.2.10 */
|
||||
.connectDomainEventRegisterAny = parallelsConnectDomainEventRegisterAny, /* 1.2.10 */
|
||||
.connectDomainEventDeregisterAny = parallelsConnectDomainEventDeregisterAny, /* 1.2.10 */
|
||||
|
@ -2969,6 +2969,33 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool bootD
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
prlsdkAttachVolume(virConnectPtr conn,
|
||||
virDomainObjPtr dom,
|
||||
virDomainDiskDefPtr disk)
|
||||
{
|
||||
int ret = -1;
|
||||
parallelsConnPtr privconn = conn->privateData;
|
||||
parallelsDomObjPtr privdom = dom->privateData;
|
||||
PRL_HANDLE job = PRL_INVALID_HANDLE;
|
||||
|
||||
job = PrlVm_BeginEdit(privdom->sdkdom);
|
||||
if (PRL_FAILED(waitJob(job, privconn->jobTimeout)))
|
||||
goto cleanup;
|
||||
|
||||
ret = prlsdkAddDisk(privdom->sdkdom, disk, false);
|
||||
if (ret == 0) {
|
||||
job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
|
||||
if (PRL_FAILED(waitJob(job, privconn->jobTimeout))) {
|
||||
ret = -1;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
cleanup:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs)
|
||||
{
|
||||
|
@ -60,3 +60,7 @@ int
|
||||
prlsdkUnregisterDomain(parallelsConnPtr privconn, virDomainObjPtr dom);
|
||||
int
|
||||
prlsdkDomainManagedSaveRemove(parallelsConnPtr privconn, virDomainObjPtr dom);
|
||||
int
|
||||
prlsdkAttachVolume(virConnectPtr conn,
|
||||
virDomainObjPtr dom,
|
||||
virDomainDiskDefPtr disk);
|
||||
|
Loading…
x
Reference in New Issue
Block a user