def validate_resources_according_to_json_schema()

in Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/json_utils.py [0:0]


def validate_resources_according_to_json_schema(resources: List[ResourceMappingAttributes]) -> Dict[int, List[str]]:
    invalid_resources: Dict[int, List[str]] = {}

    success_status_unique_keys: Set[str] = set()
    other_status_unique_keys: Set[str] = set()
    other_status_duplicated_keys: Set[str] = set()
    resource: ResourceMappingAttributes
    for resource in resources:
        if resource.status.value == ResourceMappingAttributesStatus.SUCCESS_STATUS_VALUE:
            success_status_unique_keys.add(resource.key_name)
        else:
            if resource.key_name in other_status_unique_keys:
                other_status_duplicated_keys.add(resource.key_name)
            else:
                other_status_unique_keys.add(resource.key_name)

    row_count: int = 0
    for resource in resources:
        if not resource.is_valid():
            _add_validation_error_message(
                invalid_resources, row_count, error_messages.INVALID_FORMAT_EMPTY_ATTRIBUTE_ERROR_MESSAGE)

        # if resource status is success, skip validation check
        if (not resource.status.value == ResourceMappingAttributesStatus.SUCCESS_STATUS_VALUE) \
                and (resource.key_name in success_status_unique_keys
                     or resource.key_name in other_status_duplicated_keys):
            _add_validation_error_message(
                invalid_resources, row_count,
                error_messages.INVALID_FORMAT_DUPLICATED_KEY_ERROR_MESSAGE.format(resource.key_name))

        if not re.match(_RESOURCE_MAPPING_SCHEMA_ACCOUNTID_PATTERN, resource.account_id):
            _add_validation_error_message(
                invalid_resources, row_count,
                error_messages.INVALID_FORMAT_UNEXPECTED_VALUE_IN_TABLE_ERROR_MESSAGE.format(
                    resource.account_id,
                    RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME,
                    _RESOURCE_MAPPING_SCHEMA_ACCOUNTID_PATTERN))

        if not re.match(_RESOURCE_MAPPING_SCHEMA_REGION_PATTERN, resource.region):
            _add_validation_error_message(
                invalid_resources, row_count,
                error_messages.INVALID_FORMAT_UNEXPECTED_VALUE_IN_TABLE_ERROR_MESSAGE.format(
                    resource.region, _RESOURCE_MAPPING_REGION_JSON_KEY_NAME,
                    _RESOURCE_MAPPING_SCHEMA_REGION_PATTERN))

        row_count += 1

    return invalid_resources