[libvirt] [PATCH 0/3] vz: disk format support

Mikhail Feoktistov (3): vz: add vzInitVersion function vz: add virStorageFileFormat to connection structure vz: check supported disk format src/vz/vz_driver.c | 52 +++++++----------------------------------- src/vz/vz_sdk.c | 28 ++++++++++++++++------- src/vz/vz_sdk.h | 2 +- src/vz/vz_utils.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/vz/vz_utils.h | 10 +++++++++ 5 files changed, 105 insertions(+), 53 deletions(-) -- 1.8.3.1

Move code from connectGetVersion callback to vzInitVersion function Move variable contains version number to connection structure. --- src/vz/vz_driver.c | 50 +++++++------------------------------------------- src/vz/vz_utils.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/vz/vz_utils.h | 3 +++ 3 files changed, 57 insertions(+), 43 deletions(-) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index f7a8617..82eba27 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -62,7 +62,6 @@ VIR_LOG_INIT("parallels.parallels_driver"); #define PRLCTL "prlctl" -#define PRLSRVCTL "prlsrvctl" static int vzConnectClose(virConnectPtr conn); @@ -238,6 +237,9 @@ vzOpenDefault(virConnectPtr conn) if (prlsdkConnect(privconn) < 0) goto err_free; + if (vzInitVersion(privconn) < 0) + goto error; + if (!(privconn->caps = vzBuildCapabilities())) goto error; @@ -342,49 +344,11 @@ vzConnectClose(virConnectPtr conn) } static int -vzConnectGetVersion(virConnectPtr conn ATTRIBUTE_UNUSED, unsigned long *hvVer) +vzConnectGetVersion(virConnectPtr conn, unsigned long *hvVer) { - char *output, *sVer, *tmp; - const char *searchStr = "prlsrvctl version "; - int ret = -1; - - output = vzGetOutput(PRLSRVCTL, "--help", NULL); - - if (!output) { - vzParseError(); - goto cleanup; - } - - if (!(sVer = strstr(output, searchStr))) { - vzParseError(); - goto cleanup; - } - - sVer = sVer + strlen(searchStr); - - /* parallels server has versions number like 6.0.17977.782218, - * so libvirt can handle only first two numbers. */ - if (!(tmp = strchr(sVer, '.'))) { - vzParseError(); - goto cleanup; - } - - if (!(tmp = strchr(tmp + 1, '.'))) { - vzParseError(); - goto cleanup; - } - - tmp[0] = '\0'; - if (virParseVersionString(sVer, hvVer, true) < 0) { - vzParseError(); - goto cleanup; - } - - ret = 0; - - cleanup: - VIR_FREE(output); - return ret; + vzConnPtr privconn = conn->privateData; + *hvVer = privconn->vzVersion; + return 0; } diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index a1ddad0..cf37597 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -34,6 +34,7 @@ #include "datatypes.h" #define VIR_FROM_THIS VIR_FROM_PARALLELS +#define PRLSRVCTL "prlsrvctl" /** * vzDomObjFromDomain: @@ -178,3 +179,49 @@ vzNewDomain(vzConnPtr privconn, char *name, const unsigned char *uuid) VIR_FREE(pdom); return NULL; } + +int +vzInitVersion(vzConnPtr privconn) +{ + char *output, *sVer, *tmp; + const char *searchStr = "prlsrvctl version "; + int ret = -1; + + output = vzGetOutput(PRLSRVCTL, "--help", NULL); + + if (!output) { + vzParseError(); + goto cleanup; + } + + if (!(sVer = strstr(output, searchStr))) { + vzParseError(); + goto cleanup; + } + + sVer = sVer + strlen(searchStr); + + /* parallels server has versions number like 6.0.17977.782218 or 7.0.0, + * In libvirt we handle only first two numbers. */ + if (!(tmp = strchr(sVer, '.'))) { + vzParseError(); + goto cleanup; + } + + if (!(tmp = strchr(tmp + 1, '.'))) { + vzParseError(); + goto cleanup; + } + + tmp[0] = '\0'; + if (virParseVersionString(sVer, &(privconn->vzVersion), true) < 0) { + vzParseError(); + goto cleanup; + } + + ret = 0; + + cleanup: + VIR_FREE(output); + return ret; +} diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h index 0976193..694f204 100644 --- a/src/vz/vz_utils.h +++ b/src/vz/vz_utils.h @@ -59,6 +59,7 @@ struct _vzConn { virDomainXMLOptionPtr xmlopt; virObjectEventStatePtr domainEventState; const char *drivername; + unsigned long vzVersion; }; typedef struct _vzConn vzConn; @@ -94,6 +95,8 @@ virDomainObjPtr vzNewDomain(vzConnPtr privconn, char *name, const unsigned char *uuid); +int +vzInitVersion(vzConnPtr privconn); # define PARALLELS_BLOCK_STATS_FOREACH(OP) \ OP(rd_req, VIR_DOMAIN_BLOCK_STATS_READ_REQ, "read_requests") \ -- 1.8.3.1

Virtuozzo6 supports only ploop disks for containers and virtual machines. Virtuozzo7 supports only qcow2 for virtual machines. In this patch we add virStorageFileFormat variables to connection structure. Each variable contains disk format that we support for virtual machines and containers. In openConnection() callback we get virtuozzo version and select proper virStorageFileFormat values. --- src/vz/vz_utils.c | 8 ++++++++ src/vz/vz_utils.h | 3 +++ 2 files changed, 11 insertions(+) diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index cf37597..f7db9cf 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -219,6 +219,14 @@ vzInitVersion(vzConnPtr privconn) goto cleanup; } + if (privconn->vzVersion < VIRTUOZZO_VER_7) { + privconn->ctDiskFormat = VIR_STORAGE_FILE_PLOOP; + privconn->vmDiskFormat = VIR_STORAGE_FILE_PLOOP; + } else { + privconn->ctDiskFormat = VIR_STORAGE_FILE_PLOOP; + privconn->vmDiskFormat = VIR_STORAGE_FILE_QCOW2; + } + ret = 0; cleanup: diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h index 694f204..b1bdcce 100644 --- a/src/vz/vz_utils.h +++ b/src/vz/vz_utils.h @@ -47,6 +47,7 @@ # define PARALLELS_DOMAIN_ROUTED_NETWORK_NAME "Routed" # define PARALLELS_DOMAIN_BRIDGED_NETWORK_NAME "Bridged" +# define VIRTUOZZO_VER_7 ((unsigned long) 7000000) struct _vzConn { virMutex lock; @@ -60,6 +61,8 @@ struct _vzConn { virObjectEventStatePtr domainEventState; const char *drivername; unsigned long vzVersion; + virStorageFileFormat vmDiskFormat; + virStorageFileFormat ctDiskFormat; }; typedef struct _vzConn vzConn; -- 1.8.3.1

In prlsdkAddDisk() we try to check disk format, before adding disk. If disk format is not specified in XML (VIR_STORAGE_FILE_NONE) than we accept this disk. Otherwise we try to find disk format in connection struct. --- src/vz/vz_driver.c | 2 +- src/vz/vz_sdk.c | 28 ++++++++++++++++++++-------- src/vz/vz_sdk.h | 2 +- src/vz/vz_utils.c | 11 +++++++++++ src/vz/vz_utils.h | 4 ++++ 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 82eba27..c1ccbc5 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -1070,7 +1070,7 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, switch (dev->type) { case VIR_DOMAIN_DEVICE_DISK: - ret = prlsdkAttachVolume(privdom, dev->data.disk); + ret = prlsdkAttachVolume(privconn, privdom, dev->data.disk); if (ret) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("disk attach failed")); diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 92bb7c5..0bd80f0 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3106,7 +3106,8 @@ static int prlsdkDelDisk(PRL_HANDLE sdkdom, int idx) return ret; } -static int prlsdkAddDisk(PRL_HANDLE sdkdom, +static int prlsdkAddDisk(vzConnPtr privconn, + PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool bootDisk, bool isCt) @@ -3141,11 +3142,12 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom, if (disk->src->type == VIR_STORAGE_TYPE_FILE) { if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK && - virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP) { + virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_NONE && + !vzCheckDiskFormat(privconn, virDomainDiskGetFormat(disk), isCt)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid format of " - "disk %s, vz driver supports only " - "images in ploop format."), disk->src->path); + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported format of disk %s"), + disk->src->path); goto cleanup; } @@ -3287,7 +3289,9 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom, } int -prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk) +prlsdkAttachVolume(vzConnPtr privconn, + virDomainObjPtr dom, + virDomainDiskDefPtr disk) { int ret = -1; vzDomObjPtr privdom = dom->privateData; @@ -3297,7 +3301,11 @@ prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk) if (PRL_FAILED(waitJob(job))) goto cleanup; - ret = prlsdkAddDisk(privdom->sdkdom, disk, false, IS_CT(dom->def)); + ret = prlsdkAddDisk(privconn, + privdom->sdkdom, + disk, + false, + IS_CT(dom->def)); if (ret == 0) { job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE); if (PRL_FAILED(waitJob(job))) { @@ -3528,7 +3536,11 @@ prlsdkDoApplyConfig(virConnectPtr conn, needBoot = false; bootDisk = true; } - if (prlsdkAddDisk(sdkdom, def->disks[i], bootDisk, IS_CT(def)) < 0) + if (prlsdkAddDisk(conn->privateData, + sdkdom, + def->disks[i], + bootDisk, + IS_CT(def)) < 0) goto error; } diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h index c2d9cb4..8a38797 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -63,7 +63,7 @@ prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom, unsigned int fla int prlsdkDomainManagedSaveRemove(virDomainObjPtr dom); int -prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk); +prlsdkAttachVolume(vzConnPtr privconn, virDomainObjPtr dom, virDomainDiskDefPtr disk); int prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk); int diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index f7db9cf..e2be56d 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -233,3 +233,14 @@ vzInitVersion(vzConnPtr privconn) VIR_FREE(output); return ret; } + +bool vzCheckDiskFormat(vzConnPtr privconn, virStorageFileFormat format, bool isCt) +{ + if (isCt && privconn->ctDiskFormat == format) + return true; + + if (!isCt && privconn->vmDiskFormat == format) + return true; + + return false; +} diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h index b1bdcce..a6274fb 100644 --- a/src/vz/vz_utils.h +++ b/src/vz/vz_utils.h @@ -100,6 +100,10 @@ vzNewDomain(vzConnPtr privconn, const unsigned char *uuid); int vzInitVersion(vzConnPtr privconn); +bool +vzCheckDiskFormat(vzConnPtr privconn, + virStorageFileFormat format, + bool isCt); # define PARALLELS_BLOCK_STATS_FOREACH(OP) \ OP(rd_req, VIR_DOMAIN_BLOCK_STATS_READ_REQ, "read_requests") \ -- 1.8.3.1

Please ignore these patches. I'll send a new version soon. On 01.03.2016 13:46, Mikhail Feoktistov wrote:
Mikhail Feoktistov (3): vz: add vzInitVersion function vz: add virStorageFileFormat to connection structure vz: check supported disk format
src/vz/vz_driver.c | 52 +++++++----------------------------------- src/vz/vz_sdk.c | 28 ++++++++++++++++------- src/vz/vz_sdk.h | 2 +- src/vz/vz_utils.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/vz/vz_utils.h | 10 +++++++++ 5 files changed, 105 insertions(+), 53 deletions(-)
participants (1)
-
Mikhail Feoktistov