本文整理汇总了Python中vlcp.event.runnable.RoutineContainer.executeAll方法的典型用法代码示例。如果您正苦于以下问题:Python RoutineContainer.executeAll方法的具体用法?Python RoutineContainer.executeAll怎么用?Python RoutineContainer.executeAll使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类vlcp.event.runnable.RoutineContainer
的用法示例。
在下文中一共展示了RoutineContainer.executeAll方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: TestModule
# 需要导入模块: from vlcp.event.runnable import RoutineContainer [as 别名]
# 或者: from vlcp.event.runnable.RoutineContainer import executeAll [as 别名]
class TestModule(Module):
_default_serverlist = ['tcp://localhost:3181/','tcp://localhost:3182/','tcp://localhost:3183/']
def __init__(self, server):
Module.__init__(self, server)
self.apiroutine = RoutineContainer(self.scheduler)
self.apiroutine.main = self.main
self.routines.append(self.apiroutine)
def main(self):
clients = [ZooKeeperClient(self.apiroutine, self.serverlist) for _ in range(0,10)]
for c in clients:
c.start()
def test_loop(number):
maindir = ('vlcptest_' + str(number)).encode('utf-8')
client = clients[number % len(clients)]
for _ in range(0, 100):
for m in client.requests([zk.multi(
zk.multi_create(maindir, b'test'),
zk.multi_create(maindir + b'/subtest', 'test2')
),
zk.getchildren2(maindir, True)], self.apiroutine):
yield m
for m in client.requests([zk.multi(
zk.multi_delete(maindir + b'/subtest'),
zk.multi_delete(maindir)),
zk.getchildren2(maindir, True)], self.apiroutine):
yield m
from time import time
starttime = time()
for m in self.apiroutine.executeAll([test_loop(i) for i in range(0, 100)]):
yield m
print('10000 loops in %r seconds, with %d connections' % (time() - starttime, len(clients)))
for c in clients:
for m in c.shutdown():
yield m
示例2: OpenflowPortManager
# 需要导入模块: from vlcp.event.runnable import RoutineContainer [as 别名]
# 或者: from vlcp.event.runnable.RoutineContainer import executeAll [as 别名]
class OpenflowPortManager(Module):
'''
Manage Ports from Openflow Protocol
'''
service = True
def __init__(self, server):
Module.__init__(self, server)
self.apiroutine = RoutineContainer(self.scheduler)
self.apiroutine.main = self._manage_ports
self.routines.append(self.apiroutine)
self.managed_ports = {}
self.createAPI(api(self.getports, self.apiroutine),
api(self.getallports, self.apiroutine),
api(self.getportbyno, self.apiroutine),
api(self.waitportbyno, self.apiroutine),
api(self.getportbyname, self.apiroutine),
api(self.waitportbyname, self.apiroutine),
api(self.resync, self.apiroutine)
)
self._synchronized = False
def _get_ports(self, connection, protocol, onup = False, update = True):
ofdef = connection.openflowdef
dpid = connection.openflow_datapathid
vhost = connection.protocol.vhost
add = []
try:
if hasattr(ofdef, 'ofp_multipart_request'):
# Openflow 1.3, use ofp_multipart_request to get ports
for m in protocol.querymultipart(ofdef.ofp_multipart_request(type=ofdef.OFPMP_PORT_DESC), connection, self.apiroutine):
yield m
ports = self.managed_ports.setdefault((vhost, dpid), {})
for msg in self.apiroutine.openflow_reply:
for p in msg.ports:
add.append(p)
ports[p.port_no] = p
else:
# Openflow 1.0, use features_request
if onup:
# Use the features_reply on connection setup
reply = connection.openflow_featuresreply
else:
request = ofdef.ofp_msg()
request.header.type = ofdef.OFPT_FEATURES_REQUEST
for m in protocol.querywithreply(request):
yield m
reply = self.apiroutine.retvalue
ports = self.managed_ports.setdefault((vhost, dpid), {})
for p in reply.ports:
add.append(p)
ports[p.port_no] = p
if update:
for m in self.apiroutine.waitForSend(OpenflowPortSynchronized(connection)):
yield m
for m in self.apiroutine.waitForSend(ModuleNotification(self.getServiceName(), 'update',
datapathid = connection.openflow_datapathid,
connection = connection,
vhost = protocol.vhost,
add = add, remove = [],
reason = 'connected')):
yield m
except ConnectionResetException:
pass
except OpenflowProtocolException:
pass
def _get_existing_ports(self):
for m in callAPI(self.apiroutine, 'openflowmanager', 'getallconnections', {'vhost':None}):
yield m
with closing(self.apiroutine.executeAll([self._get_ports(c, c.protocol, False, False) for c in self.apiroutine.retvalue if c.openflow_auxiliaryid == 0])) as g:
for m in g:
yield m
self._synchronized = True
for m in self.apiroutine.waitForSend(ModuleNotification(self.getServiceName(), 'synchronized')):
yield m
def _wait_for_sync(self):
if not self._synchronized:
yield (ModuleNotification.createMatcher(self.getServiceName(), 'synchronized'),)
def _manage_ports(self):
try:
self.apiroutine.subroutine(self._get_existing_ports())
conn_update = ModuleNotification.createMatcher('openflowmanager', 'update')
port_status = OpenflowAsyncMessageEvent.createMatcher(of13.OFPT_PORT_STATUS, None, 0)
while True:
yield (conn_update, port_status)
if self.apiroutine.matcher is port_status:
e = self.apiroutine.event
m = e.message
c = e.connection
if (c.protocol.vhost, c.openflow_datapathid) in self.managed_ports:
if m.reason == c.openflowdef.OFPPR_ADD:
# A new port is added
self.managed_ports[(c.protocol.vhost, c.openflow_datapathid)][m.desc.port_no] = m.desc
self.scheduler.emergesend(ModuleNotification(self.getServiceName(), 'update',
datapathid = c.openflow_datapathid,
connection = c,
vhost = c.protocol.vhost,
add = [m.desc], remove = [],
reason = 'add'))
elif m.reason == c.openflowdef.OFPPR_DELETE:
try:
del self.managed_ports[(c.protocol.vhost, c.openflow_datapathid)][m.desc.port_no]
#.........这里部分代码省略.........
示例3: OpenflowManager
# 需要导入模块: from vlcp.event.runnable import RoutineContainer [as 别名]
# 或者: from vlcp.event.runnable.RoutineContainer import executeAll [as 别名]
#.........这里部分代码省略.........
if hasattr(ofdef, 'ofp_instruction_goto_table'):
# Create default flows
vhost = conn.protocol.vhost
if self._lastacquire and vhost in self._lastacquire:
_, pathtable = self._lastacquire[vhost]
cmds = [ofdef.ofp_flow_mod(table_id = t[i][1],
command = ofdef.OFPFC_ADD,
priority = 0,
buffer_id = ofdef.OFP_NO_BUFFER,
out_port = ofdef.OFPP_ANY,
out_group = ofdef.OFPG_ANY,
match = ofdef.ofp_match_oxm(),
instructions = [ofdef.ofp_instruction_goto_table(table_id = t[i+1][1])]
)
for _,t in pathtable.items()
for i in range(0, len(t) - 1)]
if cmds:
for m in conn.protocol.batch(cmds, conn, self.apiroutine):
yield m
for m in self.apiroutine.waitForSend(FlowInitialize(conn, conn.openflow_datapathid, conn.protocol.vhost)):
yield m
def _acquire_tables(self):
try:
while self._acquire_updated:
result = None
exception = None
# Delay the update so we are not updating table acquires for every module
for m in self.apiroutine.waitForSend(TableAcquireDelayEvent()):
yield m
yield (TableAcquireDelayEvent.createMatcher(),)
module_list = list(self.table_modules)
self._acquire_updated = False
try:
for m in self.apiroutine.executeAll((callAPI(self.apiroutine, module, 'gettablerequest', {}) for module in module_list)):
yield m
except QuitException:
raise
except Exception as exc:
self._logger.exception('Acquiring table failed')
exception = exc
else:
requests = [r[0] for r in self.apiroutine.retvalue]
vhosts = set(vh for _, vhs in requests if vhs is not None for vh in vhs)
vhost_result = {}
# Requests should be list of (name, (ancester, ancester, ...), pathname)
for vh in vhosts:
graph = {}
table_path = {}
try:
for r in requests:
if r[1] is None or vh in r[1]:
for name, ancesters, pathname in r[0]:
if name in table_path:
if table_path[name] != pathname:
raise ValueError("table conflict detected: %r can not be in two path: %r and %r" % (name, table_path[name], pathname))
else:
table_path[name] = pathname
if name not in graph:
graph[name] = (set(ancesters), set())
else:
graph[name][0].update(ancesters)
for anc in ancesters:
graph.setdefault(anc, (set(), set()))[1].add(name)
except ValueError as exc:
self._logger.error(str(exc))
exception = exc
示例4: TestObjectDB
# 需要导入模块: from vlcp.event.runnable import RoutineContainer [as 别名]
# 或者: from vlcp.event.runnable.RoutineContainer import executeAll [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()
#.........这里部分代码省略.........
示例5: OVSDBManager
# 需要导入模块: from vlcp.event.runnable import RoutineContainer [as 别名]
# 或者: from vlcp.event.runnable.RoutineContainer import executeAll [as 别名]
#.........这里部分代码省略.........
if econns:
try:
econns.remove(oc)
except ValueError:
pass
del self.managed_systemids[(vhost, system_id)]
self.managed_systemids[(vhost, system_id)] = connection
self.managed_bridges[connection] = []
ep = _get_endpoint(connection)
self.endpoint_conns.setdefault((vhost, ep), []).append(connection)
method, params = ovsdb.monitor('Open_vSwitch', 'ovsdb_manager_bridges_monitor', {'Bridge':ovsdb.monitor_request(['name', 'datapath_id'])})
for m in protocol.querywithreply(method, params, connection, self.apiroutine):
yield m
if 'error' in self.apiroutine.jsonrpc_result:
# The monitor is already set, cancel it first
method, params = ovsdb.monitor_cancel('ovsdb_manager_bridges_monitor')
for m in protocol.querywithreply(method, params, connection, self.apiroutine, False):
yield m
method, params = ovsdb.monitor('Open_vSwitch', 'ovsdb_manager_bridges_monitor', {'Bridge':ovsdb.monitor_request(['name', 'datapath_id'])})
for m in protocol.querywithreply(method, params, connection, self.apiroutine):
yield m
if 'error' in self.apiroutine.jsonrpc_result:
raise JsonRPCErrorResultException('OVSDB request failed: ' + repr(self.apiroutine.jsonrpc_result))
except Exception:
for m in self.apiroutine.waitForSend(OVSDBConnectionSetup(system_id, connection, connection.connmark, vhost)):
yield m
raise
else:
# Process initial bridges
init_subprocesses = [self._update_bridge(connection, protocol, buuid, vhost)
for buuid in self.apiroutine.jsonrpc_result['Bridge'].keys()]
def init_process():
try:
with closing(self.apiroutine.executeAll(init_subprocesses, retnames = ())) as g:
for m in g:
yield m
except Exception:
for m in self.apiroutine.waitForSend(OVSDBConnectionSetup(system_id, connection, connection.connmark, vhost)):
yield m
raise
else:
for m in self.apiroutine.waitForSend(OVSDBConnectionSetup(system_id, connection, connection.connmark, vhost)):
yield m
self.apiroutine.subroutine(init_process())
# Wait for notify
notification = JsonRPCNotificationEvent.createMatcher('update', connection, connection.connmark, _ismatch = lambda x: x.params[0] == 'ovsdb_manager_bridges_monitor')
conn_down = protocol.statematcher(connection)
while True:
yield (conn_down, notification)
if self.apiroutine.matcher is conn_down:
break
else:
for buuid, v in self.apiroutine.event.params[1]['Bridge'].items():
# If a bridge's name or datapath-id is changed, we remove this bridge and add it again
if 'old' in v:
# A bridge is deleted
bridges = self.managed_bridges[connection]
for i in range(0, len(bridges)):
if buuid == bridges[i][3]:
self.scheduler.emergesend(OVSDBBridgeSetup(OVSDBBridgeSetup.DOWN,
bridges[i][1],
system_id,
bridges[i][2],
connection,
connection.connmark,
vhost,
示例6: OVSDBPortManager
# 需要导入模块: from vlcp.event.runnable import RoutineContainer [as 别名]
# 或者: from vlcp.event.runnable.RoutineContainer import executeAll [as 别名]
#.........这里部分代码省略.........
if puuid in port_update:
# The port is modified, there should be an 'old' set and 'new' set
pu = port_update[puuid]
if 'old' in pu:
poset = set((p for _,p in ovsdb.getlist(pu['old']['interfaces'])))
else:
poset = set()
if 'new' in pu:
pnset = set((p for _,p in ovsdb.getlist(pu['new']['interfaces'])))
else:
pnset = set()
# Remove old interfaces
remove += [r for r in
(self._remove_interface(connection, protocol, datapath_id, iuuid, puuid)
for iuuid in (poset - pnset)) if r is not None]
# Prepare to add new interfaces
add_routine += [self._get_interface_info(connection, protocol, buuid, iuuid, puuid)
for iuuid in (pnset - poset)]
# For every port added, add the interfaces
def add_port_interfaces(puuid):
# If the uuid does not appear in update info, we have no choice but to query interfaces with select
# we cannot use data from other bridges; the port may be moved from a bridge which is not tracked
try:
method, params = ovsdb.transact('Open_vSwitch', ovsdb.select('Port',
[["_uuid", "==", ovsdb.uuid(puuid)]],
["interfaces"]))
for m in protocol.querywithreply(method, params, connection, self.apiroutine):
yield m
r = self.apiroutine.jsonrpc_result[0]
if 'error' in r:
raise JsonRPCErrorResultException('Error when query interfaces from port ' + repr(puuid) + ': ' + r['error'])
if r['rows']:
interfaces = ovsdb.getlist(r['rows'][0]['interfaces'])
with closing(self.apiroutine.executeAll([self._get_interface_info(connection, protocol, buuid, iuuid, puuid)
for _,iuuid in interfaces])) as g:
for m in g:
yield m
self.apiroutine.retvalue = list(itertools.chain(r[0] for r in self.apiroutine.retvalue))
else:
self.apiroutine.retvalue = []
except JsonRPCProtocolException:
self.apiroutine.retvalue = []
except ConnectionResetException:
self.apiroutine.retvalue = []
for puuid in nset - oset:
self.ports_uuids[puuid] = buuid
if puuid in port_update and 'new' in port_update[puuid] \
and 'old' not in port_update[puuid]:
# Add all the interfaces in 'new'
interfaces = ovsdb.getlist(port_update[puuid]['new']['interfaces'])
add_routine += [self._get_interface_info(connection, protocol, buuid, iuuid, puuid)
for _,iuuid in interfaces]
else:
add_routine.append(add_port_interfaces(puuid))
# Execute the add_routine
try:
with closing(self.apiroutine.executeAll(add_routine)) as g:
for m in g:
yield m
except:
add = []
raise
else:
add = list(itertools.chain(r[0] for r in self.apiroutine.retvalue))
finally: