diff --git a/cfg/multiplexer.cfg b/cfg/multiplexer.cfg index e06dc62..fe50017 100644 --- a/cfg/multiplexer.cfg +++ b/cfg/multiplexer.cfg @@ -1,7 +1,8 @@ -[node router] -type = router -description = router node +[NODE] +class = protocol.router.Router +id = multiplexer +description = multiplexer node nodes = ['localhost:5000', 'localhost:10769'] -[interface tcp] -bindto = 0.0.0.0:5001 +[INTERFACE] +uri = tcp://5000 diff --git a/cfg/router.cfg b/cfg/router.cfg index b0e182c..a25edfd 100644 --- a/cfg/router.cfg +++ b/cfg/router.cfg @@ -1,7 +1,8 @@ -[node router] -type = router +[NODE] +id = router +class = protocol.router.Router description = router node node = localhost:5000 -[interface tcp] -bindto = 0.0.0.0:5001 +[INTERFACE] +uri=tcp://5002 diff --git a/secop/protocol/router.py b/secop/protocol/router.py index 3d3c93a..c2e8303 100644 --- a/secop/protocol/router.py +++ b/secop/protocol/router.py @@ -43,7 +43,8 @@ from secop.lib.multievent import MultiEvent class SecopClient(secop.client.SecopClient): - DISCONNECTED = ('Communication failed', 'remote SEC node disconnected') + disconnectedExc = secop.errors.CommunicationFailedError('remote SEC node disconnected') + disconnectedError = (disconnectedExc.name, str(disconnectedExc)) def __init__(self, uri, log, dispatcher): self.dispatcher = dispatcher @@ -66,13 +67,14 @@ class SecopClient(secop.client.SecopClient): if not online: for key, (value, _, readerror) in self.cache.items(): if not readerror: - self.cache[key] = value, t, self.DISCONNECTED + self.cache[key] = value, t, self.disconnectedExc self.updateEvent(*key, *self.cache[key]) def descriptiveDataChange(self, module, data): if module is None: - self.log.error('descriptive data for node %r has changed', self.nodename) - self.dispatcher.restart() + self.dispatcher.restart() + self._shutdown = True + raise secop.errors.SECoPError('descriptive data for node %r has changed' % self.nodename) class Router(secop.protocol.dispatcher.Dispatcher): @@ -99,6 +101,8 @@ class Router(secop.protocol.dispatcher.Dispatcher): # register callbacks for node in self.nodes: node.register_callback(None, node.updateEvent, node.descriptiveDataChange, node.nodeStateChange) + + self.restart = srv.restart self.node_by_module = {} multievent = MultiEvent() for node in self.nodes: @@ -171,7 +175,7 @@ class Router(secop.protocol.dispatcher.Dispatcher): node = self.node_by_module[module] if node.online: return node.request(READREQUEST, specifier, data) - return ERRORPREFIX + READREQUEST, specifier, SecopClient.DISCONNECTED + (dict(t=node.disconnect_time),) + return ERRORPREFIX + READREQUEST, specifier, SecopClient.disconnectedError + (dict(t=node.disconnect_time),) def handle_change(self, conn, specifier, data): module = specifier.split(':')[0]