def _create_dynamodb_table_from_meta()

in syndicate/core/resources/dynamo_db_resource.py [0:0]


    def _create_dynamodb_table_from_meta(self, name, meta):
        """ Create Dynamo DB table from meta description after parameter
        validation.
    
        :type name: str
        :type meta: dict
        """
        validate_params(name, meta, DYNAMODB_TABLE_REQUIRED_PARAMS)

        res = self.dynamodb_conn.describe_table(name)
        autoscaling_config = meta.get('autoscaling')
        if res:
            _LOG.warn('%s table exists.', name)
            if autoscaling_config:
                res['Autoscaling'] = self._describe_autoscaling(
                    autoscaling_config,
                    name)
            response = self.describe_table(name, meta, res)
            arn = list(response.keys())[0]
            response[arn]['resource_meta']['external'] = True
            return response

        self.dynamodb_conn.create_table(
            name, meta['hash_key_name'], meta['hash_key_type'],
            meta.get('sort_key_name'), meta.get('sort_key_type'),
            meta.get('read_capacity'), meta.get('write_capacity'),
            global_indexes=meta.get('global_indexes'),
            local_indexes=meta.get('local_indexes'),
            tags=meta.get('tags'),
            wait=True)
        response = self.dynamodb_conn.describe_table(name)
        if not response:
            raise AssertionError('Table with name {0} has not been created!'
                                 .format(name))
        # enabling stream if present
        stream_view_type = meta.get('stream_view_type')
        if stream_view_type:
            stream = self.dynamodb_conn.get_table_stream_arn(name)
            if stream:
                _LOG.warn('Stream %s exists.', name)
            else:
                try:
                    self.dynamodb_conn.enable_table_stream(name,
                                                           stream_view_type)
                except ClientError as e:
                    # handle specific case for fantom stream enabling
                    if 'ResourceInUseException' in str(e):
                        _LOG.warn('Stream enabling currently in progress,'
                                  ' table: %s', name)
                    else:
                        raise e
        if autoscaling_config:
            _LOG.debug('Found autoscaling configuration for resource %s', name)
            sc_res = self._enable_autoscaling(autoscaling_config, name)
            response['Autoscaling'] = sc_res
        _LOG.info('Created table %s.', name)
        return self.describe_table(name, meta, response)