本文整理汇总了Python中vlcp.event.runnable.RoutineContainer.withException方法的典型用法代码示例。如果您正苦于以下问题:Python RoutineContainer.withException方法的具体用法?Python RoutineContainer.withException怎么用?Python RoutineContainer.withException使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类vlcp.event.runnable.RoutineContainer
的用法示例。
在下文中一共展示了RoutineContainer.withException方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: TestObjectDB
# 需要导入模块: from vlcp.event.runnable import RoutineContainer [as 别名]
# 或者: from vlcp.event.runnable.RoutineContainer import withException [as 别名]
class TestObjectDB(Module):
def __init__(self, server):
Module.__init__(self, server)
self.apiroutine = RoutineContainer(self.scheduler)
self.apiroutine.main = self._main
self.routines.append(self.apiroutine)
self._reqid = 0
self._ownerid = uuid1().hex
self.createAPI(api(self.createlogicalnetwork, self.apiroutine),
api(self.createlogicalnetworks, self.apiroutine),
api(self.createphysicalnetwork, self.apiroutine),
api(self.createphysicalnetworks, self.apiroutine),
api(self.createphysicalport, self.apiroutine),
api(self.createphysicalports, self.apiroutine),
api(self.createlogicalport, self.apiroutine),
api(self.createlogicalports, self.apiroutine),
api(self.getlogicalnetworks, self.apiroutine))
self._logger.setLevel(logging.DEBUG)
def _monitor(self):
update_event = DataObjectUpdateEvent.createMatcher()
while True:
yield (update_event,)
self._logger.info('Database update: %r', self.apiroutine.event)
def _dumpkeys(self, keys):
self._reqid += 1
reqid = ('testobjectdb', self._reqid)
for m in callAPI(self.apiroutine, 'objectdb', 'mget', {'keys': keys, 'requestid': reqid}):
yield m
retobjs = self.apiroutine.retvalue
with watch_context(keys, retobjs, reqid, self.apiroutine):
self.apiroutine.retvalue = [dump(v) for v in retobjs]
def _updateport(self, key):
unload_matcher = ModuleLoadStateChanged.createMatcher(self.target, ModuleLoadStateChanged.UNLOADING)
def updateinner():
self._reqid += 1
reqid = ('testobjectdb', self._reqid)
for m in callAPI(self.apiroutine, 'objectdb', 'get', {'key': key, 'requestid': reqid}):
yield m
portobj = self.apiroutine.retvalue
with watch_context([key], [portobj], reqid, self.apiroutine):
if portobj is not None:
@updater
def write_status(portobj):
if portobj is None:
raise ValueError('Already deleted')
if not hasattr(portobj, 'owner'):
portobj.owner = self._ownerid
portobj.status = 'READY'
return [portobj]
else:
raise ValueError('Already managed')
try:
for m in callAPI(self.apiroutine, 'objectdb', 'transact', {'keys': [portobj.getkey()], 'updater': write_status}):
yield m
except ValueError:
pass
else:
for m in portobj.waitif(self.apiroutine, lambda x: x.isdeleted() or hasattr(x, 'owner')):
yield m
self._logger.info('Port managed: %r', dump(portobj))
while True:
for m in portobj.waitif(self.apiroutine, lambda x: True, True):
yield m
if portobj.isdeleted():
self._logger.info('Port deleted: %r', dump(portobj))
break
else:
self._logger.info('Port updated: %r', dump(portobj))
try:
for m in self.apiroutine.withException(updateinner(), unload_matcher):
yield m
except RoutineException:
pass
def _waitforchange(self, key):
for m in callAPI(self.apiroutine, 'objectdb', 'watch', {'key': key, 'requestid': 'testobjectdb'}):
yield m
setobj = self.apiroutine.retvalue
with watch_context([key], [setobj], 'testobjectdb', self.apiroutine):
for m in setobj.wait(self.apiroutine):
yield m
oldset = set()
while True:
for weakref in setobj.set.dataset().difference(oldset):
self.apiroutine.subroutine(self._updateport(weakref.getkey()))
oldset = set(setobj.set.dataset())
for m in setobj.waitif(self.apiroutine, lambda x: not x.isdeleted(), True):
yield m
def _main(self):
routines = []
routines.append(self._monitor())
keys = [LogicalPortSet.default_key(), PhysicalPortSet.default_key()]
for k in keys:
routines.append(self._waitforchange(k))
for m in self.apiroutine.executeAll(routines, retnames = ()):
yield m
def load(self, container):
@updater
def initialize(phynetset, lognetset, logportset, phyportset):
if phynetset is None:
phynetset = PhysicalNetworkSet()
#.........这里部分代码省略.........