mirror of https://gitee.com/openkylin/libvirt.git
vz: add device updates
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> Signed-off-by: Maxim Nestratov <mnestratov@virtuozzo.com>
This commit is contained in:
parent
0f38187b68
commit
307eb644ed
|
@ -1242,6 +1242,42 @@ vzDomainSetUserPassword(virDomainPtr domain,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vzDomainUpdateDeviceFlags(virDomainPtr dom,
|
||||||
|
const char *xml,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
vzConnPtr privconn = dom->conn->privateData;
|
||||||
|
virDomainObjPtr privdom = NULL;
|
||||||
|
virDomainDeviceDefPtr dev = NULL;
|
||||||
|
vzDriverPtr driver = privconn->driver;
|
||||||
|
|
||||||
|
virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
|
||||||
|
VIR_DOMAIN_AFFECT_CONFIG, -1);
|
||||||
|
|
||||||
|
if (!(privdom = vzDomObjFromDomain(dom)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (vzCheckConfigUpdateFlags(privdom, &flags) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!(dev = virDomainDeviceDefParse(xml, privdom->def, driver->caps,
|
||||||
|
driver->xmlopt,
|
||||||
|
VIR_DOMAIN_XML_INACTIVE)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (prlsdkUpdateDevice(driver, privdom, dev) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
|
||||||
|
virDomainDeviceDefFree(dev);
|
||||||
|
virObjectUnlock(privdom);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static unsigned long long
|
static unsigned long long
|
||||||
vzDomainGetMaxMemory(virDomainPtr domain)
|
vzDomainGetMaxMemory(virDomainPtr domain)
|
||||||
{
|
{
|
||||||
|
@ -2756,6 +2792,7 @@ static virHypervisorDriver vzHypervisorDriver = {
|
||||||
.domainMigratePerform3Params = vzDomainMigratePerform3Params, /* 1.3.5 */
|
.domainMigratePerform3Params = vzDomainMigratePerform3Params, /* 1.3.5 */
|
||||||
.domainMigrateFinish3Params = vzDomainMigrateFinish3Params, /* 1.3.5 */
|
.domainMigrateFinish3Params = vzDomainMigrateFinish3Params, /* 1.3.5 */
|
||||||
.domainMigrateConfirm3Params = vzDomainMigrateConfirm3Params, /* 1.3.5 */
|
.domainMigrateConfirm3Params = vzDomainMigrateConfirm3Params, /* 1.3.5 */
|
||||||
|
.domainUpdateDeviceFlags = vzDomainUpdateDeviceFlags, /* 2.0.0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
static virConnectDriver vzConnectDriver = {
|
static virConnectDriver vzConnectDriver = {
|
||||||
|
|
|
@ -43,6 +43,11 @@ prlsdkUUIDParse(const char *uuidstr, unsigned char *uuid);
|
||||||
|
|
||||||
VIR_LOG_INIT("parallels.sdk");
|
VIR_LOG_INIT("parallels.sdk");
|
||||||
|
|
||||||
|
static PRL_HANDLE
|
||||||
|
prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac);
|
||||||
|
static PRL_HANDLE
|
||||||
|
prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool isCt);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Log error description
|
* Log error description
|
||||||
*/
|
*/
|
||||||
|
@ -2796,10 +2801,10 @@ static const char * prlsdkFormatMac(virMacAddrPtr mac, char *macstr)
|
||||||
return macstr;
|
return macstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int prlsdkAddNet(vzDriverPtr driver,
|
static int prlsdkConfigureNet(vzDriverPtr driver,
|
||||||
PRL_HANDLE sdkdom,
|
PRL_HANDLE sdkdom,
|
||||||
virDomainNetDefPtr net,
|
virDomainNetDefPtr net,
|
||||||
bool isCt)
|
bool isCt, bool create)
|
||||||
{
|
{
|
||||||
PRL_RESULT pret;
|
PRL_RESULT pret;
|
||||||
PRL_HANDLE sdknet = PRL_INVALID_HANDLE;
|
PRL_HANDLE sdknet = PRL_INVALID_HANDLE;
|
||||||
|
@ -2816,8 +2821,14 @@ static int prlsdkAddNet(vzDriverPtr driver,
|
||||||
if (prlsdkCheckNetUnsupportedParams(net) < 0)
|
if (prlsdkCheckNetUnsupportedParams(net) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (create) {
|
||||||
pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_GENERIC_NETWORK_ADAPTER, &sdknet);
|
pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_GENERIC_NETWORK_ADAPTER, &sdknet);
|
||||||
prlsdkCheckRetGoto(pret, cleanup);
|
prlsdkCheckRetGoto(pret, cleanup);
|
||||||
|
} else {
|
||||||
|
sdknet = prlsdkFindNetByMAC(sdkdom, &net->mac);
|
||||||
|
if (sdknet == PRL_INVALID_HANDLE)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
pret = PrlVmDev_SetEnabled(sdknet, 1);
|
pret = PrlVmDev_SetEnabled(sdknet, 1);
|
||||||
prlsdkCheckRetGoto(pret, cleanup);
|
prlsdkCheckRetGoto(pret, cleanup);
|
||||||
|
@ -3088,9 +3099,11 @@ prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac)
|
||||||
return adapter;
|
return adapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int prlsdkAddDisk(vzDriverPtr driver,
|
static int prlsdkConfigureDisk(vzDriverPtr driver,
|
||||||
PRL_HANDLE sdkdom,
|
PRL_HANDLE sdkdom,
|
||||||
virDomainDiskDefPtr disk)
|
virDomainDiskDefPtr disk,
|
||||||
|
bool isCt,
|
||||||
|
bool create)
|
||||||
{
|
{
|
||||||
PRL_RESULT pret;
|
PRL_RESULT pret;
|
||||||
PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE;
|
PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE;
|
||||||
|
@ -3109,8 +3122,14 @@ static int prlsdkAddDisk(vzDriverPtr driver,
|
||||||
else
|
else
|
||||||
devType = PDE_OPTICAL_DISK;
|
devType = PDE_OPTICAL_DISK;
|
||||||
|
|
||||||
|
if (create) {
|
||||||
pret = PrlVmCfg_CreateVmDev(sdkdom, devType, &sdkdisk);
|
pret = PrlVmCfg_CreateVmDev(sdkdom, devType, &sdkdisk);
|
||||||
prlsdkCheckRetGoto(pret, cleanup);
|
prlsdkCheckRetGoto(pret, cleanup);
|
||||||
|
} else {
|
||||||
|
sdkdisk = prlsdkGetDisk(sdkdom, disk, isCt);
|
||||||
|
if (sdkdisk == PRL_INVALID_HANDLE)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
pret = PrlVmDev_SetEnabled(sdkdisk, 1);
|
pret = PrlVmDev_SetEnabled(sdkdisk, 1);
|
||||||
prlsdkCheckRetGoto(pret, cleanup);
|
prlsdkCheckRetGoto(pret, cleanup);
|
||||||
|
@ -3280,7 +3299,8 @@ prlsdkAttachDevice(vzDriverPtr driver,
|
||||||
|
|
||||||
switch (dev->type) {
|
switch (dev->type) {
|
||||||
case VIR_DOMAIN_DEVICE_DISK:
|
case VIR_DOMAIN_DEVICE_DISK:
|
||||||
if (prlsdkAddDisk(driver, privdom->sdkdom, dev->data.disk) < 0)
|
if (prlsdkConfigureDisk(driver, privdom->sdkdom,
|
||||||
|
dev->data.disk, IS_CT(dom->def), true) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -3291,7 +3311,8 @@ prlsdkAttachDevice(vzDriverPtr driver,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prlsdkAddNet(driver, privdom->sdkdom, dev->data.net, IS_CT(dom->def)) < 0)
|
if (prlsdkConfigureNet(driver, privdom->sdkdom, dev->data.net,
|
||||||
|
IS_CT(dom->def), true) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -3370,6 +3391,45 @@ prlsdkDetachDevice(vzDriverPtr driver,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
prlsdkUpdateDevice(vzDriverPtr driver,
|
||||||
|
virDomainObjPtr dom,
|
||||||
|
virDomainDeviceDefPtr dev)
|
||||||
|
{
|
||||||
|
vzDomObjPtr privdom = dom->privateData;
|
||||||
|
PRL_HANDLE job = PRL_INVALID_HANDLE;
|
||||||
|
|
||||||
|
job = PrlVm_BeginEdit(privdom->sdkdom);
|
||||||
|
if (PRL_FAILED(waitJob(job)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
switch (dev->type) {
|
||||||
|
case VIR_DOMAIN_DEVICE_DISK:
|
||||||
|
if (prlsdkConfigureDisk(driver, privdom->sdkdom, dev->data.disk,
|
||||||
|
IS_CT(dom->def), false) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_DEVICE_NET:
|
||||||
|
if (prlsdkConfigureNet(driver, privdom->sdkdom, dev->data.net,
|
||||||
|
IS_CT(dom->def), false) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("updating device type '%s' is unsupported"),
|
||||||
|
virDomainDeviceTypeToString(dev->type));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
|
||||||
|
if (PRL_FAILED(waitJob(job)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs)
|
prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs)
|
||||||
{
|
{
|
||||||
|
@ -3588,7 +3648,8 @@ prlsdkDoApplyConfig(vzDriverPtr driver,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < def->nnets; i++) {
|
for (i = 0; i < def->nnets; i++) {
|
||||||
if (prlsdkAddNet(driver, sdkdom, def->nets[i], IS_CT(def)) < 0)
|
if (prlsdkConfigureNet(driver, sdkdom, def->nets[i],
|
||||||
|
IS_CT(def), true) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3609,7 +3670,8 @@ prlsdkDoApplyConfig(vzDriverPtr driver,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < def->ndisks; i++) {
|
for (i = 0; i < def->ndisks; i++) {
|
||||||
if (prlsdkAddDisk(driver, sdkdom, def->disks[i]) < 0)
|
if (prlsdkConfigureDisk(driver, sdkdom, def->disks[i],
|
||||||
|
IS_CT(def), true) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,8 @@ prlsdkAttachDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPt
|
||||||
int
|
int
|
||||||
prlsdkDetachDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPtr dev);
|
prlsdkDetachDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPtr dev);
|
||||||
int
|
int
|
||||||
|
prlsdkUpdateDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPtr dev);
|
||||||
|
int
|
||||||
prlsdkGetBlockStats(PRL_HANDLE sdkstats, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats);
|
prlsdkGetBlockStats(PRL_HANDLE sdkstats, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats);
|
||||||
int
|
int
|
||||||
prlsdkGetNetStats(PRL_HANDLE sdkstas, PRL_HANDLE sdkdom, const char *path, virDomainInterfaceStatsPtr stats);
|
prlsdkGetNetStats(PRL_HANDLE sdkstas, PRL_HANDLE sdkdom, const char *path, virDomainInterfaceStatsPtr stats);
|
||||||
|
|
Loading…
Reference in New Issue