Set aliases for LXC/UML console devices

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
This commit is contained in:
Daniel P. Berrange 2011-10-20 14:57:10 +01:00
parent 876c8b3bd3
commit 8866eed097
2 changed files with 61 additions and 12 deletions

View File

@ -1678,6 +1678,14 @@ static int lxcVmStart(virConnectPtr conn,
return -1; return -1;
} }
/* Do this up front, 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. /* Here we open all the PTYs we need on the host OS side.
* The LXC controller will open the guest OS side PTYs * The LXC controller will open the guest OS side PTYs
* and forward I/O between them. * and forward I/O between them.
@ -1706,6 +1714,12 @@ static int lxcVmStart(virConnectPtr conn,
VIR_FREE(vm->def->consoles[i]->source.data.file.path); VIR_FREE(vm->def->consoles[i]->source.data.file.path);
vm->def->consoles[i]->source.data.file.path = ttyPath; 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) if (lxcSetupInterfaces(conn, vm->def, &nveths, &veths) != 0)
@ -3024,6 +3038,7 @@ lxcDomainOpenConsole(virDomainPtr dom,
char uuidstr[VIR_UUID_STRING_BUFLEN]; char uuidstr[VIR_UUID_STRING_BUFLEN];
int ret = -1; int ret = -1;
virDomainChrDefPtr chr = NULL; virDomainChrDefPtr chr = NULL;
size_t i;
virCheckFlags(0, -1); virCheckFlags(0, -1);
@ -3043,10 +3058,13 @@ lxcDomainOpenConsole(virDomainPtr dom,
} }
if (dev_name) { if (dev_name) {
/* XXX support device aliases in future */ for (i = 0 ; i < vm->def->nconsoles ; i++) {
lxcError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", if (vm->def->consoles[i]->info.alias &&
_("Named device aliases are not supported")); STREQ(vm->def->consoles[i]->info.alias, dev_name)) {
goto cleanup; chr = vm->def->consoles[i];
break;
}
}
} else { } else {
if (vm->def->nconsoles) if (vm->def->nconsoles)
chr = vm->def->consoles[0]; chr = vm->def->consoles[0];
@ -3055,8 +3073,9 @@ lxcDomainOpenConsole(virDomainPtr dom,
} }
if (!chr) { if (!chr) {
lxcError(VIR_ERR_INTERNAL_ERROR, "%s", lxcError(VIR_ERR_INTERNAL_ERROR,
_("cannot find default console device")); _("cannot find console device '%s'"),
dev_name ? dev_name : _("default"));
goto cleanup; goto cleanup;
} }

View File

@ -987,11 +987,12 @@ static int umlStartVMDaemon(virConnectPtr conn,
struct uml_driver *driver, struct uml_driver *driver,
virDomainObjPtr vm, virDomainObjPtr vm,
bool autoDestroy) { bool autoDestroy) {
int ret; int ret = -1;
char *logfile; char *logfile;
int logfd = -1; int logfd = -1;
umlDomainObjPrivatePtr priv = vm->privateData; umlDomainObjPrivatePtr priv = vm->privateData;
virCommandPtr cmd = NULL; virCommandPtr cmd = NULL;
size_t i;
if (virDomainObjIsActive(vm)) { if (virDomainObjIsActive(vm)) {
umlReportError(VIR_ERR_OPERATION_INVALID, "%s", umlReportError(VIR_ERR_OPERATION_INVALID, "%s",
@ -1045,6 +1046,16 @@ static int umlStartVMDaemon(virConnectPtr conn,
return -1; 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))) { if (!(cmd = umlBuildCommandLine(conn, driver, vm))) {
VIR_FORCE_CLOSE(logfd); VIR_FORCE_CLOSE(logfd);
virDomainConfVMNWFilterTeardown(vm); virDomainConfVMNWFilterTeardown(vm);
@ -1052,6 +1063,14 @@ static int umlStartVMDaemon(virConnectPtr conn,
return -1; 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); virCommandWriteArgLog(cmd, logfd);
priv->monitor = -1; priv->monitor = -1;
@ -1077,6 +1096,12 @@ cleanup:
if (ret < 0) { if (ret < 0) {
virDomainConfVMNWFilterTeardown(vm); virDomainConfVMNWFilterTeardown(vm);
umlCleanupTapDevices(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 /* 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]; char uuidstr[VIR_UUID_STRING_BUFLEN];
int ret = -1; int ret = -1;
virDomainChrDefPtr chr = NULL; virDomainChrDefPtr chr = NULL;
size_t i;
virCheckFlags(0, -1); virCheckFlags(0, -1);
@ -2385,10 +2411,13 @@ umlDomainOpenConsole(virDomainPtr dom,
} }
if (dev_name) { if (dev_name) {
/* XXX support device aliases in future */ for (i = 0 ; i < vm->def->nconsoles ; i++) {
umlReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", if (vm->def->consoles[i]->info.alias &&
_("Named device aliases are not supported")); STREQ(vm->def->consoles[i]->info.alias, dev_name)) {
goto cleanup; chr = vm->def->consoles[i];
break;
}
}
} else { } else {
if (vm->def->nconsoles) if (vm->def->nconsoles)
chr = vm->def->consoles[0]; chr = vm->def->consoles[0];
@ -2398,7 +2427,8 @@ umlDomainOpenConsole(virDomainPtr dom,
if (!chr) { if (!chr) {
umlReportError(VIR_ERR_INTERNAL_ERROR, umlReportError(VIR_ERR_INTERNAL_ERROR,
_("cannot find character device %s"), dev_name); _("cannot find console device '%s'"),
dev_name ? dev_name : _("default"));
goto cleanup; goto cleanup;
} }