from time import sleep import boto3 import pytest from unittest.mock import patch from botocore.config import Config from botocore.exceptions import ClientError from garcon_contrib.aws import garcon_dynamodb TABLE_NAME = 'garcon_contrib_test_table' botocore_config = Config( connect_timeout=10, read_timeout=20 ) @pytest.fixture(scope='module') def created_table(): client = boto3.client('dynamodb', config=botocore_config) for attempt in range(6): try: client.delete_table(TableName=TABLE_NAME) except ClientError as exception: error_code = exception.response['Error']['Code'] if error_code == 'ResourceNotFoundException': # ok - table doesn't exist break elif error_code == 'ResourceInUseException': sleep(5) continue # next attempt else: raise create_table_response = client.create_table( TableName=TABLE_NAME, KeySchema=[ { 'AttributeName': 'id', 'KeyType': 'HASH' } ], AttributeDefinitions=[ { 'AttributeName': 'id', 'AttributeType': 'S' } ], ProvisionedThroughput={ 'ReadCapacityUnits': 1, 'WriteCapacityUnits': 1 } ) yield create_table_response client.delete_table(TableName=TABLE_NAME) @patch('garcon.activity.ActivityWorker') def test_wait_for_table_task_completion(mock_activity, created_table): result = garcon_dynamodb.wait_for_table_task_completion( mock_activity, created_table['TableDescription']['TableName']) assert result is None def _wait_for_table_to_be_active(table_name): for attempt in range(4): table = boto3.resource('dynamodb').Table(table_name) status = table.table_status print(f'Table status: {status}') if status == 'ACTIVE': return table else: sleep(5) continue raise Exception('Table was not created') @patch('garcon.activity.ActivityWorker') def test_set_table_throughput(mock_activity, created_table): table_name = created_table['TableDescription']['TableName'] table = _wait_for_table_to_be_active(table_name) assert table.table_status == 'ACTIVE' assert table.provisioned_throughput['ReadCapacityUnits'] == 1 assert table.provisioned_throughput['WriteCapacityUnits'] == 1 throughput_settings = {'throughput': {'read': 2, 'write': 1}} garcon_dynamodb.set_table_throughput( mock_activity, TABLE_NAME, throughput_settings) table = _wait_for_table_to_be_active(table_name) assert table.table_status == 'ACTIVE' assert table.provisioned_throughput['ReadCapacityUnits'] == 2 assert table.provisioned_throughput['WriteCapacityUnits'] == 1