示例#1
0
def test_identity_rotate_customer_2_when_id_server_is_dead():
    if os.environ.get('RUN_TESTS', '1') == '0':
        return pytest.skip()  # @UndefinedVariable

    service_info_v1('customer-2', 'service_customer', 'ON')

    supplier_list_v1('customer-2',
                     expected_min_suppliers=2,
                     expected_max_suppliers=2)

    service_info_v1('customer-2', 'service_shared_data', 'ON')

    r = identity_get_v1('customer-2')
    old_idurl = r['result']['idurl']

    config_set_v1('customer-2',
                  'services/identity-propagate/automatic-rotate-enabled',
                  'true')

    config_set_v1(
        'customer-2', 'services/identity-propagate/known-servers',
        'id-dead:8084:6661,id-a:8084:6661,id-b:8084:6661,id-c:8084:6661')

    stop_daemon('id-dead')

    for i in range(20):
        r = identity_get_v1('customer-2')
        new_idurl = r['result']['idurl']
        if new_idurl != old_idurl:
            break
        time.sleep(5)
    else:
        assert False, 'customer-2 automatic identity rotate did not happen after many attempts'
示例#2
0
def test_customer_family_increase_decrese_customer_1():
    if os.environ.get('RUN_TESTS', '1') == '0':
        return pytest.skip()  # @UndefinedVariable

    packet_list_v1('supplier-1', wait_all_finish=True)
    packet_list_v1('supplier-2', wait_all_finish=True)
    packet_list_v1('supplier-3', wait_all_finish=True)
    packet_list_v1('supplier-4', wait_all_finish=True)
    packet_list_v1('supplier-5', wait_all_finish=True)
    packet_list_v1('supplier-6', wait_all_finish=True)
    packet_list_v1('supplier-7', wait_all_finish=True)
    packet_list_v1('supplier-8', wait_all_finish=True)

    packet_list_v1('customer-1', wait_all_finish=True)

    transfer_list_v1('customer-1', wait_all_finish=True)

    supplier_list_v1('customer-1',
                     expected_min_suppliers=2,
                     expected_max_suppliers=2)

    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=[
            'customer-1@id-a_8084',
            'customer-3@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )
    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=[
            'customer-3@id-a_8084',
            'customer-1@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )
    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=[
            'supplier-2@id-a_8084',
            'customer-3@id-a_8084',
            'customer-1@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    config_set_v1('customer-1', 'services/customer/suppliers-number', '4')

    packet_list_v1('supplier-1', wait_all_finish=True)
    packet_list_v1('supplier-2', wait_all_finish=True)
    packet_list_v1('supplier-3', wait_all_finish=True)
    packet_list_v1('supplier-4', wait_all_finish=True)
    packet_list_v1('supplier-5', wait_all_finish=True)
    packet_list_v1('supplier-6', wait_all_finish=True)
    packet_list_v1('supplier-7', wait_all_finish=True)
    packet_list_v1('supplier-8', wait_all_finish=True)

    supplier_list_v1('customer-1',
                     expected_min_suppliers=4,
                     expected_max_suppliers=4)

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=[
            'customer-1@id-a_8084',
            'customer-3@id-a_8084',
        ],
        expected_ecc_map='ecc/4x4',
        expected_suppliers_number=4,
    )
    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=[
            'customer-3@id-a_8084',
            'customer-1@id-a_8084',
        ],
        expected_ecc_map='ecc/4x4',
        expected_suppliers_number=4,
    )
    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=[
            'supplier-2@id-a_8084',
            'customer-3@id-a_8084',
            'customer-1@id-a_8084',
        ],
        expected_ecc_map='ecc/4x4',
        expected_suppliers_number=4,
    )

    config_set_v1('customer-1', 'services/customer/suppliers-number', '2')

    packet_list_v1('supplier-1', wait_all_finish=True)
    packet_list_v1('supplier-2', wait_all_finish=True)
    packet_list_v1('supplier-3', wait_all_finish=True)
    packet_list_v1('supplier-4', wait_all_finish=True)
    packet_list_v1('supplier-5', wait_all_finish=True)
    packet_list_v1('supplier-6', wait_all_finish=True)
    packet_list_v1('supplier-7', wait_all_finish=True)
    packet_list_v1('supplier-8', wait_all_finish=True)

    supplier_list_v1('customer-1',
                     expected_min_suppliers=2,
                     expected_max_suppliers=2)

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=[
            'customer-1@id-a_8084',
            'customer-3@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )
    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=[
            'customer-3@id-a_8084',
            'customer-1@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )
    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=[
            'supplier-2@id-a_8084',
            'customer-3@id-a_8084',
            'customer-1@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )
示例#3
0
def test_customer_1_share_file_to_customer_2_same_name_as_existing():
    if os.environ.get('RUN_TESTS', '1') == '0':
        return pytest.skip()  # @UndefinedVariable

    supplier_list_v1('customer-1',
                     expected_min_suppliers=2,
                     expected_max_suppliers=2)
    supplier_list_v1('customer-2',
                     expected_min_suppliers=4,
                     expected_max_suppliers=4)

    service_info_v1('customer-1', 'service_shared_data', 'ON')
    service_info_v1('customer-2', 'service_shared_data', 'ON')

    # create shares (logic unit to upload/download/share files)
    share_id_customer_1 = share_create_v1('customer-1')
    share_id_customer_2 = share_create_v1('customer-2')

    filename = 'cat.txt'
    virtual_filename = filename

    volume_customer_1 = '/customer_1'
    filepath_customer_1 = f'{volume_customer_1}/{filename}'

    volume_customer_2 = '/customer_2'
    filepath_customer_2 = f'{volume_customer_2}/{filename}'

    run_ssh_command_and_wait('customer-1',
                             f'echo customer_1 > {filepath_customer_1}')
    run_ssh_command_and_wait('customer-2',
                             f'echo customer_2 > {filepath_customer_2}')

    remote_path_customer_1 = f'{share_id_customer_1}:{virtual_filename}'
    remote_path_customer_2 = f'{share_id_customer_2}:{virtual_filename}'

    # create virtual file for customer_1
    file_create_v1('customer-1', remote_path_customer_1)

    # create virtual file for customer_2
    file_create_v1('customer-2', remote_path_customer_2)

    # upload file for customer_1
    service_info_v1('customer-1', 'service_shared_data', 'ON')
    file_upload_start_v1('customer-1', remote_path_customer_1,
                         filepath_customer_1)

    # upload file for customer_2
    service_info_v1('customer-2', 'service_shared_data', 'ON')
    file_upload_start_v1('customer-2', remote_path_customer_2,
                         filepath_customer_2)

    packet_list_v1('customer-2', wait_all_finish=True)

    transfer_list_v1('customer-2', wait_all_finish=True)

    # wait for quite a while to allow files to be uploaded
    # time.sleep(5)

    service_info_v1('customer-1', 'service_shared_data', 'ON')
    file_download_start_v1('customer-1',
                           remote_path=remote_path_customer_1,
                           destination=volume_customer_1)

    service_info_v1('customer-2', 'service_shared_data', 'ON')
    file_download_start_v1('customer-2',
                           remote_path=remote_path_customer_2,
                           destination=volume_customer_2)

    service_info_v1('customer-2', 'service_shared_data', 'ON')

    packet_list_v1('customer-1', wait_all_finish=True)

    transfer_list_v1('customer-1', wait_all_finish=True)

    packet_list_v1('customer-2', wait_all_finish=True)

    transfer_list_v1('customer-2', wait_all_finish=True)

    response = request_put(
        'customer-1',
        'share/grant/v1',
        json={
            'trusted_global_id': 'customer-2@id-a_8084',
            'key_id': share_id_customer_1,
        },
        timeout=40,
    )
    assert response.status_code == 200
    assert response.json()['status'] == 'OK', response.json()
    print('\n\nshare/grant/v1 trusted_global_id=%s key_id=%s : %s\n' % (
        'customer-2@id-a_8084',
        share_id_customer_1,
        response.json(),
    ))

    response = request_get('customer-2', 'file/list/all/v1')
    assert response.status_code == 200, response.json()

    run_ssh_command_and_wait('customer-2',
                             f'mkdir {volume_customer_2}/sharesamename')
    run_ssh_command_and_wait('customer-2',
                             f'mkdir {volume_customer_2}/sharesamename2')

    service_info_v1('customer-2', 'service_shared_data', 'ON')
    file_download_start_v1('customer-2',
                           remote_path=remote_path_customer_1,
                           destination=f'{volume_customer_2}/sharesamename')

    service_info_v1('customer-2', 'service_shared_data', 'ON')
    file_download_start_v1('customer-2',
                           remote_path=remote_path_customer_2,
                           destination=f'{volume_customer_2}/sharesamename2')

    file_1 = run_ssh_command_and_wait(
        'customer-2',
        f'cat {volume_customer_2}/sharesamename/cat.txt')[0].strip()
    file_2 = run_ssh_command_and_wait(
        'customer-2',
        f'cat {volume_customer_2}/sharesamename2/cat.txt')[0].strip()

    assert file_1 != file_2
示例#4
0
def test_customer_1_share_file_to_customer_3():
    if os.environ.get('RUN_TESTS', '1') == '0':
        return pytest.skip()  # @UndefinedVariable

    supplier_list_v1('customer-1',
                     expected_min_suppliers=2,
                     expected_max_suppliers=2)

    key_id = share_create_v1('customer-1')

    # create randomized file to test files upload/download
    origin_volume = '/customer_1'
    origin_filename = 'second_file_customer_1.txt'
    run_ssh_command_and_wait(
        'customer-1',
        f'python -c "import os, base64; print(base64.b64encode(os.urandom(24)).decode())" > {origin_volume}/{origin_filename}'
    )

    local_path = '%s/%s' % (origin_volume, origin_filename)
    virtual_file = 'second_virtual_file.txt'
    remote_path = '%s:%s' % (key_id, virtual_file)
    download_volume = '/customer_3'
    downloaded_file = '%s/%s' % (download_volume, virtual_file)

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    file_create_v1('customer-1', remote_path)

    file_upload_start_v1('customer-1', remote_path, local_path)

    packet_list_v1('customer-1', wait_all_finish=True)

    transfer_list_v1('customer-1', wait_all_finish=True)

    file_download_start_v1('customer-1',
                           remote_path=remote_path,
                           destination='/customer_1')

    packet_list_v1('customer-1', wait_all_finish=True)

    transfer_list_v1('customer-1', wait_all_finish=True)

    service_info_v1('customer-3', 'service_shared_data', 'ON')

    packet_list_v1('customer-3', wait_all_finish=True)

    transfer_list_v1('customer-3', wait_all_finish=True)

    response = request_put(
        'customer-1',
        'share/grant/v1',
        json={
            'trusted_global_id': 'customer-3@id-a_8084',
            'key_id': key_id,
        },
        timeout=40,
    )
    assert response.status_code == 200
    assert response.json()['status'] == 'OK', response.json()
    print('\n\nshare/grant/v1 trusted_global_id=%s key_id=%s : %s\n' % (
        'customer-3@id-a_8084',
        key_id,
        response.json(),
    ))

    file_download_start_v1('customer-3',
                           remote_path=remote_path,
                           destination=download_volume)

    local_file_src = run_ssh_command_and_wait('customer-1', 'cat %s' %
                                              local_path)[0].strip()
    print('customer-1: file %s is %d bytes long' %
          (local_path, len(local_file_src)))

    downloaded_file_src = run_ssh_command_and_wait('customer-3', 'cat %s' %
                                                   downloaded_file)[0].strip()
    print('customer-3: file %s is %d bytes long' %
          (downloaded_file, len(downloaded_file_src)))

    assert local_file_src == downloaded_file_src, "source file and shared file content is not equal"
示例#5
0
def test_identity_rotate_customer_1():
    if os.environ.get('RUN_TESTS', '1') == '0':
        return pytest.skip()  # @UndefinedVariable

    sys.stderr.write('\ntest_identity_rotate_customer_1\n')

    service_info_v1('customer-1', 'service_customer', 'ON')

    supplier_list_v1('customer-1',
                     expected_min_suppliers=2,
                     expected_max_suppliers=2)

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    # remember current ID sources
    r = identity_get_v1('customer-1')
    old_sources = r['result']['sources']
    old_global_id = r['result']['global_id']
    old_idurl = r['result']['idurl']

    # test other nodes able to talk to customer-1 before identity get rotated
    user_ping_v1('customer-3', old_global_id)
    user_ping_v1('supplier-1', old_global_id)
    user_ping_v1('supplier-2', old_global_id)

    # test customer-3 can chat with customer-1 before identity get rotated
    service_info_v1('customer-3', 'service_private_messages', 'ON')
    service_info_v1('customer-1', 'service_private_messages', 'ON')
    random_string = base64.b32encode(os.urandom(20)).decode()
    random_message = {
        'random_message': random_string,
    }
    t = threading.Timer(2.0, message_send_v1, [
        'customer-3',
        'master$%s' % old_global_id,
        random_message,
    ])
    t.start()
    message_receive_v1('customer-1', expected_data=random_message)

    # create one share and upload one file for customer-1
    share_id_customer_1 = share_create_v1('customer-1')
    filename = 'cat.txt'
    virtual_filename = filename
    volume_customer_1 = '/customer_1'
    filepath_customer_1 = f'{volume_customer_1}/{filename}'
    run_ssh_command_and_wait('customer-1',
                             f'echo customer_1 > {filepath_customer_1}')

    remote_path_customer_1 = f'{share_id_customer_1}:{virtual_filename}'
    downloaded_filepath = f'/tmp/{filename}'
    local_file_src = run_ssh_command_and_wait('customer-1', 'cat %s' %
                                              filepath_customer_1)[0].strip()

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    packet_list_v1('customer-1', wait_all_finish=True)
    transfer_list_v1('customer-1', wait_all_finish=True)

    file_create_v1('customer-1', remote_path=remote_path_customer_1)
    file_upload_start_v1('customer-1',
                         remote_path=remote_path_customer_1,
                         local_path=filepath_customer_1)

    time.sleep(3)

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    # make sure file is available before identity rotate
    share_open_v1('customer-1', share_id_customer_1)
    file_download_start_v1('customer-1',
                           remote_path=remote_path_customer_1,
                           destination='/tmp')

    # and make sure this is the same file
    downloaded_file_src = run_ssh_command_and_wait(
        'customer-1', 'cat %s' % downloaded_filepath)[0].strip()
    assert local_file_src == downloaded_file_src, "source file and received file content is not equal"

    # remember list of existing keys
    old_keys = [k['key_id'] for k in key_list_v1('customer-1')['result']]
    assert f'master${old_global_id}' in old_keys
    assert f'messages${old_global_id}' in old_keys
    assert f'customer${old_global_id}' in old_keys

    # make customer-1 and customer-3 friends to each other
    friend_add_v1('customer-1', 'http://id-a:8084/customer-3.xml', 'friend2')
    friend_add_v1('customer-3', old_idurl, 'friend1')
    old_friends = friend_list_v1('customer-3', extract_idurls=True)
    assert old_idurl in old_friends

    # rotate identity sources
    identity_rotate_v1('customer-1')

    time.sleep(1)

    # and make sure ID sources were changed
    r = identity_get_v1('customer-1')
    new_sources = r['result']['sources']
    new_global_id = r['result']['global_id']
    new_idurl = r['result']['idurl']
    assert new_sources != old_sources
    assert new_global_id != old_global_id
    assert new_idurl != old_idurl

    service_info_v1('customer-1', 'service_gateway', 'ON')
    service_info_v1('customer-1', 'service_customer', 'ON')

    # remember current suppliers of customer-1
    customer_1_suppliers = supplier_list_v1('customer-1',
                                            expected_min_suppliers=2,
                                            expected_max_suppliers=2,
                                            extract_suppliers=True)
    first_supplier = customer_1_suppliers[0].replace(
        'http://id-a:8084/', '').replace('http://id-b:8084/',
                                         '').replace('.xml', '')
    second_supplier = customer_1_suppliers[1].replace(
        'http://id-a:8084/', '').replace('http://id-b:8084/',
                                         '').replace('.xml', '')

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    # test other nodes able to talk to customer-1 again on new IDURL
    user_ping_v1('customer-3', new_global_id)
    user_ping_v1('supplier-1', new_global_id)
    user_ping_v1('supplier-2', new_global_id)

    # make sure keys are renamed on customer-1
    new_keys = [k['key_id'] for k in key_list_v1('customer-1')['result']]
    assert len(old_keys) == len(new_keys)
    assert f'master${new_global_id}' in new_keys
    assert f'messages${new_global_id}' in new_keys
    assert f'customer${new_global_id}' in new_keys
    assert f'master${old_global_id}' not in new_keys
    assert f'messages${old_global_id}' not in new_keys
    assert f'customer${old_global_id}' not in new_keys

    # make sure file is still available after identity rotate
    new_share_id_customer_1 = share_id_customer_1.replace(
        old_global_id, new_global_id)
    share_open_v1('customer-1', new_share_id_customer_1)
    new_remote_path_customer_1 = remote_path_customer_1.replace(
        old_global_id, new_global_id)
    run_ssh_command_and_wait('customer-1',
                             'rm -rfv %s' % downloaded_filepath)[0].strip()
    file_download_start_v1('customer-1',
                           remote_path=new_remote_path_customer_1,
                           destination='/tmp')

    # and make sure this is still the same file
    new_downloaded_file_src = run_ssh_command_and_wait(
        'customer-1', 'cat %s' % downloaded_filepath)[0].strip()
    assert local_file_src == downloaded_file_src, "source file and received file content is not equal after identity rotate"
    assert new_downloaded_file_src == downloaded_file_src, "received file content before identity rotate is not equal to received file after identity rotate"

    # check again current suppliers of customer-1
    customer_1_suppliers = supplier_list_v1('customer-1',
                                            expected_min_suppliers=2,
                                            expected_max_suppliers=2,
                                            extract_suppliers=True)
    first_supplier = customer_1_suppliers[0].replace(
        'http://id-a:8084/', '').replace('http://id-b:8084/',
                                         '').replace('.xml', '')
    second_supplier = customer_1_suppliers[1].replace(
        'http://id-a:8084/', '').replace('http://id-b:8084/',
                                         '').replace('.xml', '')

    # verify files on first supplier were moved to correct sub folder
    print(f'checking customer-1 files on {first_supplier}')
    old_folder_first_supplier = run_ssh_command_and_wait(
        first_supplier,
        f'ls -la ~/.bitdust/customers/{old_global_id}/')[0].strip()
    new_folder_first_supplier = run_ssh_command_and_wait(
        first_supplier,
        f'ls -la ~/.bitdust/customers/{new_global_id}/')[0].strip()
    assert old_folder_first_supplier == ''
    assert new_folder_first_supplier != ''
    print(f'first supplier {first_supplier} :\n', new_folder_first_supplier)

    # verify files on second supplier were moved to correct sub folder
    print(f'checking customer-1 files on {second_supplier}')
    old_folder_second_supplier = run_ssh_command_and_wait(
        second_supplier,
        f'ls -la ~/.bitdust/customers/{old_global_id}/')[0].strip()
    new_folder_second_supplier = run_ssh_command_and_wait(
        second_supplier,
        f'ls -la ~/.bitdust/customers/{new_global_id}/')[0].strip()
    assert old_folder_second_supplier == ''
    assert new_folder_second_supplier != ''
    print(f'second supplier {second_supplier} :\n', new_folder_second_supplier)

    # test that friend1 idurl changed for customer-3
    new_friends = friend_list_v1('customer-3', extract_idurls=True)
    assert new_idurl in new_friends
    assert old_idurl not in new_friends

    # test customer-3 can still chat with customer-1 after identity rotated
    service_info_v1('customer-3', 'service_private_messages', 'ON')
    service_info_v1('customer-1', 'service_private_messages', 'ON')
    random_string = base64.b32encode(os.urandom(20)).decode()
    random_message = {
        'random_message': random_string,
    }
    t = threading.Timer(1.0, message_send_v1, [
        'customer-3',
        'master$%s' % new_global_id,
        random_message,
    ])
    t.start()
    message_receive_v1('customer-1', expected_data=random_message)
示例#6
0
def test_customer_1_replace_supplier_at_position_0():
    if os.environ.get('RUN_TESTS', '1') == '0':
        return pytest.skip()  # @UndefinedVariable

    packet_list_v1('supplier-1', wait_all_finish=True)
    packet_list_v1('supplier-2', wait_all_finish=True)
    packet_list_v1('supplier-3', wait_all_finish=True)
    packet_list_v1('supplier-4', wait_all_finish=True)
    packet_list_v1('supplier-5', wait_all_finish=True)
    packet_list_v1('supplier-6', wait_all_finish=True)
    packet_list_v1('supplier-7', wait_all_finish=True)
    packet_list_v1('supplier-8', wait_all_finish=True)

    packet_list_v1('customer-1', wait_all_finish=True)

    transfer_list_v1('customer-1', wait_all_finish=True)

    supplier_list_v1('customer-1', expected_min_suppliers=2, expected_max_suppliers=2)

    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=['customer-1@id-a_8084', 'customer-3@id-a_8084', ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )
    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=['customer-3@id-a_8084', 'customer-1@id-a_8084', ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )
    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=['supplier-2@id-a_8084', 'customer-3@id-a_8084', 'customer-1@id-a_8084', ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )

    share_id_customer_1 = share_create_v1('customer-1')

    filename = 'file_to_be_distributed.txt'
    virtual_filename = filename

    volume_customer_1 = '/customer_1'
    filepath_customer_1 = f'{volume_customer_1}/{filename}'

    remote_path_customer_1 = f'{share_id_customer_1}:{virtual_filename}'

    run_ssh_command_and_wait('customer-1', f'echo customer_1 > {filepath_customer_1}')

    file_create_v1('customer-1', remote_path_customer_1)

    file_upload_start_v1('customer-1', remote_path_customer_1, filepath_customer_1)

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    packet_list_v1('customer-1', wait_all_finish=True)

    transfer_list_v1('customer-1', wait_all_finish=True)

    file_download_start_v1('customer-1', remote_path=remote_path_customer_1, destination=volume_customer_1)

    response_before = request_get('customer-1', 'supplier/list/v1')
    assert response_before.status_code == 200
    supplier_list_before = response_before.json()['result']
    suppliers_before = list([x['global_id'] for x in supplier_list_before])
    assert len(suppliers_before) == 2

    response = request_post('customer-1', 'supplier/replace/v1', json={'position': '0'})
    assert response.status_code == 200

    packet_list_v1('supplier-1', wait_all_finish=True)
    packet_list_v1('supplier-2', wait_all_finish=True)
    packet_list_v1('supplier-3', wait_all_finish=True)
    packet_list_v1('supplier-4', wait_all_finish=True)
    packet_list_v1('supplier-5', wait_all_finish=True)
    packet_list_v1('supplier-6', wait_all_finish=True)
    packet_list_v1('supplier-7', wait_all_finish=True)
    packet_list_v1('supplier-8', wait_all_finish=True)

    supplier_list_v1('customer-1', expected_min_suppliers=2, expected_max_suppliers=2)

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=['customer-1@id-a_8084', 'customer-3@id-a_8084', ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )
    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=['customer-3@id-a_8084', 'customer-1@id-a_8084', ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )
    supplier_list_dht_v1(
        customer_id='customer-1@id-a_8084',
        observers_ids=['supplier-2@id-a_8084', 'customer-3@id-a_8084', 'customer-1@id-a_8084', ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )

    count = 0
    while True:
        if count > 20:
            assert False, 'supplier was not replaced after many attempts'
            break
        response_after = request_get('customer-1', 'supplier/list/v1')
        assert response_after.status_code == 200
        supplier_list_after = response_after.json()['result']
        suppliers_after = list([x['global_id'] for x in supplier_list_after])
        assert len(suppliers_after) == 2
        assert suppliers_after[1] == suppliers_before[1]
        if suppliers_after[0] != suppliers_before[0]:
            break
        count += 1
        time.sleep(1)
示例#7
0
def test_customer_2_switch_supplier_at_position_0():
    if os.environ.get('RUN_TESTS', '1') == '0':
        return pytest.skip()  # @UndefinedVariable

    packet_list_v1('supplier-1', wait_all_finish=True)
    packet_list_v1('supplier-2', wait_all_finish=True)
    packet_list_v1('supplier-3', wait_all_finish=True)
    packet_list_v1('supplier-4', wait_all_finish=True)
    packet_list_v1('supplier-5', wait_all_finish=True)
    packet_list_v1('supplier-6', wait_all_finish=True)
    packet_list_v1('supplier-7', wait_all_finish=True)
    packet_list_v1('supplier-8', wait_all_finish=True)

    packet_list_v1('customer-2', wait_all_finish=True)

    transfer_list_v1('customer-2', wait_all_finish=True)

    supplier_list_v1('customer-2', expected_min_suppliers=4, expected_max_suppliers=4)

    response_before = request_get('customer-2', 'supplier/list/v1')
    assert response_before.status_code == 200
    supplier_list_before = response_before.json()['result']
    suppliers_before = list([x['global_id'] for x in supplier_list_before])
    assert len(suppliers_before) == 4

    possible_suppliers = set([
        'supplier-1@id-a_8084',
        'supplier-2@id-a_8084',
        'supplier-3@id-a_8084',
        'supplier-4@id-a_8084',
        'supplier-5@id-a_8084',
        'supplier-6@id-a_8084',
        'supplier-7@id-a_8084',
        'supplier-8@id-a_8084',
    ])
    possible_suppliers.difference_update(set(suppliers_before))
    new_supplier = list(possible_suppliers)[0]

    supplier_list_dht_v1(
        customer_id='customer-2@id-a_8084',
        observers_ids=[new_supplier, 'customer-2@id-a_8084', 'customer-3@id-a_8084', ],
        expected_ecc_map='ecc/4x4',
        expected_suppliers_number=4,
    )
    supplier_list_dht_v1(
        customer_id='customer-2@id-a_8084',
        observers_ids=['customer-2@id-a_8084', 'customer-3@id-a_8084', ],
        expected_ecc_map='ecc/4x4',
        expected_suppliers_number=4,
    )
    supplier_list_dht_v1(
        customer_id='customer-2@id-a_8084',
        observers_ids=['customer-3@id-a_8084', 'customer-1@id-a_8084', ],
        expected_ecc_map='ecc/4x4',
        expected_suppliers_number=4,
    )
    supplier_list_dht_v1(
        customer_id='customer-2@id-a_8084',
        observers_ids=['supplier-2@id-a_8084', 'customer-3@id-a_8084', 'customer-1@id-a_8084', ],
        expected_ecc_map='ecc/4x4',
        expected_suppliers_number=4,
    )

    share_id_customer_2 = share_create_v1('customer-2')

    filename = 'file_to_be_distributed.txt'
    virtual_filename = filename

    volume_customer_2 = '/customer_2'
    filepath_customer_2 = f'{volume_customer_2}/{filename}'

    remote_path_customer_2 = f'{share_id_customer_2}:{virtual_filename}'

    run_ssh_command_and_wait('customer-2', f'echo customer_2 > {filepath_customer_2}')

    file_create_v1('customer-2', remote_path_customer_2)

    file_upload_start_v1('customer-2', remote_path_customer_2, filepath_customer_2)

    service_info_v1('customer-2', 'service_shared_data', 'ON')

    packet_list_v1('customer-2', wait_all_finish=True)

    transfer_list_v1('customer-2', wait_all_finish=True)

    file_download_start_v1('customer-2', remote_path=remote_path_customer_2, destination=volume_customer_2)

    response = request_put('customer-2', 'supplier/switch/v1', json={
        'position': '0',
        'new_global_id': new_supplier,
    })
    assert response.status_code == 200

    packet_list_v1('supplier-1', wait_all_finish=True)
    packet_list_v1('supplier-2', wait_all_finish=True)
    packet_list_v1('supplier-3', wait_all_finish=True)
    packet_list_v1('supplier-4', wait_all_finish=True)
    packet_list_v1('supplier-5', wait_all_finish=True)
    packet_list_v1('supplier-6', wait_all_finish=True)
    packet_list_v1('supplier-7', wait_all_finish=True)
    packet_list_v1('supplier-8', wait_all_finish=True)

    supplier_list_v1('customer-2', expected_min_suppliers=4, expected_max_suppliers=4)

    service_info_v1('customer-2', 'service_shared_data', 'ON')

    supplier_list_dht_v1(
        customer_id='customer-2@id-a_8084',
        observers_ids=[new_supplier, 'customer-2@id-a_8084', 'customer-3@id-a_8084', ],
        expected_ecc_map='ecc/4x4',
        expected_suppliers_number=4,
    )
    supplier_list_dht_v1(
        customer_id='customer-2@id-a_8084',
        observers_ids=['customer-2@id-a_8084', 'customer-3@id-a_8084', ],
        expected_ecc_map='ecc/4x4',
        expected_suppliers_number=4,
    )
    supplier_list_dht_v1(
        customer_id='customer-2@id-a_8084',
        observers_ids=['customer-3@id-a_8084', 'customer-1@id-a_8084', ],
        expected_ecc_map='ecc/4x4',
        expected_suppliers_number=4,
    )
    supplier_list_dht_v1(
        customer_id='customer-2@id-a_8084',
        observers_ids=['supplier-2@id-a_8084', 'customer-3@id-a_8084', 'customer-1@id-a_8084', ],
        expected_ecc_map='ecc/4x4',
        expected_suppliers_number=4,
    )

    count = 0
    while True:
        if count > 20:
            assert False, 'supplier was not switched after many attempts'
            break
        response_after = request_get('customer-2', 'supplier/list/v1')
        assert response_after.status_code == 200
        supplier_list_after = response_after.json()['result']
        suppliers_after = list([x['global_id'] for x in supplier_list_after])
        assert len(suppliers_after) == 4
        assert suppliers_after[1] == suppliers_before[1]
        assert suppliers_after[2] == suppliers_before[2]
        assert suppliers_after[3] == suppliers_before[3]
        if suppliers_after[0] != suppliers_before[0] and suppliers_after[0] == new_supplier:
            break
        count += 1
        time.sleep(1)
示例#8
0
def test_identity_recover_from_customer_backup_to_customer_restore():
    if os.environ.get('RUN_TESTS', '1') == '0':
        return pytest.skip()  # @UndefinedVariable

    # step1: first upload/download one file on customer_backup
    key_id = 'master$customer-backup@id-a_8084'
    source_volume = '/customer_backup'
    origin_filename = 'file_customer_backup.txt'
    source_local_path = '%s/%s' % (source_volume, origin_filename)
    virtual_file = 'virtual_file.txt'
    remote_path = '%s:%s' % (key_id, virtual_file)
    download_volume = '/customer_backup'
    downloaded_file = '%s/%s' % (download_volume, virtual_file)

    supplier_list_v1('customer-backup',
                     expected_min_suppliers=2,
                     expected_max_suppliers=2)

    service_info_v1('customer-backup', 'service_shared_data', 'ON')

    supplier_list_dht_v1(
        customer_id='customer-backup@id-a_8084',
        observers_ids=[
            'customer-backup@id-a_8084',
            'supplier-1@id-a_8084',
            'supplier-2@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )

    supplier_list_dht_v1(
        customer_id='customer-backup@id-a_8084',
        observers_ids=[
            'supplier-1@id-a_8084',
            'supplier-2@id-a_8084',
            'customer-backup@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )

    supplier_list_dht_v1(
        customer_id='customer-backup@id-a_8084',
        observers_ids=[
            'supplier-2@id-a_8084',
            'customer-backup@id-a_8084',
            'supplier-1@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )

    file_create_v1('customer-backup', remote_path)

    run_ssh_command_and_wait(
        'customer-backup',
        f'python -c "import os, base64; print(base64.b64encode(os.urandom(30000)).decode())" > /customer_backup/{origin_filename}'
    )

    file_upload_start_v1('customer-backup', remote_path, source_local_path)

    service_info_v1('customer-backup', 'service_shared_data', 'ON')

    file_download_start_v1('customer-backup',
                           remote_path,
                           download_volume,
                           open_share=False)

    source_local_file_src = run_ssh_command_and_wait(
        'customer-backup', 'cat %s' % source_local_path)[0].strip()
    print('customer-backup: file %s is %d bytes long' %
          (source_local_path, len(source_local_file_src)))

    downloaded_file_src = run_ssh_command_and_wait(
        'customer-backup', 'cat %s' % downloaded_file)[0].strip()
    print('customer-backup: file %s is %d bytes long' %
          (downloaded_file, len(downloaded_file_src)))

    assert source_local_file_src == downloaded_file_src, (
        source_local_file_src,
        downloaded_file_src,
    )

    # step2: backup customer-backup private key and stop that container
    backup_file_directory_c2 = '/customer_backup/identity.backup'
    backup_file_directory_c3 = '/customer_restore/identity.backup'
    assert not os.path.exists(backup_file_directory_c2)

    response = request_post(
        'customer-backup',
        'identity/backup/v1',
        json={
            'destination_path': backup_file_directory_c2,
        },
    )
    print('\n\nidentity/backup/v1 : %s\n' % response.json())
    assert response.json()['status'] == 'OK', response.json()

    # copy private key from one container to another
    # just like when you backup your private key and restore it from USB stick on another device
    shutil.move(backup_file_directory_c2, backup_file_directory_c3)

    # to make sure all uploads to finish
    transfer_list_v1('customer-backup', wait_all_finish=True)
    packet_list_v1('customer-backup', wait_all_finish=True)
    file_list_all_v1('customer-backup')

    supplier_list_dht_v1(
        customer_id='customer-backup@id-a_8084',
        observers_ids=[
            'customer-backup@id-a_8084',
            'supplier-1@id-a_8084',
            'supplier-2@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )

    supplier_list_dht_v1(
        customer_id='customer-backup@id-a_8084',
        observers_ids=[
            'supplier-1@id-a_8084',
            'supplier-2@id-a_8084',
            'customer-backup@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )

    supplier_list_dht_v1(
        customer_id='customer-backup@id-a_8084',
        observers_ids=[
            'supplier-2@id-a_8084',
            'customer-backup@id-a_8084',
            'supplier-1@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )

    try:
        response = request_get('customer-backup', 'process/stop/v1')
        assert response.json()['status'] == 'OK', response.json()
    except Exception as exc:
        print(f'\n\nprocess/stop/v1 failed with {exc}')

    # step3: recover key on customer-restore container and join network
    for _ in range(5):
        response = request_post(
            'customer-restore',
            'identity/recover/v1',
            json={
                'private_key_local_file': backup_file_directory_c3,
            },
        )
        print('\n\nidentity/recover/v1 : %s\n' % response.json())
        if response.json()['status'] == 'OK':
            break
        time.sleep(1)
    else:
        assert False, 'customer-restore was not able to recover identity after few seconds'

    response = request_get('customer-restore',
                           'network/connected/v1?wait_timeout=1')
    assert response.json()['status'] == 'ERROR'

    for _ in range(5):
        response = request_get('customer-restore',
                               'network/connected/v1?wait_timeout=5')
        if response.json()['status'] == 'OK':
            break
        time.sleep(5)
    else:
        assert False, 'customer-restore was not able to join the network after identity recover'

    supplier_list_v1('customer-restore',
                     expected_min_suppliers=2,
                     expected_max_suppliers=2)

    service_info_v1('customer-restore', 'service_shared_data', 'ON')

    supplier_list_dht_v1(
        customer_id='customer-backup@id-a_8084',
        observers_ids=[
            'customer-restore@id-a_8084',
            'supplier-3@id-a_8084',
            'supplier-1@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )

    supplier_list_dht_v1(
        customer_id='customer-backup@id-a_8084',
        observers_ids=[
            'supplier-3@id-a_8084',
            'supplier-1@id-a_8084',
            'customer-restore@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )

    supplier_list_dht_v1(
        customer_id='customer-backup@id-a_8084',
        observers_ids=[
            'supplier-1@id-a_8084',
            'customer-restore@id-a_8084',
            'supplier-3@id-a_8084',
        ],
        expected_ecc_map='ecc/2x2',
        expected_suppliers_number=2,
    )

    file_list_all_v1('customer-restore')

    # step4: try to recover stored file again
    key_id = 'master$customer-backup@id-a_8084'
    recover_volume = '/customer_restore'
    virtual_file = 'virtual_file.txt'
    remote_path = '%s:%s' % (key_id, virtual_file)
    recovered_file = '%s/%s' % (recover_volume, virtual_file)
    for _ in range(20):
        response = request_post(
            'customer-restore',
            'file/download/start/v1',
            json={
                'remote_path': remote_path,
                'destination_folder': recover_volume,
                'wait_result': '1',
            },
        )
        assert response.status_code == 200

        if response.json()['status'] == 'OK':
            break

        if response.json()['errors'][0].startswith(
                'download not possible, uploading'):
            time.sleep(1)
        else:
            assert False, response.json()

    else:
        assert False, 'download was not successful: %r' % response.json()

    recovered_file_src = run_ssh_command_and_wait(
        'customer-restore', 'cat %s' % recovered_file)[0].strip()
    print('customer-restore:%s' % recovered_file, recovered_file_src)
    assert source_local_file_src == recovered_file_src, (
        source_local_file_src,
        recovered_file_src,
    )
示例#9
0
def test_identity_rotate_supplier_1():
    if os.environ.get('RUN_TESTS', '1') == '0':
        return pytest.skip()  # @UndefinedVariable

    # first create supplier-1 identity and start the node, identity will be rotated later
    create_identity('supplier-1', 'supplier-1')

    connect_network('supplier-1')

    r = identity_get_v1('supplier-1')
    supplier_1_global_id = r['result']['global_id']
    supplier_1_idurl = r['result']['idurl']

    service_info_v1('supplier-1', 'service_supplier', 'ON')

    # make sure supplier-1 was hired by customer-1
    current_suppliers_idurls = supplier_list_v1('customer-1',
                                                expected_min_suppliers=2,
                                                expected_max_suppliers=2)

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    # if he is not hired yet, we switch our first supplier to supplier-1
    if supplier_1_idurl not in current_suppliers_idurls:
        supplier_switch_v1('customer-1',
                           supplier_idurl=supplier_1_idurl,
                           position=0)

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    current_suppliers_idurls = supplier_list_v1('customer-1',
                                                expected_min_suppliers=2,
                                                expected_max_suppliers=2)
    assert supplier_1_idurl in current_suppliers_idurls

    share_id_customer_1 = share_create_v1('customer-1')

    filename = 'cat.txt'
    virtual_filename = filename
    volume_customer_1 = '/customer_1'
    filepath_customer_1 = f'{volume_customer_1}/{filename}'
    remote_path_customer_1 = f'{share_id_customer_1}:{virtual_filename}'
    download_filepath_customer_1 = f'/tmp/{filename}'
    run_ssh_command_and_wait('customer-1',
                             f'echo "customer_1" > {filepath_customer_1}')

    file_create_v1('customer-1', remote_path_customer_1)

    file_upload_start_v1('customer-1', remote_path_customer_1,
                         filepath_customer_1)

    packet_list_v1('customer-1', wait_all_finish=True)

    transfer_list_v1('customer-1', wait_all_finish=True)

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    file_download_start_v1('customer-1',
                           remote_path=remote_path_customer_1,
                           destination='/tmp')

    file_1 = run_ssh_command_and_wait('customer-1',
                                      f'cat {filepath_customer_1}')[0].strip()
    file_2 = run_ssh_command_and_wait(
        'customer-1', f'cat {download_filepath_customer_1}')[0].strip()
    assert file_1 == file_2

    # rotate identity sources on supplier-1
    identity_rotate_v1('supplier-1')

    time.sleep(1)

    r = identity_get_v1('supplier-1')
    supplier_1_global_id_new = r['result']['global_id']
    supplier_1_idurl_new = r['result']['idurl']
    assert supplier_1_global_id_new != supplier_1_global_id
    assert supplier_1_idurl_new != supplier_1_idurl

    service_info_v1('supplier-1', 'service_gateway', 'ON')
    service_info_v1('supplier-1', 'service_supplier', 'ON')

    file_sync_v1('customer-1')

    time.sleep(1)

    packet_list_v1('customer-1', wait_all_finish=True)

    transfer_list_v1('customer-1', wait_all_finish=True)

    service_info_v1('customer-1', 'service_shared_data', 'ON')

    file_list_all_v1('customer-1')
示例#10
0
def test_customers_1_2_3_communicate_via_message_brokers():
    if os.environ.get('RUN_TESTS', '1') == '0':
        return pytest.skip()  # @UndefinedVariable

    # prepare customers 1, 2 and 3
    kw.supplier_list_v1('customer-1',
                        expected_min_suppliers=2,
                        expected_max_suppliers=2)
    kw.service_info_v1('customer-1', 'service_shared_data', 'ON')
    kw.service_info_v1('customer-1', 'service_private_groups', 'ON')

    kw.supplier_list_v1('customer-2',
                        expected_min_suppliers=2,
                        expected_max_suppliers=2)
    kw.service_info_v1('customer-2', 'service_shared_data', 'ON')
    kw.service_info_v1('customer-2', 'service_private_groups', 'ON')

    kw.supplier_list_v1('customer-3',
                        expected_min_suppliers=2,
                        expected_max_suppliers=2)
    kw.service_info_v1('customer-3', 'service_shared_data', 'ON')
    kw.service_info_v1('customer-3', 'service_private_groups', 'ON')

    kw.wait_packets_finished(CUSTOMERS_IDS + BROKERS_IDS)

    assert kw.queue_list_v1('broker-1', extract_ids=True) == []
    assert kw.queue_list_v1('broker-2', extract_ids=True) == []
    assert kw.queue_list_v1('broker-3', extract_ids=True) == []
    assert kw.queue_list_v1('broker-4', extract_ids=True) == []
    assert kw.queue_list_v1('broker-5', extract_ids=True) == []

    assert kw.queue_consumer_list_v1('broker-1', extract_ids=True) == []
    assert kw.queue_consumer_list_v1('broker-2', extract_ids=True) == []
    assert kw.queue_consumer_list_v1('broker-3', extract_ids=True) == []
    assert kw.queue_consumer_list_v1('broker-4', extract_ids=True) == []
    assert kw.queue_consumer_list_v1('broker-5', extract_ids=True) == []

    assert kw.queue_producer_list_v1('broker-1', extract_ids=True) == []
    assert kw.queue_producer_list_v1('broker-2', extract_ids=True) == []
    assert kw.queue_producer_list_v1('broker-3', extract_ids=True) == []
    assert kw.queue_producer_list_v1('broker-4', extract_ids=True) == []
    assert kw.queue_producer_list_v1('broker-5', extract_ids=True) == []

    # remember suppliers of customer-1
    customer_1_suppliers = kw.supplier_list_v1('customer-1',
                                               expected_min_suppliers=2,
                                               expected_max_suppliers=2,
                                               extract_suppliers=True)
    first_supplier_customer_1 = customer_1_suppliers[0].replace(
        'http://*****:*****@')[0]

    assert active_queue_id in kw.queue_list_v1(active_broker_name,
                                               extract_ids=True)

    broker_consumers = kw.queue_consumer_list_v1(active_broker_name,
                                                 extract_ids=True)
    broker_producers = kw.queue_producer_list_v1(active_broker_name,
                                                 extract_ids=True)
    assert len(broker_consumers) == 1
    assert len(broker_producers) == 1
    assert 'customer-1@id-a_8084' in broker_consumers
    assert 'customer-1@id-a_8084' in broker_producers

    # share group key from customer-1 to customer-2
    kw.group_share_v1('customer-1', group_key_id, 'customer-2@id-b_8084')

    # second member join the group
    kw.group_join_v1('customer-2', group_key_id)

    kw.wait_packets_finished(CUSTOMERS_IDS + BROKERS_IDS)

    assert kw.group_info_v1('customer-2',
                            group_key_id)['result']['last_sequence_id'] == -1

    broker_consumers = kw.queue_consumer_list_v1(active_broker_name,
                                                 extract_ids=True)
    broker_producers = kw.queue_producer_list_v1(active_broker_name,
                                                 extract_ids=True)
    assert len(broker_consumers) == 2
    assert len(broker_producers) == 2
    assert 'customer-1@id-a_8084' in broker_consumers
    assert 'customer-1@id-a_8084' in broker_producers
    assert 'customer-2@id-b_8084' in broker_consumers
    assert 'customer-2@id-b_8084' in broker_producers

    # MESSAGE A: from customer 1 to the group, customers 1 and 2 must receive the message
    execute_message_send_receive(
        group_key_id,
        producer_id='customer-1',
        consumers_ids=[
            'customer-1',
            'customer-2',
        ],
        message_label='A',
        expected_results={
            'customer-1': True,
            'customer-2': True,
        },
        expected_last_sequence_id={
            'customer-1': 0,
            'customer-2': 0,
        },
    )

    # customer-2 share group key to customer-3
    kw.group_share_v1('customer-2', group_key_id, 'customer-3@id-a_8084')

    # third member join the group
    kw.group_join_v1('customer-3', group_key_id)

    kw.wait_packets_finished(CUSTOMERS_IDS + BROKERS_IDS)

    broker_consumers = kw.queue_consumer_list_v1(active_broker_name,
                                                 extract_ids=True)
    broker_producers = kw.queue_producer_list_v1(active_broker_name,
                                                 extract_ids=True)
    assert len(broker_consumers) == 3
    assert len(broker_producers) == 3
    assert 'customer-1@id-a_8084' in broker_consumers
    assert 'customer-1@id-a_8084' in broker_producers
    assert 'customer-2@id-b_8084' in broker_consumers
    assert 'customer-2@id-b_8084' in broker_producers
    assert 'customer-3@id-a_8084' in broker_consumers
    assert 'customer-3@id-a_8084' in broker_producers

    assert kw.group_info_v1('customer-3',
                            group_key_id)['result']['last_sequence_id'] == 0

    # MESSAGE B: from customer 3 to the group, customers 1, 2 and 3 must receive the message
    execute_message_send_receive(
        group_key_id,
        producer_id='customer-3',
        consumers_ids=[
            'customer-1',
            'customer-2',
            'customer-3',
        ],
        message_label='B',
        expected_results={
            'customer-1': True,
            'customer-2': True,
            'customer-3': True,
        },
        expected_last_sequence_id={
            'customer-1': 1,
            'customer-2': 1,
            'customer-3': 1,
        },
    )

    # customer-2 leave the group
    kw.group_leave_v1('customer-2', group_key_id)

    kw.wait_packets_finished(CUSTOMERS_IDS + BROKERS_IDS)

    group_info_offline = kw.group_info_v1('customer-2', group_key_id)['result']
    assert group_info_offline['state'] == 'OFFLINE'
    assert group_info_offline['label'] == 'TestGroup123'
    assert group_info_offline['last_sequence_id'] == 1

    assert 'customer-1@id-a_8084' in kw.queue_consumer_list_v1(
        active_broker_name, extract_ids=True)
    assert 'customer-1@id-a_8084' in kw.queue_producer_list_v1(
        active_broker_name, extract_ids=True)
    assert 'customer-2@id-b_8084' not in kw.queue_consumer_list_v1(
        active_broker_name, extract_ids=True)
    assert 'customer-2@id-b_8084' not in kw.queue_producer_list_v1(
        active_broker_name, extract_ids=True)
    assert 'customer-3@id-a_8084' in kw.queue_consumer_list_v1(
        active_broker_name, extract_ids=True)
    assert 'customer-3@id-a_8084' in kw.queue_producer_list_v1(
        active_broker_name, extract_ids=True)

    # MESSAGE C: from customer 1 to the group, customers 1 and 3 must receive the message, customer 2 must not receive it
    execute_message_send_receive(
        group_key_id,
        producer_id='customer-1',
        consumers_ids=[
            'customer-1',
            'customer-2',
            'customer-3',
        ],
        message_label='C',
        expected_results={
            'customer-1': True,
            'customer-2': False,
            'customer-3': True,
        },
        expected_last_sequence_id={
            'customer-1': 2,
            'customer-2': 1,
            'customer-3': 2,
        },
    )

    # at that point 3 messages already passed thru the group and archive snapshot suppose to be triggered
    # kw.wait_packets_finished(CUSTOMERS_IDS + BROKERS_IDS + SUPPLIERS_IDS)

    # sending 3 other messages to the group from customer 1
    for i in range(3):
        execute_message_send_receive(
            group_key_id,
            producer_id='customer-1',
            consumers_ids=[
                'customer-1',
                'customer-2',
                'customer-3',
            ],
            message_label='D%d' % (i + 1),
            expected_results={
                'customer-1': True,
                'customer-2': False,
                'customer-3': True,
            },
            expected_last_sequence_id={},
        )

    assert kw.group_info_v1('customer-1',
                            group_key_id)['result']['last_sequence_id'] == 5
    assert kw.group_info_v1('customer-2',
                            group_key_id)['result']['last_sequence_id'] == 1
    assert kw.group_info_v1('customer-3',
                            group_key_id)['result']['last_sequence_id'] == 5

    # second member now join the group again... he missed some conversations : expect 4 messages to be missed
    kw.group_join_v1('customer-2', group_key_id)

    kw.wait_packets_finished(CUSTOMERS_IDS + BROKERS_IDS)

    assert len(kw.queue_consumer_list_v1(active_broker_name,
                                         extract_ids=True)) == 3
    assert len(kw.queue_producer_list_v1(active_broker_name,
                                         extract_ids=True)) == 3

    # all messages suppose to be restored from archive history
    # assert kw.group_info_v1('customer-2', group_key_id)['result']['last_sequence_id'] == 5

    # all customers leave the group, except customer-3
    kw.group_leave_v1('customer-1', group_key_id)
    kw.group_leave_v1('customer-2', group_key_id)

    kw.wait_packets_finished(CUSTOMERS_IDS + BROKERS_IDS)

    assert len(kw.queue_consumer_list_v1(active_broker_name,
                                         extract_ids=True)) == 1
    assert len(kw.queue_producer_list_v1(active_broker_name,
                                         extract_ids=True)) == 1

    group_info_offline = kw.group_info_v1('customer-1', group_key_id)['result']
    assert group_info_offline['state'] == 'OFFLINE'
    assert group_info_offline['label'] == 'TestGroup123'
    assert group_info_offline['last_sequence_id'] == 5

    group_info_offline = kw.group_info_v1('customer-2', group_key_id)['result']
    assert group_info_offline['state'] == 'OFFLINE'
    assert group_info_offline['label'] == 'TestGroup123'
    # assert group_info_offline['last_sequence_id'] == 5

    group_info_offline = kw.group_info_v1('customer-3', group_key_id)['result']
    assert group_info_offline['state'] == 'IN_SYNC!'
    assert group_info_offline['label'] == 'TestGroup123'
    assert group_info_offline['last_sequence_id'] == 5

    kw.supplier_list_v1('customer-1',
                        expected_min_suppliers=2,
                        expected_max_suppliers=2)

    kw.file_list_all_v1('customer-2')
示例#11
0
def test_identity_rotate_broker():
    if os.environ.get('RUN_TESTS', '1') == '0':
        return pytest.skip()  # @UndefinedVariable

    kw.service_info_v1('broker-1', 'service_message_broker', 'ON')
    kw.service_info_v1('broker-2', 'service_message_broker', 'ON')
    kw.service_info_v1('broker-3', 'service_message_broker', 'ON')
    kw.service_info_v1('broker-4', 'service_message_broker', 'ON')
    kw.service_info_v1('broker-5', 'service_message_broker', 'ON')

    # prepare customer-1
    kw.supplier_list_v1('customer-1',
                        expected_min_suppliers=2,
                        expected_max_suppliers=2)
    kw.service_info_v1('customer-1', 'service_shared_data', 'ON')
    kw.service_info_v1('customer-1', 'service_private_groups', 'ON')
    kw.packet_list_v1('customer-1', wait_all_finish=True)
    kw.transfer_list_v1('customer-1', wait_all_finish=True)

    # prepare customer-2
    kw.supplier_list_v1('customer-2',
                        expected_min_suppliers=2,
                        expected_max_suppliers=2)
    kw.service_info_v1('customer-2', 'service_shared_data', 'ON')
    kw.service_info_v1('customer-2', 'service_private_groups', 'ON')
    kw.packet_list_v1('customer-2', wait_all_finish=True)
    kw.transfer_list_v1('customer-2', wait_all_finish=True)

    # create group owned by customer-1 and join
    group_key_id = kw.group_create_v1('customer-1', label='TestGroup123')

    kw.packet_list_v1('customer-1', wait_all_finish=True)

    kw.group_join_v1('customer-1', group_key_id)

    kw.packet_list_v1('customer-1', wait_all_finish=True)

    kw.packet_list_v1('broker-1', wait_all_finish=True)
    kw.packet_list_v1('broker-2', wait_all_finish=True)
    kw.packet_list_v1('broker-3', wait_all_finish=True)
    kw.packet_list_v1('broker-4', wait_all_finish=True)
    kw.packet_list_v1('broker-5', wait_all_finish=True)

    group_info_active = kw.group_info_v1('customer-1', group_key_id)['result']
    assert group_info_active['state'] == 'IN_SYNC!'

    active_queue_id = group_info_active['active_queue_id']
    active_broker_id = group_info_active['active_broker_id']
    active_broker_name = active_broker_id.split('@')[0]

    assert active_queue_id in kw.queue_list_v1(active_broker_name,
                                               extract_ids=True)

    # share group key from customer-1 to customer-2, second member join the group
    kw.group_share_v1('customer-1', group_key_id, 'customer-2@id-b_8084')

    kw.group_join_v1('customer-2', group_key_id)

    kw.packet_list_v1('broker-1', wait_all_finish=True)
    kw.packet_list_v1('broker-2', wait_all_finish=True)
    kw.packet_list_v1('broker-3', wait_all_finish=True)
    kw.packet_list_v1('broker-4', wait_all_finish=True)
    kw.packet_list_v1('broker-5', wait_all_finish=True)

    assert kw.group_info_v1('customer-1',
                            group_key_id)['result']['last_sequence_id'] == -1
    assert kw.group_info_v1('customer-2',
                            group_key_id)['result']['last_sequence_id'] == -1

    # MESSAGE A (3 times): from customer 1 to the group, customers 1 and 2 must receive the message
    for i in range(3):
        a_message_sent_from_customer_1 = {
            'random_message':
            'MESSAGE_A%d_%s' % (
                i,
                base64.b32encode(os.urandom(20)).decode(),
            )
        }
        a_customer_1_receive_result = [
            None,
        ]
        a_customer_2_receive_result = [
            None,
        ]
        a_receive_customer_1 = threading.Timer(0, kw.message_receive_v1, [
            'customer-1',
            a_message_sent_from_customer_1,
            'test_consumer',
            a_customer_1_receive_result,
        ])
        a_receive_customer_2 = threading.Timer(0, kw.message_receive_v1, [
            'customer-2',
            a_message_sent_from_customer_1,
            'test_consumer',
            a_customer_2_receive_result,
        ])
        a_send_customer_1 = threading.Timer(0.2, kw.message_send_group_v1, [
            'customer-1',
            group_key_id,
            a_message_sent_from_customer_1,
        ])
        a_receive_customer_1.start()
        a_receive_customer_2.start()
        a_send_customer_1.start()
        a_receive_customer_1.join()
        a_receive_customer_2.join()
        a_send_customer_1.join()
        assert a_customer_1_receive_result[0]['result'][0][
            'data'] == a_message_sent_from_customer_1
        assert a_customer_2_receive_result[0]['result'][0][
            'data'] == a_message_sent_from_customer_1

        assert kw.group_info_v1(
            'customer-1', group_key_id)['result']['last_sequence_id'] == i
        assert kw.group_info_v1(
            'customer-2', group_key_id)['result']['last_sequence_id'] == i

    # rotate identity sources on broker-1
    kw.identity_rotate_v1(active_broker_name)

    kw.service_info_v1(active_broker_name, 'service_message_broker', 'ON')
    kw.service_info_v1(active_broker_name, 'service_gateway', 'ON')

    kw.packet_list_v1(active_broker_name, wait_all_finish=True)

    # MESSAGE B: from customer 2 to the group, customers 1 and 2 must switch to another active broker and receive the message
    b_message_sent_from_customer_1 = {
        'random_message':
        'MESSAGE_B_%s' % base64.b32encode(os.urandom(20)).decode(),
    }
    b_customer_1_receive_result = [
        None,
    ]
    b_customer_2_receive_result = [
        None,
    ]
    b_receive_customer_1 = threading.Timer(0, kw.message_receive_v1, [
        'customer-1',
        b_message_sent_from_customer_1,
        'test_consumer',
        b_customer_1_receive_result,
        60,
    ])
    b_receive_customer_2 = threading.Timer(0, kw.message_receive_v1, [
        'customer-2',
        b_message_sent_from_customer_1,
        'test_consumer',
        b_customer_2_receive_result,
        60,
    ])
    b_send_customer_1 = threading.Timer(0.2, kw.message_send_group_v1, [
        'customer-1',
        group_key_id,
        b_message_sent_from_customer_1,
    ])
    b_receive_customer_1.start()
    b_receive_customer_2.start()
    b_send_customer_1.start()
    b_receive_customer_1.join()
    b_receive_customer_2.join()
    b_send_customer_1.join()
    assert b_customer_1_receive_result[0]['result'][0][
        'data'] == b_message_sent_from_customer_1
    assert b_customer_2_receive_result[0]['result'][0][
        'data'] == b_message_sent_from_customer_1

    assert kw.group_info_v1('customer-1',
                            group_key_id)['result']['last_sequence_id'] == 3
    assert kw.group_info_v1('customer-2',
                            group_key_id)['result']['last_sequence_id'] == 3