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

This new driver 'vz' will be used as a substitution for parallels driver. New domains will be created with 'vz' domain type. Old 'parallels' domains remain supported. Connection to the driver can be made either way: vz:///system or parallels:///system. 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 | 52 ++++++++++++++++++++++++++++++++++----- src/parallels/parallels_network.c | 3 ++- src/parallels/parallels_sdk.c | 2 +- src/parallels/parallels_storage.c | 3 ++- 7 files changed, 66 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

Signed-off-by: Maxim Nestratov <mnestratov@parallels.com> --- src/parallels/parallels_driver.c | 3 ++- src/parallels/parallels_network.c | 3 ++- src/parallels/parallels_storage.c | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index b2ce2ef..03e50e0 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -296,7 +296,8 @@ parallelsConnectOpen(virConnectPtr conn, if (!conn->uri) return VIR_DRV_OPEN_DECLINED; - if (!conn->uri->scheme || STRNEQ(conn->uri->scheme, "parallels")) + if (!conn->uri->scheme || (STRNEQ(conn->uri->scheme, "vz") && + STRNEQ(conn->uri->scheme, "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 03e50e0..1404167 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -1207,8 +1207,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 */ @@ -1258,12 +1258,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: * @@ -1282,8 +1286,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 1404167..3972e76 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -307,7 +307,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

On 05/22/2015 09:18 PM, Maxim Nestratov wrote:
This new driver 'vz' will be used as a substitution for parallels driver. New domains will be created with 'vz' domain type. Old 'parallels' domains remain supported. Connection to the driver can be made either way: vz:///system or parallels:///system. New URI works fine (together with the old one). But the driver returns 'vz' as domain type in xml and doesn't allow parallels in input xml for *DefineXML function.
[root@dmserv libvirt]# virsh -c parallels+unix:///system dumpxml instance-00000007 | head <domain type='vz'> <name>instance-00000007</name> <uuid>3967ae06-9dc9-4717-990a-414f695c0734</uuid> <memory unit='KiB'>524288</memory> <currentMemory unit='KiB'>524288</currentMemory> <vcpu placement='static'>1</vcpu> <os> <type arch='i686'>hvm</type> </os> <clock offset='utc'/> Could, you, please, fix it? Daniel told we have to continue returning parallels.
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 | 52 ++++++++++++++++++++++++++++++++++----- src/parallels/parallels_network.c | 3 ++- src/parallels/parallels_sdk.c | 2 +- src/parallels/parallels_storage.c | 3 ++- 7 files changed, 66 insertions(+), 16 deletions(-)
participants (2)
-
Dmitry Guryanov
-
Maxim Nestratov