[libvirt] [PATCH 0/8 v3] parallels: add vz driver

v2-v3 change: * Patch "parallels: set virtType depending on driver name" reworked. Implemented ability to set virtType depending on driver name. v1-v2 change: * Only "parallels: accept vz as a driver uri and name" patch is changed. Fixed ability to connect to 'parallels' driver and deal with 'Paralells' domain virt type. Maxim Nestratov (8): parallels: introduce vz driver constant and string parallels: use newly introduced VIR_DOMAIN_VIRT_VZ parallels: add new guest capabilities assigned to vz driver parallels: accept vz as a driver uri and name parallels: add a new vz connection driver and hypervisor structures parallels: increment the number of connection drivers parallels: recommend to connect to vz:///system when connection fails parallels: set virtType depending on driver name src/conf/domain_conf.c | 19 ++++++++---- src/conf/domain_conf.h | 1 + src/libvirt.c | 2 +- src/parallels/parallels_driver.c | 63 +++++++++++++++++++++++++++++++++++---- src/parallels/parallels_network.c | 3 +- src/parallels/parallels_sdk.c | 6 +++- src/parallels/parallels_storage.c | 3 +- src/parallels/parallels_utils.h | 1 + 8 files changed, 82 insertions(+), 16 deletions(-) -- 2.1.0

This new name and constant will be used as substitutions for parallels driver one. Signed-off-by: Maxim Nestratov <mnestratov@parallels.com> --- src/conf/domain_conf.c | 3 ++- src/conf/domain_conf.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 631f9eb..576d37c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -118,7 +118,8 @@ VIR_ENUM_IMPL(virDomainVirt, VIR_DOMAIN_VIRT_LAST, "vbox", "phyp", "parallels", - "bhyve") + "bhyve", + "vz") VIR_ENUM_IMPL(virDomainOS, VIR_DOMAIN_OSTYPE_LAST, "hvm", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0fcf52e..924c484 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -223,6 +223,7 @@ typedef enum { VIR_DOMAIN_VIRT_PHYP, VIR_DOMAIN_VIRT_PARALLELS, VIR_DOMAIN_VIRT_BHYVE, + VIR_DOMAIN_VIRT_VZ, VIR_DOMAIN_VIRT_LAST } virDomainVirtType; -- 2.1.0

As soon as we keep backward compatibility we treat this constant as synonym to VIR_DOMAIN_VIRT_PARALLELS. Signed-off-by: Maxim Nestratov <mnestratov@parallels.com> --- src/conf/domain_conf.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 576d37c..041d680 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9646,7 +9646,8 @@ virDomainInputDefParseXML(const virDomainDef *dom, goto error; } } else { - if (dom->virtType == VIR_DOMAIN_VIRT_PARALLELS) { + if (dom->virtType == VIR_DOMAIN_VIRT_VZ || + dom->virtType == VIR_DOMAIN_VIRT_PARALLELS) { if (def->bus != VIR_DOMAIN_INPUT_BUS_PARALLELS) { virReportError(VIR_ERR_INTERNAL_ERROR, _("parallels containers don't support " @@ -9682,7 +9683,8 @@ virDomainInputDefParseXML(const virDomainDef *dom, } else if (dom->os.type == VIR_DOMAIN_OSTYPE_XEN) { def->bus = VIR_DOMAIN_INPUT_BUS_XEN; } else { - if ((dom->virtType == VIR_DOMAIN_VIRT_PARALLELS)) + if ((dom->virtType == VIR_DOMAIN_VIRT_VZ || + dom->virtType == VIR_DOMAIN_VIRT_PARALLELS)) def->bus = VIR_DOMAIN_INPUT_BUS_PARALLELS; } } @@ -11172,6 +11174,7 @@ virDomainVideoDefaultType(const virDomainDef *def) case VIR_DOMAIN_VIRT_VMWARE: return VIR_DOMAIN_VIDEO_TYPE_VMVGA; + case VIR_DOMAIN_VIRT_VZ: case VIR_DOMAIN_VIRT_PARALLELS: if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) return VIR_DOMAIN_VIDEO_TYPE_VGA; @@ -15320,7 +15323,8 @@ virDomainDefParseXML(xmlDocPtr xml, (input->type == VIR_DOMAIN_INPUT_TYPE_MOUSE || input->type == VIR_DOMAIN_INPUT_TYPE_KBD)) || (def->os.type == VIR_DOMAIN_OSTYPE_EXE && - def->virtType == VIR_DOMAIN_VIRT_PARALLELS && + (def->virtType == VIR_DOMAIN_VIRT_VZ || + def->virtType == VIR_DOMAIN_VIRT_PARALLELS) && input->bus == VIR_DOMAIN_INPUT_BUS_PARALLELS && (input->type == VIR_DOMAIN_INPUT_TYPE_MOUSE || input->type == VIR_DOMAIN_INPUT_TYPE_KBD))) { @@ -15356,7 +15360,8 @@ virDomainDefParseXML(xmlDocPtr xml, if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) input_bus = VIR_DOMAIN_INPUT_BUS_PS2; if (def->os.type == VIR_DOMAIN_OSTYPE_EXE && - def->virtType == VIR_DOMAIN_VIRT_PARALLELS) + (def->virtType == VIR_DOMAIN_VIRT_VZ || + def->virtType == VIR_DOMAIN_VIRT_PARALLELS)) input_bus = VIR_DOMAIN_INPUT_BUS_PARALLELS; if (virDomainDefMaybeAddInput(def, @@ -21621,7 +21626,8 @@ virDomainDefFormatInternal(virDomainDefPtr def, if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) autoInput.bus = VIR_DOMAIN_INPUT_BUS_PS2; else if (def->os.type == VIR_DOMAIN_OSTYPE_EXE && - def->virtType == VIR_DOMAIN_VIRT_PARALLELS) + (def->virtType == VIR_DOMAIN_VIRT_VZ || + def->virtType == VIR_DOMAIN_VIRT_PARALLELS)) autoInput.bus = VIR_DOMAIN_INPUT_BUS_PARALLELS; else autoInput.bus = VIR_DOMAIN_INPUT_BUS_XEN; -- 2.1.0

Signed-off-by: Maxim Nestratov <mnestratov@parallels.com> --- src/parallels/parallels_driver.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index 4b87213..b2ce2ef 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -120,6 +120,33 @@ parallelsBuildCapabilities(void) NULL, NULL, 0, NULL) == NULL) goto error; + if ((guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, + VIR_ARCH_X86_64, + "vz", + NULL, 0, NULL)) == NULL) + goto error; + + if ((guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM, + VIR_ARCH_I686, + "vz", + NULL, 0, NULL)) == NULL) + goto error; + + + if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_VZ, + NULL, NULL, 0, NULL) == NULL) + goto error; + + if ((guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_EXE, + VIR_ARCH_X86_64, + "vz", + NULL, 0, NULL)) == NULL) + goto error; + + if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_VZ, + NULL, NULL, 0, NULL) == NULL) + goto error; + if (nodeGetInfo(&nodeinfo)) goto error; -- 2.1.0

If 'parallels:///system' uri is specified then connection is made to 'Parallels' driver and domain type will be VIR_DOMAIN_VIRT_PARALLELS. In case of 'vz:///system' connection is established to 'vz' driver and domain type will be VIR_DOMAIN_VIRT_VZ. Signed-off-by: Maxim Nestratov <mnestratov@parallels.com> --- src/parallels/parallels_driver.c | 12 +++++++++++- src/parallels/parallels_network.c | 3 ++- src/parallels/parallels_storage.c | 3 ++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index b2ce2ef..3db5872 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -296,7 +296,17 @@ parallelsConnectOpen(virConnectPtr conn, if (!conn->uri) return VIR_DRV_OPEN_DECLINED; - if (!conn->uri->scheme || STRNEQ(conn->uri->scheme, "parallels")) + if (!conn->uri->scheme) + return VIR_DRV_OPEN_DECLINED; + + if (STRNEQ(conn->uri->scheme, "vz") && + STRNEQ(conn->uri->scheme, "parallels")) + return VIR_DRV_OPEN_DECLINED; + + if (STREQ(conn->uri->scheme, "vz") && STRNEQ(conn->driver->name, "vz")) + return VIR_DRV_OPEN_DECLINED; + + if (STREQ(conn->uri->scheme, "parallels") && STRNEQ(conn->driver->name, "Parallels")) return VIR_DRV_OPEN_DECLINED; /* Remote driver should handle these. */ diff --git a/src/parallels/parallels_network.c b/src/parallels/parallels_network.c index fb98041..895c706 100644 --- a/src/parallels/parallels_network.c +++ b/src/parallels/parallels_network.c @@ -334,7 +334,8 @@ parallelsNetworkOpen(virConnectPtr conn, virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR); - if (STRNEQ(conn->driver->name, "Parallels")) + if (STRNEQ(conn->driver->name, "vz") && + STRNEQ(conn->driver->name, "Parallels")) return VIR_DRV_OPEN_DECLINED; if (!(privconn->networks = virNetworkObjListNew())) diff --git a/src/parallels/parallels_storage.c b/src/parallels/parallels_storage.c index 4091124..3dcc44d 100644 --- a/src/parallels/parallels_storage.c +++ b/src/parallels/parallels_storage.c @@ -470,7 +470,8 @@ parallelsStorageOpen(virConnectPtr conn, virStorageDriverStatePtr storageState; virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR); - if (STRNEQ(conn->driver->name, "Parallels")) + if (STRNEQ(conn->driver->name, "vz") && + STRNEQ(conn->driver->name, "Parallels")) return VIR_DRV_OPEN_DECLINED; if (VIR_ALLOC(storageState) < 0) -- 2.1.0

We add this connection driver just as an exact copy with different name to keep backward compatibility. Vz stands for Virtuozzo, which is a new name of Parallels Cloud Server. Signed-off-by: Maxim Nestratov <mnestratov@parallels.com> --- src/parallels/parallels_driver.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index 3db5872..e150448 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -1216,8 +1216,8 @@ parallelsDomainGetMaxMemory(virDomainPtr domain) return ret; } -static virHypervisorDriver parallelsDriver = { - .name = "Parallels", +static virHypervisorDriver vzDriver = { + .name = "vz", .connectOpen = parallelsConnectOpen, /* 0.10.0 */ .connectClose = parallelsConnectClose, /* 0.10.0 */ .connectGetVersion = parallelsConnectGetVersion, /* 0.10.0 */ @@ -1267,12 +1267,16 @@ static virHypervisorDriver parallelsDriver = { .domainGetMaxMemory = parallelsDomainGetMaxMemory, /* 1.2.15 */ }; -static virConnectDriver parallelsConnectDriver = { - .hypervisorDriver = ¶llelsDriver, +static virConnectDriver vzConnectDriver = { + .hypervisorDriver = &vzDriver, .storageDriver = ¶llelsStorageDriver, .networkDriver = ¶llelsNetworkDriver, }; +/* Parallels domain type backward compatibility*/ +static virHypervisorDriver parallelsDriver; +static virConnectDriver parallelsConnectDriver; + /** * parallelsRegister: * @@ -1291,8 +1295,16 @@ parallelsRegister(void) VIR_FREE(prlctl_path); + /* Backward compatibility with Parallels domain type */ + parallelsDriver = vzDriver; + parallelsDriver.name = "Parallels"; + parallelsConnectDriver = vzConnectDriver; + parallelsConnectDriver.hypervisorDriver = ¶llelsDriver; if (virRegisterConnectDriver(¶llelsConnectDriver, false) < 0) return -1; + if (virRegisterConnectDriver(&vzConnectDriver, false) < 0) + return -1; + return 0; } -- 2.1.0

We need to do this because we have just added a vz driver. Signed-off-by: Maxim Nestratov <mnestratov@parallels.com> --- src/libvirt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libvirt.c b/src/libvirt.c index c8a5834..fe62faa 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -109,7 +109,7 @@ VIR_LOG_INIT("libvirt"); * - use reference counting to guarantee coherent pointer state ? */ -#define MAX_DRIVERS 20 +#define MAX_DRIVERS 21 static virConnectDriverPtr virConnectDriverTab[MAX_DRIVERS]; static int virConnectDriverTabCount; -- 2.1.0

Though parallels:///system is still accepted we will encourage users to use vz:///system instead. Signed-off-by: Maxim Nestratov <mnestratov@parallels.com> --- src/parallels/parallels_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index e150448..44b4de8 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -316,7 +316,7 @@ parallelsConnectOpen(virConnectPtr conn, /* From this point on, the connection is for us. */ if (!STREQ_NULLABLE(conn->uri->path, "/system")) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unexpected Parallels URI path '%s', try parallels:///system"), + _("Unexpected Virtuozzo URI path '%s', try vz:///system"), conn->uri->path); return VIR_DRV_OPEN_ERROR; } -- 2.1.0

We remember driver name in a new field 'drivername' within private parallels connection structure. When a new domain is defined we use this name to set corresponding virtType. We set VIR_DOMAIN_VIRT_VZ for 'vz' driver and VIR_DOMAIN_VIRT_PARALLELS for 'Parallels'. Signed-off-by: Maxim Nestratov <mnestratov@parallels.com> --- src/parallels/parallels_driver.c | 2 ++ src/parallels/parallels_sdk.c | 6 +++++- src/parallels/parallels_utils.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index 44b4de8..e3ac90d 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -241,6 +241,8 @@ parallelsOpenDefault(virConnectPtr conn) goto err_free; } + privconn->drivername = conn->driver->name; + if (prlsdkInit()) { VIR_DEBUG("%s", _("Can't initialize Parallels SDK")); goto err_free; diff --git a/src/parallels/parallels_sdk.c b/src/parallels/parallels_sdk.c index 2a44504..83117ef 100644 --- a/src/parallels/parallels_sdk.c +++ b/src/parallels/parallels_sdk.c @@ -1253,7 +1253,11 @@ prlsdkLoadDomain(parallelsConnPtr privconn, pdom = olddom->privateData; } - def->virtType = VIR_DOMAIN_VIRT_PARALLELS; + if (STREQ(privconn->drivername, "vz")) + def->virtType = VIR_DOMAIN_VIRT_VZ; + else + def->virtType = VIR_DOMAIN_VIRT_PARALLELS; + def->id = -1; /* we will remove this field in the near future, so let's set it diff --git a/src/parallels/parallels_utils.h b/src/parallels/parallels_utils.h index 2d1d405..e8a92bb 100644 --- a/src/parallels/parallels_utils.h +++ b/src/parallels/parallels_utils.h @@ -68,6 +68,7 @@ struct _parallelsConn { virDomainXMLOptionPtr xmlopt; virObjectEventStatePtr domainEventState; virStorageDriverStatePtr storageState; + const char *drivername; }; typedef struct _parallelsConn parallelsConn; -- 2.1.0

On 05/26/2015 08:12 PM, Maxim Nestratov wrote:
v2-v3 change:
* Patch "parallels: set virtType depending on driver name" reworked. Implemented ability to set virtType depending on driver name.
v1-v2 change:
* Only "parallels: accept vz as a driver uri and name" patch is changed. Fixed ability to connect to 'parallels' driver and deal with 'Paralells' domain virt type.
ACK to the whole series, but I'll push it after libvirt's release.
Maxim Nestratov (8): parallels: introduce vz driver constant and string parallels: use newly introduced VIR_DOMAIN_VIRT_VZ parallels: add new guest capabilities assigned to vz driver parallels: accept vz as a driver uri and name parallels: add a new vz connection driver and hypervisor structures parallels: increment the number of connection drivers parallels: recommend to connect to vz:///system when connection fails parallels: set virtType depending on driver name
src/conf/domain_conf.c | 19 ++++++++---- src/conf/domain_conf.h | 1 + src/libvirt.c | 2 +- src/parallels/parallels_driver.c | 63 +++++++++++++++++++++++++++++++++++---- src/parallels/parallels_network.c | 3 +- src/parallels/parallels_sdk.c | 6 +++- src/parallels/parallels_storage.c | 3 +- src/parallels/parallels_utils.h | 1 + 8 files changed, 82 insertions(+), 16 deletions(-)

On 05/28/2015 11:05 AM, Dmitry Guryanov wrote:
On 05/26/2015 08:12 PM, Maxim Nestratov wrote:
v2-v3 change:
* Patch "parallels: set virtType depending on driver name" reworked. Implemented ability to set virtType depending on driver name.
v1-v2 change:
* Only "parallels: accept vz as a driver uri and name" patch is changed. Fixed ability to connect to 'parallels' driver and deal with 'Paralells' domain virt type.
ACK to the whole series, but I'll push it after libvirt's release.
Since there was no objections, I've pushed it.
Maxim Nestratov (8): parallels: introduce vz driver constant and string parallels: use newly introduced VIR_DOMAIN_VIRT_VZ parallels: add new guest capabilities assigned to vz driver parallels: accept vz as a driver uri and name parallels: add a new vz connection driver and hypervisor structures parallels: increment the number of connection drivers parallels: recommend to connect to vz:///system when connection fails parallels: set virtType depending on driver name
src/conf/domain_conf.c | 19 ++++++++---- src/conf/domain_conf.h | 1 + src/libvirt.c | 2 +- src/parallels/parallels_driver.c | 63 +++++++++++++++++++++++++++++++++++---- src/parallels/parallels_network.c | 3 +- src/parallels/parallels_sdk.c | 6 +++- src/parallels/parallels_storage.c | 3 +- src/parallels/parallels_utils.h | 1 + 8 files changed, 82 insertions(+), 16 deletions(-)
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
-- Dmitry Guryanov
participants (3)
-
Dmitry Guryanov
-
Dmitry Guryanov
-
Maxim Nestratov