예제 #1
0
    def test02_main(self):
        call_stack = []
        def call_node_simulator(nodeaddr, request):
            call_stack.append((nodeaddr, request.parameters['start_key'], request.parameters['end_key']))
            return 0, 'ok'

        operator = DHTOperator('127.0.0.1:1987', home_dir=TEST_FS_RANGE_DIR)

        operator.ranges_table.append(0, 99, 'first_range_holder')
        operator.ranges_table.append(100, 149, 'second_range_holder')
        operator.ranges_table.append(300, 499, 'third_range_holder')

        operator.call_node = call_node_simulator
        operator.start_as_dht_member()
        operator.start_as_dht_member()
        operator.start_as_dht_member()

        self.assertEqual(len(call_stack), 3)
        self.assertEqual(call_stack[0][0], 'third_range_holder')
        self.assertEqual(call_stack[0][1], 400)
        self.assertEqual(call_stack[0][2], 499)

        self.assertEqual(call_stack[1][0], 'first_range_holder')
        self.assertEqual(call_stack[1][1], 50)
        self.assertEqual(call_stack[1][2], 99)

        self.assertEqual(call_stack[2][0], 'second_range_holder')
        self.assertEqual(call_stack[2][1], 125)
        self.assertEqual(call_stack[2][2], 149)

        operator.start_as_dht_member() #wait timeout
        self.assertEqual(call_stack[3][0], 'second_range_holder')
        self.assertEqual(call_stack[3][1], 125)
        self.assertEqual(call_stack[3][2], 149)
        operator.stop()
예제 #2
0
    def test03_discovery_range(self):
        shutil.rmtree(TEST_FS_RANGE_DIR)
        os.mkdir(TEST_FS_RANGE_DIR)
        os.makedirs(os.path.join(TEST_FS_RANGE_DIR, 'dht_range', '%040x_%040x'%(0, 99)))

        call_stack = []
        def call_node_simulator(nodeaddr, request):
            call_stack.append((nodeaddr, request.parameters['start_key'], request.parameters['end_key']))
            return 0, 'ok'

        operator = DHTOperator('127.0.0.1:1987', home_dir=TEST_FS_RANGE_DIR)

        try:
            operator.ranges_table.append(0, 99, 'first_range_holder')
            mod_index = operator.ranges_table.get_mod_index()
            operator.ranges_table.append(100, 149, 'second_range_holder')
            operator.ranges_table.append(300, 499, 'third_range_holder')
            mod_index1 = operator.ranges_table.get_mod_index()
            self.assertNotEqual(mod_index, mod_index1)

            tbl_dump = operator.ranges_table.dump()
            operator.ranges_table.load(tbl_dump)
            mod_index2 = operator.ranges_table.get_mod_index()
            self.assertEqual(mod_index1, mod_index2)

            operator.call_node = call_node_simulator
            operator.start_as_dht_member()
            operator.start_as_dht_member()
            operator.start_as_dht_member()

            self.assertEqual(len(call_stack), 3)
            self.assertEqual(call_stack[0][0], 'first_range_holder')
            self.assertEqual(call_stack[0][1], 50)
            self.assertEqual(call_stack[0][2], 99)

            self.assertEqual(call_stack[1][0], 'third_range_holder')
            self.assertEqual(call_stack[1][1], 400)
            self.assertEqual(call_stack[1][2], 499)

            self.assertEqual(call_stack[2][0], 'second_range_holder')
            self.assertEqual(call_stack[2][1], 125)
            self.assertEqual(call_stack[2][2], 149)

            def call_node_error_simulator(nodeaddr, request):
                if nodeaddr == 'second_range_holder':
                    return 666, 'No route to host!'

                call_stack.append((nodeaddr, request.parameters['start_key'], request.parameters['end_key']))
                return 0, 'ok'
            operator.call_node = call_node_error_simulator
            operator.start_as_dht_member()
            self.assertEqual(call_stack[3][0], 'third_range_holder')
            self.assertEqual(call_stack[3][1], 400)
            self.assertEqual(call_stack[3][2], 499)
        finally:
            operator.stop()
예제 #3
0
    def test04_check_hash_table(self):
        call_stack = []
        def call_node_simulator(nodeaddr, request, sync):
            call_stack.append((nodeaddr, sync, request))
            return 0, 'ok'

        try:
            operator = DHTOperator('127.0.0.1:1987', home_dir=TEST_FS_RANGE_DIR)

            operator.ranges_table.append(0, 99, 'first_range_holder')
            operator.ranges_table.append(100, 149, 'second_range_holder')
            operator.ranges_table.append(300, 499, 'third_range_holder')

            operator.call_node = call_node_simulator
            operator.register_operation('CheckHashRangeTable', CheckHashRangeTableOperation)

            operator1 = DHTOperator('127.0.0.1:1986', home_dir=TEST_FS_RANGE_DIR)

            operator1.ranges_table.append(0, 99, 'first_range_holder')
            operator1.ranges_table.append(100, 149, 'second_range_holder')
            operator1.ranges_table.append(300, 499, 'third_range_holder')

            operator1.call_node = call_node_simulator
            operator1.register_operation('CheckHashRangeTable', CheckHashRangeTableOperation)

            mod_index = operator.ranges_table.get_mod_index()
            params = {'mod_index': mod_index}
            packet = FabnetPacketRequest(method='CheckHashRangeTable', sender=operator.self_address, parameters=params)
            resp = operator1.process(packet)
            self.assertEqual(resp.ret_code, 0)

            operator1.ranges_table.append(500, 599, 'forth_range_holder')

            packet = FabnetPacketRequest(method='CheckHashRangeTable', sender=operator.self_address, parameters=params)
            resp = operator1.process(packet)
            self.assertEqual(resp.ret_code, RC_NEED_UPDATE)
            callback_resp = resp

            mod_index = operator.ranges_table.get_mod_index()
            params = {'mod_index': mod_index}
            packet = FabnetPacketRequest(message_id=packet.message_id, method='CheckHashRangeTable', \
                                    sender=operator1.self_address, parameters=params)
            resp = operator.process(packet)
            self.assertEqual(resp.ret_code, 0, resp.ret_message)

            operator.callback(callback_resp)
            self.assertEqual(len(call_stack), 1)
            self.assertEqual(call_stack[0][0], '127.0.0.1:1986')
            self.assertEqual(call_stack[0][2].method, 'GetRangesTable')

            print 'GENERATE EXCEPTION'
            packet = FabnetPacketRequest(method='CheckHashRangeTable', sender=operator.self_address)
            resp = operator.process(packet)
            self.assertNotEqual(resp.ret_code, 0)
            self.assertNotEqual(resp.ret_code, RC_NEED_UPDATE)
        finally:
            operator.stop()
            operator1.stop()
예제 #4
0
    def run(self):
        address = '127.0.0.1:%s'%self.port
        operator = DHTOperator(address, self.home_dir, is_init_node=self.init_node, node_name=self.port)
        self.operator = operator

        operator.register_operation('ManageNeighbour', ManageNeighbour)
        operator.register_operation('DiscoveryOperation', DiscoveryOperation)
        operator.register_operation('TopologyCognition', TopologyCognition)

        operator.register_operation('GetRangeDataRequest', GetRangeDataRequestOperation)
        operator.register_operation('GetRangesTable', GetRangesTableOperation)
        operator.register_operation('PutDataBlock', PutDataBlockOperation)
        operator.register_operation('SplitRangeCancel', SplitRangeCancelOperation)
        operator.register_operation('SplitRangeRequest', SplitRangeRequestOperation)
        operator.register_operation('UpdateHashRangeTable', UpdateHashRangeTableOperation)
        operator.register_operation('CheckHashRangeTable', CheckHashRangeTableOperation)
        server = FriServer('0.0.0.0', self.port, operator, server_name='node_%s'%self.port)
        ret = server.start()
        if not ret:
            print 'ERROR: server does not started!'
            return

        self.stopped = False

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

        server.stop()