def validate_dynamodb()

in syndicate/core/build/validator/dynamodb_validator.py [0:0]


def validate_dynamodb(table_name, table_meta):
    """
    Performs check of DynamoDB resources.
    :param table_name: name of resource
    :param table_meta: resource definition
    :raises AssertionError in case of invalidity.
    :return: None
    """
    # check hash key
    _assert_key(meta=table_meta,
                res_name=table_name,
                key_name_attr=HASH_KEY_NAME,
                key_type_attr=HASH_KEY_TYPE)
    hash_key_type = table_meta[HASH_KEY_TYPE]
    if hash_key_type not in dynamodb_valid_key_types:
        raise AssertionError(
            'Hash key type of Table {0} is unsupported by DynamoDB. '
            'Valid types are {1}'.format(table_name, dynamodb_valid_key_types))

    # check sort key
    if table_meta.get(SORT_KEY_NAME):
        _assert_key(meta=table_meta,
                    res_name=table_name,
                    key_name_attr=SORT_KEY_NAME,
                    key_type_attr=SORT_KEY_TYPE)
        table_sort_key_type = table_meta[SORT_KEY_TYPE]
        if table_sort_key_type not in dynamodb_valid_key_types:
            raise AssertionError(
                'Sort key type of Table {0} is unsupported by DynamoDB. '
                'Valid types are {1}'.format(table_name,
                                             dynamodb_valid_key_types))

    # check LSIs
    if table_meta.get(LOCAL_INDEXES):
        for index in table_meta.get(LOCAL_INDEXES):
            index_name = index.get(NAME)
            assert_required_property(
                resource_name=index_name,
                property_name='local_indexes.{0}'.format(NAME),
                property_value=index_name)
            # both keys are required for LSI
            index_key_name = index.get(INDEX_KEY_NAME)
            assert_required_property(resource_name=INDEX_KEY_NAME,
                                     property_name='local_indexes.{0}'.format(
                                         INDEX_KEY_NAME),
                                     property_value=index_key_name)
            index_key_type_value = index.get(INDEX_KEY_TYPE)
            assert_required_property(resource_name=INDEX_KEY_TYPE,
                                     property_name='local_indexes.{0}'.format(
                                         INDEX_KEY_TYPE),
                                     property_value=index_key_type_value)
            if index_key_type_value not in dynamodb_valid_key_types:
                raise AssertionError(
                    'Local Index hash key type of Table {0} '
                    'is unsupported by DynamoDB. Valid types are {1}'.format(
                        table_name, dynamodb_valid_key_types))

            # LSI hash key must be equal to table's hash key
            table_hash_key_name = table_meta[HASH_KEY_NAME]
            if index_key_name != table_hash_key_name or \
                    index_key_type_value != hash_key_type:
                raise AssertionError(
                    'Hash key name and type of LocalSecondaryIndex named {0}'
                    ' must be equal to Table\'s {1} one. Expected: {2}:{3}; '
                    'Actual: {4}:{5}'.format(index_name,
                                             table_name,
                                             table_hash_key_name,
                                             hash_key_type,
                                             index_key_name,
                                             index_key_type_value))

            index_sort_key_name = index.get(INDEX_SORT_KEY_NAME)
            assert_required_property(resource_name=INDEX_SORT_KEY_NAME,
                                     property_name='local_indexes.{0}'.format(
                                         INDEX_SORT_KEY_NAME),
                                     property_value=index_sort_key_name)
            index_sort_key_type_value = index.get(INDEX_SORT_KEY_TYPE)
            assert_required_property(resource_name=INDEX_SORT_KEY_TYPE,
                                     property_name='local_indexes.{0}'.format(
                                         INDEX_SORT_KEY_TYPE),
                                     property_value=index_sort_key_type_value)

            if index_sort_key_type_value not in dynamodb_valid_key_types:
                raise AssertionError(
                    'Local Index sort key type of Table {0} '
                    'is unsupported by DynamoDB. Valid types are {1}'.format(
                        table_name, dynamodb_valid_key_types))
            # LSI hash key must be equal to table's hash key
            if table_meta.get(SORT_KEY_NAME):
                if index_sort_key_name == table_meta[SORT_KEY_NAME]:
                    raise AssertionError(
                        'Sort key name of LocalSecondaryIndex '
                        'named {0} is equal to Table\'s {1} ones. '
                        'Sort key of LSI must differ from table\s. '
                        'Value: {2}'.format(
                            index_name,
                            table_name,
                            index_sort_key_name
                        ))