On Thu, Jul 26, 2012 at 10:32:00PM +0400, Dmitry Guryanov wrote: > Parallels Cloud Server is a cloud-ready virtualization > solution that allows users to simultaneously run multiple virtual > machines and containers on the same physical server. > > More information can be found here: http://www.parallels.com/products/pcs/ > Also beta version of Parallels Cloud Server can be downloaded there. > > Signed-off-by: Dmitry Guryanov <dguryanov@xxxxxxxxxxxxx> > --- > configure.ac | 61 ++++++--- > docs/drvparallels.html.in | 28 ++++ > include/libvirt/virterror.h | 1 + > libvirt.spec.in | 9 +- > mingw-libvirt.spec.in | 6 + > po/POTFILES.in | 1 + > src/Makefile.am | 13 ++ > src/conf/domain_conf.c | 3 +- > src/conf/domain_conf.h | 1 + > src/driver.h | 1 + > src/libvirt.c | 9 ++ > src/parallels/parallels_driver.c | 287 ++++++++++++++++++++++++++++++++++++++ > src/parallels/parallels_driver.h | 28 ++++ > src/util/virterror.c | 3 +- > 14 files changed, 429 insertions(+), 22 deletions(-) > create mode 100644 docs/drvparallels.html.in > create mode 100644 src/parallels/parallels_driver.c > create mode 100644 src/parallels/parallels_driver.h > > diff --git a/docs/drvparallels.html.in b/docs/drvparallels.html.in > new file mode 100644 > index 0000000..40a0fe5 > --- /dev/null > +++ b/docs/drvparallels.html.in > @@ -0,0 +1,28 @@ > +<html><body> > + <h1>Parallels Cloud Server driver</h1> > + <ul id="toc"></ul> > + <p> > + The libvirt Parallels driver can manage Parallels Cloud Server starting from version 6.0. > + </p> > + > + > + <h2><a name="project">Project Links</a></h2> > + <ul> > + <li> > + The <a href="http://www.parallels.com/products/server/baremetal/sp/">Parallels Cloud Server</a> Virtualization Solution. > + </li> > + </ul> > + > + > + <h2><a name="uri">Connections to the Parallels Cloud Server driver</a></h2> > + <p> > + The libvirt Parallels driver is a single-instance privileged driver, with a driver name of 'parallels'. Some example connection URIs for the libvirt driver are: > + </p> > +<pre> > +parallels:///default (local access) > +parallels+unix:///default (local access) > +parallels://example.com/default (remote access, TLS/x509) > +parallels+tcp://example.com/default (remote access, SASl/Kerberos) > +parallels+ssh://root@xxxxxxxxxxx/default (remote access, SSH tunnelled) > +</pre> > +</body></html> It would be nice to have some examples of the suitable XML for running a parallels container shown here too. That can be done as a later follow up patch though. No need to change this patch though - I'm happy to see it as a later addon patch. > +static virCapsPtr > +parallelsBuildCapabilities(void) > +{ > + virCapsPtr caps; > + virCapsGuestPtr guest; > + struct utsname utsname; > + uname(&utsname); > + > + if ((caps = virCapabilitiesNew(utsname.machine, 0, 0)) == NULL) > + goto no_memory; > + > + if (nodeCapsInitNUMA(caps) < 0) > + goto no_memory; > + > + virCapabilitiesSetMacPrefix(caps, (unsigned char[]) { > + 0x42, 0x1C, 0x00}); > + > + if ((guest = virCapabilitiesAddGuest(caps, "hvm", PARALLELS_DEFAULT_ARCH, > + 64, "parallels", > + NULL, 0, NULL)) == NULL) > + goto no_memory; Hmm, perhaps I'm misunderstanding, but isn't Parallels a container based technology like OpenVZ, rather than full machine virtualization ? For containers we use 'exe' as the os type rather than 'hvm', and I'd expect the arch + bit count to match the host OS. > +static virDrvOpenStatus > +parallelsOpen(virConnectPtr conn, > + virConnectAuthPtr auth ATTRIBUTE_UNUSED, > + unsigned int flags) > +{ > + int ret; > + parallelsConnPtr privconn; > + virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR); > + > + if (!conn->uri) > + return VIR_DRV_OPEN_DECLINED; > + > + if (!conn->uri->scheme || STRNEQ(conn->uri->scheme, "parallels")) > + return VIR_DRV_OPEN_DECLINED; > + > + /* Remote driver should handle these. */ > + if (conn->uri->server) > + return VIR_DRV_OPEN_DECLINED; > + > + /* From this point on, the connection is for us. */ > + if (!conn->uri->path || > + conn->uri->path[0] == '\0' || > + (conn->uri->path[0] == '/' && conn->uri->path[1] == '\0')) { > + virReportError(VIR_ERR_INVALID_ARG, "%s", > + _("parallelsOpen: supply a path or use " > + "parallels:///default")); > + return VIR_DRV_OPEN_ERROR; > + } > + > + if (STREQ(conn->uri->path, "/default")) How do connections from parallels work from an end user POV ? Is there is a single parallels service for the whole machine which all users connect to, or does each user have their own private service they work with. If the former, I think it'd be preferable for the URI to be either simple parallels:/// Or parallels:///system to have a bit closer alignment with the naming we use with LXC / QEMU / OpenBVZ. If the latter, then I'd suggest parallels:///session to indicate its tied to a per-user account/session. > +static int > +parallelsGetVersion(virConnectPtr conn ATTRIBUTE_UNUSED, unsigned long *hvVer) > +{ > + /* TODO */ > + *hvVer = 6; > + return 0; > +} For this I reckon you basically want to return the version of the parallels software. > +int > +parallelsRegister(void) > +{ > + char *prlctl_path; > + > + prlctl_path = virFindFileInPath(PRLCTL); > + if (!prlctl_path) { > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("Can't find prlctl command in the PATH env")); > + return VIR_DRV_OPEN_ERROR; You can just return '0' here, and rather than reporting an error, you want to just log a VIR_DEBUG statement I reckon, since you don't want to cause initialization of libvirt as a whole to fail just because parallels isn't installed. > + } > + > + VIR_FREE(prlctl_path); > + > + if (virRegisterDriver(¶llelsDriver) < 0) > + return -1; > + > + return 0; > +} If you can either answer my questions or address them, I'd ACK this now. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list