+
+ def deregister(self):
+ self._log.debug("De-register VLD handler for project {}".
+ format(self._vnsm._project.name))
+ if self._regh:
+ self._regh.deregister()
+ self._regh = None
+
+class VirtualLinkEventListener(object):
+ """ DTS Listener to listen on Virtual Link related events """
+ XPATH = "D,/rw-resource-mgr:resource-mgmt/vlink-event/vlink-event-data"
+ def __init__(self, dts, log, loop, vnsm):
+ self._dts = dts
+ self._log = log
+ self._loop = loop
+ self._vnsm = vnsm
+ self._regh = None
+
+ @property
+ def regh(self):
+ """ The registration handle assocaited with this Handler"""
+ return self._regh
+
+ def event_id_from_keyspec(self, ks):
+ """ Get the event id from the keyspec """
+ event_pe = RwResourceMgrYang.YangData_RwProject_Project_ResourceMgmt_VlinkEvent_VlinkEventData.schema().keyspec_to_entry(ks)
+ try:
+ # Can get just path without event id when
+ # deleting project
+ event_id = event_pe.key00.event_id
+ except AttributeError:
+ return None
+ return event_id
+
+ @asyncio.coroutine
+ def register(self):
+ """ Register the Virtual Link Event path """
+ @asyncio.coroutine
+ def on_prepare(xact_info, query_action, ks_path, msg):
+ """ prepare callback on Virtual Link Events """
+ try:
+ self._log.debug(
+ "Got on prepare for Virtual Link Event id (ks_path: %s) (msg: %s)",
+ ks_path.to_xpath(RwResourceMgrYang.get_schema()), msg)
+ event_id = self.event_id_from_keyspec(ks_path)
+ if event_id:
+ if query_action == rwdts.QueryAction.CREATE or query_action == rwdts.QueryAction.UPDATE:
+ yield from self._vnsm.update_virual_link_event(event_id, msg)
+ elif query_action == rwdts.QueryAction.DELETE:
+ self._vnsm.delete_virual_link_event(event_id)
+ except Exception as e:
+ self._log.exception("Caught execption in Virtual Link Event handler", e)
+
+ xact_info.respond_xpath(rwdts.XactRspCode.ACK)
+
+ handler = rift.tasklets.DTS.RegistrationHandler(on_prepare=on_prepare)
+
+ self._regh = yield from self._dts.register(
+ self._vnsm._project.add_project(VirtualLinkEventListener.XPATH),
+ flags=rwdts.Flag.SUBSCRIBER,
+ handler=handler
+ )
+
+ def deregister(self):
+ if self._regh:
+ self._regh.deregister()
+ self._regh = None