[virt-tools-list] [PATCH] Use storage pool lifecycle events

Jovanka Gulicoska jovanka.gulicoska at gmail.com
Mon Jun 13 18:25:42 UTC 2016


---
 virtManager/connection.py  | 35 +++++++++++++++++++++++++++++++++++
 virtManager/storagelist.py |  5 +----
 virtManager/storagepool.py |  5 ++++-
 3 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/virtManager/connection.py b/virtManager/connection.py
index 6cb9cc0..98b4ce1 100644
--- a/virtManager/connection.py
+++ b/virtManager/connection.py
@@ -213,6 +213,8 @@ class vmmConnection(vmmGObject):
         self._domain_cb_ids = []
         self.using_network_events = False
         self._network_cb_ids = []
+        self.using_storage_pool_events = False
+        self._storage_pool_cb_ids = []
 
         self._xml_flags = {}
 
@@ -774,6 +776,20 @@ class vmmConnection(vmmGObject):
         else:
             self.schedule_priority_tick(pollnet=True, force=True)
 
+    def _storage_pool_lifecycle_event(self, conn, pool, event, reason, userdata):
+        ignore = conn
+        ignore = userdata
+
+        name = pool.name()
+        logging.debug("storage pool lifecycle event: storage=%s event=%s "
+            "reason=%s", name, event, reason)
+        obj = self.get_pool(name)
+
+        if obj:
+            self.idle_add(obj.refresh_from_event_loop)
+        else:
+            self.schedule_priority_tick(pollpool=True, force=True)
+
     def _add_conn_events(self):
         if not self.check_support(support.SUPPORT_CONN_WORKING_XEN_EVENTS):
             return
@@ -829,6 +845,20 @@ class vmmConnection(vmmGObject):
             self.using_network_events = False
             logging.debug("Error registering network events: %s", e)
 
+        try:
+            if FORCE_DISABLE_EVENTS:
+                raise RuntimeError("FORCE_DISABLE_EVENTS = True")
+
+            eventid = getattr(libvirt, "VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE", 0)
+            self._storage_pool_cb_ids.append(
+                self.get_backend().storagePoolEventRegisterAny(
+                None, eventid, self._storage_pool_lifecycle_event, None))
+            self.using_storage_pool_events = True
+            logging.debug("Using storage pool events")
+        except Exception, e:
+            self.using_storage_pool_events = False
+            logging.debug("Error registering storage pool events: %s", e)
+
 
     ######################################
     # Connection closing/opening methods #
@@ -849,12 +879,15 @@ class vmmConnection(vmmGObject):
                     self._backend.domainEventDeregisterAny(eid)
                 for eid in self._network_cb_ids:
                     self._backend.networkEventDeregisterAny(eid)
+                for eid in self._storage_pool_cb_ids:
+                    self._backend.storagePoolEventDeregisterAny(eid)
         except:
             logging.debug("Failed to deregister events in conn cleanup",
                 exc_info=True)
         finally:
             self._domain_cb_ids = []
             self._network_cb_ids = []
+            self._storage_pool_cb_ids = []
 
         self._backend.close()
         self._stats = []
@@ -1177,6 +1210,8 @@ class vmmConnection(vmmGObject):
             pollvm = False
         if self.using_network_events and not force:
             pollnet = False
+        if self.using_storage_pool_events and not force:
+            pollpool = False
 
         self._hostinfo = self._backend.getInfo()
 
diff --git a/virtManager/storagelist.py b/virtManager/storagelist.py
index 8a34e7f..c16cf5c 100644
--- a/virtManager/storagelist.py
+++ b/virtManager/storagelist.py
@@ -654,11 +654,8 @@ class vmmStorageList(vmmGObjectUI):
         if pool is None:
             return
 
-        def cb():
-            pool.refresh()
-
         logging.debug("Refresh pool '%s'", pool.get_name())
-        vmmAsyncJob.simple_async_noshow(cb, [], self,
+        vmmAsyncJob.simple_async_noshow(pool.refresh, [], self,
                             _("Error refreshing pool '%s'") % pool.get_name())
 
     def _pool_apply(self):
diff --git a/virtManager/storagepool.py b/virtManager/storagepool.py
index b099fbe..ac7af1d 100644
--- a/virtManager/storagepool.py
+++ b/virtManager/storagepool.py
@@ -40,7 +40,7 @@ class vmmStorageVolume(vmmLibvirtObject):
     ##########################
 
     def _conn_tick_poll_param(self):
-        return None
+        return "pollpool"
     def class_name(self):
         return "volume"
 
@@ -59,6 +59,7 @@ class vmmStorageVolume(vmmLibvirtObject):
         # Deliberately empty
         ignore = stats_update
     def _init_libvirt_state(self):
+        self.tick()
         self.ensure_latest_xml()
 
 
@@ -134,6 +135,8 @@ class vmmStoragePool(vmmLibvirtObject):
         return self._backend.XMLDesc(flags)
     def _define(self, xml):
         return self.conn.define_pool(xml)
+    def _using_events(self):
+        return self.conn.using_storage_pool_events
     def _check_supports_isactive(self):
         return self.conn.check_support(
             self.conn.SUPPORT_POOL_ISACTIVE, self._backend)
-- 
2.5.5




More information about the virt-tools-list mailing list