diff --git a/ChangeLog b/ChangeLog index ce135bcaad..8a6cc8337e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Mon Nov 17 16:45:00 GMT 2008 Daniel Berrange + + Generate domain events for QEMU driver config files + * src/qemu_driver.c: Generate events when config is defined + and undefined + * src/domain_conf.c, src/domain_conf.h: Add a callback for + notifications of each loaded config file + * src/lxc_driver.c: Pass NULL for config file notification + callback parameter + Mon Nov 17 16:42:00 GMT 2008 Daniel Berrange Include an event 'detail' field providing the cause of diff --git a/src/domain_conf.c b/src/domain_conf.c index 8f4d39937b..7a5e5019ec 100644 --- a/src/domain_conf.c +++ b/src/domain_conf.c @@ -3242,31 +3242,38 @@ virDomainObjPtr virDomainLoadConfig(virConnectPtr conn, virDomainObjListPtr doms, const char *configDir, const char *autostartDir, - const char *name) + const char *name, + virDomainLoadConfigNotify notify, + void *opaque) { char *configFile = NULL, *autostartLink = NULL; virDomainDefPtr def = NULL; virDomainObjPtr dom; int autostart; + int newVM = 1; if ((configFile = virDomainConfigFile(conn, configDir, name)) == NULL) goto error; if ((autostartLink = virDomainConfigFile(conn, autostartDir, name)) == NULL) goto error; - if ((autostart = virFileLinkPointsTo(autostartLink, configFile)) < 0) goto error; if (!(def = virDomainDefParseFile(conn, caps, configFile))) goto error; + if (virDomainFindByName(doms, def->name)) + newVM = 0; + if (!(dom = virDomainAssignDef(conn, doms, def))) goto error; - dom->state = VIR_DOMAIN_SHUTOFF; dom->autostart = autostart; + if (notify) + (*notify)(dom, newVM, opaque); + return dom; error: @@ -3280,7 +3287,9 @@ int virDomainLoadAllConfigs(virConnectPtr conn, virCapsPtr caps, virDomainObjListPtr doms, const char *configDir, - const char *autostartDir) + const char *autostartDir, + virDomainLoadConfigNotify notify, + void *opaque) { DIR *dir; struct dirent *entry; @@ -3310,7 +3319,9 @@ int virDomainLoadAllConfigs(virConnectPtr conn, doms, configDir, autostartDir, - entry->d_name); + entry->d_name, + notify, + opaque); if (dom) dom->persistent = 1; } diff --git a/src/domain_conf.h b/src/domain_conf.h index 6343a70c66..448723f622 100644 --- a/src/domain_conf.h +++ b/src/domain_conf.h @@ -549,18 +549,26 @@ int virDomainSaveConfig(virConnectPtr conn, const char *configDir, virDomainDefPtr def); +typedef void (*virDomainLoadConfigNotify)(virDomainObjPtr dom, + int newDomain, + void *opaque); + virDomainObjPtr virDomainLoadConfig(virConnectPtr conn, virCapsPtr caps, virDomainObjListPtr doms, const char *configDir, const char *autostartDir, - const char *name); + const char *name, + virDomainLoadConfigNotify notify, + void *opaque); int virDomainLoadAllConfigs(virConnectPtr conn, virCapsPtr caps, virDomainObjListPtr doms, const char *configDir, - const char *autostartDir); + const char *autostartDir, + virDomainLoadConfigNotify notify, + void *opaque); int virDomainDeleteConfig(virConnectPtr conn, const char *configDir, diff --git a/src/lxc_driver.c b/src/lxc_driver.c index 4e7ae10efa..e8aa018b7c 100644 --- a/src/lxc_driver.c +++ b/src/lxc_driver.c @@ -1015,7 +1015,8 @@ static int lxcStartup(void) lxc_driver->caps, &lxc_driver->domains, lxc_driver->configDir, - lxc_driver->autostartDir) < 0) { + lxc_driver->autostartDir, + NULL, NULL) < 0) { lxcShutdown(); return -1; } diff --git a/src/qemu_driver.c b/src/qemu_driver.c index 3ad6a557c6..f9e93f8037 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -226,7 +226,8 @@ qemudStartup(void) { qemu_driver->caps, &qemu_driver->domains, qemu_driver->configDir, - qemu_driver->autostartDir) < 0) { + qemu_driver->autostartDir, + NULL, NULL) < 0) { qemudShutdown(); return -1; } @@ -243,6 +244,16 @@ qemudStartup(void) { return -1; } +static void qemudNotifyLoadDomain(virDomainObjPtr vm, int newVM, void *opaque) +{ + struct qemud_driver *driver = opaque; + + if (newVM) + qemudDomainEventDispatch(driver, vm, + VIR_DOMAIN_EVENT_DEFINED, + VIR_DOMAIN_EVENT_DEFINED_ADDED); +} + /** * qemudReload: * @@ -258,7 +269,8 @@ qemudReload(void) { qemu_driver->caps, &qemu_driver->domains, qemu_driver->configDir, - qemu_driver->autostartDir); + qemu_driver->autostartDir, + qemudNotifyLoadDomain, qemu_driver); qemudAutostartConfigs(qemu_driver); @@ -2365,10 +2377,15 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) { virDomainDefPtr def; virDomainObjPtr vm; virDomainPtr dom; + int newVM = 1; if (!(def = virDomainDefParseString(conn, driver->caps, xml))) return NULL; + vm = virDomainFindByName(&driver->domains, def->name); + if (vm) + newVM = 0; + if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) { @@ -2385,6 +2402,12 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) { return NULL; } + qemudDomainEventDispatch(driver, 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; return dom; @@ -2415,6 +2438,10 @@ static int qemudDomainUndefine(virDomainPtr dom) { if (virDomainDeleteConfig(dom->conn, driver->configDir, driver->autostartDir, vm) < 0) return -1; + qemudDomainEventDispatch(driver, vm, + VIR_DOMAIN_EVENT_UNDEFINED, + VIR_DOMAIN_EVENT_UNDEFINED_REMOVED); + virDomainRemoveInactive(&driver->domains, vm);