コード例 #1
0
def test_migrate_wms_workspace_metadata(ensure_layer):
    def assert_md_keys(layer_info):
        for key in ['comparison_url', 'csw_url', 'identifier', 'record_url']:
            assert key in layer_info['metadata']

    workspace = 'test_migrate_wms_workspace_metadata_workspace'
    layer = 'test_migrate_wms_workspace_metadata_layer'
    ensure_layer(workspace, layer)

    with app.app_context():
        upgrade_v1_10.migrate_layers_to_wms_workspace(workspace)

    wms_workspace = wms.get_geoserver_workspace(workspace)
    wms_old_prefix = f"http://localhost:8000/geoserver/{workspace}/ows"
    wms_new_prefix = f"http://localhost:8000/geoserver/{wms_workspace}/ows"
    csw_prefix = f"http://localhost:3080/csw"

    layer_info = process_client.get_workspace_layer(workspace, layer)
    assert_md_keys(layer_info)

    md_comparison = process_client.get_workspace_layer_metadata_comparison(
        workspace, layer)
    md_props = md_comparison['metadata_properties']

    csw_src_key = process_client.get_source_key_from_metadata_comparison(
        md_comparison, csw_prefix)
    assert csw_src_key is not None

    assert md_props['wms_url']['equal'] is False
    assert md_props['wms_url']['equal_or_null'] is False
    assert md_props['wms_url']['values'][csw_src_key].startswith(
        wms_old_prefix)
    with app.app_context():
        upgrade_v1_10.migrate_metadata_records(workspace)

    layer_info = process_client.get_workspace_layer(workspace, layer)
    assert_md_keys(layer_info)

    md_comparison = process_client.get_workspace_layer_metadata_comparison(
        workspace, layer)
    md_props = md_comparison['metadata_properties']

    csw_src_key = process_client.get_source_key_from_metadata_comparison(
        md_comparison, csw_prefix)
    assert csw_src_key is not None
    assert md_props['wms_url']['values'][csw_src_key].startswith(
        wms_new_prefix)
    for value in md_props['wms_url']['values'].values():
        assert value.startswith(wms_new_prefix)
    assert md_props['wms_url']['equal'] is True
    assert md_props['wms_url']['equal_or_null'] is True
    process_client.delete_workspace_layer(workspace, layer)
コード例 #2
0
def test_wms_ows_proxy(service_endpoint):
    username = '******'
    layername = 'test_wms_ows_proxy_layer'

    authn_headers = get_authz_headers(username)

    process_client.ensure_reserved_username(username, headers=authn_headers)
    process_client.publish_workspace_layer(username,
                                           layername,
                                           headers=authn_headers)

    wms_url = geoserver_client.get_wms_url(username, service_endpoint)

    layer_info = process_client.get_workspace_layer(username,
                                                    layername,
                                                    headers=authn_headers)
    tn_bbox = get_square_bbox(layer_info['bounding_box'])

    from layman.layer.geoserver.wms import VERSION
    response = get_layer_thumbnail(wms_url,
                                   layername,
                                   tn_bbox,
                                   headers=authn_headers,
                                   wms_version=VERSION)
    response.raise_for_status()
    assert 'image' in response.headers['content-type']

    process_client.delete_workspace_layer(username,
                                          layername,
                                          headers=authn_headers)
コード例 #3
0
def test_wms_workspace():
    workspace = 'test_wms_workspace_workspace'
    layername = 'test_wms_workspace_layer'

    wms_url = f"http://localhost:8000/geoserver/test_wms_workspace_workspace{settings.LAYMAN_GS_WMS_WORKSPACE_POSTFIX}/ows"
    wfs_url = f"http://localhost:8000/geoserver/test_wms_workspace_workspace/wfs"

    process_client.publish_workspace_layer(workspace, layername)
    r_json = process_client.get_workspace_layer(workspace, layername)
    assert r_json['wms']['url'] == wms_url
    assert r_json['wfs']['url'] == wfs_url

    with app.app_context():
        internal_wms_url = url_for('geoserver_proxy_bp.proxy', subpath=workspace + settings.LAYMAN_GS_WMS_WORKSPACE_POSTFIX + '/ows')
        internal_wfs_url = url_for('geoserver_proxy_bp.proxy', subpath=workspace + '/wfs')

    r_wms = requests.get(internal_wms_url, params={
        'service': 'WMS',
        'request': 'GetCapabilities',
        'version': '1.3.0',
    })
    assert r_wms.status_code == 200

    r_wfs = requests.get(internal_wfs_url, params={
        'service': 'WFS',
        'request': 'GetCapabilities',
        'version': '2.0.0',
    })
    assert r_wfs.status_code == 200

    process_client.delete_workspace_layer(workspace, layername)
コード例 #4
0
def test_migrate_layer_metadata(ensure_layer):
    def assert_md_keys(layer_info):
        for key in ['comparison_url', 'csw_url', 'identifier', 'record_url']:
            assert key in layer_info['metadata']

    def assert_csw_value(md_comparison, prop_key, exp_value):
        csw_prefix = f"http://localhost:3080/csw"
        csw_src_key = process_client.get_source_key_from_metadata_comparison(
            md_comparison, csw_prefix)
        assert csw_src_key is not None
        md_props = md_comparison['metadata_properties']
        assert md_props[prop_key]['equal'] is True
        assert md_props[prop_key]['equal_or_null'] is True
        assert md_props[prop_key]['values'][csw_src_key] == exp_value

    workspace = 'test_migrate_layer_metadata_workspace'
    layer = 'test_migrate_layer_metadata_layer'
    ensure_layer(workspace, layer)

    layer_info = process_client.get_workspace_layer(workspace, layer)
    assert_md_keys(layer_info)

    md_comparison = process_client.get_workspace_layer_metadata_comparison(
        workspace, layer)
    exp_wms_url = f"http://localhost:8000/geoserver/{workspace}_wms/ows?SERVICE=WMS&REQUEST=GetCapabilities&VERSION=1.3.0"
    assert_csw_value(md_comparison, 'wms_url', exp_wms_url)
    exp_wfs_url = f"http://localhost:8000/geoserver/{workspace}/wfs?SERVICE=WFS&REQUEST=GetCapabilities&VERSION=2.0.0"
    assert_csw_value(md_comparison, 'wfs_url', exp_wfs_url)

    with app.app_context():
        upgrade_v1_12.migrate_layer_metadata(workspace)

    layer_info = process_client.get_workspace_layer(workspace, layer)
    assert_md_keys(layer_info)

    md_comparison = process_client.get_workspace_layer_metadata_comparison(
        workspace, layer)
    exp_wms_url = f"{exp_wms_url}&LAYERS={layer}"
    assert_csw_value(md_comparison, 'wms_url', exp_wms_url)
    exp_wfs_url = f"{exp_wfs_url}&LAYERS={layer}"
    assert_csw_value(md_comparison, 'wfs_url', exp_wfs_url)

    process_client.delete_workspace_layer(workspace, layer)
コード例 #5
0
ファイル: http_header_test.py プロジェクト: index-git/layman
def test_http_header():
    username = '******'
    workspace = 'test_http_header_workspace'
    layername = 'test_http_header_layer'
    http_authn_headers = {
        settings.LAYMAN_AUTHN_HTTP_HEADER_NAME: username,
    }

    with pytest.raises(LaymanError) as exc_info:
        process_client.get_workspace_layer(workspace,
                                           layername,
                                           headers=http_authn_headers)
    assert exc_info.value.http_code == 403
    assert exc_info.value.code == 44
    assert exc_info.value.message == 'Unsuccessful HTTP Header authentication.'
    assert exc_info.value.data == 'Username test_http_header_user not recognized.'

    # reserve the username in prime DB schema
    with app.app_context():
        prime_db_schema.ensure_whole_user(
            username, {
                'issuer_id': 'test_http_header_issuer',
                'sub': username,
                'claims': {
                    'preferred_username': username,
                    'given_name': username,
                    'family_name': username,
                    'middle_name': username,
                    'name': username,
                    'email': f"{username}@example.com",
                }
            })

    with pytest.raises(LaymanError) as exc_info:
        process_client.get_workspace_layer(workspace,
                                           layername,
                                           headers=http_authn_headers)
    assert exc_info.value.http_code == 404
    assert exc_info.value.code == 40
    assert exc_info.value.message == 'Workspace does not exist.'

    with app.app_context():
        prime_db_schema.delete_whole_user(username)
コード例 #6
0
def test_wrong_sld_causes_no_thumbnail():
    workspace = 'test_wrong_sld_causes_no_thumbnail_workspace'
    layer = 'test_wrong_sld_causes_no_thumbnail_layer'
    geojson_file = ['/code/sample/layman.layer/sample_point_cz.geojson']
    style_file = '/code/sample/layman.layer/sample_point_cz_wrong_literal.sld'

    def wait_for_thumbnail_error(response):
        ok_keys = ['db_table', 'wms', 'wfs', 'file']
        if response.status_code == 200:
            r_json = response.json()
            result = response.status_code == 200 and all(
                'status' not in r_json[k]
                for k in ok_keys) and 'status' in r_json[
                    'thumbnail'] and r_json['thumbnail']['status'] in [
                        'FAILURE'
                    ]
        else:
            result = False
        return result

    process_client.publish_workspace_layer(
        workspace,
        layer,
        file_paths=geojson_file,
        style_file=style_file,
        check_response_fn=wait_for_thumbnail_error,
    )

    layer_info = process_client.get_workspace_layer(workspace, layer)

    assert 'error' in layer_info['thumbnail']
    assert layer_info['thumbnail']['error'][
        'message'] == 'Thumbnail rendering failed'
    assert layer_info['thumbnail']['error']['code'] == -1

    process_client.delete_workspace_layer(workspace, layer)
コード例 #7
0
def test_migrate_layers_to_wms_workspace(ensure_layer):
    workspace = 'test_migrate_layers_to_wms_workspace_workspace'
    layer = 'test_migrate_layers_to_wms_workspace_layer'
    expected_file = 'sample/style/countries_wms_blue.png'
    ensure_layer(workspace, layer)

    layer_info = process_client.get_workspace_layer(workspace, layer)

    assert layer_info['wms']['status'] == 'NOT_AVAILABLE'
    assert layer_info['wfs'][
        'url'] == f'http://localhost:8000/geoserver/{workspace}/wfs'
    assert layer_info['db_table']['name'] == layer

    all_workspaces = gs_util.get_all_workspaces(settings.LAYMAN_GS_AUTH)
    assert workspace in all_workspaces
    wms_workspace = wms.get_geoserver_workspace(workspace)
    assert wms_workspace not in all_workspaces
    sld_wfs_r = gs_util.get_workspace_style_response(
        workspace, layer, auth=settings.LAYMAN_GS_AUTH)
    assert sld_wfs_r.status_code == 200

    old_wms_url = f"http://{settings.LAYMAN_SERVER_NAME}/geoserver/" \
                  f"{workspace}/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&STYLES=&" \
                  f"LAYERS={workspace}:{layer}&SRS=EPSG:3857&WIDTH=768&HEIGHT=752&" \
                  f"BBOX=-30022616.05686392,-30569903.32873383,30022616.05686392,28224386.44929134"

    obtained_file = 'tmp/artifacts/test_migrate_layers_to_wms_workspace_before_migration.png'
    assert_util.assert_same_images(old_wms_url, obtained_file, expected_file,
                                   2000)

    with app.app_context():
        upgrade_v1_10.migrate_layers_to_wms_workspace(workspace)

    layer_info = process_client.get_workspace_layer(workspace, layer)
    assert layer_info['wms'][
        'url'] == f'http://localhost:8000/geoserver/{wms_workspace}/ows'
    assert layer_info['wfs'][
        'url'] == f'http://localhost:8000/geoserver/{workspace}/wfs'
    with app.app_context():
        assert layer_info['style']['url'] == url_for(
            'rest_workspace_layer_style.get',
            workspace=workspace,
            layername=layer,
            internal=False)

    all_workspaces = gs_util.get_all_workspaces(settings.LAYMAN_GS_AUTH)
    assert workspace in all_workspaces
    assert wms_workspace in all_workspaces
    sld_wfs_r = gs_util.get_workspace_style_response(
        workspace, layer, auth=settings.LAYMAN_GS_AUTH)
    assert sld_wfs_r.status_code == 404
    sld_wms_r = gs_util.get_workspace_style_response(
        wms_workspace, layer, auth=settings.LAYMAN_GS_AUTH)
    assert sld_wms_r.status_code == 200

    sld_stream = process_client.get_workspace_layer_style(workspace, layer)
    assert sld_stream

    new_wms_url = f"http://{settings.LAYMAN_SERVER_NAME}/geoserver/" \
                  f"{wms_workspace}/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&STYLES=&" \
                  f"LAYERS={wms_workspace}:{layer}&SRS=EPSG:3857&WIDTH=768&HEIGHT=752&" \
                  f"BBOX=-30022616.05686392,-30569903.32873383,30022616.05686392,28224386.44929134"
    obtained_file2 = 'tmp/artifacts/test_migrate_layers_to_wms_workspace_after_migration.png'
    assert_util.assert_same_images(new_wms_url, obtained_file2, expected_file,
                                   2000)

    process_client.delete_workspace_layer(workspace, layer)
コード例 #8
0
def test_map_with_unauthorized_layer():
    username1 = 'test_map_with_unauthorized_layer_user1'
    layername1 = 'test_map_with_unauthorized_layer_layer1'
    mapname1 = 'test_map_with_unauthorized_layer_map1'
    username2 = 'test_map_with_unauthorized_layer_user2'
    layername2 = 'test_map_with_unauthorized_layer_layer2'

    user1_authz_headers = process_client.get_authz_headers(username1)
    user2_authz_headers = process_client.get_authz_headers(username2)

    process_client.reserve_username(username1, headers=user1_authz_headers)
    process_client.reserve_username(username2, headers=user2_authz_headers)

    process_client.publish_workspace_layer(username1,
                                           layername1,
                                           headers=user1_authz_headers)
    process_client.publish_workspace_layer(username2,
                                           layername2,
                                           headers=user2_authz_headers)

    # assert users have access only to their own layer
    process_client.assert_workspace_layers(username1, [layername1],
                                           headers=user1_authz_headers)
    process_client.assert_workspace_layers(username1, [],
                                           headers=user2_authz_headers)
    process_client.assert_workspace_layers(username2, [layername2],
                                           headers=user2_authz_headers)
    process_client.assert_workspace_layers(username2, [],
                                           headers=user1_authz_headers)

    # publish map composed of layers of both users, read for everyone
    process_client.publish_workspace_map(
        username1,
        mapname1,
        file_paths=['sample/layman.map/internal_url_unauthorized_layer.json'],
        access_rights={
            'read': 'EVERYONE',
            'write': f"{username1},{username2}",
        },
        headers=user1_authz_headers,
    )
    process_client.assert_workspace_maps(username1, [mapname1],
                                         headers=user1_authz_headers)
    process_client.assert_workspace_maps(username1, [mapname1],
                                         headers=user2_authz_headers)

    layer1_uuid = process_client.get_workspace_layer(
        username1, layername1, headers=user1_authz_headers)['uuid']
    layer2_uuid = process_client.get_workspace_layer(
        username2, layername2, headers=user2_authz_headers)['uuid']

    # assert that metadata property operates_on contains only layers visible to publisher, whoever is asking and has read access to the map
    assert_operates_on(username1,
                       mapname1, [(layer1_uuid, layername1)],
                       authz_headers=user1_authz_headers)
    assert_operates_on(username1,
                       mapname1, [(layer1_uuid, layername1)],
                       authz_headers=user2_authz_headers)

    process_client.patch_workspace_map(username1,
                                       mapname1,
                                       headers=user2_authz_headers)

    # assert that metadata property operates_on contains only layers visible to last publisher, whoever is asking and has read access to the map
    assert_operates_on(username1,
                       mapname1, [(layer2_uuid, layername2)],
                       authz_headers=user1_authz_headers)
    assert_operates_on(username1,
                       mapname1, [(layer2_uuid, layername2)],
                       authz_headers=user2_authz_headers)

    # clean up
    process_client.delete_workspace_map(username1,
                                        mapname1,
                                        headers=user1_authz_headers)
    process_client.delete_workspace_layer(username1,
                                          layername1,
                                          headers=user1_authz_headers)
    process_client.delete_workspace_layer(username2,
                                          layername2,
                                          headers=user2_authz_headers)