def stop_router_realm_link(self, realm_id, link_id, details=None): """ Stop a currently running router link. :param realm_id: The ID of the (local) realm on which the link is running that is to be stopped. :type realm_id: str :param link_id: The ID of the router link to stop. :type link_id: str :returns: The stopped link detail information. :rtype: dict """ assert type(realm_id) == str assert type(link_id) == str assert isinstance(details, CallDetails) self.log.info( '{method} Router link {link_id} stopping on realm {realm_id}', link_id=hlid(link_id), realm_id=hlid(realm_id), method=hltype(RouterController.stop_router_realm_link)) if realm_id not in self.realms: raise ApplicationError('crossbar.error.no_such_object', 'no realm with ID {}'.format(realm_id)) rlink_manager = self.realms[realm_id].rlink_manager if link_id not in self.rlink_manager: raise ApplicationError('crossbar.error.no_such_object', 'no router link with ID {}'.format(link_id)) caller = SessionIdent.from_calldetails(details) rlink = yield rlink_manager.stop_link(link_id, caller) stopped = rlink.marshal() self.publish( '{}.on_router_realm_link_stopped'.format(self._uri_prefix), stopped) self.log.info('Router link {link_id} stopped', link_id=hlid(link_id)) returnValue(stopped)
def start_router_realm_link(self, realm_id, link_id, link_config, details=None): """ Start a new router link to a remote router on a (local) realm. The link configuration (``link_config``) must include the transport definition to the remote router. Here is an example: .. code-block:: json { "realm": "realm1", "transport": { "type": "websocket", "endpoint": { "type": "tcp", "host": "localhost", "port": 8002 }, "url": "ws://localhost:8002/ws" } } :param realm_id: The ID of the (local) realm on which to start the link. :type realm_id: str :param link_id: The ID of the router link to start. :type link_id: str :param link_config: The router link configuration. :type link_config: dict :returns: The new link detail information. :rtype: dict """ assert type(realm_id) == str assert type(link_id) == str assert type(link_config) == dict assert isinstance(details, CallDetails) self.log.info( 'Router link {link_id} starting on realm {realm_id} {method}', link_id=hlid(link_id), realm_id=hlid(realm_id), method=hltype(RouterController.start_router_realm_link)) if realm_id not in self.realms: raise ApplicationError('crossbar.error.no_such_object', 'no realm with ID {}'.format(realm_id)) rlink_manager = self.realms[realm_id].rlink_manager if link_id in rlink_manager: raise ApplicationError('crossbar.error.already_running', 'router link {} already running'.format(link_id)) link_config = RLinkConfig.parse(self.personality, link_config, id=link_id) caller = SessionIdent.from_calldetails(details) rlink = yield rlink_manager.start_link(link_id, link_config, caller) started = rlink.marshal() self.publish('{}.on_router_realm_link_started'.format(self._uri_prefix), started) self.log.info('Router link {link_id} started', link_id=hlid(link_id)) returnValue(started)