sprockets.clients.dynamodb/examples/create-table.py
2016-02-25 13:35:22 -05:00

79 lines
2.3 KiB
Python

"""
Create the table described in `CreateTable`_.
This example creates a table if it does not exist using chained
callbacks.
.. _CreateTable: http://docs.aws.amazon.com/amazondynamodb/latest/
APIReference/API_CreateTable.html
"""
import logging
import sys
from sprockets.clients import dynamodb
from tornado import ioloop
LOGGER = logging.getLogger('create-database')
TABLE_DEF = {
'TableName': 'Thread',
'AttributeDefinitions': [
{'AttributeName': 'ForumName', 'AttributeType': 'S'},
{'AttributeName': 'Subject', 'AttributeType': 'S'},
{'AttributeName': 'LastPostDateTime', 'AttributeType': 'S'},
],
'KeySchema': [
{'AttributeName': 'ForumName', 'KeyType': 'HASH'},
{'AttributeName': 'Subject', 'KeyType': 'RANGE'},
],
'LocalSecondaryIndexes': [
{
'IndexName': 'LastPostIndex',
'KeySchema': [
{'AttributeName': 'ForumName', 'KeyType': 'HASH'},
{'AttributeName': 'LastPostDateTime', 'KeyType': 'RANGE'},
],
'Projection': {
'ProjectionType': 'KEYS_ONLY',
},
},
],
'ProvisionedThroughput': {
'ReadCapacityUnits': 5,
'WriteCapacityUnits': 5,
}
}
dynamo = dynamodb.DynamoDB()
iol = ioloop.IOLoop.instance()
def on_table_described(describe_response):
def on_created(create_response):
try:
result = create_response.result()
LOGGER.info('table created - %r', result)
iol.add_callback(iol.stop)
except Exception:
LOGGER.exception('failed to create table')
sys.exit(-1)
try:
result = describe_response.result()
LOGGER.info('found table %s, created %s',
result['Table']['TableName'],
result['Table']['CreationDateTime'])
iol.add_callback(iol.stop)
except Exception as error:
LOGGER.warn('table not found, attempting to create: %s', error)
next_future = dynamo.create_table(TABLE_DEF)
iol.add_future(next_future, on_created)
logging.basicConfig(level=logging.DEBUG,
format='%(levelname)1.1s %(name)s: %(message)s')
iol.add_future(dynamo.describe_table(TABLE_DEF['TableName']),
on_table_described)
iol.start()