def onJoin(self, details): assert self.config.extra and 'on_ready' in self.config.extra assert self.config.extra and 'other' in self.config.extra remote = self.config.extra['other'] assert isinstance(remote, RLinkRemoteSession) self._exclude_authid = self.config.extra.get('exclude_authid', None) self._exclude_authrole = self.config.extra.get('exclude_authrole', None) # setup local->remote event forwarding forward_events = self.config.extra.get('forward_events', False) if forward_events: yield self._setup_event_forwarding(remote) # setup local->remote invocation forwarding forward_invocations = self.config.extra.get('forward_invocations', False) if forward_invocations: yield self._setup_invocation_forwarding(remote) self.log.debug( 'Router link local session ready (forward_events={forward_events}, forward_invocations={forward_invocations}, realm={realm}, authid={authid}, authrole={authrole}, session={session}) {method}', method=hltype(RLinkLocalSession.onJoin), forward_events=hluserid(forward_events), forward_invocations=hluserid(forward_invocations), realm=hluserid(details.realm), authid=hluserid(details.authid), authrole=hluserid(details.authrole), session=hlid(details.session)) on_ready = self.config.extra.get('on_ready', None) if on_ready and not on_ready.called: self.config.extra['on_ready'].callback(self)
def forward(*args, **kwargs): details = kwargs.pop('details', None) if details: match = pat.match(details.topic) if match: node_id, worker_id = match.groups() # FIXME: map back from node authid (?) to node OID (as UUID string)? self.log.debug( 'Forwarding CFC {forward_type} on mrealm {realm} from node {node_id} and worker {worker_id} [local=<{local_uri}>, remote=<{remote_uri}>]', forward_type=hl('EVENT'), local_uri=hlid(local_uri), remote_uri=hlid(details.topic), node_id=hluserid(node_id), worker_id=hluserid(worker_id), realm=hluserid(session._realm)) return session.publish( local_uri, node_id, worker_id, *args, **kwargs, options=PublishOptions(exclude_me=False)) # should not arrive here session.log.warn( 'received unexpected event to forward for management API: local_uri={local_uri}, remote_uri={remote_uri}, remote_uri_regex={remote_uri_regex} details={details}', local_uri=local_uri, remote_uri=remote_uri, remote_uri_regex=remote_uri_regex, details=details)
def onLeave(self, details): self.log.warn( 'Router link local session down! (realm={realm}, authid={authid}, authrole={authrole}, session={session}, details={details}) {method}', method=hltype(RLinkLocalSession.onLeave), realm=hluserid(self.config.realm), authid=hluserid(self._authid), authrole=hluserid(self._authrole), details=details, session=hlid(self._session_id)) BridgeSession.onLeave(self, details)
def onLeave(self, details): self.log.warn( '{klass}.onLeave(): rlink remote session left! (realm={realm}, authid={authid}, authrole={authrole}, session={session}, details={details}) {method}', klass=self.__class__.__name__, method=hltype(RLinkLocalSession.onLeave), realm=hluserid(self.config.realm), authid=hluserid(self._authid), authrole=hluserid(self._authrole), session=hlid(self._session_id), details=details) BridgeSession.onLeave(self, details)
def forward(node_oid, *args, **kwargs): # remove the calling origin details (do not forward those 1:1 at least - FIXME) kwargs.pop('details', None) # map the node OID (given as UUID string) to the node WAMP authid for .. node_authid = session.map_node_oid_to_authid(node_oid) # .. creating the remote URI to be used on the management uplink _remote_uri = remote_uri.format(node_id=node_authid) self.log.debug( 'Forwarding CFC {forward_type} on mrealm {realm} to node "{node_authid}" [node_oid={node_oid}, local=<{local_uri}>, remote=<{remote_uri}>]', forward_type=hl('CALL'), local_uri=hlid(local_uri), remote_uri=hlid(_remote_uri), node_oid=hlid(node_oid), node_authid=hluserid(node_authid), realm=hluserid(session._realm)) return session.call(_remote_uri, *args, **kwargs)
def onJoin(self, details): self.log.debug('{klass}.onJoin(details={details})', klass=self.__class__.__name__, details=details) assert self.config.extra and 'on_ready' in self.config.extra assert self.config.extra and 'other' in self.config.extra local = self.config.extra['other'] assert isinstance(local, RLinkLocalSession) self._exclude_authid = self.config.extra.get('exclude_authid', None) self._exclude_authrole = self.config.extra.get('exclude_authrole', None) # setup remote->local event forwarding forward_events = self.config.extra.get('forward_events', False) if forward_events: yield self._setup_event_forwarding(local) # setup remote->local invocation forwarding forward_invocations = self.config.extra.get('forward_invocations', False) if forward_invocations: yield self._setup_invocation_forwarding(local) self.log.info( '{klass}.onJoin(): rlink remote session ready (forward_events={forward_events}, forward_invocations={forward_invocations}, realm={realm}, authid={authid}, authrole={authrole}, session={session}) {method}', klass=self.__class__.__name__, method=hltype(RLinkRemoteSession.onJoin), forward_events=hluserid(forward_events), forward_invocations=hluserid(forward_invocations), realm=hluserid(details.realm), authid=hluserid(details.authid), authrole=hluserid(details.authrole), session=hlid(details.session)) # we are ready! on_ready = self.config.extra.get('on_ready', None) if on_ready and not on_ready.called: self.config.extra['on_ready'].callback(self)
def onLeave(self, details): # When the rlink is going down, make sure to unsubscribe to # all events that are subscribed on the local-leg. # This avoids duplicate events that would otherwise arrive # See: https://github.com/crossbario/crossbar/issues/1916 for k, v in self._subs.items(): if v['sub'].active: yield v['sub'].unsubscribe() self._subs = {} self.config.extra['other']._tracker.connected = False self.log.warn( '{klass}.onLeave(): rlink remote session left! (realm={realm}, authid={authid}, authrole={authrole}, session={session}, details={details}) {method}', klass=self.__class__.__name__, method=hltype(RLinkLocalSession.onLeave), realm=hluserid(self.config.realm), authid=hluserid(self._authid), authrole=hluserid(self._authrole), session=hlid(self._session_id), details=details) BridgeSession.onLeave(self, details)
def _configure_native_worker_router(self, worker_logname, worker_id, worker): yield self._configure_native_worker_common(worker_logname, worker_id, worker) # start realms on router for realm in worker.get('realms', []): # start realm if 'id' in realm: realm_id = realm['id'] else: realm_id = 'realm{:03d}'.format(self._realm_no) realm['id'] = realm_id self._realm_no += 1 self.log.info( "Order {worker_logname} to start Realm {realm_id}", worker_logname=worker_logname, realm_id=hlid(realm_id), ) yield self._controller.call( u'crossbar.worker.{}.start_router_realm'.format(worker_id), realm_id, realm, options=CallOptions()) self.log.info( "Ok, {worker_logname} has started Realm {realm_id}", worker_logname=worker_logname, realm_id=hlid(realm_id), ) # add roles to realm for role in realm.get('roles', []): if 'id' in role: role_id = role['id'] else: role_id = 'role{:03d}'.format(self._role_no) role['id'] = role_id self._role_no += 1 self.log.info( "Order Realm {realm_id} to start Role {role_id}", realm_id=hlid(realm_id), role_id=hlid(role_id), ) yield self._controller.call( u'crossbar.worker.{}.start_router_realm_role'.format( worker_id), realm_id, role_id, role, options=CallOptions()) self.log.info( "Ok, Realm {realm_id} has started Role {role_id}", realm_id=hlid(realm_id), role_id=hlid(role_id), ) # start components to run embedded in the router for component in worker.get('components', []): if 'id' in component: component_id = component['id'] else: component_id = 'component{:03d}'.format(self._component_no) component['id'] = component_id self._component_no += 1 yield self._controller.call( u'crossbar.worker.{}.start_router_component'.format(worker_id), component_id, component, options=CallOptions()) self.log.info( "{logname}: component '{component}' started", logname=worker_logname, component=component_id, ) # start transports on router for transport in worker.get('transports', []): if 'id' in transport: transport_id = transport['id'] else: transport_id = 'transport{:03d}'.format(self._transport_no) transport['id'] = transport_id self._transport_no += 1 add_paths_on_transport_create = False self.log.info( "Order {worker_logname} to start Transport {transport_id}", worker_logname=worker_logname, transport_id=hlid(transport_id), ) yield self._controller.call( u'crossbar.worker.{}.start_router_transport'.format(worker_id), transport_id, transport, create_paths=add_paths_on_transport_create, options=CallOptions()) self.log.info( "Ok, {worker_logname} has started Transport {transport_id}", worker_logname=worker_logname, transport_id=hlid(transport_id), ) if not add_paths_on_transport_create: if transport['type'] == 'web': paths = transport.get('paths', {}) elif transport['type'] == 'universal': paths = transport.get('web', {}).get('paths', {}) else: paths = None # Web service paths if paths: for path in sorted(paths): if path != '/': webservice = paths[path] if 'id' in webservice: webservice_id = webservice['id'] else: webservice_id = 'webservice{:03d}'.format( self._webservice_no) webservice['id'] = webservice_id self._webservice_no += 1 self.log.info( "Order Transport {transport_id} to start Web Service {webservice_id}", transport_id=hlid(transport_id), webservice_id=hlid(webservice_id), path=hluserid(path), ) yield self._controller.call( u'crossbar.worker.{}.start_web_transport_service' .format(worker_id), transport_id, path, webservice, options=CallOptions()) self.log.info( "Ok, Transport {transport_id} has started Web Service {webservice_id}", transport_id=hlid(transport_id), webservice_id=hlid(webservice_id), path=hluserid(path), )
def _configure_native_worker_proxy(self, worker_logname, worker_id, worker): yield self._configure_native_worker_common(worker_logname, worker_id, worker) # start transports on proxy for i, transport in enumerate(worker.get('transports', [])): if 'id' in transport: transport_id = transport['id'] else: transport_id = 'transport{:03d}'.format(i) transport['id'] = transport_id self.log.info( "Order {worker_logname} to start Transport {transport_id}", worker_logname=worker_logname, transport_id=hlid(transport_id), ) # XXX we're doing startup, and begining proxy workers -- # want to share the web-transport etc etc stuff between # these and otehr kinds of routers / transports yield self._controller.call('crossbar.worker.{}.start_proxy_transport'.format(worker_id), transport_id, transport, options=CallOptions()) if transport['type'] == 'web': paths = transport.get('paths', {}) elif transport['type'] in ('universal'): paths = transport.get('web', {}).get('paths', {}) else: paths = None # Web service paths if paths: for path in sorted(paths): if path != '/': webservice = paths[path] if 'id' in webservice: webservice_id = webservice['id'] else: webservice_id = 'webservice{:03d}'.format(self._webservice_no) webservice['id'] = webservice_id self._webservice_no += 1 self.log.info( "Order Transport {transport_id} to start Web Service {webservice_id}", transport_id=hlid(transport_id), webservice_id=hlid(webservice_id), path=hluserid(path), ) yield self._controller.call('crossbar.worker.{}.start_web_transport_service'.format(worker_id), transport_id, path, webservice, options=CallOptions()) self.log.info( "Ok, Transport {transport_id} has started Web Service {webservice_id}", transport_id=hlid(transport_id), webservice_id=hlid(webservice_id), path=hluserid(path), ) self.log.info( "Ok, {worker_logname} has started Transport {transport_id}", worker_logname=worker_logname, transport_id=hlid(transport_id), ) # set up backend connections on the proxy for i, connection_name in enumerate(worker.get('connections', {})): self.log.debug( "Starting connection {index}: {name}", index=i, name=connection_name, ) yield self._controller.call( 'crossbar.worker.{}.start_proxy_connection'.format(worker_id), connection_name, worker['connections'].get(connection_name, {}), ) # set up realms and roles on the proxy for i, realm_name in enumerate(worker.get('routes', {})): roles = worker['routes'][realm_name] for role_id, connections in roles.items(): if not isinstance(connections, list): connections = [connections] # used to be a single string, now a list of strings for connection_id in connections: self.log.debug( "Starting proxy realm route {realm}, {role} to {connection}", realm=realm_name, role=role_id, connection=connection_id, ) yield self._controller.call( 'crossbar.worker.{}.start_proxy_realm_route'.format(worker_id), realm_name, {role_id: connection_id}, )
def _configure_native_worker_router(self, worker_logname, worker_id, worker): yield self._configure_native_worker_common(worker_logname, worker_id, worker) # start realms on router for realm in worker.get('realms', []): # start realm if 'id' in realm: realm_id = realm['id'] else: realm_id = 'realm{:03d}'.format(self._realm_no) realm['id'] = realm_id self._realm_no += 1 self.log.info( "Order {worker_logname} to start Realm {realm_id}", worker_logname=worker_logname, realm_id=hlid(realm_id), ) yield self._controller.call('crossbar.worker.{}.start_router_realm'.format(worker_id), realm_id, realm, options=CallOptions()) self.log.info( "Ok, {worker_logname} has started Realm {realm_id}", worker_logname=worker_logname, realm_id=hlid(realm_id), ) # add roles to realm for role in realm.get('roles', []): if 'id' in role: role_id = role['id'] else: role_id = 'role{:03d}'.format(self._role_no) role['id'] = role_id self._role_no += 1 self.log.info( "Order Realm {realm_id} to start Role {role_id}", realm_id=hlid(realm_id), role_id=hlid(role_id), ) yield self._controller.call('crossbar.worker.{}.start_router_realm_role'.format(worker_id), realm_id, role_id, role, options=CallOptions()) self.log.info( "Ok, Realm {realm_id} has started Role {role_id}", realm_id=hlid(realm_id), role_id=hlid(role_id), ) # start components to run embedded in the router for component in worker.get('components', []): if 'id' in component: component_id = component['id'] else: component_id = 'component{:03d}'.format(self._component_no) component['id'] = component_id self._component_no += 1 yield self._controller.call('crossbar.worker.{}.start_router_component'.format(worker_id), component_id, component, options=CallOptions()) self.log.info( "{logname}: component '{component}' started", logname=worker_logname, component=component_id, ) # start transports on router for transport in worker.get('transports', []): if 'id' in transport: transport_id = transport['id'] else: transport_id = 'transport{:03d}'.format(self._transport_no) transport['id'] = transport_id self._transport_no += 1 add_paths_on_transport_create = False self.log.info( "Order {worker_logname} to start Transport {transport_id}", worker_logname=worker_logname, transport_id=hlid(transport_id), ) yield self._controller.call('crossbar.worker.{}.start_router_transport'.format(worker_id), transport_id, transport, create_paths=add_paths_on_transport_create, options=CallOptions()) self.log.info( "Ok, {worker_logname} has started Transport {transport_id}", worker_logname=worker_logname, transport_id=hlid(transport_id), ) if not add_paths_on_transport_create: if transport['type'] == 'web': paths = transport.get('paths', {}) elif transport['type'] in ('universal'): paths = transport.get('web', {}).get('paths', {}) else: paths = None # Web service paths if paths: for path in sorted(paths): if path != '/': webservice = paths[path] if 'id' in webservice: webservice_id = webservice['id'] else: webservice_id = 'webservice{:03d}'.format(self._webservice_no) webservice['id'] = webservice_id self._webservice_no += 1 self.log.info( "Order Transport {transport_id} to start Web Service {webservice_id}", transport_id=hlid(transport_id), webservice_id=hlid(webservice_id), path=hluserid(path), ) yield self._controller.call( 'crossbar.worker.{}.start_web_transport_service'.format(worker_id), transport_id, path, webservice, options=CallOptions()) self.log.info( "Ok, Transport {transport_id} has started Web Service {webservice_id}", transport_id=hlid(transport_id), webservice_id=hlid(webservice_id), path=hluserid(path), ) # start rlinks for realms dl = [] for realm in worker.get('realms', []): realm_id = realm['id'] for i, rlink in enumerate(realm.get('rlinks', [])): if 'id' in rlink: rlink_id = rlink['id'] else: rlink_id = 'rlink{:03d}'.format(i) rlink['id'] = rlink_id self.log.info( 'Starting router-to-router "{rlink_id}" on realm "{realm_id}" ..', realm_id=hlid(realm_id), rlink_id=hlid(rlink_id), ) d = self._controller.call('crossbar.worker.{}.start_router_realm_link'.format(worker_id), realm_id, rlink_id, rlink, options=CallOptions()) def done(_): self.log.info( 'Ok, router-to-router {rlink_id} started on realm "{realm_id}".', realm_id=hlid(realm_id), rlink_id=hlid(rlink_id), ) d.addCallback(done) dl.append(d) # FIXME: rlinks must be started without waiting for them to be established. otherwise the start of other stuff # is waiting for all rlinks to be up! d = gatherResults(dl)
def _configure_native_worker_proxy(self, worker_logname, worker_id, worker): yield self._configure_native_worker_common(worker_logname, worker_id, worker) # start transports on proxy for i, transport in enumerate(worker.get('transports', [])): if 'id' in transport: transport_id = transport['id'] else: transport_id = 'transport{:03d}'.format(i) transport['id'] = transport_id self.log.info( "Order {worker_logname} to start Transport {transport_id}", worker_logname=worker_logname, transport_id=hlid(transport_id), ) # XXX we're doing startup, and begining proxy workers -- # want to share the web-transport etc etc stuff between # these and otehr kinds of routers / transports yield self._controller.call( 'crossbar.worker.{}.start_proxy_transport'.format(worker_id), transport_id, transport, options=CallOptions()) if transport['type'] == 'web': paths = transport.get('paths', {}) elif transport['type'] in ('universal'): paths = transport.get('web', {}).get('paths', {}) else: paths = None # Web service paths if paths: for path in sorted(paths): if path != '/': webservice = paths[path] if 'id' in webservice: webservice_id = webservice['id'] else: webservice_id = 'webservice{:03d}'.format( self._webservice_no) webservice['id'] = webservice_id self._webservice_no += 1 self.log.info( "Order Transport {transport_id} to start Web Service {webservice_id}", transport_id=hlid(transport_id), webservice_id=hlid(webservice_id), path=hluserid(path), ) yield self._controller.call( 'crossbar.worker.{}.start_web_transport_service'. format(worker_id), transport_id, path, webservice, options=CallOptions()) self.log.info( "Ok, Transport {transport_id} has started Web Service {webservice_id}", transport_id=hlid(transport_id), webservice_id=hlid(webservice_id), path=hluserid(path), ) self.log.info( "Ok, {worker_logname} has started Transport {transport_id}", worker_logname=worker_logname, transport_id=hlid(transport_id), ) # set up backend connections on the proxy for i, connection_name in enumerate(worker.get('connections', {})): print(i, connection_name) yield self._controller.call( 'crossbar.worker.{}.start_proxy_connection'.format(worker_id), connection_name, worker['connections'].get(connection_name, {}), ) # set up realms and roles on the proxy for i, realm_name in enumerate(worker.get('routes', {})): print(i, realm_name) yield self._controller.call( 'crossbar.worker.{}.start_proxy_route'.format(worker_id), realm_name, worker['routes'].get(realm_name, {}), )
def _configure_native_worker_router(self, worker_logname, worker_id, worker): yield self._configure_native_worker_common(worker_logname, worker_id, worker) # start realms on router for realm in worker.get('realms', []): # start realm if 'id' in realm: realm_id = realm['id'] else: realm_id = 'realm{:03d}'.format(self._realm_no) realm['id'] = realm_id self._realm_no += 1 self.log.info( "Order {worker_logname} to start Realm {realm_id}", worker_logname=worker_logname, realm_id=hlid(realm_id), ) yield self._controller.call(u'crossbar.worker.{}.start_router_realm'.format(worker_id), realm_id, realm, options=CallOptions()) self.log.info( "Ok, {worker_logname} has started Realm {realm_id}", worker_logname=worker_logname, realm_id=hlid(realm_id), ) # add roles to realm for role in realm.get('roles', []): if 'id' in role: role_id = role['id'] else: role_id = 'role{:03d}'.format(self._role_no) role['id'] = role_id self._role_no += 1 self.log.info( "Order Realm {realm_id} to start Role {role_id}", realm_id=hlid(realm_id), role_id=hlid(role_id), ) yield self._controller.call(u'crossbar.worker.{}.start_router_realm_role'.format(worker_id), realm_id, role_id, role, options=CallOptions()) self.log.info( "Ok, Realm {realm_id} has started Role {role_id}", realm_id=hlid(realm_id), role_id=hlid(role_id), ) # start components to run embedded in the router for component in worker.get('components', []): if 'id' in component: component_id = component['id'] else: component_id = 'component{:03d}'.format(self._component_no) component['id'] = component_id self._component_no += 1 yield self._controller.call(u'crossbar.worker.{}.start_router_component'.format(worker_id), component_id, component, options=CallOptions()) self.log.info( "{logname}: component '{component}' started", logname=worker_logname, component=component_id, ) # start transports on router for transport in worker.get('transports', []): if 'id' in transport: transport_id = transport['id'] else: transport_id = 'transport{:03d}'.format(self._transport_no) transport['id'] = transport_id self._transport_no += 1 add_paths_on_transport_create = False self.log.info( "Order {worker_logname} to start Transport {transport_id}", worker_logname=worker_logname, transport_id=hlid(transport_id), ) yield self._controller.call(u'crossbar.worker.{}.start_router_transport'.format(worker_id), transport_id, transport, create_paths=add_paths_on_transport_create, options=CallOptions()) self.log.info( "Ok, {worker_logname} has started Transport {transport_id}", worker_logname=worker_logname, transport_id=hlid(transport_id), ) if not add_paths_on_transport_create: if transport['type'] == 'web': paths = transport.get('paths', {}) elif transport['type'] == 'universal': paths = transport.get('web', {}).get('paths', {}) else: paths = None # Web service paths if paths: for path in sorted(paths): if path != '/': webservice = paths[path] if 'id' in webservice: webservice_id = webservice['id'] else: webservice_id = 'webservice{:03d}'.format(self._webservice_no) webservice['id'] = webservice_id self._webservice_no += 1 self.log.info( "Order Transport {transport_id} to start Web Service {webservice_id}", transport_id=hlid(transport_id), webservice_id=hlid(webservice_id), path=hluserid(path), ) yield self._controller.call(u'crossbar.worker.{}.start_web_transport_service'.format(worker_id), transport_id, path, webservice, options=CallOptions()) self.log.info( "Ok, Transport {transport_id} has started Web Service {webservice_id}", transport_id=hlid(transport_id), webservice_id=hlid(webservice_id), path=hluserid(path), )