[libvirt] [PATCH 00/18] vz: support disk/net/graphics devices updates

It makes sense to support other devices too as update can be on persistent config only which is always possible, but as AFAIK the main purpose of this API is to change live config the set of devices is just set of devices supported by qemu for live updates. Nikolay Shirokovskiy (18): vz: remove disk cache mode hunk vz: make prlsdkGetDisk more generic vz: reuse edit config frame in for attach/detach functions vz: add device updates vz: leverage disks parameters check on disks updates too vz: move disks checks to device post parse vz: fix memory leaks in attach/detach functions vz: give nice report if network device not found vz: dump ip addresses to domain xml vz: dump route info in domain xml vz: fix updating to no gateways vz: fix minor type safey issues with net union usage vz: trustGuestRxFilters fixes vz: move getting container video devices out from vnc code vz: support attach/detach/update/ of graphics device vz: remove exlicitly setting zeros in dumping graphics vz: support vnc password vz: always pass graphics address to sdk src/conf/networkcommon_conf.c | 2 +- src/conf/networkcommon_conf.h | 2 +- src/libvirt_private.syms | 1 + src/vz/vz_driver.c | 115 +++--- src/vz/vz_sdk.c | 897 +++++++++++++++++++++++------------------- src/vz/vz_sdk.h | 10 +- src/vz/vz_utils.c | 204 ++++++++-- src/vz/vz_utils.h | 7 +- 8 files changed, 740 insertions(+), 498 deletions(-) -- 1.8.3.1

This code was added as a part of huge patch that moves driver from working with prlctl to vz sdk so there is no good explanation why this is done this way. The problem that it is not correct. vz sdk cache mode parameter affects all domain disks while this hunk resets its on every disk to a new value. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 9b783af..bff52f9 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3293,24 +3293,6 @@ static int prlsdkAddDisk(vzDriverPtr driver, pret = PrlVmDev_SetStackIndex(sdkdisk, idx); prlsdkCheckRetGoto(pret, cleanup); - switch (disk->cachemode) { - case VIR_DOMAIN_DISK_CACHE_DISABLE: - pret = PrlVmCfg_SetDiskCacheWriteBack(sdkdom, PRL_FALSE); - prlsdkCheckRetGoto(pret, cleanup); - break; - case VIR_DOMAIN_DISK_CACHE_WRITEBACK: - pret = PrlVmCfg_SetDiskCacheWriteBack(sdkdom, PRL_TRUE); - prlsdkCheckRetGoto(pret, cleanup); - break; - case VIR_DOMAIN_DISK_CACHE_DEFAULT: - break; - default: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Specified disk cache mode is not " - "supported by vz driver.")); - goto cleanup; - } - return 0; cleanup: PrlHandle_Free(sdkdisk); -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
This code was added as a part of huge patch that moves driver from working with prlctl to vz sdk so there is no good explanation why this is done this way. The problem that it is not correct. vz sdk cache mode parameter affects all domain disks while this hunk resets its on every disk to a new value.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 18 ------------------ 1 file changed, 18 deletions(-)
ACK for now. Though I think we have to check for reasonable cachemode parameters later on. Maxim

Current implementation works with hard disks only. This patch adds support for any disk device (cdroms and hdds right now). Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index bff52f9..0f05dfd 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3304,29 +3304,36 @@ static PRL_HANDLE prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool isCt) { PRL_RESULT pret; - PRL_UINT32 hddCount; + PRL_UINT32 num; size_t i; - PRL_HANDLE hdd = PRL_INVALID_HANDLE; + PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE; int bus; char *dst = NULL; + PRL_DEVICE_TYPE devType; - pret = PrlVmCfg_GetHardDisksCount(sdkdom, &hddCount); + /* FIXME safe conversion?? */ + if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) + devType = PDE_HARD_DISK; + else + devType = PDE_OPTICAL_DISK; + + pret = PrlVmCfg_GetDevsCountByType(sdkdom, devType, &num); prlsdkCheckRetGoto(pret, error); - for (i = 0; i < hddCount; ++i) { - pret = PrlVmCfg_GetHardDisk(sdkdom, i, &hdd); + for (i = 0; i < num; ++i) { + pret = PrlVmCfg_GetDevByType(sdkdom, devType, i, &sdkdisk); prlsdkCheckRetGoto(pret, error); - if (prlsdkGetDiskId(hdd, isCt, &bus, &dst) < 0) + if (prlsdkGetDiskId(sdkdisk, isCt, &bus, &dst) < 0) goto error; if (disk->bus == bus && STREQ(disk->dst, dst)) { VIR_FREE(dst); - return hdd; + return sdkdisk; } - PrlHandle_Free(hdd); - hdd = PRL_INVALID_HANDLE; + PrlHandle_Free(sdkdisk); + sdkdisk = PRL_INVALID_HANDLE; VIR_FREE(dst); } @@ -3337,7 +3344,7 @@ prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool isCt) error: VIR_FREE(dst); - PrlHandle_Free(hdd); + PrlHandle_Free(sdkdisk); return PRL_INVALID_HANDLE; } -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
Current implementation works with hard disks only. This patch adds support for any disk device (cdroms and hdds right now).
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-)
ACK with the comment inline.
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index bff52f9..0f05dfd 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3304,29 +3304,36 @@ static PRL_HANDLE prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool isCt) { PRL_RESULT pret; - PRL_UINT32 hddCount; + PRL_UINT32 num; size_t i; - PRL_HANDLE hdd = PRL_INVALID_HANDLE; + PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE; int bus; char *dst = NULL; + PRL_DEVICE_TYPE devType;
- pret = PrlVmCfg_GetHardDisksCount(sdkdom, &hddCount); + /* FIXME safe conversion?? */
Not sure we need this.
+ if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) + devType = PDE_HARD_DISK; + else + devType = PDE_OPTICAL_DISK; + + pret = PrlVmCfg_GetDevsCountByType(sdkdom, devType, &num); prlsdkCheckRetGoto(pret, error);
- for (i = 0; i < hddCount; ++i) { - pret = PrlVmCfg_GetHardDisk(sdkdom, i, &hdd); + for (i = 0; i < num; ++i) { + pret = PrlVmCfg_GetDevByType(sdkdom, devType, i, &sdkdisk); prlsdkCheckRetGoto(pret, error);
- if (prlsdkGetDiskId(hdd, isCt, &bus, &dst) < 0) + if (prlsdkGetDiskId(sdkdisk, isCt, &bus, &dst) < 0) goto error;
if (disk->bus == bus && STREQ(disk->dst, dst)) { VIR_FREE(dst); - return hdd; + return sdkdisk; }
- PrlHandle_Free(hdd); - hdd = PRL_INVALID_HANDLE; + PrlHandle_Free(sdkdisk); + sdkdisk = PRL_INVALID_HANDLE; VIR_FREE(dst); }
@@ -3337,7 +3344,7 @@ prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool isCt)
error: VIR_FREE(dst); - PrlHandle_Free(hdd); + PrlHandle_Free(sdkdisk); return PRL_INVALID_HANDLE; }

Attach/detach functions for disk/net are quite trivial and typically call a few functions in begin/end edit frame. Having in mind update function too adding configuring for another device (like graphics) will introduce 3 trivial functions more. Let's replace current approach by attach/detach functions for device. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 60 ++++----------------- src/vz/vz_sdk.c | 156 +++++++++++++++++++++++------------------------------ src/vz/vz_sdk.h | 8 +-- 3 files changed, 79 insertions(+), 145 deletions(-) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index ffa6f45..ab4aa74 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -1114,6 +1114,7 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, vzConnPtr privconn = dom->conn->privateData; virDomainDeviceDefPtr dev = NULL; virDomainObjPtr privdom = NULL; + vzDriverPtr driver = privconn->driver; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -1124,34 +1125,13 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, if (vzCheckConfigUpdateFlags(privdom, &flags) < 0) goto cleanup; - dev = virDomainDeviceDefParse(xml, privdom->def, privconn->driver->caps, - privconn->driver->xmlopt, VIR_DOMAIN_XML_INACTIVE); + dev = virDomainDeviceDefParse(xml, privdom->def, driver->caps, + driver->xmlopt, VIR_DOMAIN_XML_INACTIVE); if (dev == NULL) goto cleanup; - switch (dev->type) { - case VIR_DOMAIN_DEVICE_DISK: - ret = prlsdkAttachVolume(privconn->driver, privdom, dev->data.disk); - if (ret) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("disk attach failed")); - goto cleanup; - } - break; - case VIR_DOMAIN_DEVICE_NET: - ret = prlsdkAttachNet(privconn->driver, privdom, dev->data.net); - if (ret) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("network attach failed")); - goto cleanup; - } - break; - default: - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, - _("device type '%s' cannot be attached"), - virDomainDeviceTypeToString(dev->type)); - break; - } + if (prlsdkAttachDevice(driver, privdom, dev) < 0) + goto cleanup; ret = 0; cleanup: @@ -1172,6 +1152,7 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, vzConnPtr privconn = dom->conn->privateData; virDomainDeviceDefPtr dev = NULL; virDomainObjPtr privdom = NULL; + vzDriverPtr driver = privconn->driver; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -1183,34 +1164,13 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, if (vzCheckConfigUpdateFlags(privdom, &flags) < 0) goto cleanup; - dev = virDomainDeviceDefParse(xml, privdom->def, privconn->driver->caps, - privconn->driver->xmlopt, VIR_DOMAIN_XML_INACTIVE); + dev = virDomainDeviceDefParse(xml, privdom->def, driver->caps, + driver->xmlopt, VIR_DOMAIN_XML_INACTIVE); if (dev == NULL) goto cleanup; - switch (dev->type) { - case VIR_DOMAIN_DEVICE_DISK: - ret = prlsdkDetachVolume(privdom, dev->data.disk); - if (ret) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("disk detach failed")); - goto cleanup; - } - break; - case VIR_DOMAIN_DEVICE_NET: - ret = prlsdkDetachNet(privconn->driver, privdom, dev->data.net); - if (ret) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("network detach failed")); - goto cleanup; - } - break; - default: - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, - _("device type '%s' cannot be detached"), - virDomainDeviceTypeToString(dev->type)); - break; - } + if (prlsdkDetachDevice(driver, privdom, dev) < 0) + goto cleanup; ret = 0; cleanup: diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 0f05dfd..cb624dc 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3066,34 +3066,6 @@ prlsdkCleanupBridgedNet(vzDriverPtr driver, virDomainNetDefPtr net) PrlHandle_Free(vnet); } -int prlsdkAttachNet(vzDriverPtr driver, - virDomainObjPtr dom, - virDomainNetDefPtr net) -{ - int ret = -1; - vzDomObjPtr privdom = dom->privateData; - PRL_HANDLE job = PRL_INVALID_HANDLE; - - if (!IS_CT(dom->def)) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", - _("network device cannot be attached")); - return ret; - } - - job = PrlVm_BeginEdit(privdom->sdkdom); - if (PRL_FAILED(waitJob(job))) - return ret; - - ret = prlsdkAddNet(driver, privdom->sdkdom, net, IS_CT(dom->def)); - if (ret == 0) { - job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE); - if (PRL_FAILED(waitJob(job))) - return -1; - } - - return ret; -} - static PRL_HANDLE prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac) { @@ -3129,46 +3101,6 @@ prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac) return adapter; } -int prlsdkDetachNet(vzDriverPtr driver, - virDomainObjPtr dom, - virDomainNetDefPtr net) -{ - int ret = -1; - vzDomObjPtr privdom = dom->privateData; - PRL_HANDLE job = PRL_INVALID_HANDLE; - PRL_HANDLE sdknet = PRL_INVALID_HANDLE; - PRL_RESULT pret; - - if (!IS_CT(dom->def)) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", - _("network device cannot be detached")); - goto cleanup; - } - - job = PrlVm_BeginEdit(privdom->sdkdom); - if (PRL_FAILED(waitJob(job))) - goto cleanup; - - sdknet = prlsdkFindNetByMAC(privdom->sdkdom, &net->mac); - if (sdknet == PRL_INVALID_HANDLE) - goto cleanup; - - prlsdkCleanupBridgedNet(driver, net); - - pret = PrlVmDev_Remove(sdknet); - prlsdkCheckRetGoto(pret, cleanup); - - job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE); - if (PRL_FAILED(waitJob(job))) - goto cleanup; - - ret = 0; - - cleanup: - PrlHandle_Free(sdknet); - return ret; -} - static int prlsdkAddDisk(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDiskDefPtr disk) @@ -3349,50 +3281,96 @@ prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool isCt) } int -prlsdkAttachVolume(vzDriverPtr driver, +prlsdkAttachDevice(vzDriverPtr driver, virDomainObjPtr dom, - virDomainDiskDefPtr disk) + virDomainDeviceDefPtr dev) { - int ret = -1; vzDomObjPtr privdom = dom->privateData; PRL_HANDLE job = PRL_INVALID_HANDLE; job = PrlVm_BeginEdit(privdom->sdkdom); if (PRL_FAILED(waitJob(job))) - goto cleanup; + return -1; - ret = prlsdkAddDisk(driver, privdom->sdkdom, disk); - if (ret == 0) { - job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE); - if (PRL_FAILED(waitJob(job))) { - ret = -1; - goto cleanup; + switch (dev->type) { + case VIR_DOMAIN_DEVICE_DISK: + if (prlsdkAddDisk(driver, privdom->sdkdom, dev->data.disk) < 0) + return -1; + + break; + case VIR_DOMAIN_DEVICE_NET: + if (!IS_CT(dom->def)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("attaching network device to VM is unsupported")); + return -1; } + + if (prlsdkAddNet(driver, privdom->sdkdom, dev->data.net, IS_CT(dom->def)) < 0) + return -1; + + break; + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("attaching device type '%s' is unsupported"), + virDomainDeviceTypeToString(dev->type)); + return -1; } - cleanup: - return ret; + job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE); + if (PRL_FAILED(waitJob(job))) + return -1; + + return 0; } int -prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk) +prlsdkDetachDevice(vzDriverPtr driver, + virDomainObjPtr dom, + virDomainDeviceDefPtr dev) { int ret = -1; vzDomObjPtr privdom = dom->privateData; PRL_HANDLE job = PRL_INVALID_HANDLE; - PRL_HANDLE sdkdisk; + PRL_HANDLE sdkdev = PRL_INVALID_HANDLE; PRL_RESULT pret; - sdkdisk = prlsdkGetDisk(privdom->sdkdom, disk, IS_CT(dom->def)); - if (sdkdisk == PRL_INVALID_HANDLE) - goto cleanup; - job = PrlVm_BeginEdit(privdom->sdkdom); if (PRL_FAILED(waitJob(job))) goto cleanup; - pret = PrlVmDev_Remove(sdkdisk); - prlsdkCheckRetGoto(pret, cleanup); + switch (dev->type) { + case VIR_DOMAIN_DEVICE_DISK: + sdkdev = prlsdkGetDisk(privdom->sdkdom, dev->data.disk, IS_CT(dom->def)); + if (sdkdev == PRL_INVALID_HANDLE) + goto cleanup; + + pret = PrlVmDev_Remove(sdkdev); + prlsdkCheckRetGoto(pret, cleanup); + + break; + case VIR_DOMAIN_DEVICE_NET: + if (!IS_CT(dom->def)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("detaching network device from VM is unsupported")); + goto cleanup; + } + + sdkdev = prlsdkFindNetByMAC(privdom->sdkdom, &dev->data.net->mac); + if (sdkdev == PRL_INVALID_HANDLE) + goto cleanup; + + prlsdkCleanupBridgedNet(driver, dev->data.net); + + pret = PrlVmDev_Remove(sdkdev); + prlsdkCheckRetGoto(pret, cleanup); + + break; + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("detaching device type '%s' is unsupported"), + virDomainDeviceTypeToString(dev->type)); + goto cleanup; + } job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE); if (PRL_FAILED(waitJob(job))) @@ -3402,7 +3380,7 @@ prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk) cleanup: - PrlHandle_Free(sdkdisk); + PrlHandle_Free(sdkdev); return ret; } diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h index e562f98..e68a710 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -63,16 +63,12 @@ prlsdkUnregisterDomain(vzDriverPtr driver, virDomainObjPtr dom, unsigned int fla int prlsdkDomainManagedSaveRemove(virDomainObjPtr dom); int -prlsdkAttachVolume(vzDriverPtr driver, virDomainObjPtr dom, virDomainDiskDefPtr disk); +prlsdkAttachDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPtr disk); int -prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk); +prlsdkDetachDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPtr disk); int prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats); int -prlsdkAttachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net); -int -prlsdkDetachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net); -int prlsdkGetNetStats(virDomainObjPtr dom, const char *path, virDomainInterfaceStatsPtr stats); int prlsdkGetVcpuStats(virDomainObjPtr dom, int idx, unsigned long long *time); -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
Attach/detach functions for disk/net are quite trivial and typically call a few functions in begin/end edit frame. Having in mind update function too adding configuring for another device (like graphics) will introduce 3 trivial functions more. Let's replace current approach by attach/detach functions for device.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 60 ++++----------------- src/vz/vz_sdk.c | 156 +++++++++++++++++++++++------------------------------ src/vz/vz_sdk.h | 8 +-- 3 files changed, 79 insertions(+), 145 deletions(-)
[snip]
diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h index e562f98..e68a710 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -63,16 +63,12 @@ prlsdkUnregisterDomain(vzDriverPtr driver, virDomainObjPtr dom, unsigned int fla int prlsdkDomainManagedSaveRemove(virDomainObjPtr dom); int -prlsdkAttachVolume(vzDriverPtr driver, virDomainObjPtr dom, virDomainDiskDefPtr disk); +prlsdkAttachDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPtr disk);
s/disk/dev
int -prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk); +prlsdkDetachDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPtr disk);
s/disk/dev
int prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats); int -prlsdkAttachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net); -int -prlsdkDetachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net); -int prlsdkGetNetStats(virDomainObjPtr dom, const char *path, virDomainInterfaceStatsPtr stats); int prlsdkGetVcpuStats(virDomainObjPtr dom, int idx, unsigned long long *time);
ACK with little nits above. Max

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 37 ++++++++++++++++++++++ src/vz/vz_sdk.c | 92 +++++++++++++++++++++++++++++++++++++++++++++--------- src/vz/vz_sdk.h | 2 ++ 3 files changed, 116 insertions(+), 15 deletions(-) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index ab4aa74..2778a9a 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -1185,6 +1185,42 @@ static int vzDomainDetachDevice(virDomainPtr dom, const char *xml) VIR_DOMAIN_AFFECT_CONFIG | VIR_DOMAIN_AFFECT_LIVE); } +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 vzDomainGetMaxMemory(virDomainPtr domain) { @@ -1584,6 +1620,7 @@ static virHypervisorDriver vzHypervisorDriver = { .connectUnregisterCloseCallback = vzConnectUnregisterCloseCallback, /* 1.3.2 */ .domainSetMemoryFlags = vzDomainSetMemoryFlags, /* 1.3.4 */ .domainSetMemory = vzDomainSetMemory, /* 1.3.4 */ + .domainUpdateDeviceFlags = vzDomainUpdateDeviceFlags, /* 1.3.4 */ }; static virConnectDriver vzConnectDriver = { diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index cb624dc..7e36cb0 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -39,6 +39,11 @@ 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 */ @@ -2809,10 +2814,10 @@ static const char * prlsdkFormatMac(virMacAddrPtr mac, char *macstr) return macstr; } -static int prlsdkAddNet(vzDriverPtr driver, - PRL_HANDLE sdkdom, - virDomainNetDefPtr net, - bool isCt) +static int prlsdkConfigureNet(vzDriverPtr driver, + PRL_HANDLE sdkdom, + virDomainNetDefPtr net, + bool isCt, bool create) { PRL_RESULT pret; PRL_HANDLE sdknet = PRL_INVALID_HANDLE; @@ -2829,8 +2834,14 @@ static int prlsdkAddNet(vzDriverPtr driver, if (prlsdkCheckNetUnsupportedParams(net) < 0) return -1; - pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_GENERIC_NETWORK_ADAPTER, &sdknet); - prlsdkCheckRetGoto(pret, cleanup); + if (create) { + pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_GENERIC_NETWORK_ADAPTER, &sdknet); + prlsdkCheckRetGoto(pret, cleanup); + } else { + sdknet = prlsdkFindNetByMAC(sdkdom, &net->mac); + if (sdknet == PRL_INVALID_HANDLE) + return -1; + } pret = PrlVmDev_SetEnabled(sdknet, 1); prlsdkCheckRetGoto(pret, cleanup); @@ -3101,9 +3112,11 @@ prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac) return adapter; } -static int prlsdkAddDisk(vzDriverPtr driver, - PRL_HANDLE sdkdom, - virDomainDiskDefPtr disk) +static int prlsdkConfigureDisk(vzDriverPtr driver, + PRL_HANDLE sdkdom, + virDomainDiskDefPtr disk, + bool isCt, + bool create) { PRL_RESULT pret; PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE; @@ -3122,8 +3135,14 @@ static int prlsdkAddDisk(vzDriverPtr driver, else devType = PDE_OPTICAL_DISK; - pret = PrlVmCfg_CreateVmDev(sdkdom, devType, &sdkdisk); - prlsdkCheckRetGoto(pret, cleanup); + if (create) { + pret = PrlVmCfg_CreateVmDev(sdkdom, devType, &sdkdisk); + prlsdkCheckRetGoto(pret, cleanup); + } else { + sdkdisk = prlsdkGetDisk(sdkdom, disk, isCt); + if (sdkdisk == PRL_INVALID_HANDLE) + return -1; + } pret = PrlVmDev_SetEnabled(sdkdisk, 1); prlsdkCheckRetGoto(pret, cleanup); @@ -3294,7 +3313,8 @@ prlsdkAttachDevice(vzDriverPtr driver, switch (dev->type) { 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; break; @@ -3305,7 +3325,8 @@ prlsdkAttachDevice(vzDriverPtr driver, 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; break; @@ -3384,6 +3405,45 @@ prlsdkDetachDevice(vzDriverPtr driver, 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 prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs) { @@ -3568,7 +3628,8 @@ prlsdkDoApplyConfig(vzDriverPtr driver, } 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; } @@ -3589,7 +3650,8 @@ prlsdkDoApplyConfig(vzDriverPtr driver, } 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; } diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h index e68a710..f129d68 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -67,6 +67,8 @@ prlsdkAttachDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPt int prlsdkDetachDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPtr disk); int +prlsdkUpdateDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPtr disk); +int prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats); int prlsdkGetNetStats(virDomainObjPtr dom, const char *path, virDomainInterfaceStatsPtr stats); -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 37 ++++++++++++++++++++++ src/vz/vz_sdk.c | 92 +++++++++++++++++++++++++++++++++++++++++++++--------- src/vz/vz_sdk.h | 2 ++ 3 files changed, 116 insertions(+), 15 deletions(-)
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index ab4aa74..2778a9a 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -1185,6 +1185,42 @@ static int vzDomainDetachDevice(virDomainPtr dom, const char *xml) VIR_DOMAIN_AFFECT_CONFIG | VIR_DOMAIN_AFFECT_LIVE); }
+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 vzDomainGetMaxMemory(virDomainPtr domain) { @@ -1584,6 +1620,7 @@ static virHypervisorDriver vzHypervisorDriver = { .connectUnregisterCloseCallback = vzConnectUnregisterCloseCallback, /* 1.3.2 */ .domainSetMemoryFlags = vzDomainSetMemoryFlags, /* 1.3.4 */ .domainSetMemory = vzDomainSetMemory, /* 1.3.4 */ + .domainUpdateDeviceFlags = vzDomainUpdateDeviceFlags, /* 1.3.4 */
s/1.3.4/2.0.0
};
static virConnectDriver vzConnectDriver = { diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index cb624dc..7e36cb0 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -39,6 +39,11 @@
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 */ @@ -2809,10 +2814,10 @@ static const char * prlsdkFormatMac(virMacAddrPtr mac, char *macstr) return macstr; }
-static int prlsdkAddNet(vzDriverPtr driver, - PRL_HANDLE sdkdom, - virDomainNetDefPtr net, - bool isCt) +static int prlsdkConfigureNet(vzDriverPtr driver, + PRL_HANDLE sdkdom, + virDomainNetDefPtr net, + bool isCt, bool create) { PRL_RESULT pret; PRL_HANDLE sdknet = PRL_INVALID_HANDLE; @@ -2829,8 +2834,14 @@ static int prlsdkAddNet(vzDriverPtr driver, if (prlsdkCheckNetUnsupportedParams(net) < 0) return -1;
- pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_GENERIC_NETWORK_ADAPTER, &sdknet); - prlsdkCheckRetGoto(pret, cleanup); + if (create) { + pret = PrlVmCfg_CreateVmDev(sdkdom, PDE_GENERIC_NETWORK_ADAPTER, &sdknet); + prlsdkCheckRetGoto(pret, cleanup); + } else { + sdknet = prlsdkFindNetByMAC(sdkdom, &net->mac); + if (sdknet == PRL_INVALID_HANDLE) + return -1; + }
pret = PrlVmDev_SetEnabled(sdknet, 1); prlsdkCheckRetGoto(pret, cleanup); @@ -3101,9 +3112,11 @@ prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac) return adapter; }
-static int prlsdkAddDisk(vzDriverPtr driver, - PRL_HANDLE sdkdom, - virDomainDiskDefPtr disk) +static int prlsdkConfigureDisk(vzDriverPtr driver, + PRL_HANDLE sdkdom, + virDomainDiskDefPtr disk, + bool isCt, + bool create) { PRL_RESULT pret; PRL_HANDLE sdkdisk = PRL_INVALID_HANDLE; @@ -3122,8 +3135,14 @@ static int prlsdkAddDisk(vzDriverPtr driver, else devType = PDE_OPTICAL_DISK;
- pret = PrlVmCfg_CreateVmDev(sdkdom, devType, &sdkdisk); - prlsdkCheckRetGoto(pret, cleanup); + if (create) { + pret = PrlVmCfg_CreateVmDev(sdkdom, devType, &sdkdisk); + prlsdkCheckRetGoto(pret, cleanup); + } else { + sdkdisk = prlsdkGetDisk(sdkdom, disk, isCt); + if (sdkdisk == PRL_INVALID_HANDLE) + return -1; + }
pret = PrlVmDev_SetEnabled(sdkdisk, 1); prlsdkCheckRetGoto(pret, cleanup); @@ -3294,7 +3313,8 @@ prlsdkAttachDevice(vzDriverPtr driver,
switch (dev->type) { 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;
break; @@ -3305,7 +3325,8 @@ prlsdkAttachDevice(vzDriverPtr driver, 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;
break; @@ -3384,6 +3405,45 @@ prlsdkDetachDevice(vzDriverPtr driver, 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 prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs) { @@ -3568,7 +3628,8 @@ prlsdkDoApplyConfig(vzDriverPtr driver, }
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; }
@@ -3589,7 +3650,8 @@ prlsdkDoApplyConfig(vzDriverPtr driver, }
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; }
diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h index e68a710..f129d68 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -67,6 +67,8 @@ prlsdkAttachDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPt int prlsdkDetachDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPtr disk); int +prlsdkUpdateDevice(vzDriverPtr driver, virDomainObjPtr dom, virDomainDeviceDefPtr disk); +int
s/disk/dev
prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats); int prlsdkGetNetStats(virDomainObjPtr dom, const char *path, virDomainInterfaceStatsPtr stats);
ACK with minor nits fixed. Maxim

This is as easy as moving disks checks from domain post parse callback to device post parse callback. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 14 +++++------- src/vz/vz_utils.c | 66 ++++++++++++++++++++++++++---------------------------- src/vz/vz_utils.h | 5 +++-- 3 files changed, 40 insertions(+), 45 deletions(-) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 2778a9a..b007ad2 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -234,9 +234,6 @@ vzDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, void *opaque) { - if (vzCheckUnsupportedDisks(def, opaque) < 0) - return -1; - if (vzCheckUnsupportedControllers(def, opaque) < 0) return -1; @@ -250,19 +247,18 @@ vzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, unsigned int parseFlags ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) { - int ret = -1; - if (dev->type == VIR_DOMAIN_DEVICE_NET && (dev->data.net->type == VIR_DOMAIN_NET_TYPE_NETWORK || dev->data.net->type == VIR_DOMAIN_NET_TYPE_BRIDGE) && !dev->data.net->model && def->os.type == VIR_DOMAIN_OSTYPE_HVM && VIR_STRDUP(dev->data.net->model, "e1000") < 0) - goto cleanup; + return -1; - ret = 0; - cleanup: - return ret; + if (dev->type == VIR_DOMAIN_DEVICE_DISK) + return vzCheckUnsupportedDisk(def, dev->data.disk, opaque); + + return 0; } diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index d9da1e7..db0ad82 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -387,51 +387,49 @@ vzCheckDiskUnsupportedParams(virDomainDiskDefPtr disk) } int -vzCheckUnsupportedDisks(virDomainDefPtr def, vzCapabilitiesPtr vzCaps) +vzCheckUnsupportedDisk(const virDomainDef *def, + virDomainDiskDefPtr disk, + vzCapabilitiesPtr vzCaps) { - size_t i, j; - virDomainDiskDefPtr disk; + size_t i; virStorageFileFormat diskFormat; - for (i = 0; i < def->ndisks; i++) { - disk = def->disks[i]; + if (vzCheckDiskUnsupportedParams(disk) < 0) + return -1; - if (vzCheckDiskUnsupportedParams(disk) < 0) - return -1; - - if (disk->src->type == VIR_STORAGE_TYPE_FILE) { - if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) { - if (IS_CT(def)) - diskFormat = vzCaps->ctDiskFormat; - else - diskFormat = vzCaps->vmDiskFormat; - } else { - diskFormat = VIR_STORAGE_FILE_RAW; - } + if (disk->src->type == VIR_STORAGE_TYPE_FILE) { + if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) { + if (IS_CT(def)) + diskFormat = vzCaps->ctDiskFormat; + else + diskFormat = vzCaps->vmDiskFormat; } else { diskFormat = VIR_STORAGE_FILE_RAW; } + } else { + diskFormat = VIR_STORAGE_FILE_RAW; + } - if (virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_NONE && - virDomainDiskGetFormat(disk) != diskFormat) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported format of disk %s"), - disk->src->path); - return -1; - } + if (virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_NONE && + virDomainDiskGetFormat(disk) != diskFormat) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported format of disk %s"), + disk->src->path); + return -1; + } - for (j = 0; vzCaps->diskBuses[j] != VIR_DOMAIN_DISK_BUS_LAST; j++) { - if (disk->bus == vzCaps->diskBuses[j]) - break; - } + for (i = 0; vzCaps->diskBuses[i] != VIR_DOMAIN_DISK_BUS_LAST; i++) { + if (disk->bus == vzCaps->diskBuses[i]) + break; + } - if (vzCaps->diskBuses[j] == VIR_DOMAIN_DISK_BUS_LAST) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported disk bus type %s"), - virDomainDiskBusTypeToString(disk->bus)); - return -1; - } + if (vzCaps->diskBuses[i] == VIR_DOMAIN_DISK_BUS_LAST) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported disk bus type %s"), + virDomainDiskBusTypeToString(disk->bus)); + return -1; } + return 0; } diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h index ee843d8..fc5f695 100644 --- a/src/vz/vz_utils.h +++ b/src/vz/vz_utils.h @@ -128,8 +128,9 @@ vzNewDomain(vzDriverPtr driver, int vzInitVersion(vzDriverPtr driver); int -vzCheckUnsupportedDisks(virDomainDefPtr def, - vzCapabilitiesPtr vzCaps); +vzCheckUnsupportedDisk(const virDomainDef *def, + virDomainDiskDefPtr disk, + vzCapabilitiesPtr vzCaps); int vzCheckUnsupportedControllers(virDomainDefPtr def, vzCapabilitiesPtr vzCaps); -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
This is as easy as moving disks checks from domain post parse callback to device post parse callback.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 14 +++++------- src/vz/vz_utils.c | 66 ++++++++++++++++++++++++++---------------------------- src/vz/vz_utils.h | 5 +++-- 3 files changed, 40 insertions(+), 45 deletions(-)
ACK

And reformat so that we don't have lengthy lines. Also simplify some checks. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 47 -------------------------------------- src/vz/vz_utils.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 47 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 7e36cb0..5a83586 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3127,7 +3127,6 @@ static int prlsdkConfigureDisk(vzDriverPtr driver, virDomainDeviceDriveAddressPtr drive; PRL_DEVICE_TYPE devType; PRL_CLUSTERED_DEVICE_SUBTYPE scsiModel; - char *dst = NULL; const char *path = disk->src->path ? : ""; if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) @@ -3165,54 +3164,19 @@ static int prlsdkConfigureDisk(vzDriverPtr driver, prlsdkCheckRetGoto(pret, cleanup); drive = &disk->info.addr.drive; - if (drive->controller > 0) { - /* We have only one controller of each type */ - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid drive " - "address of disk %s, vz driver supports " - "only one controller."), disk->dst); - goto cleanup; - } - - if (drive->target > 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid drive " - "address of disk %s, vz driver supports " - "only target 0."), disk->dst); - goto cleanup; - } switch (disk->bus) { case VIR_DOMAIN_DISK_BUS_IDE: - if (drive->unit > 1) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid drive " - "address of disk %s, vz driver supports " - "only units 0-1 for IDE bus."), disk->dst); - goto cleanup; - } sdkbus = PMS_IDE_DEVICE; idx = 2 * drive->bus + drive->unit; - dst = virIndexToDiskName(idx, "hd"); break; case VIR_DOMAIN_DISK_BUS_SCSI: - if (drive->bus > 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid drive " - "address of disk %s, vz driver supports " - "only bus 0 for SCSI bus."), disk->dst); - goto cleanup; - } sdkbus = PMS_SCSI_DEVICE; idx = drive->unit; - dst = virIndexToDiskName(idx, "sd"); break; case VIR_DOMAIN_DISK_BUS_SATA: - if (drive->bus > 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid drive " - "address of disk %s, vz driver supports " - "only bus 0 for SATA bus."), disk->dst); - goto cleanup; - } sdkbus = PMS_SATA_DEVICE; idx = drive->unit; - dst = virIndexToDiskName(idx, "sd"); break; default: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -3221,16 +3185,6 @@ static int prlsdkConfigureDisk(vzDriverPtr driver, goto cleanup; } - if (!dst) - goto cleanup; - - if (STRNEQ(dst, disk->dst)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid drive " - "address of disk %s, vz driver supports " - "only defaults address to logical device name."), disk->dst); - goto cleanup; - } - if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) { if (vzGetDefaultSCSIModel(driver, &scsiModel) < 0) goto cleanup; @@ -3247,7 +3201,6 @@ static int prlsdkConfigureDisk(vzDriverPtr driver, return 0; cleanup: PrlHandle_Free(sdkdisk); - VIR_FREE(dst); return ret; } diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index db0ad82..5c53e79 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -265,6 +265,71 @@ vzInitVersion(vzDriverPtr driver) } static int +vzCheckDiskAddressDriveUnsupportedParams(virDomainDiskDefPtr disk) +{ + virDomainDeviceDriveAddressPtr drive = &disk->info.addr.drive; + int devIdx, busIdx; + + if (drive->controller > 0) { + /* We have only one controller of each type */ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Invalid drive address of disk %s, vz driver " + "supports only one controller."), disk->dst); + return -1; + } + + if (drive->target > 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Invalid drive address of disk %s, vz driver " + "supports only target 0."), disk->dst); + return -1; + } + + switch (disk->bus) { + case VIR_DOMAIN_DISK_BUS_IDE: + if (drive->unit > 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Invalid drive address of disk %s, vz driver " + "supports only units 0-1 for IDE bus."), + disk->dst); + return -1; + } + break; + case VIR_DOMAIN_DISK_BUS_SCSI: + case VIR_DOMAIN_DISK_BUS_SATA: + if (drive->bus > 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Invalid drive address of disk %s, vz driver " + "supports only bus 0 for SATA and SCSI bus."), + disk->dst); + return -1; + } + break; + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Specified disk bus is not supported by vz driver.")); + return -1; + } + + if (virDiskNameToBusDeviceIndex(disk, &busIdx, &devIdx) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("cannot convert disk '%s' to bus/device index"), + disk->dst); + return -1; + } + + if (busIdx != drive->bus || devIdx != drive->unit) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Invalid drive address of disk %s, vz driver " + "does not support non default name mappings."), + disk->dst); + return -1; + } + + return 0; +} + +static int vzCheckDiskUnsupportedParams(virDomainDiskDefPtr disk) { if (disk->device != VIR_DOMAIN_DISK_DEVICE_DISK && @@ -383,6 +448,9 @@ vzCheckDiskUnsupportedParams(virDomainDiskDefPtr disk) } + if (vzCheckDiskAddressDriveUnsupportedParams(disk) < 0) + return -1; + return 0; } -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
And reformat so that we don't have lengthy lines. Also simplify some checks.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 47 -------------------------------------- src/vz/vz_utils.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 47 deletions(-)
ACK

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index b007ad2..ea28698 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -1131,6 +1131,7 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, ret = 0; cleanup: + virDomainDeviceDefFree(dev); virObjectUnlock(privdom); return ret; } @@ -1170,6 +1171,7 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, ret = 0; cleanup: + virDomainDeviceDefFree(dev); virObjectUnlock(privdom); return ret; -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index b007ad2..ea28698 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -1131,6 +1131,7 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
ret = 0; cleanup: + virDomainDeviceDefFree(dev); virObjectUnlock(privdom); return ret; } @@ -1170,6 +1171,7 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
ret = 0; cleanup: + virDomainDeviceDefFree(dev); virObjectUnlock(privdom);
return ret;
ACK. Nice catch.

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 5a83586..29b31a2 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3086,6 +3086,7 @@ prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac) PRL_HANDLE adapter = PRL_INVALID_HANDLE; char adapterMac[PRL_MAC_STRING_BUFNAME]; char expectedMac[PRL_MAC_STRING_BUFNAME]; + char virMac[VIR_MAC_STRING_BUFLEN]; prlsdkFormatMac(mac, expectedMac); @@ -3107,6 +3108,9 @@ prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac) adapter = PRL_INVALID_HANDLE; } + virReportError(VIR_ERR_INTERNAL_ERROR, + _("No net with mac '%s'"), virMacAddrFormat(mac, virMac)); + cleanup: PrlHandle_Free(adapter); return adapter; -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 5a83586..29b31a2 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3086,6 +3086,7 @@ prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac) PRL_HANDLE adapter = PRL_INVALID_HANDLE; char adapterMac[PRL_MAC_STRING_BUFNAME]; char expectedMac[PRL_MAC_STRING_BUFNAME]; + char virMac[VIR_MAC_STRING_BUFLEN];
prlsdkFormatMac(mac, expectedMac);
@@ -3107,6 +3108,9 @@ prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac) adapter = PRL_INVALID_HANDLE; }
+ virReportError(VIR_ERR_INTERNAL_ERROR, + _("No net with mac '%s'"), virMacAddrFormat(mac, virMac)); + cleanup: PrlHandle_Free(adapter); return adapter; ACK

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/libvirt_private.syms | 1 + src/vz/vz_sdk.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 2b55369..3f2845b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2185,6 +2185,7 @@ virSocketAddrEqual; virSocketAddrFormat; virSocketAddrFormatFull; virSocketAddrGetIpPrefix; +virSocketAddrGetNumNetmaskBits; virSocketAddrGetPort; virSocketAddrGetRange; virSocketAddrIsNetmask; diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 29b31a2..db85558 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -727,6 +727,91 @@ prlsdkAddDomainOpticalDisksInfo(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomain return -1; } +static virDomainNetIpDefPtr +prlsdkParseNetAddress(char *addr) +{ + char *maskstr = NULL; + int nbits; + virSocketAddr mask; + virDomainNetIpDefPtr ip = NULL, ret = NULL; + + if (!(maskstr = strchr(addr, '/'))) + goto cleanup; + + *maskstr = '\0'; + ++maskstr; + + if (VIR_ALLOC(ip) < 0) + goto cleanup; + + if (virSocketAddrParse(&ip->address, addr, AF_UNSPEC) < 0) + goto cleanup; + + if (virSocketAddrParse(&mask, maskstr, AF_UNSPEC) < 0) + goto cleanup; + + if ((nbits = virSocketAddrGetNumNetmaskBits(&mask)) < 0) + goto cleanup; + ip->prefix = nbits; + + ret = ip; + ip = NULL; + + cleanup: + if (!ret) + VIR_WARN("cannot parse network address '%s'", addr); + + VIR_FREE(ip); + VIR_FREE(addr); + + return ret; +} + +static int +prlsdkGetNetAddresses(PRL_HANDLE sdknet, virDomainNetDefPtr net) +{ + int ret = -1; + PRL_HANDLE addrlist = PRL_INVALID_HANDLE; + PRL_UINT32 num; + size_t i; + PRL_RESULT pret; + + pret = PrlVmDevNet_GetNetAddresses(sdknet, &addrlist); + prlsdkCheckRetGoto(pret, cleanup); + + PrlStrList_GetItemsCount(addrlist, &num); + prlsdkCheckRetGoto(pret, cleanup); + + for (i = 0; i < num; ++i) { + virDomainNetIpDefPtr ip = NULL; + PRL_UINT32 buflen = 0; + char *addr; + + pret = PrlStrList_GetItem(addrlist, i, NULL, &buflen); + prlsdkCheckRetGoto(pret, cleanup); + + if (VIR_ALLOC_N(addr, buflen) < 0) + goto cleanup; + + pret = PrlStrList_GetItem(addrlist, i, addr, &buflen); + prlsdkCheckRetGoto(pret, cleanup); + + if (!(ip = prlsdkParseNetAddress(addr))) + continue; + + if (VIR_APPEND_ELEMENT(net->ips, net->nips, ip) < 0) { + VIR_FREE(ip); + goto cleanup; + } + } + + ret = 0; + cleanup: + + PrlHandle_Free(addrlist); + return ret; +} + static int prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt) { @@ -766,6 +851,9 @@ prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt) if (virMacAddrParse(macstr, &net->mac) < 0) goto cleanup; + if (prlsdkGetNetAddresses(netAdapter, net) < 0) + goto cleanup; + pret = PrlVmDev_GetEmulatedType(netAdapter, &emulatedType); prlsdkCheckRetGoto(pret, cleanup); -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/libvirt_private.syms | 1 + src/vz/vz_sdk.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 2b55369..3f2845b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2185,6 +2185,7 @@ virSocketAddrEqual; virSocketAddrFormat; virSocketAddrFormatFull; virSocketAddrGetIpPrefix; +virSocketAddrGetNumNetmaskBits; virSocketAddrGetPort; virSocketAddrGetRange; virSocketAddrIsNetmask; diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 29b31a2..db85558 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -727,6 +727,91 @@ prlsdkAddDomainOpticalDisksInfo(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomain return -1; }
+static virDomainNetIpDefPtr +prlsdkParseNetAddress(char *addr) +{ + char *maskstr = NULL; + int nbits; + virSocketAddr mask; + virDomainNetIpDefPtr ip = NULL, ret = NULL; + + if (!(maskstr = strchr(addr, '/'))) + goto cleanup; + + *maskstr = '\0'; + ++maskstr;
why not *maskstr++ = '\0'; ? Anyway, ACK :)

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/conf/networkcommon_conf.c | 2 +- src/conf/networkcommon_conf.h | 2 +- src/vz/vz_sdk.c | 47 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/conf/networkcommon_conf.c b/src/conf/networkcommon_conf.c index 7b7a851..e5f3018 100644 --- a/src/conf/networkcommon_conf.c +++ b/src/conf/networkcommon_conf.c @@ -60,7 +60,7 @@ virNetworkRouteDefFree(virNetworkRouteDefPtr def) virNetworkRouteDefPtr virNetworkRouteDefCreate(const char *errorDetail, - char *family, + const char *family, const char *address, const char *netmask, const char *gateway, diff --git a/src/conf/networkcommon_conf.h b/src/conf/networkcommon_conf.h index 1500d0f..41d8b97 100644 --- a/src/conf/networkcommon_conf.h +++ b/src/conf/networkcommon_conf.h @@ -40,7 +40,7 @@ virNetworkRouteDefFree(virNetworkRouteDefPtr def); virNetworkRouteDefPtr virNetworkRouteDefCreate(const char *networkName, - char *family, + const char *family, const char *address, const char *netmask, const char *gateway, diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index db85558..6c085b3 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -813,6 +813,50 @@ prlsdkGetNetAddresses(PRL_HANDLE sdknet, virDomainNetDefPtr net) } static int +prlsdkGetRoutes(PRL_HANDLE sdknet, virDomainNetDefPtr net) +{ + int ret = -1; + char *gw = NULL; + char *gw6 = NULL; + virNetworkRouteDefPtr route = NULL; + + if (!(gw = prlsdkGetStringParamVar(PrlVmDevNet_GetDefaultGateway, sdknet))) + goto cleanup; + + if (!(gw6 = prlsdkGetStringParamVar(PrlVmDevNet_GetDefaultGatewayIPv6, sdknet))) + goto cleanup; + + if (*gw != '\0') { + if (!(route = virNetworkRouteDefCreate(_("Domain interface"), + "ipv4", VIR_SOCKET_ADDR_IPV4_ALL, + NULL, gw, 0, true, 0, false))) + goto cleanup; + + if (VIR_APPEND_ELEMENT(net->routes, net->nroutes, route) < 0) + goto cleanup; + } + + if (*gw6 != '\0') { + if (!(route = virNetworkRouteDefCreate(_("Domain interface"), + "ipv6", VIR_SOCKET_ADDR_IPV6_ALL, + NULL, gw6, 0, true, 0, false))) + goto cleanup; + + if (VIR_APPEND_ELEMENT(net->routes, net->nroutes, route) < 0) + goto cleanup; + } + + ret = 0; + + cleanup: + VIR_FREE(route); + VIR_FREE(gw); + VIR_FREE(gw6); + + return ret; +} + +static int prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt) { char macstr[VIR_MAC_STRING_BUFLEN]; @@ -854,6 +898,9 @@ prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt) if (prlsdkGetNetAddresses(netAdapter, net) < 0) goto cleanup; + if (prlsdkGetRoutes(netAdapter, net) < 0) + goto cleanup; + pret = PrlVmDev_GetEmulatedType(netAdapter, &emulatedType); prlsdkCheckRetGoto(pret, cleanup); -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/conf/networkcommon_conf.c | 2 +- src/conf/networkcommon_conf.h | 2 +- src/vz/vz_sdk.c | 47 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-)
Looks ok.

Current code that pass gateways to vz sdk is not suitable for updates. If update has no gateways while we had them before we need to pass "" for vz sdk gateways to reset old value. The code definitely deserves its own function. Drop checks that skip setting gateways if network address is not set. Such a configuration is possible in vz sdk. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 159 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 83 insertions(+), 76 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 6c085b3..7730bca 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -2949,6 +2949,87 @@ static const char * prlsdkFormatMac(virMacAddrPtr mac, char *macstr) return macstr; } +static int prlsdkConfigureGateways(PRL_HANDLE sdknet, virDomainNetDefPtr net) +{ + int ret = -1; + size_t i; + virNetworkRouteDefPtr route4 = NULL, route6 = NULL; + char *gw4 = NULL, *gw6 = NULL; + PRL_RESULT pret; + + for (i = 0; i < net->nroutes; i++) { + virSocketAddrPtr addrdst, gateway; + virSocketAddr zero; + + addrdst = virNetworkRouteDefGetAddress(net->routes[i]); + gateway = virNetworkRouteDefGetGateway(net->routes[i]); + + ignore_value(virSocketAddrParse(&zero, + (VIR_SOCKET_ADDR_IS_FAMILY(addrdst, AF_INET) + ? VIR_SOCKET_ADDR_IPV4_ALL + : VIR_SOCKET_ADDR_IPV6_ALL), + VIR_SOCKET_ADDR_FAMILY(addrdst))); + + if (!virSocketAddrEqual(addrdst, &zero)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Support only default gateway")); + return -1; + } + + switch (VIR_SOCKET_ADDR_FAMILY(gateway)) { + case AF_INET: + if (route4) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Support only one IPv4 default gateway")); + return -1; + } + + route4 = net->routes[i]; + + break; + case AF_INET6: + if (route6) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Support only one IPv6 default gateway")); + return -1; + } + + route6 = net->routes[i]; + + break; + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported address family %d " + "Only IPv4 or IPv6 default gateway"), + VIR_SOCKET_ADDR_FAMILY(gateway)); + + return -1; + } + } + + if (route4 && + !(gw4 = virSocketAddrFormat(virNetworkRouteDefGetGateway(route4)))) + goto cleanup; + + pret = PrlVmDevNet_SetDefaultGateway(sdknet, gw4 ? : ""); + prlsdkCheckRetGoto(pret, cleanup); + + if (route6 && + !(gw6 = virSocketAddrFormat(virNetworkRouteDefGetGateway(route6)))) + goto cleanup; + + pret = PrlVmDevNet_SetDefaultGatewayIPv6(sdknet, gw6 ? : ""); + prlsdkCheckRetGoto(pret, cleanup); + + ret = 0; + + cleanup: + VIR_FREE(gw4); + VIR_FREE(gw6); + + return ret; +} + static int prlsdkConfigureNet(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainNetDefPtr net, @@ -3037,82 +3118,8 @@ static int prlsdkConfigureNet(vzDriverPtr driver, pret = PrlVmDevNet_SetAutoApply(sdknet, true); prlsdkCheckRetGoto(pret, cleanup); - if (net->nroutes) { - bool alreadySetIPv4Gateway = false; - bool alreadySetIPv6Gateway = false; - - for (i = 0; i < net->nroutes; i++) { - virSocketAddrPtr addrdst, gateway; - virSocketAddr zero; - - addrdst = virNetworkRouteDefGetAddress(net->routes[i]); - gateway = virNetworkRouteDefGetGateway(net->routes[i]); - - ignore_value(virSocketAddrParse(&zero, - (VIR_SOCKET_ADDR_IS_FAMILY(addrdst, AF_INET) - ? VIR_SOCKET_ADDR_IPV4_ALL - : VIR_SOCKET_ADDR_IPV6_ALL), - VIR_SOCKET_ADDR_FAMILY(addrdst))); - - if (!virSocketAddrEqual(addrdst, &zero)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Support only default gateway")); - goto cleanup; - } - - switch (VIR_SOCKET_ADDR_FAMILY(gateway)) { - case AF_INET: - - if (!ipv4present) - continue; - - if (alreadySetIPv4Gateway) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Support only one IPv4 default gateway")); - goto cleanup; - } - - if (!(addrstr = virSocketAddrFormat(gateway))) - goto cleanup; - - pret = PrlVmDevNet_SetDefaultGateway(sdknet, addrstr); - prlsdkCheckRetGoto(pret, cleanup); - - alreadySetIPv4Gateway = true; - break; - - case AF_INET6: - - if (!ipv6present) - continue; - - if (alreadySetIPv6Gateway) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Support only one IPv6 default gateway")); - goto cleanup; - } - - if (!(addrstr = virSocketAddrFormat(gateway))) - goto cleanup; - - pret = PrlVmDevNet_SetDefaultGatewayIPv6(sdknet, addrstr); - prlsdkCheckRetGoto(pret, cleanup); - - alreadySetIPv6Gateway = true; - break; - - default: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported address family %d " - "Only IPv4 or IPv6 default gateway"), - VIR_SOCKET_ADDR_FAMILY(gateway)); - - goto cleanup; - } - - VIR_FREE(addrstr); - } - } + if (prlsdkConfigureGateways(sdknet, net)) + goto cleanup; if (isCt) { if (net->model) -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
Current code that pass gateways to vz sdk is not suitable for updates. If update has no gateways while we had them before we need to pass "" for vz sdk gateways to reset old value.
The code definitely deserves its own function.
Drop checks that skip setting gateways if network address is not set. Such a configuration is possible in vz sdk.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 159 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 83 insertions(+), 76 deletions(-)
ACK

Fix net->data usage accordingly to type field. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 7730bca..328a5bc 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -866,9 +866,6 @@ prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt) PRL_BOOL isConnected; int ret = -1; - net->type = VIR_DOMAIN_NET_TYPE_NETWORK; - - /* use device name, shown by prlctl as target device * for identifying network adapter in virDomainDefineXML */ if (!(net->ifname = prlsdkGetStringParamVar(PrlVmDevNet_GetHostInterfaceName, @@ -909,7 +906,9 @@ prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt) PARALLELS_DOMAIN_ROUTED_NETWORK_NAME) < 0) goto cleanup; } else { - if (!(net->data.network.name = + char *netid = NULL; + + if (!(netid = prlsdkGetStringParamVar(PrlVmDevNet_GetVirtualNetworkId, netAdapter))) goto cleanup; @@ -920,8 +919,13 @@ prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt) * predefined ones such as PARALLELS_DOMAIN_BRIDGED_NETWORK_NAME * and PARALLELS_DONAIN_ROUTED_NETWORK_NAME */ - if (STRNEQ(net->data.network.name, PARALLELS_DOMAIN_BRIDGED_NETWORK_NAME)) + if (STRNEQ(netid, PARALLELS_DOMAIN_BRIDGED_NETWORK_NAME)) { net->type = VIR_DOMAIN_NET_TYPE_BRIDGE; + net->data.network.name = netid; + } else { + net->type = VIR_DOMAIN_NET_TYPE_NETWORK; + net->data.bridge.brname = netid; + } } @@ -3161,7 +3165,7 @@ static int prlsdkConfigureNet(vzDriverPtr driver, pret = PrlVirtNet_Create(&vnet); prlsdkCheckRetGoto(pret, cleanup); - pret = PrlVirtNet_SetNetworkId(vnet, net->data.network.name); + pret = PrlVirtNet_SetNetworkId(vnet, net->data.bridge.brname); prlsdkCheckRetGoto(pret, cleanup); pret = PrlVirtNet_SetNetworkType(vnet, PVN_BRIDGED_ETHERNET); @@ -3176,7 +3180,7 @@ static int prlsdkConfigureNet(vzDriverPtr driver, pret = PrlVmDev_SetEmulatedType(sdknet, PNA_BRIDGED_ETHERNET); prlsdkCheckRetGoto(pret, cleanup); - pret = PrlVmDevNet_SetVirtualNetworkId(sdknet, net->data.network.name); + pret = PrlVmDevNet_SetVirtualNetworkId(sdknet, net->data.bridge.brname); prlsdkCheckRetGoto(pret, cleanup); } -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
Fix net->data usage accordingly to type field.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
ACK

First we need to always set value to vz sdk parameter so we can leverage setting code for device updates. This patch resolves tristate default to off implicitly. This is easier then extract default value from vz sdk itself. First current default is off too, second this approach is already taken for 'net->linkstate'. Second dump this option in domain xml. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 328a5bc..6b9c10d 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -863,7 +863,7 @@ prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt) PRL_UINT32 netAdapterIndex; PRL_UINT32 emulatedType; PRL_RESULT pret; - PRL_BOOL isConnected; + PRL_BOOL isConnected, isMacFilter; int ret = -1; /* use device name, shown by prlctl as target device @@ -962,6 +962,12 @@ prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt) else net->linkstate = VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DOWN; + pret = PrlVmDevNet_IsPktFilterPreventMacSpoof(netAdapter, &isMacFilter); + prlsdkCheckRetGoto(pret, cleanup); + + net->trustGuestRxFilters = isMacFilter ? VIR_TRISTATE_BOOL_YES : + VIR_TRISTATE_BOOL_NO; + ret = 0; cleanup: return ret; @@ -3184,10 +3190,8 @@ static int prlsdkConfigureNet(vzDriverPtr driver, prlsdkCheckRetGoto(pret, cleanup); } - if (net->trustGuestRxFilters == VIR_TRISTATE_BOOL_YES) - pret = PrlVmDevNet_SetPktFilterPreventMacSpoof(sdknet, 0); - else if (net->trustGuestRxFilters == VIR_TRISTATE_BOOL_NO) - pret = PrlVmDevNet_SetPktFilterPreventMacSpoof(sdknet, 1); + pret = PrlVmDevNet_SetPktFilterPreventMacSpoof(sdknet, + net->trustGuestRxFilters == VIR_TRISTATE_BOOL_YES); prlsdkCheckRetGoto(pret, cleanup); ret = 0; -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
First we need to always set value to vz sdk parameter so we can leverage setting code for device updates. This patch resolves tristate default to off implicitly. This is easier then extract default value from vz sdk itself. First current default is off too, second this approach is already taken for 'net->linkstate'.
Second dump this option in domain xml.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
ACK

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 62 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 6b9c10d..9ffcc70 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -457,7 +457,33 @@ prlsdkDomObjFreePrivate(void *p) }; static int -prlsdkAddDomainVideoInfo(PRL_HANDLE sdkdom, virDomainDefPtr def) +prlsdkAddDomainVideoInfoCt(virDomainDefPtr def) +{ + virDomainVideoDefPtr video = NULL; + int ret = -1; + + if (def->ngraphics == 0) + return 0; + + if (VIR_ALLOC(video) < 0) + goto cleanup; + + video->type = VIR_DOMAIN_VIDEO_TYPE_PARALLELS; + video->vram = 0; + video->heads = 1; + + if (VIR_APPEND_ELEMENT(def->videos, def->nvideos, video) < 0) + goto cleanup; + + ret = 0; + cleanup: + virDomainVideoDefFree(video); + + return ret; +} + +static int +prlsdkAddDomainVideoInfoVm(PRL_HANDLE sdkdom, virDomainDefPtr def) { virDomainVideoDefPtr video = NULL; virDomainVideoAccelDefPtr accel = NULL; @@ -1099,9 +1125,13 @@ prlsdkAddSerialInfo(PRL_HANDLE sdkdom, static int prlsdkAddDomainHardware(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDefPtr def) { - if (!IS_CT(def)) - if (prlsdkAddDomainVideoInfo(sdkdom, def) < 0) + if (IS_CT(def)) { + if (prlsdkAddDomainVideoInfoCt(def) < 0) goto error; + } else { + if (prlsdkAddDomainVideoInfoVm(sdkdom, def) < 0) + goto error; + } if (prlsdkAddDomainHardDisksInfo(driver, sdkdom, def) < 0) goto error; @@ -1166,25 +1196,6 @@ prlsdkAddVNCInfo(PRL_HANDLE sdkdom, virDomainDefPtr def) if (VIR_APPEND_ELEMENT(def->graphics, def->ngraphics, gr) < 0) goto error; - if (IS_CT(def)) { - virDomainVideoDefPtr video; - if (VIR_ALLOC(video) < 0) - goto error; - video->type = virDomainVideoDefaultType(def); - if (video->type < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot determine default video type")); - VIR_FREE(video); - goto error; - } - video->vram = virDomainVideoDefaultRAM(def, video->type); - video->heads = 1; - if (VIR_ALLOC_N(def->videos, 1) < 0) { - virDomainVideoDefFree(video); - goto error; - } - def->videos[def->nvideos++] = video; - } return 0; error: @@ -1678,6 +1689,10 @@ prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom) if (prlsdkConvertDomainType(sdkdom, def) < 0) goto error; + if (prlsdkAddVNCInfo(sdkdom, def) < 0) + goto error; + + /* depends on prlsdkAddVNCInfo */ if (prlsdkAddDomainHardware(driver, sdkdom, def) < 0) goto error; @@ -1685,9 +1700,6 @@ prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom) if (prlsdkConvertBootOrder(sdkdom, def) < 0) goto error; - if (prlsdkAddVNCInfo(sdkdom, def) < 0) - goto error; - pret = PrlVmCfg_GetEnvId(sdkdom, &envId); prlsdkCheckRetGoto(pret, error); -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 62 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 25 deletions(-)
ACK

Move graphic device config to post parse. This way we detect error on early stage and leverage checking on detach too. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 2 + src/vz/vz_sdk.c | 141 ++++++++++++++++++----------------------------------- src/vz/vz_utils.c | 70 ++++++++++++++++++++++++++ src/vz/vz_utils.h | 2 + 4 files changed, 121 insertions(+), 94 deletions(-) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index ea28698..e57f573 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -257,6 +257,8 @@ vzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, if (dev->type == VIR_DOMAIN_DEVICE_DISK) return vzCheckUnsupportedDisk(def, dev->data.disk, opaque); + else if (dev->type == VIR_DOMAIN_DEVICE_GRAPHICS) + return vzCheckUnsupportedGraphics(dev->data.graphics); return 0; } diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 9ffcc70..322b316 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -2441,9 +2441,6 @@ static int prlsdkClearDevices(PRL_HANDLE sdkdom) PRL_HANDLE dev; int ret = -1; - pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_DISABLED); - prlsdkCheckRetGoto(pret, cleanup); - pret = PrlVmCfg_GetAllDevices(sdkdom, &devList); prlsdkCheckRetGoto(pret, cleanup); @@ -2527,89 +2524,6 @@ prlsdkAddDeviceToBootList(PRL_HANDLE sdkdom, return -1; } -static int prlsdkCheckGraphicsUnsupportedParams(virDomainDefPtr def) -{ - virDomainGraphicsDefPtr gr; - - if (def->ngraphics == 0) - return 0; - - if (def->ngraphics > 1) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vz driver supports only " - "one VNC per domain.")); - return -1; - } - - gr = def->graphics[0]; - - if (gr->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vz driver supports only " - "VNC graphics.")); - return -1; - } - - if (gr->data.vnc.websocket != 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vz driver doesn't support " - "websockets for VNC graphics.")); - return -1; - } - - if (gr->data.vnc.keymap != 0 && - STRNEQ(gr->data.vnc.keymap, "en-us")) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vz driver supports only " - "\"en-us\" keymap for VNC graphics.")); - return -1; - } - - if (gr->data.vnc.sharePolicy == VIR_DOMAIN_GRAPHICS_VNC_SHARE_ALLOW_EXCLUSIVE) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vz driver doesn't support " - "exclusive share policy for VNC graphics.")); - return -1; - } - - if (gr->data.vnc.socket) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vz driver doesn't support " - "VNC graphics over unix sockets.")); - return -1; - } - - if (gr->data.vnc.auth.connected == VIR_DOMAIN_GRAPHICS_AUTH_CONNECTED_FAIL || - gr->data.vnc.auth.connected == VIR_DOMAIN_GRAPHICS_AUTH_CONNECTED_KEEP) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vz driver doesn't support " - "given action in case of password change.")); - return -1; - } - - if (gr->data.vnc.auth.expires) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("vz driver doesn't support " - "setting password expire time.")); - return -1; - } - - if (gr->nListens > 1) { - virReportError(VIR_ERR_INVALID_ARG, "%s", - _("vz driver doesn't support more than " - "one listening VNC server per domain")); - return -1; - } - - if (gr->nListens == 1 && - gr->listens[0].type != VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS) { - virReportError(VIR_ERR_INVALID_ARG, "%s", - _("vz driver supports only address-based VNC listening")); - return -1; - } - - return 0; -} static int prlsdkCheckVideoUnsupportedParams(virDomainDefPtr def) { @@ -2833,20 +2747,19 @@ static int prlsdkCheckFSUnsupportedParams(virDomainFSDefPtr fs) return 0; } -static int prlsdkApplyGraphicsParams(PRL_HANDLE sdkdom, virDomainDefPtr def) +static int prlsdkApplyGraphicsParams(PRL_HANDLE sdkdom, + virDomainGraphicsDefPtr gr) { - virDomainGraphicsDefPtr gr; virDomainGraphicsListenDefPtr gListen; PRL_RESULT pret; int ret = -1; - if (prlsdkCheckGraphicsUnsupportedParams(def)) - return -1; + if (!gr) { + pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_DISABLED); + prlsdkCheckRetExit(pret, -1); - if (def->ngraphics == 0) return 0; - - gr = def->graphics[0]; + } if (gr->data.vnc.autoport) { pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_AUTO); @@ -3449,6 +3362,17 @@ prlsdkAttachDevice(vzDriverPtr driver, return -1; break; + case VIR_DOMAIN_DEVICE_GRAPHICS: + if (dom->def->ngraphics > 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("domain already has VNC graphics")); + return -1; + } + + if (prlsdkApplyGraphicsParams(privdom->sdkdom, dev->data.graphics) < 0) + return -1; + + break; default: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("attaching device type '%s' is unsupported"), @@ -3505,6 +3429,17 @@ prlsdkDetachDevice(vzDriverPtr driver, prlsdkCheckRetGoto(pret, cleanup); break; + case VIR_DOMAIN_DEVICE_GRAPHICS: + if (dom->def->ngraphics < 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("cannot find VNC graphics device")); + goto cleanup; + } + + if (prlsdkApplyGraphicsParams(privdom->sdkdom, NULL) < 0) + goto cleanup; + + break; default: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("detaching device type '%s' is unsupported"), @@ -3549,6 +3484,17 @@ prlsdkUpdateDevice(vzDriverPtr driver, return -1; break; + case VIR_DOMAIN_DEVICE_GRAPHICS: + if (dom->def->ngraphics < 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("cannot find VNC graphics device")); + return -1; + } + + if (prlsdkApplyGraphicsParams(privdom->sdkdom, dev->data.graphics) < 0) + return -1; + + break; default: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("updating device type '%s' is unsupported"), @@ -3752,7 +3698,14 @@ prlsdkDoApplyConfig(vzDriverPtr driver, goto error; } - if (prlsdkApplyGraphicsParams(sdkdom, def) < 0) + if (def->ngraphics > 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vz driver supports only VNC graphics")); + goto error; + } + + if (prlsdkApplyGraphicsParams(sdkdom, + def->ngraphics == 1 ? def->graphics[0] : NULL) < 0) goto error; if (prlsdkApplyVideoParams(sdkdom, def) < 0) diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index 5c53e79..a6f5919 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -555,3 +555,73 @@ int vzGetDefaultSCSIModel(vzDriverPtr driver, } return 0; } + +int vzCheckUnsupportedGraphics(virDomainGraphicsDefPtr gr) +{ + if (gr->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vz driver supports only " + "VNC graphics.")); + return -1; + } + + if (gr->data.vnc.websocket != 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vz driver doesn't support " + "websockets for VNC graphics.")); + return -1; + } + + if (gr->data.vnc.keymap != 0 && + STRNEQ(gr->data.vnc.keymap, "en-us")) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vz driver supports only " + "\"en-us\" keymap for VNC graphics.")); + return -1; + } + + if (gr->data.vnc.sharePolicy == VIR_DOMAIN_GRAPHICS_VNC_SHARE_ALLOW_EXCLUSIVE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vz driver doesn't support " + "exclusive share policy for VNC graphics.")); + return -1; + } + + if (gr->data.vnc.socket) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vz driver doesn't support " + "VNC graphics over unix sockets.")); + return -1; + } + + if (gr->data.vnc.auth.connected == VIR_DOMAIN_GRAPHICS_AUTH_CONNECTED_FAIL || + gr->data.vnc.auth.connected == VIR_DOMAIN_GRAPHICS_AUTH_CONNECTED_KEEP) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vz driver doesn't support " + "given action in case of password change.")); + return -1; + } + + if (gr->data.vnc.auth.expires) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("vz driver doesn't support " + "setting password expire time.")); + return -1; + } + + if (gr->nListens > 1) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("vz driver doesn't support more than " + "one listening VNC server per domain")); + return -1; + } + + if (gr->nListens == 1 && + gr->listens[0].type != VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("vz driver supports only address-based VNC listening")); + return -1; + } + + return 0; +} diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h index fc5f695..a8a74b6 100644 --- a/src/vz/vz_utils.h +++ b/src/vz/vz_utils.h @@ -138,6 +138,8 @@ int vzGetDefaultSCSIModel(vzDriverPtr driver, PRL_CLUSTERED_DEVICE_SUBTYPE *scsiModel); +int vzCheckUnsupportedGraphics(virDomainGraphicsDefPtr gr); + # define PARALLELS_BLOCK_STATS_FOREACH(OP) \ OP(rd_req, VIR_DOMAIN_BLOCK_STATS_READ_REQ, "read_requests") \ OP(rd_bytes, VIR_DOMAIN_BLOCK_STATS_READ_BYTES, "read_total") \ -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
Move graphic device config to post parse. This way we detect error on early stage and leverage checking on detach too.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_driver.c | 2 + src/vz/vz_sdk.c | 141 ++++++++++++++++++----------------------------------- src/vz/vz_utils.c | 70 ++++++++++++++++++++++++++ src/vz/vz_utils.h | 2 + 4 files changed, 121 insertions(+), 94 deletions(-)
ACK

Allocation will do this job. Also we don't use the explicit setting in other places. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 322b316..2e2cdfd 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -1176,11 +1176,6 @@ prlsdkAddVNCInfo(PRL_HANDLE sdkdom, virDomainDefPtr def) gr->data.vnc.autoport = (vncMode == PRD_AUTO); gr->type = VIR_DOMAIN_GRAPHICS_TYPE_VNC; gr->data.vnc.port = port; - gr->data.vnc.keymap = NULL; - gr->data.vnc.socket = NULL; - gr->data.vnc.auth.passwd = NULL; - gr->data.vnc.auth.expires = false; - gr->data.vnc.auth.connected = 0; if (VIR_ALLOC(gr->listens) < 0) goto error; -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
Allocation will do this job. Also we don't use the explicit setting in other places.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 5 ----- 1 file changed, 5 deletions(-)
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 322b316..2e2cdfd 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -1176,11 +1176,6 @@ prlsdkAddVNCInfo(PRL_HANDLE sdkdom, virDomainDefPtr def) gr->data.vnc.autoport = (vncMode == PRD_AUTO); gr->type = VIR_DOMAIN_GRAPHICS_TYPE_VNC; gr->data.vnc.port = port; - gr->data.vnc.keymap = NULL; - gr->data.vnc.socket = NULL; - gr->data.vnc.auth.passwd = NULL; - gr->data.vnc.auth.expires = false; - gr->data.vnc.auth.connected = 0;
if (VIR_ALLOC(gr->listens) < 0) goto error;
ACK

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 2e2cdfd..334b2d0 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -1160,6 +1160,7 @@ prlsdkAddVNCInfo(PRL_HANDLE sdkdom, virDomainDefPtr def) PRL_VM_REMOTE_DISPLAY_MODE vncMode; PRL_UINT32 port; PRL_RESULT pret; + char *passwd = NULL; pret = PrlVmCfg_GetVNCMode(sdkdom, &vncMode); prlsdkCheckRetGoto(pret, error); @@ -1170,6 +1171,14 @@ prlsdkAddVNCInfo(PRL_HANDLE sdkdom, virDomainDefPtr def) if (VIR_ALLOC(gr) < 0) goto error; + if (!(passwd = prlsdkGetStringParamVar(PrlVmCfg_GetVNCPassword, sdkdom))) + goto error; + + if (*passwd != '\0') { + gr->data.vnc.auth.passwd = passwd; + passwd = NULL; + } + pret = PrlVmCfg_GetVNCPort(sdkdom, &port); prlsdkCheckRetGoto(pret, error); @@ -1195,6 +1204,7 @@ prlsdkAddVNCInfo(PRL_HANDLE sdkdom, virDomainDefPtr def) error: virDomainGraphicsDefFree(gr); + VIR_FREE(passwd); return -1; } @@ -2756,6 +2766,9 @@ static int prlsdkApplyGraphicsParams(PRL_HANDLE sdkdom, return 0; } + pret = PrlVmCfg_SetVNCPassword(sdkdom, gr->data.vnc.auth.passwd ? : ""); + prlsdkCheckRetExit(pret, -1); + if (gr->data.vnc.autoport) { pret = PrlVmCfg_SetVNCMode(sdkdom, PRD_AUTO); prlsdkCheckRetGoto(pret, cleanup); -- 1.8.3.1

We need this because apply graphics functions is used on update too. Also in case of NULL address resolve it to default instead of error. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/vz/vz_sdk.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 334b2d0..5a45e43 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -2780,12 +2780,10 @@ static int prlsdkApplyGraphicsParams(PRL_HANDLE sdkdom, prlsdkCheckRetGoto(pret, cleanup); } - if ((gListen = virDomainGraphicsGetListen(gr, 0))) { - if (!gListen->address) - goto cleanup; - pret = PrlVmCfg_SetVNCHostName(sdkdom, gListen->address); - prlsdkCheckRetGoto(pret, cleanup); - } + gListen = virDomainGraphicsGetListen(gr, 0); + pret = PrlVmCfg_SetVNCHostName(sdkdom, gListen && gListen->address ? + gListen->address : ""); + prlsdkCheckRetGoto(pret, cleanup); ret = 0; cleanup: -- 1.8.3.1

20.04.2016 17:05, Nikolay Shirokovskiy пишет:
It makes sense to support other devices too as update can be on persistent config only which is always possible, but as AFAIK the main purpose of this API is to change live config the set of devices is just set of devices supported by qemu for live updates.
Nikolay Shirokovskiy (18): vz: remove disk cache mode hunk vz: make prlsdkGetDisk more generic vz: reuse edit config frame in for attach/detach functions vz: add device updates vz: leverage disks parameters check on disks updates too vz: move disks checks to device post parse vz: fix memory leaks in attach/detach functions vz: give nice report if network device not found vz: dump ip addresses to domain xml vz: dump route info in domain xml vz: fix updating to no gateways vz: fix minor type safey issues with net union usage vz: trustGuestRxFilters fixes vz: move getting container video devices out from vnc code vz: support attach/detach/update/ of graphics device vz: remove exlicitly setting zeros in dumping graphics vz: support vnc password vz: always pass graphics address to sdk
src/conf/networkcommon_conf.c | 2 +- src/conf/networkcommon_conf.h | 2 +- src/libvirt_private.syms | 1 + src/vz/vz_driver.c | 115 +++--- src/vz/vz_sdk.c | 897 +++++++++++++++++++++++------------------- src/vz/vz_sdk.h | 10 +- src/vz/vz_utils.c | 204 ++++++++-- src/vz/vz_utils.h | 7 +- 8 files changed, 740 insertions(+), 498 deletions(-)
Pushed the series. Rebased and fixed minor issue mentioned to my comments to patches. Thank you. Sorry for such a long delay. Maxim
participants (2)
-
Maxim Nestratov
-
Nikolay Shirokovskiy