def validate_bucket_name()

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


def validate_bucket_name(bucket_name: str):
    """Checks whether the given bucket name is valid.
    If the given name isn't valid, ValueError with an appropriate message
    is raised.
    :type bucket_name: str
    :param bucket_name: the name to check
    """
    bucket_name = bucket_name.strip()
    _LOG.info(f"Starting validating bucket name '{bucket_name}'")
    error = None

    raw_bucket_name, _ = (bucket_name.split('/', 1)
                          if bucket_name and '/' in bucket_name
                          else (bucket_name, None))
    if not raw_bucket_name or not 3 <= len(raw_bucket_name) <= 63:
        error = 'Bucket name must be between 3 and 63 characters long'
    else:
        invalid_characters = re.search('[^a-z0-9.-]', bucket_name)
        if invalid_characters:
            character = invalid_characters.group()
            if character in string.ascii_uppercase:
                error = 'Bucket name must not contain uppercase characters'
            else:
                error = f'Bucket name contains invalid characters: {character}'
        elif any(bucket_name.startswith(symbol) for symbol in '.-'):
            error = 'Bucket name must start with a lowercase letter or number'
        elif any(bucket_name.endswith(symbol) for symbol in '.-'):
            error = 'Bucket name must not end with dash or period'
        elif '..' in bucket_name:
            error = 'Bucket name must not contain two adjacent periods'
        elif '.-' in bucket_name or '-.' in bucket_name:
            error = 'Bucket name must not contain dash next to period'
        else:
            try:
                ipaddress.ip_address(bucket_name)
                error = 'Bucket name must not resemble an IP address'
            except ValueError:
                pass
    if error:
        _LOG.warning(error)
        raise ValueError(error)
    _LOG.info(f"Finished validating bucket name '{bucket_name}'")