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

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 VIR_DOMAIN_VIRT_VZ virtType for new domains src/conf/domain_conf.c | 19 ++++++++---- src/conf/domain_conf.h | 1 + src/libvirt.c | 2 +- src/parallels/parallels_driver.c | 61 +++++++++++++++++++++++++++++++++++---- src/parallels/parallels_network.c | 3 +- src/parallels/parallels_sdk.c | 2 +- src/parallels/parallels_storage.c | 3 +- 7 files changed, 75 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

When a new domain is defined we use VIR_DOMAIN_VIRT_VZ instead of VIR_DOMAIN_VIRT_PARALLELS despite the fact it remains supported. Signed-off-by: Maxim Nestratov <mnestratov@parallels.com> --- src/parallels/parallels_sdk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parallels/parallels_sdk.c b/src/parallels/parallels_sdk.c index 2a44504..542e09e 100644 --- a/src/parallels/parallels_sdk.c +++ b/src/parallels/parallels_sdk.c @@ -1253,7 +1253,7 @@ prlsdkLoadDomain(parallelsConnPtr privconn, pdom = olddom->privateData; } - def->virtType = VIR_DOMAIN_VIRT_PARALLELS; + def->virtType = VIR_DOMAIN_VIRT_VZ; def->id = -1; /* we will remove this field in the near future, so let's set it -- 2.1.0
participants (1)
-
Maxim Nestratov