Skip to content

Commit ead5fdf

Browse files
JGuliccrobinso
authored andcommitted
Use node device lifecycle events
API will be available in upcoming libvirt 2.2.0
1 parent f557728 commit ead5fdf

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

virtManager/connection.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ def __init__(self, uri):
215215
self._network_cb_ids = []
216216
self.using_storage_pool_events = False
217217
self._storage_pool_cb_ids = []
218+
self.using_node_device_events = False
219+
self._node_device_cb_ids = []
218220

219221
self._xml_flags = {}
220222

@@ -796,6 +798,17 @@ def _storage_pool_lifecycle_event(self, conn, pool,
796798
else:
797799
self.schedule_priority_tick(pollpool=True, force=True)
798800

801+
def _node_device_lifecycle_event(self, conn, dev,
802+
event, reason, userdata):
803+
ignore = conn
804+
ignore = userdata
805+
806+
name = dev.name()
807+
logging.debug("node device lifecycle event: device=%s event=%s "
808+
"reason=%s", name, event, reason)
809+
810+
self.schedule_priority_tick(pollnodedev=True, force=True)
811+
799812
def _add_conn_events(self):
800813
if not self.check_support(support.SUPPORT_CONN_WORKING_XEN_EVENTS):
801814
return
@@ -866,6 +879,20 @@ def _add_domain_xml_event(eventid, typestr):
866879
self.using_storage_pool_events = False
867880
logging.debug("Error registering storage pool events: %s", e)
868881

882+
try:
883+
if FORCE_DISABLE_EVENTS:
884+
raise RuntimeError("FORCE_DISABLE_EVENTS = True")
885+
886+
eventid = getattr(libvirt, "VIR_NODE_DEVICE_EVENT_ID_LIFECYCLE", 0)
887+
self._node_device_cb_ids.append(
888+
self.get_backend().nodeDeviceEventRegisterAny(
889+
None, eventid, self._node_device_lifecycle_event, None))
890+
self.using_node_device_events = True
891+
logging.debug("Using node device events")
892+
except Exception, e:
893+
self.using_network_events = False
894+
logging.debug("Error registering node device events: %s", e)
895+
869896

870897
######################################
871898
# Connection closing/opening methods #
@@ -888,13 +915,16 @@ def close(self):
888915
self._backend.networkEventDeregisterAny(eid)
889916
for eid in self._storage_pool_cb_ids:
890917
self._backend.storagePoolEventDeregisterAny(eid)
918+
for eid in self._node_device_cb_ids:
919+
self._backend.nodeDeviceEventDeregisterAny(eid)
891920
except:
892921
logging.debug("Failed to deregister events in conn cleanup",
893922
exc_info=True)
894923
finally:
895924
self._domain_cb_ids = []
896925
self._network_cb_ids = []
897926
self._storage_pool_cb_ids = []
927+
self._node_device_cb_ids = []
898928

899929
self._backend.close()
900930
self._stats = []
@@ -1227,6 +1257,8 @@ def _tick(self, stats_update=False,
12271257
pollnet = False
12281258
if self.using_storage_pool_events and not force:
12291259
pollpool = False
1260+
if self.using_node_device_events and not force:
1261+
pollnodedev = False
12301262

12311263
self._hostinfo = self._backend.getInfo()
12321264

virtManager/nodedev.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ def _backend_get_name(self):
4444
return self.get_connkey()
4545
def is_active(self):
4646
return True
47+
def _using_events(self):
48+
return self.conn.using_node_device_events
4749

4850
def tick(self, stats_update=True):
4951
# Deliberately empty

0 commit comments

Comments
 (0)