+Mon Nov 17 16:45:00 GMT 2008 Daniel Berrange <berrange@redhat.com>
+
+ 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 <berrange@redhat.com>
Include an event 'detail' field providing the cause of
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:
virCapsPtr caps,
virDomainObjListPtr doms,
const char *configDir,
- const char *autostartDir)
+ const char *autostartDir,
+ virDomainLoadConfigNotify notify,
+ void *opaque)
{
DIR *dir;
struct dirent *entry;
doms,
configDir,
autostartDir,
- entry->d_name);
+ entry->d_name,
+ notify,
+ opaque);
if (dom)
dom->persistent = 1;
}
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,
lxc_driver->caps,
&lxc_driver->domains,
lxc_driver->configDir,
- lxc_driver->autostartDir) < 0) {
+ lxc_driver->autostartDir,
+ NULL, NULL) < 0) {
lxcShutdown();
return -1;
}
qemu_driver->caps,
&qemu_driver->domains,
qemu_driver->configDir,
- qemu_driver->autostartDir) < 0) {
+ qemu_driver->autostartDir,
+ NULL, NULL) < 0) {
qemudShutdown();
return -1;
}
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:
*
qemu_driver->caps,
&qemu_driver->domains,
qemu_driver->configDir,
- qemu_driver->autostartDir);
+ qemu_driver->autostartDir,
+ qemudNotifyLoadDomain, qemu_driver);
qemudAutostartConfigs(qemu_driver);
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))) {
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;
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);