[libvirt] [PATCH 6/7] Set aliases for LXC/UML console devices

Daniel P. Berrange berrange at redhat.com
Thu Oct 20 14:47:26 UTC 2011


From: "Daniel P. Berrange" <berrange at redhat.com>

To allow virDomainOpenConsole to access non-primary consoles,
device aliases are required to be set. Until now only the QEMU
driver has done this. Update LXC & UML to set aliases for any
console devices

* src/lxc/lxc_driver.c, src/uml/uml_driver.c: Set aliases
  for console devices
---
 src/lxc/lxc_driver.c |   30 ++++++++++++++++++++++++------
 src/uml/uml_driver.c |   41 +++++++++++++++++++++++++++++++++++------
 2 files changed, 59 insertions(+), 12 deletions(-)

diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 8e02676..037d781 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -1681,6 +1681,14 @@ static int lxcVmStart(virConnectPtr conn,
         return -1;
     }
 
+    /* Do this upfront, so any part of the startup process can add
+     * runtime state to vm->def that won't be persisted. This let's us
+     * report implicit runtime defaults in the XML, like vnc listen/socket
+     */
+    VIR_DEBUG("Setting current domain def as transient");
+    if (virDomainObjSetDefTransient(driver->caps, vm, true) < 0)
+        goto cleanup;
+
     /* Here we open all the PTYs we need on the host OS side.
      * The LXC controller will open the guest OS side PTYs
      * forward I/O between them.
@@ -1709,6 +1717,12 @@ static int lxcVmStart(virConnectPtr conn,
 
         VIR_FREE(vm->def->consoles[i]->source.data.file.path);
         vm->def->consoles[i]->source.data.file.path = ttyPath;
+
+        VIR_FREE(vm->def->consoles[i]->info.alias);
+        if (virAsprintf(&vm->def->consoles[i]->info.alias, "console%zu", i) < 0) {
+            virReportOOMError();
+            goto cleanup;
+        }
     }
 
     if (lxcSetupInterfaces(conn, vm->def, &nveths, &veths) != 0)
@@ -3020,6 +3034,7 @@ lxcDomainOpenConsole(virDomainPtr dom,
     char uuidstr[VIR_UUID_STRING_BUFLEN];
     int ret = -1;
     virDomainChrDefPtr chr = NULL;
+    size_t i;
 
     virCheckFlags(0, -1);
 
@@ -3039,10 +3054,12 @@ lxcDomainOpenConsole(virDomainPtr dom,
     }
 
     if (dev_name) {
-        /* XXX support device aliases in future */
-        lxcError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                 _("Named device aliases are not supported"));
-        goto cleanup;
+        for (i = 0 ; i < vm->def->nconsoles ; i++) {
+            if (STREQ(vm->def->consoles[i]->info.alias, dev_name)) {
+                chr = vm->def->consoles[i];
+                break;
+            }
+        }
     } else {
         if (vm->def->nconsoles)
             chr = vm->def->consoles[0];
@@ -3051,8 +3068,9 @@ lxcDomainOpenConsole(virDomainPtr dom,
     }
 
     if (!chr) {
-        lxcError(VIR_ERR_INTERNAL_ERROR, "%s",
-                 _("cannot find default console device"));
+        lxcError(VIR_ERR_INTERNAL_ERROR,
+                 _("cannot find console device '%s'"),
+                 dev_name ? dev_name : _("default"));
         goto cleanup;
     }
 
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
index 44529f0..c9fe0ac 100644
--- a/src/uml/uml_driver.c
+++ b/src/uml/uml_driver.c
@@ -987,11 +987,12 @@ static int umlStartVMDaemon(virConnectPtr conn,
                             struct uml_driver *driver,
                             virDomainObjPtr vm,
                             bool autoDestroy) {
-    int ret;
+    int ret = -1;
     char *logfile;
     int logfd = -1;
     umlDomainObjPrivatePtr priv = vm->privateData;
     virCommandPtr cmd = NULL;
+    size_t i;
 
     if (virDomainObjIsActive(vm)) {
         umlReportError(VIR_ERR_OPERATION_INVALID, "%s",
@@ -1045,6 +1046,16 @@ static int umlStartVMDaemon(virConnectPtr conn,
         return -1;
     }
 
+    /* Do this upfront, so any part of the startup process can add
+     * runtime state to vm->def that won't be persisted. This let's us
+     * report implicit runtime defaults in the XML, like vnc listen/socket
+     */
+    VIR_DEBUG("Setting current domain def as transient");
+    if (virDomainObjSetDefTransient(driver->caps, vm, true) < 0) {
+        VIR_FORCE_CLOSE(logfd);
+        return -1;
+    }
+
     if (!(cmd = umlBuildCommandLine(conn, driver, vm))) {
         VIR_FORCE_CLOSE(logfd);
         virDomainConfVMNWFilterTeardown(vm);
@@ -1052,6 +1063,14 @@ static int umlStartVMDaemon(virConnectPtr conn,
         return -1;
     }
 
+    for (i = 0 ; i < vm->def->nconsoles ; i++) {
+        VIR_FREE(vm->def->consoles[i]->info.alias);
+        if (virAsprintf(&vm->def->consoles[i]->info.alias, "console%zu", i) < 0) {
+            virReportOOMError();
+            goto cleanup;
+        }
+    }
+
     virCommandWriteArgLog(cmd, logfd);
 
     priv->monitor = -1;
@@ -1077,6 +1096,12 @@ cleanup:
     if (ret < 0) {
         virDomainConfVMNWFilterTeardown(vm);
         umlCleanupTapDevices(vm);
+        if (vm->newDef) {
+            virDomainDefFree(vm->def);
+            vm->def = vm->newDef;
+            vm->def->id = -1;
+            vm->newDef = NULL;
+        }
     }
 
     /* NB we don't mark it running here - we do that async
@@ -2366,6 +2391,7 @@ umlDomainOpenConsole(virDomainPtr dom,
     char uuidstr[VIR_UUID_STRING_BUFLEN];
     int ret = -1;
     virDomainChrDefPtr chr = NULL;
+    size_t i;
 
     virCheckFlags(0, -1);
 
@@ -2385,10 +2411,12 @@ umlDomainOpenConsole(virDomainPtr dom,
     }
 
     if (dev_name) {
-        /* XXX support device aliases in future */
-        umlReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("Named device aliases are not supported"));
-        goto cleanup;
+        for (i = 0 ; i < vm->def->nconsoles ; i++) {
+            if (STREQ(vm->def->consoles[i]->info.alias, dev_name)) {
+                chr = vm->def->consoles[i];
+                break;
+            }
+        }
     } else {
         if (vm->def->nconsoles)
             chr = vm->def->consoles[0];
@@ -2398,7 +2426,8 @@ umlDomainOpenConsole(virDomainPtr dom,
 
     if (!chr) {
         umlReportError(VIR_ERR_INTERNAL_ERROR,
-                        _("cannot find character device %s"), dev_name);
+                       _("cannot find console device '%s'"),
+                       dev_name ? dev_name : _("default"));
         goto cleanup;
     }
 
-- 
1.7.6.4




More information about the libvir-list mailing list