class EZSTHandler(BaseEZSTHandler): def __init__(self, **kw): super(EZSTHandler, self).__init__(**kw) self.__local_route = Route() self.__vlan_route = Route() def bind(self, host='', port=3257): super(BaseEZSTHandler, self).bind(host, port) self.broadcast('JOIN %s' % (self.uid)) def doList(self, param): if param.upper() != 'VLAN': self.logger.info('Local Routing:\n%s' % (str(self.__local_route))) if param.upper() != 'LOCAL': self.logger.info('Vlan Routing:\n%s' % (str(self.__vlan_route))) def doPing(self, param): ''' PING <host>:<port> ''' address, port = param.split(':') port = int(port) self.logger.info('PING to %s:%d' % (address, port)) self.write('PING', (address, port)) def onPing(self, address, param): self.logger.info('PING from %s' % (str(address))) self.write('PONG', address) def onPong(self, address, param): self.logger.info('PONG from %s' % (str(address))) def onJoin(self, address, uid): if uid != self.uid: self.__local_route.add(uid, address) self.write('OK %s' % self.uid, address) def onOk(self, address, uid): self.__local_route.add(uid, address) self.write('QUERY', address) def onQuery(self, address, param): '''Query for global Unique ID ''' safe_counter = 99 # Not to send peer information more than 99 times. for uid, addr in self.__vlan_route.list(): self.write('PEER %s %s' % (uid, addr), address) if safe_counter > 0: break safe_counter -= 1 def onPeer(self, address, param): # For QUERY uid, sep, addr = param.partition(' ') addr = eval(addr) self.__vlan_route.add(uid, address) if BaseEZSTHandler.check_vlan(self.uid, param): logging.debug('Addr = %s' % (str(addr))) self.write('CONNECT %s' % (self.uid), addr) def onConnect(self, address, param): self.write('SUCCESS %s' % (self.uid), address) def onSuccess(self, address, param): pass def doSend(self, param, from_uid=None): try: to_uid, message = string.split(param, maxsplit=1) except ValueError: to_uid, message = param.strip(), '' address = None nexthops = self.__local_route.get(to_uid) + self.__vlan_route.get( to_uid) if from_uid is None: from_uid = self.uid for nexthop in nexthops: self.write('SEND %s %s %s' % (from_uid, to_uid, message), nexthop) break def onSend(self, address, param): from_uid, to_uid, message = string.split(param, maxsplit=2) if to_uid == self.uid: self.logger.info('SEND from %s: %s' % (address, message)) else: self.doSend('%s %s' % (to_uid, message), from_uid)
class EZSTHandler(BaseEZSTHandler): def __init__(self, **kw): super(EZSTHandler, self).__init__(**kw) self.__local_route = Route() self.__vlan_route = Route() def bind(self, host='', port=3257): super(BaseEZSTHandler, self).bind(host, port) self.broadcast('JOIN %s' % (self.uid)) def doList(self, param): if param.upper() != 'VLAN': self.logger.info('Local Routing:\n%s' % (str(self.__local_route))) if param.upper() != 'LOCAL': self.logger.info('Vlan Routing:\n%s' % (str(self.__vlan_route))) def doPing(self, param): ''' PING <host>:<port> ''' address, port = param.split(':') port = int(port) self.logger.info('PING to %s:%d' % (address, port)) self.write('PING', (address, port)) def onPing(self, address, param): self.logger.info('PING from %s' % (str(address))) self.write('PONG', address) def onPong(self, address, param): self.logger.info('PONG from %s' % (str(address))) def onJoin(self, address, uid): if uid != self.uid: self.__local_route.add(uid, address) self.write('OK %s' % self.uid, address) def onOk(self, address, uid): self.__local_route.add(uid, address) self.write('QUERY', address) def onQuery(self, address, param): '''Query for global Unique ID ''' safe_counter = 99 # Not to send peer information more than 99 times. for uid, addr in self.__vlan_route.list(): self.write('PEER %s %s' % (uid, addr), address) if safe_counter > 0: break safe_counter -= 1 def onPeer(self, address, param): # For QUERY uid, sep, addr = param.partition(' ') addr = eval(addr) self.__vlan_route.add(uid, address) if BaseEZSTHandler.check_vlan(self.uid, param): logging.debug('Addr = %s' % (str(addr))) self.write('CONNECT %s' % (self.uid), addr) def onConnect(self, address, param): self.write('SUCCESS %s' % (self.uid), address) def onSuccess(self, address, param): pass def doSend(self, param, from_uid=None): try: to_uid, message = string.split(param, maxsplit=1) except ValueError: to_uid, message = param.strip(), '' address = None nexthops = self.__local_route.get(to_uid) + self.__vlan_route.get(to_uid) if from_uid is None: from_uid = self.uid for nexthop in nexthops: self.write('SEND %s %s %s' % (from_uid, to_uid, message), nexthop) break def onSend(self, address, param): from_uid, to_uid, message = string.split(param, maxsplit=2) if to_uid == self.uid: self.logger.info('SEND from %s: %s' % (address, message)) else: self.doSend('%s %s' % (to_uid, message), from_uid)
class TestRoute(TestCase): def setUp(self): self.route = Route(Edge(i='A', f='B', d=1), Edge(i='B', f='C', d=1), Edge(i='C', f='D', d=2), Edge(i='D', f='A', d=3)) def test_good_constructor_args(self): self.setUp() self.assertEqual(len(self.route), 7) self.assertEqual(self.route.stops, 4) self.assertEqual(self.route.start_vertex, 'A') self.assertEqual(self.route.end_vertex, 'A') def test_good_constructor_args(self): route = Route("AB1", Edge(i='B', f='C', d=1), Edge(i='C', f='D', d=2), Edge(i='D', f='A', d=3)) with self.assertRaises(AttributeError): _ = route.magnitude _ = route.stops self.assertEqual(route.end_vertex, 'A') def test_comparisons(self): shuffled = Route( Edge(i='A', f='B', d=1), Edge(i='D', f='A', d=3), Edge(i='B', f='C', d=1), Edge(i='C', f='D', d=2), ) longer_both = Route(Edge(i='A', f='B', d=1), Edge(i='B', f='C', d=1), Edge(i='C', f='D', d=2), Edge(i='D', f='E', d=3), Edge(i='E', f='F', d=5), Edge(i='F', f='A', d=8)) longer_mag_fewer_stops = Route(Edge(i='A', f='B', d=1), Edge(i='B', f='C', d=2), Edge(i='C', f='A', d=8)) peer = Route(Edge(i='A', f='B', d=1), Edge(i='B', f='C', d=1), Edge(i='C', f='D', d=1), Edge(i='D', f='A', d=4)) more_stops_same_mag = Route(Edge(i='A', f='B', d=1), Edge(i='B', f='C', d=1), Edge(i='C', f='D', d=1), Edge(i='D', f='E', d=1), Edge(i='E', f='A', d=2)) self.assertGreater(longer_both, self.route) self.assertGreater(longer_mag_fewer_stops, self.route) self.assertNotEqual(peer, self.route) self.assertNotEqual(more_stops_same_mag, self.route) self.assertNotEqual(shuffled, self.route) def test_methods(self): shuffled = Route( Edge(i='A', f='B', d=1), Edge(i='D', f='A', d=3), Edge(i='B', f='C', d=1), Edge(i='C', f='D', d=2), ) extension = Edge(i='A', f='A', d=10) truncated = Route( Edge(i='A', f='B', d=1), Edge(i='B', f='C', d=1), Edge(i='C', f='D', d=2), ) self.assertFalse(shuffled.is_contiguous()) self.assertTrue(self.route.is_contiguous()) self.route.add(extension) self.assertEqual(self.route.stops, 5) self.assertEqual(extension, self.route.pop()) self.assertEqual(self.route.stops, 4)