Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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)