[libvirt] PATCH: Add name uniqueness checking to LXC driver

Daniel P. Berrange berrange at redhat.com
Fri Jul 31 14:56:02 UTC 2009


The LXC driver define/create methods didn't yet have name uniqueness
checking enabled

Daniel

commit 4b23a44f34392b5c6d1c5aa483cbe81b010e47c4
Author: Daniel P. Berrange <berrange at redhat.com>
Date:   Fri Jul 31 15:25:03 2009 +0100

    Add uniqness checking for LXC define/create methods
    
    * src/lxc_driver.c: Check for name & UUID uniqueness when
      defining or creating domains

diff --git a/src/lxc_driver.c b/src/lxc_driver.c
index d62c2d7..a9c4f79 100644
--- a/src/lxc_driver.c
+++ b/src/lxc_driver.c
@@ -311,6 +311,35 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml)
                                         VIR_DOMAIN_XML_INACTIVE)))
         goto cleanup;
 
+    /* See if a VM with matching UUID already exists */
+    vm = virDomainFindByUUID(&driver->domains, def->uuid);
+    if (vm) {
+        /* UUID matches, but if names don't match, refuse it */
+        if (STRNEQ(vm->def->name, def->name)) {
+            char uuidstr[VIR_UUID_STRING_BUFLEN];
+            virUUIDFormat(vm->def->uuid, uuidstr);
+            lxcError(conn, NULL, VIR_ERR_OPERATION_FAILED,
+                     _("domain '%s' is already defined with uuid %s"),
+                     vm->def->name, uuidstr);
+            goto cleanup;
+        }
+
+        /* UUID & name match */
+        virDomainObjUnlock(vm);
+        newVM = 0;
+    } else {
+        /* UUID does not match, but if a name matches, refuse it */
+        vm = virDomainFindByName(&driver->domains, def->name);
+        if (vm) {
+            char uuidstr[VIR_UUID_STRING_BUFLEN];
+            virUUIDFormat(vm->def->uuid, uuidstr);
+            lxcError(conn, NULL, VIR_ERR_OPERATION_FAILED,
+                     _("domain '%s' is already defined with uuid %s"),
+                     def->name, uuidstr);
+            goto cleanup;
+        }
+    }
+
     if ((def->nets != NULL) && !(driver->have_netns)) {
         lxcError(conn, NULL, VIR_ERR_NO_SUPPORT,
                  "%s", _("System lacks NETNS support"));
@@ -1082,6 +1111,39 @@ lxcDomainCreateAndStart(virConnectPtr conn,
                                         VIR_DOMAIN_XML_INACTIVE)))
         goto cleanup;
 
+    /* See if a VM with matching UUID already exists */
+    vm = virDomainFindByUUID(&driver->domains, def->uuid);
+    if (vm) {
+        /* UUID matches, but if names don't match, refuse it */
+        if (STRNEQ(vm->def->name, def->name)) {
+            char uuidstr[VIR_UUID_STRING_BUFLEN];
+            virUUIDFormat(vm->def->uuid, uuidstr);
+            lxcError(conn, NULL, VIR_ERR_OPERATION_FAILED,
+                     _("domain '%s' is already defined with uuid %s"),
+                     vm->def->name, uuidstr);
+            goto cleanup;
+        }
+
+        /* UUID & name match, but if VM is already active, refuse it */
+        if (virDomainIsActive(vm)) {
+            lxcError(conn, NULL, VIR_ERR_OPERATION_FAILED,
+                     _("domain is already active as '%s'"), vm->def->name);
+            goto cleanup;
+        }
+        virDomainObjUnlock(vm);
+    } else {
+        /* UUID does not match, but if a name matches, refuse it */
+        vm = virDomainFindByName(&driver->domains, def->name);
+        if (vm) {
+            char uuidstr[VIR_UUID_STRING_BUFLEN];
+            virUUIDFormat(vm->def->uuid, uuidstr);
+            lxcError(conn, NULL, VIR_ERR_OPERATION_FAILED,
+                     _("domain '%s' is already defined with uuid %s"),
+                     def->name, uuidstr);
+            goto cleanup;
+        }
+    }
+
     if ((def->nets != NULL) && !(driver->have_netns)) {
         lxcError(conn, NULL, VIR_ERR_NO_SUPPORT,
                  "%s", _("System lacks NETNS support"));

-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list