[libvirt] [PATCH 0/2] Add some more features to LXC driver

This patch series simply adds a couple of easy features to the LXC driver. Daniel P. Berrange (2): Add domain events support to LXC driver Add domain autostart for LXC driver src/lxc_conf.h | 7 + src/lxc_driver.c | 365 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 367 insertions(+), 5 deletions(-)

* src/lxc_conf.h: Add queue for dispatch of domain events * src/lxc_driver.c: Trigger domain events upon important lifecycle transitions Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/lxc_conf.h | 7 ++ src/lxc_driver.c | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 185 insertions(+), 3 deletions(-) diff --git a/src/lxc_conf.h b/src/lxc_conf.h index 30a51e1..9690cc8 100644 --- a/src/lxc_conf.h +++ b/src/lxc_conf.h @@ -28,6 +28,7 @@ #include "internal.h" #include "domain_conf.h" +#include "domain_event.h" #include "capabilities.h" #include "threads.h" @@ -47,6 +48,12 @@ struct __lxc_driver { char *stateDir; char *logDir; int have_netns; + + /* An array of callbacks */ + virDomainEventCallbackListPtr domainEventCallbacks; + virDomainEventQueuePtr domainEventQueue; + int domainEventTimer; + int domainEventDispatching; }; int lxcLoadDriverConfig(lxc_driver_t *driver); diff --git a/src/lxc_driver.c b/src/lxc_driver.c index 3503573..1b5c86c 100644 --- a/src/lxc_driver.c +++ b/src/lxc_driver.c @@ -67,6 +67,10 @@ static void lxcDriverUnlock(lxc_driver_t *driver) virMutexUnlock(&driver->lock); } +static void lxcDomainEventFlush(int timer, void *opaque); +static void lxcDomainEventQueue(lxc_driver_t *driver, + virDomainEventPtr event); + static virDrvOpenStatus lxcOpen(virConnectPtr conn, virConnectAuthPtr auth ATTRIBUTE_UNUSED, @@ -114,6 +118,12 @@ static virDrvOpenStatus lxcOpen(virConnectPtr conn, static int lxcClose(virConnectPtr conn) { + lxc_driver_t *driver = conn->privateData; + + lxcDriverLock(driver); + virDomainEventCallbackListRemoveConn(conn, driver->domainEventCallbacks); + lxcDriverUnlock(driver); + conn->privateData = NULL; return 0; } @@ -293,6 +303,8 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) virDomainDefPtr def = NULL; virDomainObjPtr vm = NULL; virDomainPtr dom = NULL; + virDomainEventPtr event = NULL; + int newVM = 1; lxcDriverLock(driver); if (!(def = virDomainDefParseString(conn, driver->caps, xml, @@ -318,6 +330,12 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) goto cleanup; } + event = virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_DEFINED, + newVM ? + VIR_DOMAIN_EVENT_DEFINED_ADDED : + VIR_DOMAIN_EVENT_DEFINED_UPDATED); + dom = virGetDomain(conn, vm->def->name, vm->def->uuid); if (dom) dom->id = vm->def->id; @@ -326,6 +344,8 @@ cleanup: virDomainDefFree(def); if (vm) virDomainObjUnlock(vm); + if (event) + lxcDomainEventQueue(driver, event); lxcDriverUnlock(driver); return dom; } @@ -334,6 +354,7 @@ static int lxcDomainUndefine(virDomainPtr dom) { lxc_driver_t *driver = dom->conn->privateData; virDomainObjPtr vm; + virDomainEventPtr event = NULL; int ret = -1; lxcDriverLock(driver); @@ -362,6 +383,10 @@ static int lxcDomainUndefine(virDomainPtr dom) vm) < 0) goto cleanup; + event = virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_UNDEFINED, + VIR_DOMAIN_EVENT_UNDEFINED_REMOVED); + virDomainRemoveInactive(&driver->domains, vm); vm = NULL; ret = 0; @@ -369,6 +394,8 @@ static int lxcDomainUndefine(virDomainPtr dom) cleanup: if (vm) virDomainObjUnlock(vm); + if (event) + lxcDomainEventQueue(driver, event); lxcDriverUnlock(driver); return ret; } @@ -532,6 +559,13 @@ static int lxcVMCleanup(virConnectPtr conn, virCgroupFree(&cgroup); } + if (vm->newDef) { + virDomainDefFree(vm->def); + vm->def = vm->newDef; + vm->def->id = -1; + vm->newDef = NULL; + } + return rc; } @@ -709,6 +743,7 @@ static void lxcMonitorEvent(int watch, { lxc_driver_t *driver = data; virDomainObjPtr vm = NULL; + virDomainEventPtr event = NULL; unsigned int i; lxcDriverLock(driver); @@ -731,12 +766,19 @@ static void lxcMonitorEvent(int watch, goto cleanup; } - if (lxcVmTerminate(NULL, driver, vm, SIGINT) < 0) + if (lxcVmTerminate(NULL, driver, vm, SIGINT) < 0) { virEventRemoveHandle(watch); + } else { + event = virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_STOPPED, + VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); + } cleanup: if (vm) virDomainObjUnlock(vm); + if (event) + lxcDomainEventQueue(driver, event); lxcDriverUnlock(driver); } @@ -977,6 +1019,7 @@ static int lxcDomainStart(virDomainPtr dom) { lxc_driver_t *driver = dom->conn->privateData; virDomainObjPtr vm; + virDomainEventPtr event = NULL; int ret = -1; lxcDriverLock(driver); @@ -995,9 +1038,16 @@ static int lxcDomainStart(virDomainPtr dom) ret = lxcVmStart(dom->conn, driver, vm); + if (ret == 0) + event = virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_STARTED, + VIR_DOMAIN_EVENT_STARTED_BOOTED); + cleanup: if (vm) virDomainObjUnlock(vm); + if (event) + lxcDomainEventQueue(driver, event); lxcDriverUnlock(driver); return ret; } @@ -1020,6 +1070,7 @@ lxcDomainCreateAndStart(virConnectPtr conn, virDomainObjPtr vm = NULL; virDomainDefPtr def; virDomainPtr dom = NULL; + virDomainEventPtr event = NULL; lxcDriverLock(driver); if (!(def = virDomainDefParseString(conn, driver->caps, xml, @@ -1043,6 +1094,10 @@ lxcDomainCreateAndStart(virConnectPtr conn, goto cleanup; } + event = virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_STARTED, + VIR_DOMAIN_EVENT_STARTED_BOOTED); + dom = virGetDomain(conn, vm->def->name, vm->def->uuid); if (dom) dom->id = vm->def->id; @@ -1051,6 +1106,8 @@ cleanup: virDomainDefFree(def); if (vm) virDomainObjUnlock(vm); + if (event) + lxcDomainEventQueue(driver, event); lxcDriverUnlock(driver); return dom; } @@ -1067,6 +1124,7 @@ static int lxcDomainShutdown(virDomainPtr dom) { lxc_driver_t *driver = dom->conn->privateData; virDomainObjPtr vm; + virDomainEventPtr event = NULL; int ret = -1; lxcDriverLock(driver); @@ -1078,6 +1136,9 @@ static int lxcDomainShutdown(virDomainPtr dom) } ret = lxcVmTerminate(dom->conn, driver, vm, 0); + event = virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_STOPPED, + VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); if (!vm->persistent) { virDomainRemoveInactive(&driver->domains, vm); vm = NULL; @@ -1086,10 +1147,103 @@ static int lxcDomainShutdown(virDomainPtr dom) cleanup: if (vm) virDomainObjUnlock(vm); + if (event) + lxcDomainEventQueue(driver, event); + lxcDriverUnlock(driver); + return ret; +} + + +static int +lxcDomainEventRegister (virConnectPtr conn, + virConnectDomainEventCallback callback, + void *opaque, + virFreeCallback freecb) +{ + lxc_driver_t *driver = conn->privateData; + int ret; + + lxcDriverLock(driver); + ret = virDomainEventCallbackListAdd(conn, driver->domainEventCallbacks, + callback, opaque, freecb); lxcDriverUnlock(driver); + return ret; } +static int +lxcDomainEventDeregister (virConnectPtr conn, + virConnectDomainEventCallback callback) +{ + lxc_driver_t *driver = conn->privateData; + int ret; + + lxcDriverLock(driver); + if (driver->domainEventDispatching) + ret = virDomainEventCallbackListMarkDelete(conn, driver->domainEventCallbacks, + callback); + else + ret = virDomainEventCallbackListRemove(conn, driver->domainEventCallbacks, + callback); + lxcDriverUnlock(driver); + + return ret; +} + +static void lxcDomainEventDispatchFunc(virConnectPtr conn, + virDomainEventPtr event, + virConnectDomainEventCallback cb, + void *cbopaque, + void *opaque) +{ + lxc_driver_t *driver = opaque; + + /* Drop the lock whle dispatching, for sake of re-entrancy */ + lxcDriverUnlock(driver); + virDomainEventDispatchDefaultFunc(conn, event, cb, cbopaque, NULL); + lxcDriverLock(driver); +} + + +static void lxcDomainEventFlush(int timer ATTRIBUTE_UNUSED, void *opaque) +{ + lxc_driver_t *driver = opaque; + virDomainEventQueue tempQueue; + + lxcDriverLock(driver); + + driver->domainEventDispatching = 1; + + /* Copy the queue, so we're reentrant safe */ + tempQueue.count = driver->domainEventQueue->count; + tempQueue.events = driver->domainEventQueue->events; + driver->domainEventQueue->count = 0; + driver->domainEventQueue->events = NULL; + + virEventUpdateTimeout(driver->domainEventTimer, -1); + virDomainEventQueueDispatch(&tempQueue, + driver->domainEventCallbacks, + lxcDomainEventDispatchFunc, + driver); + + /* Purge any deleted callbacks */ + virDomainEventCallbackListPurgeMarked(driver->domainEventCallbacks); + + driver->domainEventDispatching = 0; + lxcDriverUnlock(driver); +} + + +/* driver must be locked before calling */ +static void lxcDomainEventQueue(lxc_driver_t *driver, + virDomainEventPtr event) +{ + if (virDomainEventQueuePush(driver->domainEventQueue, + event) < 0) + virDomainEventFree(event); + if (lxc_driver->domainEventQueue->count == 1) + virEventUpdateTimeout(driver->domainEventTimer, 0); +} /** * lxcDomainDestroy: @@ -1103,6 +1257,7 @@ static int lxcDomainDestroy(virDomainPtr dom) { lxc_driver_t *driver = dom->conn->privateData; virDomainObjPtr vm; + virDomainEventPtr event = NULL; int ret = -1; lxcDriverLock(driver); @@ -1114,6 +1269,9 @@ static int lxcDomainDestroy(virDomainPtr dom) } ret = lxcVmTerminate(dom->conn, driver, vm, SIGKILL); + event = virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_STOPPED, + VIR_DOMAIN_EVENT_STOPPED_DESTROYED); if (!vm->persistent) { virDomainRemoveInactive(&driver->domains, vm); vm = NULL; @@ -1122,6 +1280,8 @@ static int lxcDomainDestroy(virDomainPtr dom) cleanup: if (vm) virDomainObjUnlock(vm); + if (event) + lxcDomainEventQueue(driver, event); lxcDriverUnlock(driver); return ret; } @@ -1172,6 +1332,15 @@ static int lxcStartup(int privileged) if(lxcContainerAvailable(0) < 0) goto cleanup; + if(VIR_ALLOC(lxc_driver->domainEventCallbacks) < 0) + goto cleanup; + if (!(lxc_driver->domainEventQueue = virDomainEventQueueNew())) + goto cleanup; + + if ((lxc_driver->domainEventTimer = + virEventAddTimeout(-1, lxcDomainEventFlush, lxc_driver, NULL)) < 0) + goto cleanup; + lxc_driver->have_netns = lxcCheckNetNsSupport(); /* Call function to load lxc driver configuration information */ @@ -1252,6 +1421,12 @@ static int lxcShutdown(void) lxcDriverLock(lxc_driver); virDomainObjListFree(&lxc_driver->domains); + virDomainEventCallbackListFree(lxc_driver->domainEventCallbacks); + virDomainEventQueueFree(lxc_driver->domainEventQueue); + + if (lxc_driver->domainEventTimer != -1) + virEventRemoveTimeout(lxc_driver->domainEventTimer); + virCapabilitiesFree(lxc_driver->caps); VIR_FREE(lxc_driver->configDir); VIR_FREE(lxc_driver->autostartDir); @@ -1490,8 +1665,8 @@ static virDriver lxcDriver = { NULL, /* domainMemoryPeek */ nodeGetCellsFreeMemory, /* nodeGetCellsFreeMemory */ nodeGetFreeMemory, /* getFreeMemory */ - NULL, /* domainEventRegister */ - NULL, /* domainEventDeregister */ + lxcDomainEventRegister, /* domainEventRegister */ + lxcDomainEventDeregister, /* domainEventDeregister */ NULL, /* domainMigratePrepare2 */ NULL, /* domainMigrateFinish2 */ NULL, /* nodeDeviceDettach */ -- 1.6.2.5

On Wed, Jul 22, 2009 at 05:02:55PM +0100, Daniel P. Berrange wrote:
* src/lxc_conf.h: Add queue for dispatch of domain events * src/lxc_driver.c: Trigger domain events upon important lifecycle transitions [...] @@ -293,6 +303,8 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) virDomainDefPtr def = NULL; virDomainObjPtr vm = NULL; virDomainPtr dom = NULL; + virDomainEventPtr event = NULL; + int newVM = 1;
Hum I don't see where newVM is set to anything else in that patch isn't there something missing ?
lxcDriverLock(driver); if (!(def = virDomainDefParseString(conn, driver->caps, xml, @@ -318,6 +330,12 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) goto cleanup; }
+ event = virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_DEFINED, + newVM ? + VIR_DOMAIN_EVENT_DEFINED_ADDED : + VIR_DOMAIN_EVENT_DEFINED_UPDATED); + @@ -532,6 +559,13 @@ static int lxcVMCleanup(virConnectPtr conn, virCgroupFree(&cgroup); }
+ if (vm->newDef) { + virDomainDefFree(vm->def); + vm->def = vm->newDef; + vm->def->id = -1; + vm->newDef = NULL; + } +
Hum newDef is not touched anywhere else in that patch, unrelated ? Except that couple of question, looks fine, ACK, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

On Wed, Jul 22, 2009 at 06:49:26PM +0200, Daniel Veillard wrote:
On Wed, Jul 22, 2009 at 05:02:55PM +0100, Daniel P. Berrange wrote:
* src/lxc_conf.h: Add queue for dispatch of domain events * src/lxc_driver.c: Trigger domain events upon important lifecycle transitions [...] @@ -293,6 +303,8 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) virDomainDefPtr def = NULL; virDomainObjPtr vm = NULL; virDomainPtr dom = NULL; + virDomainEventPtr event = NULL; + int newVM = 1;
Hum I don't see where newVM is set to anything else in that patch isn't there something missing ?
Yeah, it should be probing to see if a config already exists with the same name/uuid, and if so setting this flag to 0. I'm going to add that support later, since these name/uuid checks impact many other methods in this driver.
lxcDriverLock(driver); if (!(def = virDomainDefParseString(conn, driver->caps, xml, @@ -318,6 +330,12 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) goto cleanup; }
+ event = virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_DEFINED, + newVM ? + VIR_DOMAIN_EVENT_DEFINED_ADDED : + VIR_DOMAIN_EVENT_DEFINED_UPDATED); + @@ -532,6 +559,13 @@ static int lxcVMCleanup(virConnectPtr conn, virCgroupFree(&cgroup); }
+ if (vm->newDef) { + virDomainDefFree(vm->def); + vm->def = vm->newDef; + vm->def->id = -1; + vm->newDef = NULL; + } +
Hum newDef is not touched anywhere else in that patch, unrelated ?
Opps, yes this is unrelated. THis is fixing the shutdown method so that when a VM shuts down the existing config is replaced by the new config (if defined). Daniel -- |: 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 :|

* src/lxc_driver.c: Implement support for domain autostart Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/lxc_driver.c | 184 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 182 insertions(+), 2 deletions(-) diff --git a/src/lxc_driver.c b/src/lxc_driver.c index 1b5c86c..ef31be9 100644 --- a/src/lxc_driver.c +++ b/src/lxc_driver.c @@ -48,6 +48,7 @@ #include "event.h" #include "cgroup.h" #include "nodeinfo.h" +#include "uuid.h" #define VIR_FROM_THIS VIR_FROM_LXC @@ -1301,6 +1302,48 @@ static int lxcCheckNetNsSupport(void) return 1; } + +static void +lxcAutostartConfigs(lxc_driver_t *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("lxc:///"); + /* Ignoring NULL conn which is mostly harmless here */ + + lxcDriverLock(driver); + for (i = 0 ; i < driver->domains.count ; i++) { + virDomainObjPtr vm = driver->domains.objs[i]; + virDomainObjLock(vm); + if (vm->autostart && + !virDomainIsActive(vm)) { + int ret = lxcVmStart(conn, driver, vm); + if (ret < 0) { + virErrorPtr err = virGetLastError(); + VIR_ERROR(_("Failed to autostart VM '%s': %s\n"), + vm->def->name, + err ? err->message : ""); + } else { + virDomainEventPtr event = + virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_STARTED, + VIR_DOMAIN_EVENT_STARTED_BOOTED); + if (event) + lxcDomainEventQueue(driver, event); + } + } + virDomainObjUnlock(vm); + } + lxcDriverUnlock(driver); + + if (conn) + virConnectClose(conn); +} + + static int lxcStartup(int privileged) { unsigned int i; @@ -1413,6 +1456,45 @@ cleanup: return -1; } +static void lxcNotifyLoadDomain(virDomainObjPtr vm, int newVM, void *opaque) +{ + lxc_driver_t *driver = opaque; + + if (newVM) { + virDomainEventPtr event = + virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_DEFINED, + VIR_DOMAIN_EVENT_DEFINED_ADDED); + if (event) + lxcDomainEventQueue(driver, event); + } +} + +/** + * lxcReload: + * + * Function to restart the LXC driver, it will recheck the configuration + * files and perform autostart + */ +static int +lxcReload(void) { + if (!lxc_driver) + return 0; + + lxcDriverLock(lxc_driver); + virDomainLoadAllConfigs(NULL, + lxc_driver->caps, + &lxc_driver->domains, + lxc_driver->configDir, + lxc_driver->autostartDir, + 0, lxcNotifyLoadDomain, lxc_driver); + lxcDriverUnlock(lxc_driver); + + lxcAutostartConfigs(lxc_driver); + + return 0; +} + static int lxcShutdown(void) { if (lxc_driver == NULL) @@ -1589,6 +1671,103 @@ cleanup: return ret; } +static int lxcDomainGetAutostart(virDomainPtr dom, + int *autostart) { + lxc_driver_t *driver = dom->conn->privateData; + virDomainObjPtr vm; + int ret = -1; + + lxcDriverLock(driver); + vm = virDomainFindByUUID(&driver->domains, dom->uuid); + lxcDriverUnlock(driver); + + if (!vm) { + char uuidstr[VIR_UUID_STRING_BUFLEN]; + virUUIDFormat(dom->uuid, uuidstr); + lxcError(dom->conn, dom, VIR_ERR_NO_DOMAIN, + _("no domain with matching uuid '%s'"), uuidstr); + goto cleanup; + } + + *autostart = vm->autostart; + ret = 0; + +cleanup: + if (vm) + virDomainObjUnlock(vm); + return ret; +} + +static int lxcDomainSetAutostart(virDomainPtr dom, + int autostart) { + lxc_driver_t *driver = dom->conn->privateData; + virDomainObjPtr vm; + char *configFile = NULL, *autostartLink = NULL; + int ret = -1; + + lxcDriverLock(driver); + vm = virDomainFindByUUID(&driver->domains, dom->uuid); + + if (!vm) { + char uuidstr[VIR_UUID_STRING_BUFLEN]; + virUUIDFormat(dom->uuid, uuidstr); + lxcError(dom->conn, dom, VIR_ERR_NO_DOMAIN, + _("no domain with matching uuid '%s'"), uuidstr); + goto cleanup; + } + + if (!vm->persistent) { + lxcError(dom->conn, dom, VIR_ERR_INTERNAL_ERROR, + "%s", _("cannot set autostart for transient domain")); + goto cleanup; + } + + autostart = (autostart != 0); + + if (vm->autostart != autostart) { + if ((configFile = virDomainConfigFile(dom->conn, driver->configDir, vm->def->name)) == NULL) + goto cleanup; + if ((autostartLink = virDomainConfigFile(dom->conn, driver->autostartDir, vm->def->name)) == NULL) + goto cleanup; + + if (autostart) { + int err; + + if ((err = virFileMakePath(driver->autostartDir))) { + virReportSystemError(dom->conn, err, + _("cannot create autostart directory %s"), + driver->autostartDir); + goto cleanup; + } + + if (symlink(configFile, autostartLink) < 0) { + virReportSystemError(dom->conn, errno, + _("Failed to create symlink '%s to '%s'"), + autostartLink, configFile); + goto cleanup; + } + } else { + if (unlink(autostartLink) < 0 && errno != ENOENT && errno != ENOTDIR) { + virReportSystemError(dom->conn, errno, + _("Failed to delete symlink '%s'"), + autostartLink); + goto cleanup; + } + } + + vm->autostart = autostart; + } + ret = 0; + +cleanup: + VIR_FREE(configFile); + VIR_FREE(autostartLink); + if (vm) + virDomainObjUnlock(vm); + lxcDriverUnlock(driver); + return ret; +} + static char *lxcGetHostname (virConnectPtr conn) { char *result; @@ -1651,8 +1830,8 @@ static virDriver lxcDriver = { lxcDomainUndefine, /* domainUndefine */ NULL, /* domainAttachDevice */ NULL, /* domainDetachDevice */ - NULL, /* domainGetAutostart */ - NULL, /* domainSetAutostart */ + lxcDomainGetAutostart, /* domainGetAutostart */ + lxcDomainSetAutostart, /* domainSetAutostart */ lxcGetSchedulerType, /* domainGetSchedulerType */ lxcGetSchedulerParameters, /* domainGetSchedulerParameters */ lxcSetSchedulerParameters, /* domainSetSchedulerParameters */ @@ -1678,6 +1857,7 @@ static virStateDriver lxcStateDriver = { .initialize = lxcStartup, .cleanup = lxcShutdown, .active = lxcActive, + .reload = lxcReload, }; int lxcRegister(void) -- 1.6.2.5

On Wed, Jul 22, 2009 at 05:02:56PM +0100, Daniel P. Berrange wrote:
* src/lxc_driver.c: Implement support for domain autostart
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> except that +static void +lxcAutostartConfigs(lxc_driver_t *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("lxc:///"); + /* Ignoring NULL conn which is mostly harmless here */
which is a bit funky, I didn't spot anything, ACK Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

On Wed, Jul 22, 2009 at 06:52:11PM +0200, Daniel Veillard wrote:
On Wed, Jul 22, 2009 at 05:02:56PM +0100, Daniel P. Berrange wrote:
* src/lxc_driver.c: Implement support for domain autostart
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> except that +static void +lxcAutostartConfigs(lxc_driver_t *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("lxc:///"); + /* Ignoring NULL conn which is mostly harmless here */
which is a bit funky, I didn't spot anything, ACK
We have the same limitation in the UML and QEMU drivers - not really got a good plan for fixing this yet... Daniel -- |: 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 :|
participants (2)
-
Daniel P. Berrange
-
Daniel Veillard