Пример #1
0
 def echo_worker(name, err_queue):
     cl = OperatorClient('test_node')
     msg = 'Hello, I am %s'%name
     for i in xrange(100):
         ret_msg = cl.echo(msg)
         if ret_msg != msg:
             error = '%s != %s'%(ret_msg, msg)
             print 'ERROR: %s'%error
             err_queue.put(error)
Пример #2
0
    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)
Пример #3
0
    def run(self):
        os.system('cp ./tests/ks/certs.ca %s'%self.home_dir)
        address = '127.0.0.1:%s'%self.port
        if self.is_monitor:
            node_type = 'TestMonitor'
        else:
            node_type = 'DHT'

        config = {'INIT_DHT_WAIT_NEIGHBOUR_TIMEOUT': 0.1,
                 'MONITOR_DHT_RANGES_TIMEOUT': 1,
                 'CHECK_HASH_TABLE_TIMEOUT': 1,
                 'WAIT_FILE_MD_TIMEDELTA': 0.1,
                 'WAIT_DHT_TABLE_UPDATE': 0.2}
        config.update(self.config)

        node = Node('127.0.0.1', self.port, self.home_dir, 'node_%s'%self.port,
                    ks_path=self.ks_path, ks_passwd=PASSWD, node_type=node_type, config=config)
        node.set_auth_key(None)
        node.start(self.neighbour)

        self.__lock.acquire()
        try:
            self.operator = OperatorClient('node_%s'%self.port)
            self.stopped = False
        finally:
            self.__lock.release()

        while not self.stopped:
            time.sleep(0.1)

        node.stop()
Пример #4
0
    def test01_ret_struct(self):
        proc = OperatorProcess(Operator, None, None, None, None, server_name='test_node')
        proc.start()
        time.sleep(1)
        try:
            cl = OperatorClient('test_node')
            ret = cl.test_ret_struct('test message', 123456)
            self.assertEqual(len(ret), 2)
            self.assertEqual(ret[0], 'str_param=test message, int_param=123456')
            self.assertEqual(ret[1],  {'s':'test message', 'i':123456})

            ret = cl.test_object(FabnetPacketRequest(method='TestMethod', parameters={'tst': 213}))
            self.assertEqual(ret.ret_code, 0, ret.ret_message)

            try:
                cl.raise_exception('test exception')
            except Exception, err:
                from fabnet.core.fri_base import FriException
                self.assertEqual(err.__class__, FriException)
                self.assertEqual(str(err), 'test exception')
            else:
Пример #5
0
    def __init__(self, operations_classes, server_name, key_storage=None, op_auth_key=None):
        self.__operations = {}

        self.operator_cl = OperatorClient(server_name, op_auth_key)
        self.__self_address = self.operator_cl.get_self_address()
        home_dir = self.operator_cl.get_home_dir()

        self.__key_storage = key_storage
        self.__fri_client = FriClient(key_storage)

        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)
            operation.get_operation_object = self.__get_operation_object
            self.__operations[op_class.get_name()] = operation
Пример #6
0
    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
Пример #7
0
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
Пример #8
0
    def test_discovery_operation(self):
        server1 = server2 = server3 = None
        #os.system('rm /tmp/fabnet_topology.db')
        try:
            server1 = TestServerThread(1986)
            server1.start()
            server2 = TestServerThread(1987, '127.0.0.1:1986')
            time.sleep(1.5)
            server2.start()
            server3 = TestServerThread(1988, '127.0.0.1:1986')
            time.sleep(1.5)
            server3.start()

            time.sleep(2.5)

            operator = OperatorClient('node1986')
            operator1 = OperatorClient('node1987')
            operator2 = OperatorClient('node1988')

            self.assertEqual(sorted(operator.get_neighbours(NT_UPPER)), ['127.0.0.1:1987', '127.0.0.1:1988'])
            self.assertEqual(sorted(operator.get_neighbours(NT_SUPERIOR)), ['127.0.0.1:1987', '127.0.0.1:1988'])
            self.assertEqual(sorted(operator1.get_neighbours(NT_UPPER)), ['127.0.0.1:1986', '127.0.0.1:1988'])
            self.assertEqual(sorted(operator1.get_neighbours(NT_SUPERIOR)), ['127.0.0.1:1986', '127.0.0.1:1988'])
            self.assertEqual(sorted(operator2.get_neighbours(NT_UPPER)), ['127.0.0.1:1986', '127.0.0.1:1987'])
            self.assertEqual(sorted(operator2.get_neighbours(NT_SUPERIOR)), ['127.0.0.1:1986', '127.0.0.1:1987'])

            server1.stop()
            server1.join()
            server1 = None
            time.sleep(2)
            self.assertEqual(operator1.get_neighbours(NT_UPPER), ['127.0.0.1:1988'])
            self.assertEqual(operator1.get_neighbours(NT_SUPERIOR), ['127.0.0.1:1988'])
            self.assertEqual(operator2.get_neighbours(NT_UPPER), ['127.0.0.1:1987'])
            self.assertEqual(operator2.get_neighbours(NT_SUPERIOR), ['127.0.0.1:1987'])
        finally:
            try:
                if server1:
                    server1.stop()
                    server1.join()
            except Exception, err:
                print 'ERROR while stopping server1: %s'%err
            time.sleep(1)
            try:
                if server2:
                    server2.stop()
                    server2.join()
            except Exception, err:
                print 'ERROR while stopping server2: %s'%err
Пример #9
0
class TestServerThread(threading.Thread):
    def __init__(self, port, home_dir, neighbour=None, is_monitor=False, \
                                config={}, ks_path='', clear_home=True):
        threading.Thread.__init__(self)
        if clear_home and os.path.exists(home_dir):
            shutil.rmtree(home_dir)
        if not os.path.exists(home_dir):
            os.mkdir(home_dir)

        self.port = port
        self.home_dir = home_dir
        self.stopped = True
        self.operator = None
        self.neighbour = neighbour
        self.config = config
        self.is_monitor = is_monitor
        self.ks_path = ks_path
        self.ks = None if not ks_path else init_keystore(ks_path, PASSWD)
        self.__lock = threading.Lock()

    def run(self):
        os.system('cp ./tests/ks/certs.ca %s'%self.home_dir)
        address = '127.0.0.1:%s'%self.port
        if self.is_monitor:
            node_type = 'TestMonitor'
        else:
            node_type = 'DHT'

        config = {'INIT_DHT_WAIT_NEIGHBOUR_TIMEOUT': 0.1,
                 'MONITOR_DHT_RANGES_TIMEOUT': 1,
                 'CHECK_HASH_TABLE_TIMEOUT': 1,
                 'WAIT_FILE_MD_TIMEDELTA': 0.1,
                 'WAIT_DHT_TABLE_UPDATE': 0.2}
        config.update(self.config)

        node = Node('127.0.0.1', self.port, self.home_dir, 'node_%s'%self.port,
                    ks_path=self.ks_path, ks_passwd=PASSWD, node_type=node_type, config=config)
        node.set_auth_key(None)
        node.start(self.neighbour)

        self.__lock.acquire()
        try:
            self.operator = OperatorClient('node_%s'%self.port)
            self.stopped = False
        finally:
            self.__lock.release()

        while not self.stopped:
            time.sleep(0.1)

        node.stop()

    def stop(self):
        self.stopped = True
        self.join()

    def wait_oper_status(self, status, errmsg=''):
        for i in xrange(20):
            if self.get_status() == status:
                return
            time.sleep(.25)
        raise Exception('[%s].wait_oper_status(%s) timeouted! %s'%(self.port, status, errmsg))

    def get_range_dir(self):
        return os.path.join(self.home_dir, 'dht_range/%s'%FSMappedDHTRange.DBCT_MASTER)

    def get_replicas_dir(self):
        return os.path.join(self.home_dir, 'dht_range/%s'%FSMappedDHTRange.DBCT_REPLICA)

    def get_tmp_dir(self):
        return os.path.join(self.home_dir, 'dht_range/%s'%FSMappedDHTRange.DBCT_TEMP)

    def get_stat(self):
        packet_obj = FabnetPacketRequest(method='NodeStatistic')

        client = FriClient(self.ks)
        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet_obj)
        if ret_packet.ret_code != 0:
            raise Exception('cant get node statistic. details: %s'%ret_packet.ret_message)
        return ret_packet.ret_parameters

    def get_status(self):
        self.__lock.acquire()
        try:
            if self.operator is None:
                return None
            return self.operator.get_status()
        finally:
            self.__lock.release()

    def put_data_block(self, data, key, dbct=FSMappedDHTRange.DBCT_MASTER, user_id_hash='', \
                careful_save=False, init_block=False, stored_unixtime=None):

        params = {'key': key, 'dbct': dbct, 'user_id_hash': user_id_hash, 'init_block': init_block,\
                'carefully_save': careful_save, 'stored_unixtime': stored_unixtime}

        req = FabnetPacketRequest(method='PutDataBlock',\
                            binary_data=data, parameters=params)

        client = FriClient(self.ks)
        resp = client.call_sync('127.0.0.1:%s'%self.port, req)
        return resp


    def put(self, data, wait_writes=3, init_block=True, client_ks=None, key=None, replica_count=2):
        if not client_ks:
            client_ks = self.ks
        client = FriClient(client_ks)

        params = {'wait_writes_count': wait_writes, 'replica_count': replica_count, \
                'init_block': init_block, 'key': key}
        data = RamBasedBinaryData(data, 20)
        packet_obj = FabnetPacketRequest(method='ClientPutData', parameters=params, binary_data=data, sync=True)
        #print '========SENDING DATA BLOCK %s (%s chunks)'%(packet_obj, data.chunks_count())

        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet_obj)
        #print '========SENDED DATA BLOCK'
        return ret_packet

    def get_keys_info(self, key, replica_count=2):
        client = FriClient(self.ks)
        packet = FabnetPacketRequest(method='GetKeysInfo', \
                parameters={'key': key, 'replica_count': replica_count}, sync=True)

        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet)
        if ret_packet.ret_code != 0:
            raise Exception('GetKeysInfo error: %s'%ret_packet.ret_message)
        keys_info = ret_packet.ret_parameters['keys_info']
        return keys_info

    def get_data_block(self, key, dbct=FSMappedDHTRange.DBCT_MASTER, client_ks=None, user_id_hash=''):
        params = {'key': key, 'dbct': dbct, 'user_id_hash': user_id_hash}
        req = FabnetPacketRequest(method='GetDataBlock', parameters=params)

        client = FriClient(client_ks)
        resp = client.call_sync('127.0.0.1:%s'%self.port, req)
        return resp

    def delete(self, key, client_ks=None, replica_count=2):
        client = FriClient(client_ks)
        params = {'key': key, 'replica_count': replica_count}
        packet_obj = FabnetPacketRequest(method='ClientDeleteData', parameters=params, sync=True)

        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet_obj)
        return ret_packet

    def check_data_block(self, key, dbct=FSMappedDHTRange.DBCT_MASTER, checksum=None):
        client = FriClient(self.ks)
        params = {'key': key, 'dbct': dbct, 'checksum': checksum}
        packet_obj = FabnetPacketRequest(method='CheckDataBlock', parameters=params)
        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet_obj) 
        return ret_packet

    def update_user_md(self, user_id_hash, storage_size):
        client = FriClient(self.ks)
        params = {'user_id_hash': user_id_hash, 'storage_size': storage_size}
        packet_obj = FabnetPacketRequest(method='UpdateUserProfile', parameters=params)
        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet_obj) 
        return ret_packet

    def update_md(self, user_id_hash, add_list, rm_list=[]):
        client = FriClient(self.ks)
        params = {'user_id_hash': user_id_hash, 'add_list': add_list, 'rm_list': rm_list}
        packet_obj = FabnetPacketRequest(method='UpdateMetadata', parameters=params)
        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet_obj) 
        return ret_packet

    def put_object_part(self, obj_path, data, seek=0, wait_writes=3, init_block=True, client_ks=None, key=None, replica_count=2):
        if not client_ks:
            client_ks = self.ks
        client = FriClient(client_ks)

        params = {'wait_writes_count': wait_writes, 'replica_count': replica_count, \
                'init_block': init_block, 'key': key, 'obj_path': obj_path, 'seek': seek}
        data = RamBasedBinaryData(data, 20)
        packet_obj = FabnetPacketRequest(method='PutObjectPart', parameters=params, binary_data=data, sync=True)
        #print '========SENDING DATA BLOCK %s (%s chunks)'%(packet_obj, data.chunks_count())

        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet_obj)
        #print '========SENDED DATA BLOCK'
        return ret_packet

    def get_object_info(self, obj_path, client_ks, req_user_info=True):
        params = {'obj_path': obj_path, 'req_user_info': req_user_info}
        req = FabnetPacketRequest(method='GetObjectInfo', parameters=params)

        client = FriClient(client_ks)
        resp = client.call_sync('127.0.0.1:%s'%self.port, req)
        return resp



    def get(self, key, client_ks=None):
        client = FriClient(client_ks)

        params = {'key': key, 'replica_count': 2}
        packet_obj = FabnetPacketRequest(method='ClientGetData', parameters=params, sync=True)

        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet_obj)
        return ret_packet
Пример #10
0
class TestServerThread(threading.Thread):
    SESSION_ID = 1234322321
    def __init__(self, port, home_dir, neighbour=None, is_monitor=False, config={}):
        threading.Thread.__init__(self)
        self.port = port
        self.home_dir = home_dir
        self.stopped = True
        self.operator = None
        self.neighbour = neighbour
        self.config = config
        self.is_monitor = is_monitor
        self.__lock = threading.Lock()

    def run(self):
        address = '127.0.0.1:%s'%self.port
        if self.is_monitor:
            node_type = 'Monitor'
        else:
            node_type = 'DHT'

        config = {'WAIT_RANGE_TIMEOUT': 0.1,
                 'INIT_DHT_WAIT_NEIGHBOUR_TIMEOUT': 0.1,
                 'MONITOR_DHT_RANGES_TIMEOUT': 1,
                 'CHECK_HASH_TABLE_TIMEOUT': 1,
                 'WAIT_FILE_MD_TIMEDELTA': 0.1,
                 'WAIT_DHT_TABLE_UPDATE': 0.2}
        config.update(self.config)

        node = Node('127.0.0.1', self.port, self.home_dir, 'node_%s'%self.port,
                    ks_path=None, ks_passwd=None, node_type=node_type, config=config)
        node.start(self.neighbour)

        self.__lock.acquire()
        try:
            self.operator = OperatorClient('node_%s'%self.port)
            self.stopped = False
        finally:
            self.__lock.release()

        while not self.stopped:
            time.sleep(0.1)

        node.stop()

    def stop(self):
        self.stopped = True
        self.join()

    def get_stat(self):
        packet_obj = FabnetPacketRequest(method='NodeStatistic', sync=True)

        client = FriClient()
        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet_obj)
        if ret_packet.ret_code != 0:
            raise Exception('cant get node statistic. details: %s'%ret_packet.ret_message)
        return ret_packet.ret_parameters

    def put_data_block(self, data, key, is_replica=False, npkey=False, user_id=0):
        checksum = hashlib.sha1(data).hexdigest()
        params = {'key': key, 'checksum': checksum, 'is_replica':is_replica, \
                'carefully_save': True, 'replica_count': 2, 'user_id': user_id}

        if not npkey:
            params['primary_key'] = key

        req = FabnetPacketRequest(method='PutDataBlock',\
                            binary_data=data, sync=True,
                            parameters=params)
        client = FriClient()
        resp = client.call_sync('127.0.0.1:%s'%self.port, req)
        return resp


    def get_data_block(self, key, is_replica=False, user_id=0):
        params = {'key': key, 'is_replica':is_replica}
        req = FabnetPacketRequest(method='GetDataBlock',\
                            sync=True, parameters=params)
        client = FriClient(session_id=user_id or self.SESSION_ID)
        resp = client.call_sync('127.0.0.1:%s'%self.port, req)
        if resp.ret_code == constants.RC_NO_DATA:
            return None
        if resp.ret_code != 0:
            raise Exception('GetDataBlock operation failed on %s. Details: %s'%('127.0.0.1:%s'%self.port, resp.ret_message))
        return resp.binary_data

    def put(self, data, wait_writes=3):
        client = FriClient(session_id=self.SESSION_ID)
        checksum = hashlib.sha1(data).hexdigest()

        params = {'checksum': checksum, 'wait_writes_count': wait_writes, 'replica_count':2}
        data = RamBasedBinaryData(data, 20)
        packet_obj = FabnetPacketRequest(method='ClientPutData', parameters=params, binary_data=data, sync=True)
        #print '========SENDING DATA BLOCK %s (%s chunks)'%(packet_obj, data.chunks_count())

        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet_obj)
        #print '========SENDED DATA BLOCK'
        if ret_packet.ret_code != 0:
            raise Exception('put data failed: %s'%ret_packet.ret_message)
        return ret_packet.ret_parameters['key']

    def get(self, key):
        client = FriClient(session_id=self.SESSION_ID)

        params = {'key': key, 'replica_count': 2}
        packet_obj = FabnetPacketRequest(method='ClientGetData', parameters=params, sync=True)

        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet_obj)
        return ret_packet

    def delete(self, key, session_id=None):
        client = FriClient(session_id=session_id or self.SESSION_ID)
        params = {'key': key, 'replica_count': 2}
        packet_obj = FabnetPacketRequest(method='ClientDeleteData', parameters=params, sync=True)

        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet_obj)
        return ret_packet

    def get_range_dir(self):
        stat = self.get_stat()
        h_start = stat['DHTInfo']['range_start']
        h_end = stat['DHTInfo']['range_end']
        return os.path.join(self.home_dir, 'dht_range/%s_%s'%(h_start, h_end))

    def get_keys_info(self, key):
        client = FriClient(session_id=self.SESSION_ID)
        packet = FabnetPacketRequest(method='GetKeysInfo', \
                parameters={'key': key, 'replica_count': 2}, sync=True)

        ret_packet = client.call_sync('127.0.0.1:%s'%self.port, packet)
        keys_info = ret_packet.ret_parameters['keys_info']
        return keys_info
    
    def get_replicas_dir(self):
        return os.path.join(self.home_dir, 'dht_range/replica_data')

    def get_tmp_dir(self):
        return os.path.join(self.home_dir, 'dht_range/tmp')

    def get_status(self):
        self.__lock.acquire()
        try:
            if self.operator is None:
                return None
            return self.operator.get_status()
        finally:
            self.__lock.release()