def test_call_context(): def progress(arg): pass parent = Context() session_details = SessionDetails('default', 5) call_details = CallDetails(progress=progress, caller=8, caller_authid='user', caller_authrole='role', procedure='procedurename') context = CallContext(parent, session_details, call_details) assert context.session_id == 5 assert context.caller_session_id == 8 assert context.caller_auth_id == 'user' assert context.caller_auth_role == 'role' assert context.procedure == 'procedurename' assert context.enc_algo is None assert context.progress is progress
def _startup(self, config): """ Startup elements in the node as specified in the provided node configuration. """ self.log.info('Configuring node from local configuration ...') # call options we use to call into the local node management API call_options = CallOptions() # fake call details we use to call into the local node management API call_details = CallDetails(caller=0) # get contoller configuration subpart controller = config.get('controller', {}) # start Manhole in node controller if 'manhole' in controller: yield self._controller.start_manhole(controller['manhole'], details=call_details) # startup all workers workers = config.get('workers', []) if len(workers): self.log.info('Starting {nworkers} workers ...', nworkers=len(workers)) else: self.log.info('No workers configured!') for worker in workers: # worker ID if 'id' in worker: worker_id = worker.pop('id') else: worker_id = 'worker-{:03d}'.format(self._worker_no) self._worker_no += 1 # worker type - a type of working process from the following fixed list worker_type = worker['type'] assert (worker_type in ['router', 'container', 'guest', 'websocket-testee']) # set logname depending on worker type if worker_type == 'router': worker_logname = "Router '{}'".format(worker_id) elif worker_type == 'container': worker_logname = "Container '{}'".format(worker_id) elif worker_type == 'websocket-testee': worker_logname = "WebSocketTestee '{}'".format(worker_id) elif worker_type == 'guest': worker_logname = "Guest '{}'".format(worker_id) else: raise Exception("logic error") # any worker specific options worker_options = worker.get('options', {}) # native worker processes: router, container, websocket-testee if worker_type in ['router', 'container', 'websocket-testee']: # start a new native worker process .. if worker_type == 'router': yield self._controller.start_router(worker_id, worker_options, details=call_details) elif worker_type == 'container': yield self._controller.start_container( worker_id, worker_options, details=call_details) elif worker_type == 'websocket-testee': yield self._controller.start_websocket_testee( worker_id, worker_options, details=call_details) else: raise Exception("logic error") # setup native worker generic stuff if 'pythonpath' in worker_options: added_paths = yield self._controller.call( 'crossbar.worker.{}.add_pythonpath'.format(worker_id), worker_options['pythonpath'], options=call_options) self.log.debug("{worker}: PYTHONPATH extended for {paths}", worker=worker_logname, paths=added_paths) if 'cpu_affinity' in worker_options: new_affinity = yield self._controller.call( 'crossbar.worker.{}.set_cpu_affinity'.format( worker_id), worker_options['cpu_affinity'], options=call_options) self.log.debug("{worker}: CPU affinity set to {affinity}", worker=worker_logname, affinity=new_affinity) if 'manhole' in worker: yield self._controller.call( 'crossbar.worker.{}.start_manhole'.format(worker_id), worker['manhole'], options=call_options) self.log.debug("{worker}: manhole started", worker=worker_logname) # setup router worker if worker_type == 'router': # start realms on router for realm in worker.get('realms', []): # start realm if 'id' in realm: realm_id = realm.pop('id') else: realm_id = 'realm-{:03d}'.format(self._realm_no) self._realm_no += 1 yield self._controller.call( 'crossbar.worker.{}.start_router_realm'.format( worker_id), realm_id, realm, options=call_options) self.log.info( "{worker}: realm '{realm_id}' (named '{realm_name}') started", worker=worker_logname, realm_id=realm_id, realm_name=realm['name']) # add roles to realm for role in realm.get('roles', []): if 'id' in role: role_id = role.pop('id') else: role_id = 'role-{:03d}'.format(self._role_no) self._role_no += 1 yield self._controller.call( 'crossbar.worker.{}.start_router_realm_role'. format(worker_id), realm_id, role_id, role, options=call_options) self.log.info( "{logname}: role '{role}' (named '{role_name}') started on realm '{realm}'", logname=worker_logname, role=role_id, role_name=role['name'], realm=realm_id, ) # start uplinks for realm for uplink in realm.get('uplinks', []): if 'id' in uplink: uplink_id = uplink.pop('id') else: uplink_id = 'uplink-{:03d}'.format( self._uplink_no) self._uplink_no += 1 yield self._controller.call( 'crossbar.worker.{}.start_router_realm_uplink'. format(worker_id), realm_id, uplink_id, uplink, options=call_options) self.log.info( "{logname}: uplink '{uplink}' started on realm '{realm}'", logname=worker_logname, uplink=uplink_id, realm=realm_id, ) # start connections (such as PostgreSQL database connection pools) # to run embedded in the router for connection in worker.get('connections', []): if 'id' in connection: connection_id = connection.pop('id') else: connection_id = 'connection-{:03d}'.format( self._connection_no) self._connection_no += 1 yield self._controller.call( 'crossbar.worker.{}.start_connection'.format( worker_id), connection_id, connection, options=call_options) self.log.info( "{logname}: connection '{connection}' started", logname=worker_logname, connection=connection_id, ) # start components to run embedded in the router for component in worker.get('components', []): if 'id' in component: component_id = component.pop('id') else: component_id = 'component-{:03d}'.format( self._component_no) self._component_no += 1 yield self._controller.call( 'crossbar.worker.{}.start_router_component'.format( worker_id), component_id, component, options=call_options) self.log.info( "{logname}: component '{component}' started", logname=worker_logname, component=component_id, ) # start transports on router for transport in worker['transports']: if 'id' in transport: transport_id = transport.pop('id') else: transport_id = 'transport-{:03d}'.format( self._transport_no) self._transport_no += 1 yield self._controller.call( 'crossbar.worker.{}.start_router_transport'.format( worker_id), transport_id, transport, options=call_options) self.log.info( "{logname}: transport '{tid}' started", logname=worker_logname, tid=transport_id, ) # setup container worker elif worker_type == 'container': # if components exit "very soon after" we try to # start them, we consider that a failure and shut # our node down. We remove this subscription 2 # seconds after we're done starting everything # (see below). This is necessary as # start_container_component returns as soon as # we've established a connection to the component def component_exited(info): component_id = info.get("id") self.log.critical( "Component '{component_id}' failed to start; shutting down node.", component_id=component_id) try: self._reactor.stop() except twisted.internet.error.ReactorNotRunning: pass topic = 'crossbar.worker.{}.container.on_component_stop'.format( worker_id) component_stop_sub = yield self._controller.subscribe( component_exited, topic) # start connections (such as PostgreSQL database connection pools) # to run embedded in the container # for connection in worker.get('connections', []): if 'id' in connection: connection_id = connection.pop('id') else: connection_id = 'connection-{:03d}'.format( self._connection_no) self._connection_no += 1 yield self._controller.call( 'crossbar.worker.{}.start_connection'.format( worker_id), connection_id, connection, options=call_options) self.log.info( "{logname}: connection '{connection}' started", logname=worker_logname, connection=connection_id, ) # start components to run embedded in the container # for component in worker.get('components', []): if 'id' in component: component_id = component.pop('id') else: component_id = 'component-{:03d}'.format( self._component_no) self._component_no += 1 yield self._controller.call( 'crossbar.worker.{}.start_container_component'. format(worker_id), component_id, component, options=call_options) self.log.info( "{worker}: component '{component_id}' started", worker=worker_logname, component_id=component_id) # after 2 seconds, consider all the application components running self._reactor.callLater(2, component_stop_sub.unsubscribe) # setup websocket-testee worker elif worker_type == 'websocket-testee': # start transport on websocket-testee transport = worker['transport'] transport_id = 'transport-{:03d}'.format( self._transport_no) self._transport_no = 1 yield self._controller.call( 'crossbar.worker.{}.start_websocket_testee_transport'. format(worker_id), transport_id, transport, options=call_options) self.log.info( "{logname}: transport '{tid}' started", logname=worker_logname, tid=transport_id, ) else: raise Exception("logic error") elif worker_type == 'guest': # start guest worker # yield self._controller.start_guest(worker_id, worker, details=call_details) self.log.info("{worker}: started", worker=worker_logname) else: raise Exception("logic error") self.log.info('Local node configuration applied.')
def _startup(self, config): # fake call details information when calling into # remoted procedure locally # call_details = CallDetails(caller=0) controller = config.get('controller', {}) # start Manhole in node controller # if 'manhole' in controller: yield self._controller.start_manhole(controller['manhole'], details=call_details) # startup all workers # worker_no = 1 call_options = CallOptions(disclose_me=True) for worker in config.get('workers', []): # worker ID, type and logname # if 'id' in worker: worker_id = worker.pop('id') else: worker_id = 'worker{}'.format(worker_no) worker_no += 1 worker_type = worker['type'] worker_options = worker.get('options', {}) if worker_type == 'router': worker_logname = "Router '{}'".format(worker_id) elif worker_type == 'container': worker_logname = "Container '{}'".format(worker_id) elif worker_type == 'websocket-testee': worker_logname = "WebSocketTestee '{}'".format(worker_id) elif worker_type == 'guest': worker_logname = "Guest '{}'".format(worker_id) else: raise Exception("logic error") # router/container # if worker_type in ['router', 'container', 'websocket-testee']: # start a new native worker process .. # if worker_type == 'router': yield self._controller.start_router(worker_id, worker_options, details=call_details) elif worker_type == 'container': yield self._controller.start_container( worker_id, worker_options, details=call_details) elif worker_type == 'websocket-testee': yield self._controller.start_websocket_testee( worker_id, worker_options, details=call_details) else: raise Exception("logic error") # setup native worker generic stuff # if 'pythonpath' in worker_options: added_paths = yield self._controller.call( 'crossbar.node.{}.worker.{}.add_pythonpath'.format( self._node_id, worker_id), worker_options['pythonpath'], options=call_options) self.log.debug("{worker}: PYTHONPATH extended for {paths}", worker=worker_logname, paths=added_paths) if 'cpu_affinity' in worker_options: new_affinity = yield self._controller.call( 'crossbar.node.{}.worker.{}.set_cpu_affinity'.format( self._node_id, worker_id), worker_options['cpu_affinity'], options=call_options) self.log.debug("{worker}: CPU affinity set to {affinity}", worker=worker_logname, affinity=new_affinity) if 'manhole' in worker: yield self._controller.call( 'crossbar.node.{}.worker.{}.start_manhole'.format( self._node_id, worker_id), worker['manhole'], options=call_options) self.log.debug("{worker}: manhole started", worker=worker_logname) # setup router worker # if worker_type == 'router': # start realms on router # realm_no = 1 for realm in worker.get('realms', []): if 'id' in realm: realm_id = realm.pop('id') else: realm_id = 'realm{}'.format(realm_no) realm_no += 1 # extract schema information from WAMP-flavored Markdown # schemas = None if 'schemas' in realm: schemas = {} schema_pat = re.compile(r"```javascript(.*?)```", re.DOTALL) cnt_files = 0 cnt_decls = 0 for schema_file in realm.pop('schemas'): schema_file = os.path.join( self._cbdir, schema_file) self.log.info( "{worker}: processing WAMP-flavored Markdown file {schema_file} for WAMP schema declarations", worker=worker_logname, schema_file=schema_file) with open(schema_file, 'r') as f: cnt_files += 1 for d in schema_pat.findall(f.read()): try: o = json.loads(d) if isinstance( o, dict ) and '$schema' in o and o[ '$schema'] == u'http://wamp.ws/schema#': uri = o['uri'] if uri not in schemas: schemas[uri] = {} schemas[uri].update(o) cnt_decls += 1 except Exception: self.log.failure( "{worker}: WARNING - failed to process declaration in {schema_file} - {log_failure.value}", worker=worker_logname, schema_file=schema_file) self.log.info( "{worker}: processed {cnt_files} files extracting {cnt_decls} schema declarations and {len_schemas} URIs", worker=worker_logname, cnt_files=cnt_files, cnt_decls=cnt_decls, len_schemas=len(schemas)) enable_trace = realm.get('trace', False) yield self._controller.call( 'crossbar.node.{}.worker.{}.start_router_realm'. format(self._node_id, worker_id), realm_id, realm, schemas, enable_trace=enable_trace, options=call_options) self.log.info( "{worker}: realm '{realm_id}' (named '{realm_name}') started", worker=worker_logname, realm_id=realm_id, realm_name=realm['name'], enable_trace=enable_trace) # add roles to realm # role_no = 1 for role in realm.get('roles', []): if 'id' in role: role_id = role.pop('id') else: role_id = 'role{}'.format(role_no) role_no += 1 yield self._controller.call( 'crossbar.node.{}.worker.{}.start_router_realm_role' .format(self._node_id, worker_id), realm_id, role_id, role, options=call_options) self.log.info( "{}: role '{}' (named '{}') started on realm '{}'" .format(worker_logname, role_id, role['name'], realm_id)) # start uplinks for realm # uplink_no = 1 for uplink in realm.get('uplinks', []): if 'id' in uplink: uplink_id = uplink.pop('id') else: uplink_id = 'uplink{}'.format(uplink_no) uplink_no += 1 yield self._controller.call( 'crossbar.node.{}.worker.{}.start_router_realm_uplink' .format(self._node_id, worker_id), realm_id, uplink_id, uplink, options=call_options) self.log.info( "{}: uplink '{}' started on realm '{}'".format( worker_logname, uplink_id, realm_id)) # start connections (such as PostgreSQL database connection pools) # to run embedded in the router # connection_no = 1 for connection in worker.get('connections', []): if 'id' in connection: connection_id = connection.pop('id') else: connection_id = 'connection{}'.format( connection_no) connection_no += 1 yield self._controller.call( 'crossbar.node.{}.worker.{}.start_connection'. format(self._node_id, worker_id), connection_id, connection, options=call_options) self.log.info("{}: connection '{}' started".format( worker_logname, connection_id)) # start components to run embedded in the router # component_no = 1 for component in worker.get('components', []): if 'id' in component: component_id = component.pop('id') else: component_id = 'component{}'.format(component_no) component_no += 1 yield self._controller.call( 'crossbar.node.{}.worker.{}.start_router_component' .format(self._node_id, worker_id), component_id, component, options=call_options) self.log.info("{}: component '{}' started".format( worker_logname, component_id)) # start transports on router # transport_no = 1 for transport in worker['transports']: if 'id' in transport: transport_id = transport.pop('id') else: transport_id = 'transport{}'.format(transport_no) transport_no += 1 yield self._controller.call( 'crossbar.node.{}.worker.{}.start_router_transport' .format(self._node_id, worker_id), transport_id, transport, options=call_options) self.log.info("{}: transport '{}' started".format( worker_logname, transport_id)) # setup container worker # elif worker_type == 'container': component_no = 1 # if components exit "very soon after" we try to # start them, we consider that a failure and shut # our node down. We remove this subscription 2 # seconds after we're done starting everything # (see below). This is necessary as # start_container_component returns as soon as # we've established a connection to the component def component_exited(info): component_id = info.get("id") self.log.critical( "Component '{component_id}' failed to start; shutting down node.", component_id=component_id) try: self._reactor.stop() except twisted.internet.error.ReactorNotRunning: pass topic = 'crossbar.node.{}.worker.{}.container.on_component_stop'.format( self._node_id, worker_id) component_stop_sub = yield self._controller.subscribe( component_exited, topic) # start connections (such as PostgreSQL database connection pools) # to run embedded in the container # connection_no = 1 for connection in worker.get('connections', []): if 'id' in connection: connection_id = connection.pop('id') else: connection_id = 'connection{}'.format( connection_no) connection_no += 1 yield self._controller.call( 'crossbar.node.{}.worker.{}.start_connection'. format(self._node_id, worker_id), connection_id, connection, options=call_options) self.log.info("{}: connection '{}' started".format( worker_logname, connection_id)) # start components to run embedded in the container # for component in worker.get('components', []): if 'id' in component: component_id = component.pop('id') else: component_id = 'component{}'.format(component_no) component_no += 1 yield self._controller.call( 'crossbar.node.{}.worker.{}.start_container_component' .format(self._node_id, worker_id), component_id, component, options=call_options) self.log.info( "{worker}: component '{component_id}' started", worker=worker_logname, component_id=component_id) # after 2 seconds, consider all the application components running self._reactor.callLater(2, component_stop_sub.unsubscribe) # setup websocket-testee worker # elif worker_type == 'websocket-testee': # start transports on router # transport = worker['transport'] transport_no = 1 transport_id = 'transport{}'.format(transport_no) yield self._controller.call( 'crossbar.node.{}.worker.{}.start_websocket_testee_transport' .format(self._node_id, worker_id), transport_id, transport, options=call_options) self.log.info("{}: transport '{}' started".format( worker_logname, transport_id)) else: raise Exception("logic error") elif worker_type == 'guest': # start guest worker # yield self._controller.start_guest(worker_id, worker, details=call_details) self.log.info("{worker}: started", worker=worker_logname) else: raise Exception("logic error")
def _run_node_config(self, config): """ Setup node according to config provided. """ ## fake call details information when calling into ## remoted procedure locally ## call_details = CallDetails(caller = 0, authid = 'node') controller = config.get('controller', {}) ## start Manhole in node controller ## if 'manhole' in controller: yield self._controller.start_manhole(controller['manhole'], details = call_details) ## start local transport for management router ## if 'transport' in controller: yield self._controller.start_management_transport(controller['transport'], details = call_details) ## startup all workers ## worker_no = 1 for worker in config.get('workers', []): ## worker ID, type and logname ## if 'id' in worker: worker_id = worker.pop('id') else: worker_id = 'worker{}'.format(worker_no) worker_no += 1 worker_type = worker['type'] worker_options = worker.get('options', {}) if worker_type == 'router': worker_logname = "Router '{}'".format(worker_id) elif worker_type == 'container': worker_logname = "Container '{}'".format(worker_id) elif worker_type == 'guest': worker_logname = "Guest '{}'".format(worker_id) else: raise Exception("logic error") ## router/container ## if worker_type in ['router', 'container']: ## start a new native worker process .. ## if worker_type == 'router': yield self._controller.start_router(worker_id, worker_options, details = call_details) elif worker_type == 'container': yield self._controller.start_container(worker_id, worker_options, details = call_details) else: raise Exception("logic error") ## setup native worker generic stuff ## if 'pythonpath' in worker_options: added_paths = yield self._controller.call('crossbar.node.{}.worker.{}.add_pythonpath'.format(self._node_id, worker_id), worker_options['pythonpath']) if self.debug: log.msg("{}: PYTHONPATH extended for {}".format(worker_logname, added_paths)) else: log.msg("{}: PYTHONPATH extended".format(worker_logname)) if 'cpu_affinity' in worker_options: new_affinity = yield self._controller.call('crossbar.node.{}.worker.{}.set_cpu_affinity'.format(self._node_id, worker_id), worker_options['cpu_affinity']) log.msg("{}: CPU affinity set to {}".format(worker_logname, new_affinity)) if 'manhole' in worker: yield self._controller.call('crossbar.node.{}.worker.{}.start_manhole'.format(self._node_id, worker_id), worker['manhole']) log.msg("{}: manhole started".format(worker_logname)) ## setup router worker ## if worker_type == 'router': ## start realms on router ## realm_no = 1 for realm in worker.get('realms', []): if 'id' in realm: realm_id = realm.pop('id') else: realm_id = 'realm{}'.format(realm_no) realm_no += 1 ## extract schema information from WAMP-flavored Markdown ## schemas = None if 'schemas' in realm: schemas = {} schema_pat = re.compile(r"```javascript(.*?)```", re.DOTALL) cnt_files = 0 cnt_decls = 0 for schema_file in realm.pop('schemas'): schema_file = os.path.join(self.options.cbdir, schema_file) log.msg("{}: processing WAMP-flavored Markdown file {} for WAMP schema declarations".format(worker_logname, schema_file)) with open(schema_file, 'r') as f: cnt_files += 1 for d in schema_pat.findall(f.read()): try: o = json.loads(d) if type(o) == dict and '$schema' in o and o['$schema'] == u'http://wamp.ws/schema#': uri = o['uri'] if not uri in schemas: schemas[uri] = {} schemas[uri].update(o) cnt_decls += 1 except Exception as e: log.msg("{}: WARNING - failed to process declaration in {} - {}".format(worker_logname, schema_file, e)) log.msg("{}: processed {} files extracting {} schema declarations and {} URIs".format(worker_logname, cnt_files, cnt_decls, len(schemas))) yield self._controller.call('crossbar.node.{}.worker.{}.start_router_realm'.format(self._node_id, worker_id), realm_id, realm, schemas) log.msg("{}: realm '{}' started".format(worker_logname, realm_id)) ## add roles to realm ## role_no = 1 for role in realm.get('roles', []): if 'id' in role: role_id = role.pop('id') else: role_id = 'role{}'.format(role_no) role_no += 1 yield self._controller.call('crossbar.node.{}.worker.{}.start_router_realm_role'.format(self._node_id, worker_id), realm_id, role_id, role) log.msg("{}: role '{}' started on realm '{}'".format(worker_logname, role_id, realm_id)) ## start components to run embedded in the router ## component_no = 1 for component in worker.get('components', []): if 'id' in component: component_id = component.pop('id') else: component_id = 'component{}'.format(component_no) component_no += 1 yield self._controller.call('crossbar.node.{}.worker.{}.start_router_component'.format(self._node_id, worker_id), component_id, component) log.msg("{}: component '{}' started".format(worker_logname, component_id)) ## start transports on router ## transport_no = 1 for transport in worker['transports']: if 'id' in transport: transport_id = transport.pop('id') else: transport_id = 'transport{}'.format(transport_no) transport_no += 1 yield self._controller.call('crossbar.node.{}.worker.{}.start_router_transport'.format(self._node_id, worker_id), transport_id, transport) log.msg("{}: transport '{}' started".format(worker_logname, transport_id)) ## setup container worker ## elif worker_type == 'container': component_no = 1 for component in worker.get('components', []): if 'id' in component: component_id = component.pop('id') else: component_id = 'component{}'.format(component_no) component_no += 1 yield self._controller.call('crossbar.node.{}.worker.{}.start_container_component'.format(self._node_id, worker_id), component_id, component) log.msg("{}: component '{}' started".format(worker_logname, component_id)) else: raise Exception("logic error") elif worker_type == 'guest': ## start guest worker ## yield self._controller.start_guest(worker_id, worker, details = call_details) log.msg("{}: started".format(worker_logname)) else: raise Exception("logic error")
def _run_node_config(self, config): """ Setup node according to config provided. """ ## fake call details information when calling into ## remoted procedure locally ## call_details = CallDetails(caller=0, authid='node') controller = config.get('controller', {}) ## start Manhole in node controller ## if 'manhole' in controller: yield self._controller.start_manhole(controller['manhole'], details=call_details) ## start local transport for management router ## if 'transport' in controller: yield self._controller.start_management_transport( controller['transport'], details=call_details) ## startup all workers ## worker_no = 1 for worker in config.get('workers', []): ## worker ID, type and logname ## if 'id' in worker: worker_id = worker.pop('id') else: worker_id = 'worker{}'.format(worker_no) worker_no += 1 worker_type = worker['type'] worker_options = worker.get('options', {}) if worker_type == 'router': worker_logname = "Router '{}'".format(worker_id) elif worker_type == 'container': worker_logname = "Container '{}'".format(worker_id) elif worker_type == 'guest': worker_logname = "Guest '{}'".format(worker_id) else: raise Exception("logic error") ## router/container ## if worker_type in ['router', 'container']: ## start a new native worker process .. ## if worker_type == 'router': yield self._controller.start_router(worker_id, worker_options, details=call_details) elif worker_type == 'container': yield self._controller.start_container( worker_id, worker_options, details=call_details) else: raise Exception("logic error") ## setup native worker generic stuff ## if 'pythonpath' in worker_options: added_paths = yield self._controller.call( 'crossbar.node.{}.worker.{}.add_pythonpath'.format( self._node_id, worker_id), worker_options['pythonpath']) if self.debug: log.msg("{}: PYTHONPATH extended for {}".format( worker_logname, added_paths)) else: log.msg( "{}: PYTHONPATH extended".format(worker_logname)) if 'cpu_affinity' in worker_options: new_affinity = yield self._controller.call( 'crossbar.node.{}.worker.{}.set_cpu_affinity'.format( self._node_id, worker_id), worker_options['cpu_affinity']) log.msg("{}: CPU affinity set to {}".format( worker_logname, new_affinity)) if 'manhole' in worker: yield self._controller.call( 'crossbar.node.{}.worker.{}.start_manhole'.format( self._node_id, worker_id), worker['manhole']) log.msg("{}: manhole started".format(worker_logname)) ## setup router worker ## if worker_type == 'router': ## start realms on router ## realm_no = 1 for realm in worker.get('realms', []): if 'id' in realm: realm_id = realm.pop('id') else: realm_id = 'realm{}'.format(realm_no) realm_no += 1 ## FIXME #yield self._controller.call('crossbar.node.{}.worker.{}.start_router_realm'.format(self._node_id, worker_id), realm_id, realm) #log.msg("{}: realm '{}' started".format(worker_logname, realm_id)) ## start components to run embedded in the router ## component_no = 1 for component in worker.get('components', []): if 'id' in component: component_id = component.pop('id') else: component_id = 'component{}'.format(component_no) component_no += 1 yield self._controller.call( 'crossbar.node.{}.worker.{}.start_router_component' .format(self._node_id, worker_id), component_id, component) log.msg("{}: component '{}' started".format( worker_logname, component_id)) ## start transports on router ## transport_no = 1 for transport in worker['transports']: if 'id' in transport: transport_id = transport.pop('id') else: transport_id = 'transport{}'.format(transport_no) transport_no += 1 yield self._controller.call( 'crossbar.node.{}.worker.{}.start_router_transport' .format(self._node_id, worker_id), transport_id, transport) log.msg("{}: transport '{}' started".format( worker_logname, transport_id)) ## setup container worker ## elif worker_type == 'container': component_no = 1 for component in worker.get('components', []): if 'id' in component: component_id = component.pop('id') else: component_id = 'component{}'.format(component_no) component_no += 1 yield self._controller.call( 'crossbar.node.{}.worker.{}.start_container_component' .format(self._node_id, worker_id), component_id, component) log.msg("{}: component '{}' started".format( worker_logname, component_id)) else: raise Exception("logic error") elif worker_type == 'guest': ## start guest worker ## yield self._controller.start_guest(worker_id, worker, details=call_details) log.msg("{}: started".format(worker_logname)) else: raise Exception("logic error")