[Libvir] OpenVZ driver enhancements

Daniel Veillard veillard at redhat.com
Fri Aug 24 12:29:00 UTC 2007


On Thu, Aug 23, 2007 at 02:33:42PM +0530, Shuveb Hussain wrote:
> Hi,
> 
> I'm glad to make available patches for the OpenVZ driver that provide
> the following features:

  Okay looking at those:

-        if (!memcmp(vm->vmdef->uuid, uuid, VIR_UUID_BUFLEN))
+        if (!memcmp(vm->vmdef->uuid, uuid, OPENVZ_UUID_MAX))

 not okay, I don't see why you should have your own definition for 
VIR_UUID_BUFLEN makes no sense to me, and Dan Berrange took some time to
clean this up last week, to not revert that cleanup patch.

+    if (!
+        (xml =
+         xmlReadDoc(BAD_CAST xmlStr,
+                    displayName ? displayName : "domain.xml", NULL,

 that's really bad formating !
 If you don't have enough space, then pake the assignment first, then
test the value !

+    obj =
+        xmlXPathEval(BAD_CAST "string(/domain/container/profile[1])",
+                     ctxt);

  there is many places where you have that formatting too, keep the xmlXPathEval
on the same line, it fits in 80 colums

-        virUUIDGenerate(uuid);
-        virUUIDFormat(uuid, uuidstr);
+        virUUIDGenerate(new_uuid);
+        bzero(uuid, VIR_UUID_STRING_BUFLEN);
+        for(i = 0; i < VIR_UUID_BUFLEN; i++)
+            sprintf(uuid + (i * 2), "%02x", (unsigned char) new_uuid[i]);

  why ? If the common routines are not okay tehy should be fixed, but we
should not do this kind of duplication

---------------
 struct openvz_vm_def {
     char name[OPENVZ_NAME_MAX];
-    unsigned char uuid[VIR_UUID_BUFLEN];
+    unsigned char uuid[OPENVZ_UUID_MAX];
---------------

   Why keeping OpenVZ specific constantes for UUID lenght ?

---------------
     virDomainPtr dom;

     if (!vm) {
-        error(conn, VIR_ERR_INTERNAL_ERROR, "no domain with matching uuid");
+        error(dom->conn, VIR_ERR_INVALID_DOMAIN, "no domain with matching uuid");
         return NULL;
     }
---------------

  that can't work, you're dereferencing an uninitialized variable, change is
just wrong.

  in openvzDomainDefineXML() you call directly
+    strcat(cmdbuf, " >/dev/null 2>&1");
+    ret = system(cmdbuf);

   didn't we had proper encapsulating functions to avoid going though system()
I think it's something Dan Berrange pointed out on previous patch and this 
had been fixed. Same problem in openvzDomainCreateLinux(), and 
openvzDomainUndefine() the calls to fork and execute a system command should
really be encapsulated and going though a single proper routine.

also at some point

+#define openvzLog(level, msg...) { if(level == OPENVZ_WARN) \

should be replaced by a proper routine, not directly calling fprintf(stderr
but setting up the proper virError structures for integration of error
handling like other parts of libvirt, but that can be postponed for now.

> * virDomainDefineXML - Defines an OpenVZ domain and does not start it.
> Takes XML description of the domain as input.
> * virDomainCreateLinux - Starts a domain based on the provided XML
> description. There is no way to start a domain in OpenVZ without
> defining it. So, it is defined anyway, as of now. :-( There may be a way
> to get around this. We are looking into it. As of now, treat this as
> define + start.
> * virDomainUndefine - removes domain from OpenVZ management. Since
> OpenVZ manages the domain's root file system, it is also lost. This
> behaviour is different from Xen.

  I didn't tried yet, I think it would be better to cleanup the patches
a little bit. I have no doubt it would work, my concerns are more code
maintainance/readability, and make sure there is no leak.

> The XML Format for OpenVZ:
> --------------------------
> 
> <domain type='openvz'>
> 	<name>108</name>
> 	<uuid>8dea22b31d52d8f32516782e98ab8fa0</uuid>
> 	<container>
> 		<filesystem>
> 			<template>fedora-core-3-i386-minimal</template>
> 			<quota level = 'first'>123</quota>
> 			<quota level = 'second' uid = '500'>534</quota>
> 		</filesystem>
> 		<network>
> 			<ipaddress>192.168.1.108</ipaddress>
> 			<hostname>fedora-minimal</hostname>
> 			<gateway>192.168.1.1</gateway>
> 			<nameserver>192.168.1.1</nameserver>
> 			<netmask>255.255.255.0</netmask>
> 		</network>
> 		<profile>vps.basic</profile>
> 	</container>
> </domain>
> 
> The name is the VPS "ID". The VPS ID is not temporary in OpenVZ as in
> Xen. The "<template>" tag in the "<filesystem>" section tells libvirt
> which OS template cache to use to create the VPS file system. Quota is
> not implemented as yet. First and second level quotas are intended to be
> supported. The "<profile>" tag must be a valid profile name from which
> VPS parameter are inherited. Other things, I guess are self explanatory.

  I assume the network children are similar to the one used on virtual network
definition as it was pointed out tehy should be harmonized, right ?

> Other issues:
> -------------
> * Moved some static declarations from the header to the .c files.
> * Fixed a small bug that cause libvirtd to crash on remote client exit.
> 
> Patches are against CVS head.

  Okay, thanks but I guess we need a little bit of cleanup first :-)

Daniel

-- 
Red Hat Virtualization group http://redhat.com/virtualization/
Daniel Veillard      | virtualization library  http://libvirt.org/
veillard at redhat.com  | libxml GNOME XML XSLT toolkit  http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine  http://rpmfind.net/




More information about the libvir-list mailing list