]> xenbits.xensource.com Git - libvirt.git/commitdiff
Add QEMU driver events for defined/undefined config files
authorDaniel P. Berrange <berrange@redhat.com>
Mon, 17 Nov 2008 16:52:32 +0000 (16:52 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 17 Nov 2008 16:52:32 +0000 (16:52 +0000)
ChangeLog
src/domain_conf.c
src/domain_conf.h
src/lxc_driver.c
src/qemu_driver.c

index ce135bcaadf064d434df3dda863db1548c8af041..8a6cc8337ed27cf30af90069cca874b79cc828a2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+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
index 8f4d39937b042ba307b51e6a62d456eba4fece8c..7a5e5019ecb87ac0b584d197c1961fa868740b3c 100644 (file)
@@ -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;
     }
index 6343a70c66f52558c1f1011772df2cbf50ce01a1..448723f6225531dd7a5ef4a345e70ab5ba73bc61 100644 (file)
@@ -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,
index 4e7ae10efa48c702d97bbd3c8cb4aeea6596e473..e8aa018b7c15e7ca13e579503df656e21e1eb3a2 100644 (file)
@@ -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;
     }
index 3ad6a557c6eec1460076521eb233440cd464c770..f9e93f8037c4978dadec584f9d8a3b1a46f4a804 100644 (file)
@@ -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);