[libvirt] KVM/qemu: problems with autostart of vms with non-bridged nets
Daniel P. Berrange
berrange at redhat.com
Tue Dec 2 11:54:12 UTC 2008
On Tue, Dec 02, 2008 at 11:38:36AM +0000, Daniel P. Berrange wrote:
> On Mon, Dec 01, 2008 at 12:23:12PM +0100, Gerd v. Egidy wrote:
> > Hi Daniel,
> >
> > > > This patch alone not, but this patch + the one in my first mail
> > > > (see
> > > > https://www.redhat.com/archives/libvir-list/2008-November/msg00457.html)
> > > > together make it work for me. The first patch fixes the autostart order,
> > > > the second one adds the necessary conn structure.
> > >
> > > Oh yes, I totally missed the patch in your first mail. The first patch
> > > is definitely correct and I'll apply that shortly.
> >
> > I just added some documentation (same as in virInitialize) to make sure this
> > bug does not get introduced again. New version attached.
> >
> > > While your second
> > > patch is also functionally OK, I'm not entirely happy with creating a
> > > connection object deep inside the QEMU driver code.
> >
> > Yeah, that was exactly my thought too.
> >
> > > So I'm going to
> > > think about whether there's a better way todo that bit.
> >
> > I looked through the rest of the qemu-initialization and it looks like this is
> > the only point where the conn-object is needed. So a solution would be to
> > directly access the network driver functions. But on the other hand these
> > functions seem all to imply that there is a valid conn available. So we would
> > have to change that, at least for the lookup-by-name case.
>
> I've committed this patch now. I'll send a suggestion for the second patch
> shortly...
Ok, I think your suggested patch is the best we can manage at this point
in time. Here's an update which also handle it for UML driver, and adds
a check for NULL on connection open.
Daniel
Index: src/qemu_driver.c
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_driver.c,v
retrieving revision 1.162
diff -u -p -r1.162 qemu_driver.c
--- src/qemu_driver.c 28 Nov 2008 12:03:20 -0000 1.162
+++ src/qemu_driver.c 2 Dec 2008 11:52:28 -0000
@@ -138,12 +138,26 @@ static struct qemud_driver *qemu_driver
static void
qemudAutostartConfigs(struct qemud_driver *driver) {
unsigned int i;
+ /* XXX: Figure out a better way todo this. The domain
+ * startup code needs a connection handle in order
+ * to lookup the bridge associated with a virtual
+ * network
+ */
+ virConnectPtr conn = virConnectOpen(getuid() ?
+ "qemu:///session" :
+ "qemu:///system");
+
+ if (!conn) {
+ qemudLog(QEMUD_ERR, "%s",
+ _("Cannot autostart domains, failed to open connection"));
+ return;
+ }
for (i = 0 ; i < driver->domains.count ; i++) {
virDomainObjPtr vm = driver->domains.objs[i];
if (vm->autostart &&
!virDomainIsActive(vm)) {
- int ret = qemudStartVMDaemon(NULL, driver, vm, NULL);
+ int ret = qemudStartVMDaemon(conn, driver, vm, NULL);
if (ret < 0) {
virErrorPtr err = virGetLastError();
qemudLog(QEMUD_ERR, _("Failed to autostart VM '%s': %s\n"),
@@ -155,6 +169,8 @@ qemudAutostartConfigs(struct qemud_drive
}
}
}
+
+ virConnectClose(conn);
}
/**
Index: src/uml_driver.c
===================================================================
RCS file: /data/cvs/libvirt/src/uml_driver.c,v
retrieving revision 1.6
diff -u -p -r1.6 uml_driver.c
--- src/uml_driver.c 2 Dec 2008 11:23:27 -0000 1.6
+++ src/uml_driver.c 2 Dec 2008 11:52:28 -0000
@@ -117,16 +117,32 @@ static struct uml_driver *uml_driver = N
static void
umlAutostartConfigs(struct uml_driver *driver) {
unsigned int i;
+ /* XXX: Figure out a better way todo this. The domain
+ * startup code needs a connection handle in order
+ * to lookup the bridge associated with a virtual
+ * network
+ */
+ virConnectPtr conn = virConnectOpen(getuid() ?
+ "uml:///session" :
+ "uml:///system");
+
+ if (!conn) {
+ umlLog(UML_ERR, "%s",
+ _("Cannot autostart domains, failed to open connection"));
+ return;
+ }
for (i = 0 ; i < driver->domains.count ; i++) {
if (driver->domains.objs[i]->autostart &&
!virDomainIsActive(driver->domains.objs[i]) &&
- umlStartVMDaemon(NULL, driver, driver->domains.objs[i]) < 0) {
+ umlStartVMDaemon(conn, driver, driver->domains.objs[i]) < 0) {
virErrorPtr err = virGetLastError();
umlLog(UML_ERR, _("Failed to autostart VM '%s': %s\n"),
driver->domains.objs[i]->def->name, err->message);
}
}
+
+ virConnectClose(conn);
}
--
|: 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