def test_topology_cognition(self): servers = [] addresses = [] #os.system('rm /tmp/fabnet_topology.db') try: for i in range(1900, 1900+NODES_COUNT): address = '127.0.0.1:%s'%i if not addresses: neighbour = None else: neighbour = random.choice(addresses) server = TestServerThread(i, neighbour) server.start() servers.append(server) addresses.append(address) time.sleep(1.5) time.sleep(1) packet = { 'method': 'TopologyCognition', 'sender': None, 'parameters': {}} packet_obj = FabnetPacketRequest(**packet) fri_client = FriClient() addr = random.choice(addresses) fri_client.call(addr, packet_obj) time.sleep(1) operator = OperatorClient('node%s'%addr.split(':')[-1]) home_dir = operator.get_home_dir() db = SafeJsonFile(os.path.join(home_dir, 'fabnet_topology.db')) nodes = db.read() print 'NODES LIST: %s'%str(nodes) for i in range(1900, 1900+NODES_COUNT): address = '127.0.0.1:%s'%i self.assertTrue(nodes.has_key(address)) self.assertTrue(len(nodes[address]['uppers']) >= 2) self.assertTrue(len(nodes[address]['superiors']) >= 2) self.assertEqual(nodes[address]['node_name'], 'node%s'%i) finally: for server in servers: if server: server.stop() server.join() time.sleep(1)
class OperationsManager: def __init__(self, operations_classes, server_name, key_storage=None): self.__operations = {} self.__op_stat = None self.operator_cl = OperatorClient(server_name) self.__self_address = self.operator_cl.get_self_address() home_dir = self.operator_cl.get_home_dir() if key_storage: cert = key_storage.get_node_cert() ckey = key_storage.get_node_cert_key() else: cert = ckey = None self.__fri_client = FriClient(bool(cert), cert, ckey) for op_class in operations_classes: if not issubclass(op_class, OperationBase): raise Exception('Class %s does not inherit OperationBase class'%op_class) logger.debug('registering %s operation class...'% op_class.__name__) lock = RLock() operation = op_class(self.operator_cl, self.__fri_client, self.__self_address, home_dir, lock) self.__operations[op_class.get_name()] = operation def set_operation_stat(self, op_stat): self.__op_stat = op_stat def process(self, packet, role): """process request fabnet packet @param packet - object of FabnetPacketRequest class @param role - requestor role (None for disable auth) """ t0 = None try: rcode = self.operator_cl.register_request(packet.message_id, packet.method, packet.sender) if rcode == RC_ALREADY_PROCESSED: return if packet.method == KEEP_ALIVE_METHOD: return FabnetPacketResponse(ret_code=rcode) if self.__op_stat is not None: t0 = datetime.now() operation_obj = self.__operations.get(packet.method, None) if operation_obj is None: if packet.is_multicast: #transit packet self.operator_cl.call_to_neighbours(packet.message_id, packet.method, packet.parameters, packet.is_multicast) return else: raise Exception('Method "%s" does not implemented! Available methods: %s'%(packet.method, self.__operations.keys())) operation_obj.check_role(role) packet.role = role logger.debug('processing %s'%packet) message_id = packet.message_id n_packet = operation_obj.before_resend(packet) if n_packet: self.operator_cl.call_to_neighbours(message_id, packet.method, packet.parameters, packet.is_multicast) s_packet = operation_obj.process(packet) if s_packet: s_packet.message_id = packet.message_id s_packet.from_node = self.__self_address return s_packet except PermissionDeniedException, err: return FabnetPacketResponse(from_node=self.__self_address, message_id=packet.message_id, ret_code=RC_PERMISSION_DENIED, ret_message='Permission denied!') except Exception, err: err_packet = FabnetPacketResponse(from_node=self.__self_address, message_id=packet.message_id, ret_code=1, ret_message= '[OpPROC] %s'%err) logger.write = logger.debug traceback.print_exc(file=logger) logger.error('[OperationsManager.process] %s'%err) return err_packet