in index-tool/migrationtools/documentdb_index_tool.py [0:0]
def find_compatibility_issues(self, metadata):
"""Check db, collection and index data in metadata files for compatibility with DocumentDB"""
compatibility_issues = AutovivifyDict()
for db_name in metadata:
db_metadata = metadata[db_name]
if len(db_name) > DocumentDbLimits.DATABASE_NAME_MAX_LENGTH:
message = 'Database name greater than {} characters'.format(
DocumentDbLimits.DATABASE_NAME_MAX_LENGTH)
compatibility_issues[db_name][
self.EXCEEDED_LIMITS][message] = db_name
for collection_name in metadata[db_name]:
collection_metadata = db_metadata[collection_name]
if len(collection_name
) > DocumentDbLimits.COLLECTION_NAME_MAX_LENGTH:
message = 'Collection name greater than {} characters'.format(
DocumentDbLimits.COLLECTION_NAME_MAX_LENGTH)
compatibility_issues[db_name][collection_name][
self.EXCEEDED_LIMITS][message] = collection_name
collection_namespace = '{}.{}'.format(db_name, collection_name)
# <db>.<collection>
if len(collection_namespace
) > DocumentDbLimits.NAMESPACE_MAX_LENGTH:
message = 'Namespace greater than {} characters'.format(
DocumentDbLimits.NAMESPACE_MAX_LENGTH)
compatibility_issues[db_name][collection_name][
self.EXCEEDED_LIMITS][message] = collection_namespace
if self.OPTIONS in collection_metadata:
for option_key in collection_metadata[self.OPTIONS]:
if option_key in DocumentDbUnsupportedFeatures.UNSUPPORTED_COLLECTION_OPTIONS and collection_metadata[self.OPTIONS][option_key] is True:
if self.UNSUPPORTED_COLLECTION_OPTIONS_KEY not in compatibility_issues[
db_name][collection_name]:
compatibility_issues[db_name][collection_name][
self.
UNSUPPORTED_COLLECTION_OPTIONS_KEY] = []
compatibility_issues[db_name][collection_name][
self.
UNSUPPORTED_COLLECTION_OPTIONS_KEY].append(
option_key)
for index_name in collection_metadata[self.INDEXES]:
index = collection_metadata[self.INDEXES][index_name]
# <collection>$<index>
collection_qualified_index_name = '{}${}'.format(
collection_name, index_name)
if len(
collection_qualified_index_name
) > DocumentDbLimits.COLLECTION_QUALIFIED_INDEX_NAME_MAX_LENGTH:
message = '<collection>$<index> greater than {} characters'.format(
DocumentDbLimits.
COLLECTION_QUALIFIED_INDEX_NAME_MAX_LENGTH)
compatibility_issues[db_name][collection_name][
index_name][self.EXCEEDED_LIMITS][
message] = collection_qualified_index_name
# <db>.<collection>$<index>
fully_qualified_index_name = '{}${}'.format(
collection_namespace, index_name)
if len(
fully_qualified_index_name
) > DocumentDbLimits.FULLY_QUALIFIED_INDEX_NAME_MAX_LENGTH:
message = '<db>.<collection>$<index> greater than {} characters'.format(
DocumentDbLimits.
COLLECTION_QUALIFIED_INDEX_NAME_MAX_LENGTH)
compatibility_issues[db_name][collection_name][
index_name][self.EXCEEDED_LIMITS][
message] = fully_qualified_index_name
# Check for indexes with too many keys
if len(index) > DocumentDbLimits.COMPOUND_INDEX_MAX_KEYS:
message = 'Index contains more than {} keys'.format(
DocumentDbLimits.COMPOUND_INDEX_MAX_KEYS)
compatibility_issues[db_name][collection_name][
index_name][self.EXCEEDED_LIMITS][message] = len(
index)
for key_name in index:
# Check for index key names that are too long
if len(key_name
) > DocumentDbLimits.INDEX_KEY_MAX_LENGTH:
message = 'Key name greater than {} characters'.format(
DocumentDbLimits.INDEX_KEY_MAX_LENGTH)
compatibility_issues[db_name][collection_name][
index_name][
self.EXCEEDED_LIMITS][message] = key_name
# Check for unsupported index options like collation
if key_name in DocumentDbUnsupportedFeatures.UNSUPPORTED_INDEX_OPTIONS:
if self.UNSUPPORTED_INDEX_OPTIONS_KEY not in compatibility_issues[
db_name][collection_name][index_name]:
compatibility_issues[db_name][collection_name][
index_name][
self.
UNSUPPORTED_INDEX_OPTIONS_KEY] = []
compatibility_issues[db_name][collection_name][
index_name][
self.UNSUPPORTED_INDEX_OPTIONS_KEY].append(
key_name)
# Check for unsupported index types like text
if key_name == self.INDEX_KEY:
for index_key_name in index[key_name]:
key_value = index[key_name][index_key_name]
if key_value in DocumentDbUnsupportedFeatures.UNSUPPORTED_INDEX_TYPES:
compatibility_issues[db_name][
collection_name][index_name][
self.
UNSUPPORTED_INDEX_TYPES_KEY] = key_value
return compatibility_issues