# Copyright 2020-present ScyllaDB # # SPDX-License-Identifier: AGPL-3.0-or-later # Tests for accessing alternator-only system tables (from Scylla). import pytest import requests from botocore.exceptions import ClientError from boto3.dynamodb.conditions import Key internal_prefix = '.scylla.alternator.' # Test that fetching key columns from system tables works def test_fetch_from_system_tables(scylla_only, dynamodb, rest_api): client = dynamodb.meta.client tables_response = client.scan(TableName=internal_prefix+'system_schema.tables', AttributesToGet=['keyspace_name','table_name']) # #13332 - don't rely on "system" prefix to decide what is user keyspace or not. resp_user = requests.get(f'{rest_api}/storage_service/keyspaces?type=user', timeout=1) resp_user.raise_for_status() keyspaces_user = resp_user.json() keyspaces_done = [] for item in tables_response['Items']: ks_name = item['keyspace_name'] table_name = item['table_name'] if ks_name in keyspaces_user: continue col_response = client.query(TableName=internal_prefix+'system_schema.columns', KeyConditionExpression=Key('keyspace_name').eq(ks_name) & Key('table_name').eq(table_name)) key_columns = [item['column_name'] for item in col_response['Items'] if item['kind'] == 'clustering' or item['kind'] == 'partition_key'] qualified_name = "{}{}.{}".format(internal_prefix, ks_name, table_name) import time start = time.time() response = client.scan(TableName=qualified_name, AttributesToGet=key_columns, Limit=50) print(ks_name, table_name, len(str(response)), time.time()-start) keyspaces_done.append(ks_name) assert keyspaces_done != {} def test_block_access_to_non_system_tables_with_virtual_interface(scylla_only, test_table_s, dynamodb): client = dynamodb.meta.client with pytest.raises(ClientError, match='ResourceNotFoundException.*{}'.format(internal_prefix)): tables_response = client.scan(TableName="{}alternator_{}.{}".format(internal_prefix, test_table_s.name, test_table_s.name)) def test_block_creating_tables_with_reserved_prefix(scylla_only, dynamodb): client = dynamodb.meta.client for wrong_name_postfix in ['', 'a', 'xxx', 'system_auth.roles', 'table_name']: with pytest.raises(ClientError, match=internal_prefix): dynamodb.create_table(TableName=internal_prefix+wrong_name_postfix, BillingMode='PAY_PER_REQUEST', KeySchema=[{'AttributeName':'p', 'KeyType':'HASH'}], AttributeDefinitions=[{'AttributeName':'p', 'AttributeType': 'S'}] )