Spaces:
Paused
Paused
| # Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/ | |
| # Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"). You | |
| # may not use this file except in compliance with the License. A copy of | |
| # the License is located at | |
| # | |
| # http://aws.amazon.com/apache2.0/ | |
| # | |
| # or in the "license" file accompanying this file. This file is | |
| # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF | |
| # ANY KIND, either express or implied. See the License for the specific | |
| # language governing permissions and limitations under the License. | |
| from botocore.vendored import requests | |
| from botocore.vendored.requests.packages import urllib3 | |
| def _exception_from_packed_args(exception_cls, args=None, kwargs=None): | |
| # This is helpful for reducing Exceptions that only accept kwargs as | |
| # only positional arguments can be provided for __reduce__ | |
| # Ideally, this would also be a class method on the BotoCoreError | |
| # but instance methods cannot be pickled. | |
| if args is None: | |
| args = () | |
| if kwargs is None: | |
| kwargs = {} | |
| return exception_cls(*args, **kwargs) | |
| class BotoCoreError(Exception): | |
| """ | |
| The base exception class for BotoCore exceptions. | |
| :ivar msg: The descriptive message associated with the error. | |
| """ | |
| fmt = 'An unspecified error occurred' | |
| def __init__(self, **kwargs): | |
| msg = self.fmt.format(**kwargs) | |
| Exception.__init__(self, msg) | |
| self.kwargs = kwargs | |
| def __reduce__(self): | |
| return _exception_from_packed_args, (self.__class__, None, self.kwargs) | |
| class DataNotFoundError(BotoCoreError): | |
| """ | |
| The data associated with a particular path could not be loaded. | |
| :ivar data_path: The data path that the user attempted to load. | |
| """ | |
| fmt = 'Unable to load data for: {data_path}' | |
| class UnknownServiceError(DataNotFoundError): | |
| """Raised when trying to load data for an unknown service. | |
| :ivar service_name: The name of the unknown service. | |
| """ | |
| fmt = ( | |
| "Unknown service: '{service_name}'. Valid service names are: " | |
| "{known_service_names}" | |
| ) | |
| class UnknownRegionError(BotoCoreError): | |
| """Raised when trying to load data for an unknown region. | |
| :ivar region_name: The name of the unknown region. | |
| """ | |
| fmt = "Unknown region: '{region_name}'. {error_msg}" | |
| class ApiVersionNotFoundError(BotoCoreError): | |
| """ | |
| The data associated with either the API version or a compatible one | |
| could not be loaded. | |
| :ivar data_path: The data path that the user attempted to load. | |
| :ivar api_version: The API version that the user attempted to load. | |
| """ | |
| fmt = 'Unable to load data {data_path} for: {api_version}' | |
| class HTTPClientError(BotoCoreError): | |
| fmt = 'An HTTP Client raised an unhandled exception: {error}' | |
| def __init__(self, request=None, response=None, **kwargs): | |
| self.request = request | |
| self.response = response | |
| super().__init__(**kwargs) | |
| def __reduce__(self): | |
| return _exception_from_packed_args, ( | |
| self.__class__, | |
| (self.request, self.response), | |
| self.kwargs, | |
| ) | |
| class ConnectionError(BotoCoreError): | |
| fmt = 'An HTTP Client failed to establish a connection: {error}' | |
| class InvalidIMDSEndpointError(BotoCoreError): | |
| fmt = 'Invalid endpoint EC2 Instance Metadata endpoint: {endpoint}' | |
| class InvalidIMDSEndpointModeError(BotoCoreError): | |
| fmt = ( | |
| 'Invalid EC2 Instance Metadata endpoint mode: {mode}' | |
| ' Valid endpoint modes (case-insensitive): {valid_modes}.' | |
| ) | |
| class EndpointConnectionError(ConnectionError): | |
| fmt = 'Could not connect to the endpoint URL: "{endpoint_url}"' | |
| class SSLError(ConnectionError, requests.exceptions.SSLError): | |
| fmt = 'SSL validation failed for {endpoint_url} {error}' | |
| class ConnectionClosedError(HTTPClientError): | |
| fmt = ( | |
| 'Connection was closed before we received a valid response ' | |
| 'from endpoint URL: "{endpoint_url}".' | |
| ) | |
| class ReadTimeoutError( | |
| HTTPClientError, | |
| requests.exceptions.ReadTimeout, | |
| urllib3.exceptions.ReadTimeoutError, | |
| ): | |
| fmt = 'Read timeout on endpoint URL: "{endpoint_url}"' | |
| class ConnectTimeoutError(ConnectionError, requests.exceptions.ConnectTimeout): | |
| fmt = 'Connect timeout on endpoint URL: "{endpoint_url}"' | |
| class ProxyConnectionError(ConnectionError, requests.exceptions.ProxyError): | |
| fmt = 'Failed to connect to proxy URL: "{proxy_url}"' | |
| class ResponseStreamingError(HTTPClientError): | |
| fmt = 'An error occurred while reading from response stream: {error}' | |
| class NoCredentialsError(BotoCoreError): | |
| """ | |
| No credentials could be found. | |
| """ | |
| fmt = 'Unable to locate credentials' | |
| class NoAuthTokenError(BotoCoreError): | |
| """ | |
| No authorization token could be found. | |
| """ | |
| fmt = 'Unable to locate authorization token' | |
| class TokenRetrievalError(BotoCoreError): | |
| """ | |
| Error attempting to retrieve a token from a remote source. | |
| :ivar provider: The name of the token provider. | |
| :ivar error_msg: The msg explaining why the token could not be retrieved. | |
| """ | |
| fmt = 'Error when retrieving token from {provider}: {error_msg}' | |
| class PartialCredentialsError(BotoCoreError): | |
| """ | |
| Only partial credentials were found. | |
| :ivar cred_var: The missing credential variable name. | |
| """ | |
| fmt = 'Partial credentials found in {provider}, missing: {cred_var}' | |
| class CredentialRetrievalError(BotoCoreError): | |
| """ | |
| Error attempting to retrieve credentials from a remote source. | |
| :ivar provider: The name of the credential provider. | |
| :ivar error_msg: The msg explaining why credentials could not be | |
| retrieved. | |
| """ | |
| fmt = 'Error when retrieving credentials from {provider}: {error_msg}' | |
| class UnknownSignatureVersionError(BotoCoreError): | |
| """ | |
| Requested Signature Version is not known. | |
| :ivar signature_version: The name of the requested signature version. | |
| """ | |
| fmt = 'Unknown Signature Version: {signature_version}.' | |
| class ServiceNotInRegionError(BotoCoreError): | |
| """ | |
| The service is not available in requested region. | |
| :ivar service_name: The name of the service. | |
| :ivar region_name: The name of the region. | |
| """ | |
| fmt = 'Service {service_name} not available in region {region_name}' | |
| class BaseEndpointResolverError(BotoCoreError): | |
| """Base error for endpoint resolving errors. | |
| Should never be raised directly, but clients can catch | |
| this exception if they want to generically handle any errors | |
| during the endpoint resolution process. | |
| """ | |
| class NoRegionError(BaseEndpointResolverError): | |
| """No region was specified.""" | |
| fmt = 'You must specify a region.' | |
| class EndpointVariantError(BaseEndpointResolverError): | |
| """ | |
| Could not construct modeled endpoint variant. | |
| :ivar error_msg: The message explaining why the modeled endpoint variant | |
| is unable to be constructed. | |
| """ | |
| fmt = ( | |
| 'Unable to construct a modeled endpoint with the following ' | |
| 'variant(s) {tags}: ' | |
| ) | |
| class UnknownEndpointError(BaseEndpointResolverError, ValueError): | |
| """ | |
| Could not construct an endpoint. | |
| :ivar service_name: The name of the service. | |
| :ivar region_name: The name of the region. | |
| """ | |
| fmt = ( | |
| 'Unable to construct an endpoint for ' | |
| '{service_name} in region {region_name}' | |
| ) | |
| class UnknownFIPSEndpointError(BaseEndpointResolverError): | |
| """ | |
| Could not construct a FIPS endpoint. | |
| :ivar service_name: The name of the service. | |
| :ivar region_name: The name of the region. | |
| """ | |
| fmt = ( | |
| 'The provided FIPS pseudo-region "{region_name}" is not known for ' | |
| 'the service "{service_name}". A FIPS compliant endpoint cannot be ' | |
| 'constructed.' | |
| ) | |
| class ProfileNotFound(BotoCoreError): | |
| """ | |
| The specified configuration profile was not found in the | |
| configuration file. | |
| :ivar profile: The name of the profile the user attempted to load. | |
| """ | |
| fmt = 'The config profile ({profile}) could not be found' | |
| class ConfigParseError(BotoCoreError): | |
| """ | |
| The configuration file could not be parsed. | |
| :ivar path: The path to the configuration file. | |
| """ | |
| fmt = 'Unable to parse config file: {path}' | |
| class ConfigNotFound(BotoCoreError): | |
| """ | |
| The specified configuration file could not be found. | |
| :ivar path: The path to the configuration file. | |
| """ | |
| fmt = 'The specified config file ({path}) could not be found.' | |
| class MissingParametersError(BotoCoreError): | |
| """ | |
| One or more required parameters were not supplied. | |
| :ivar object: The object that has missing parameters. | |
| This can be an operation or a parameter (in the | |
| case of inner params). The str() of this object | |
| will be used so it doesn't need to implement anything | |
| other than str(). | |
| :ivar missing: The names of the missing parameters. | |
| """ | |
| fmt = ( | |
| 'The following required parameters are missing for ' | |
| '{object_name}: {missing}' | |
| ) | |
| class ValidationError(BotoCoreError): | |
| """ | |
| An exception occurred validating parameters. | |
| Subclasses must accept a ``value`` and ``param`` | |
| argument in their ``__init__``. | |
| :ivar value: The value that was being validated. | |
| :ivar param: The parameter that failed validation. | |
| :ivar type_name: The name of the underlying type. | |
| """ | |
| fmt = "Invalid value ('{value}') for param {param} " "of type {type_name} " | |
| class ParamValidationError(BotoCoreError): | |
| fmt = 'Parameter validation failed:\n{report}' | |
| # These exceptions subclass from ValidationError so that code | |
| # can just 'except ValidationError' to catch any possibly validation | |
| # error. | |
| class UnknownKeyError(ValidationError): | |
| """ | |
| Unknown key in a struct parameter. | |
| :ivar value: The value that was being checked. | |
| :ivar param: The name of the parameter. | |
| :ivar choices: The valid choices the value can be. | |
| """ | |
| fmt = ( | |
| "Unknown key '{value}' for param '{param}'. Must be one " | |
| "of: {choices}" | |
| ) | |
| class RangeError(ValidationError): | |
| """ | |
| A parameter value was out of the valid range. | |
| :ivar value: The value that was being checked. | |
| :ivar param: The parameter that failed validation. | |
| :ivar min_value: The specified minimum value. | |
| :ivar max_value: The specified maximum value. | |
| """ | |
| fmt = ( | |
| 'Value out of range for param {param}: ' | |
| '{min_value} <= {value} <= {max_value}' | |
| ) | |
| class UnknownParameterError(ValidationError): | |
| """ | |
| Unknown top level parameter. | |
| :ivar name: The name of the unknown parameter. | |
| :ivar operation: The name of the operation. | |
| :ivar choices: The valid choices the parameter name can be. | |
| """ | |
| fmt = ( | |
| "Unknown parameter '{name}' for operation {operation}. Must be one " | |
| "of: {choices}" | |
| ) | |
| class InvalidRegionError(ValidationError, ValueError): | |
| """ | |
| Invalid region_name provided to client or resource. | |
| :ivar region_name: region_name that was being validated. | |
| """ | |
| fmt = "Provided region_name '{region_name}' doesn't match a supported format." | |
| class AliasConflictParameterError(ValidationError): | |
| """ | |
| Error when an alias is provided for a parameter as well as the original. | |
| :ivar original: The name of the original parameter. | |
| :ivar alias: The name of the alias | |
| :ivar operation: The name of the operation. | |
| """ | |
| fmt = ( | |
| "Parameter '{original}' and its alias '{alias}' were provided " | |
| "for operation {operation}. Only one of them may be used." | |
| ) | |
| class UnknownServiceStyle(BotoCoreError): | |
| """ | |
| Unknown style of service invocation. | |
| :ivar service_style: The style requested. | |
| """ | |
| fmt = 'The service style ({service_style}) is not understood.' | |
| class PaginationError(BotoCoreError): | |
| fmt = 'Error during pagination: {message}' | |
| class OperationNotPageableError(BotoCoreError): | |
| fmt = 'Operation cannot be paginated: {operation_name}' | |
| class ChecksumError(BotoCoreError): | |
| """The expected checksum did not match the calculated checksum.""" | |
| fmt = ( | |
| 'Checksum {checksum_type} failed, expected checksum ' | |
| '{expected_checksum} did not match calculated checksum ' | |
| '{actual_checksum}.' | |
| ) | |
| class UnseekableStreamError(BotoCoreError): | |
| """Need to seek a stream, but stream does not support seeking.""" | |
| fmt = ( | |
| 'Need to rewind the stream {stream_object}, but stream ' | |
| 'is not seekable.' | |
| ) | |
| class WaiterError(BotoCoreError): | |
| """Waiter failed to reach desired state.""" | |
| fmt = 'Waiter {name} failed: {reason}' | |
| def __init__(self, name, reason, last_response): | |
| super().__init__(name=name, reason=reason) | |
| self.last_response = last_response | |
| class IncompleteReadError(BotoCoreError): | |
| """HTTP response did not return expected number of bytes.""" | |
| fmt = ( | |
| '{actual_bytes} read, but total bytes ' 'expected is {expected_bytes}.' | |
| ) | |
| class InvalidExpressionError(BotoCoreError): | |
| """Expression is either invalid or too complex.""" | |
| fmt = 'Invalid expression {expression}: Only dotted lookups are supported.' | |
| class UnknownCredentialError(BotoCoreError): | |
| """Tried to insert before/after an unregistered credential type.""" | |
| fmt = 'Credential named {name} not found.' | |
| class WaiterConfigError(BotoCoreError): | |
| """Error when processing waiter configuration.""" | |
| fmt = 'Error processing waiter config: {error_msg}' | |
| class UnknownClientMethodError(BotoCoreError): | |
| """Error when trying to access a method on a client that does not exist.""" | |
| fmt = 'Client does not have method: {method_name}' | |
| class UnsupportedSignatureVersionError(BotoCoreError): | |
| """Error when trying to use an unsupported Signature Version.""" | |
| fmt = 'Signature version is not supported: {signature_version}' | |
| class ClientError(Exception): | |
| MSG_TEMPLATE = ( | |
| 'An error occurred ({error_code}) when calling the {operation_name} ' | |
| 'operation{retry_info}: {error_message}' | |
| ) | |
| def __init__(self, error_response, operation_name): | |
| retry_info = self._get_retry_info(error_response) | |
| error = error_response.get('Error', {}) | |
| msg = self.MSG_TEMPLATE.format( | |
| error_code=error.get('Code', 'Unknown'), | |
| error_message=error.get('Message', 'Unknown'), | |
| operation_name=operation_name, | |
| retry_info=retry_info, | |
| ) | |
| super().__init__(msg) | |
| self.response = error_response | |
| self.operation_name = operation_name | |
| def _get_retry_info(self, response): | |
| retry_info = '' | |
| if 'ResponseMetadata' in response: | |
| metadata = response['ResponseMetadata'] | |
| if metadata.get('MaxAttemptsReached', False): | |
| if 'RetryAttempts' in metadata: | |
| retry_info = ( | |
| f" (reached max retries: {metadata['RetryAttempts']})" | |
| ) | |
| return retry_info | |
| def __reduce__(self): | |
| # Subclasses of ClientError's are dynamically generated and | |
| # cannot be pickled unless they are attributes of a | |
| # module. So at the very least return a ClientError back. | |
| return ClientError, (self.response, self.operation_name) | |
| class EventStreamError(ClientError): | |
| pass | |
| class UnsupportedTLSVersionWarning(Warning): | |
| """Warn when an openssl version that uses TLS 1.2 is required""" | |
| pass | |
| class ImminentRemovalWarning(Warning): | |
| pass | |
| class InvalidDNSNameError(BotoCoreError): | |
| """Error when virtual host path is forced on a non-DNS compatible bucket""" | |
| fmt = ( | |
| 'Bucket named {bucket_name} is not DNS compatible. Virtual ' | |
| 'hosted-style addressing cannot be used. The addressing style ' | |
| 'can be configured by removing the addressing_style value ' | |
| 'or setting that value to \'path\' or \'auto\' in the AWS Config ' | |
| 'file or in the botocore.client.Config object.' | |
| ) | |
| class InvalidS3AddressingStyleError(BotoCoreError): | |
| """Error when an invalid path style is specified""" | |
| fmt = ( | |
| 'S3 addressing style {s3_addressing_style} is invalid. Valid options ' | |
| 'are: \'auto\', \'virtual\', and \'path\'' | |
| ) | |
| class UnsupportedS3ArnError(BotoCoreError): | |
| """Error when S3 ARN provided to Bucket parameter is not supported""" | |
| fmt = ( | |
| 'S3 ARN {arn} provided to "Bucket" parameter is invalid. Only ' | |
| 'ARNs for S3 access-points are supported.' | |
| ) | |
| class UnsupportedS3ControlArnError(BotoCoreError): | |
| """Error when S3 ARN provided to S3 control parameter is not supported""" | |
| fmt = 'S3 ARN "{arn}" provided is invalid for this operation. {msg}' | |
| class InvalidHostLabelError(BotoCoreError): | |
| """Error when an invalid host label would be bound to an endpoint""" | |
| fmt = ( | |
| 'Invalid host label to be bound to the hostname of the endpoint: ' | |
| '"{label}".' | |
| ) | |
| class UnsupportedOutpostResourceError(BotoCoreError): | |
| """Error when S3 Outpost ARN provided to Bucket parameter is incomplete""" | |
| fmt = ( | |
| 'S3 Outpost ARN resource "{resource_name}" provided to "Bucket" ' | |
| 'parameter is invalid. Only ARNs for S3 Outpost arns with an ' | |
| 'access-point sub-resource are supported.' | |
| ) | |
| class UnsupportedS3ConfigurationError(BotoCoreError): | |
| """Error when an unsupported configuration is used with access-points""" | |
| fmt = 'Unsupported configuration when using S3: {msg}' | |
| class UnsupportedS3AccesspointConfigurationError(BotoCoreError): | |
| """Error when an unsupported configuration is used with access-points""" | |
| fmt = 'Unsupported configuration when using S3 access-points: {msg}' | |
| class InvalidEndpointDiscoveryConfigurationError(BotoCoreError): | |
| """Error when invalid value supplied for endpoint_discovery_enabled""" | |
| fmt = ( | |
| 'Unsupported configuration value for endpoint_discovery_enabled. ' | |
| 'Expected one of ("true", "false", "auto") but got {config_value}.' | |
| ) | |
| class UnsupportedS3ControlConfigurationError(BotoCoreError): | |
| """Error when an unsupported configuration is used with S3 Control""" | |
| fmt = 'Unsupported configuration when using S3 Control: {msg}' | |
| class InvalidRetryConfigurationError(BotoCoreError): | |
| """Error when invalid retry configuration is specified""" | |
| fmt = ( | |
| 'Cannot provide retry configuration for "{retry_config_option}". ' | |
| 'Valid retry configuration options are: {valid_options}' | |
| ) | |
| class InvalidMaxRetryAttemptsError(InvalidRetryConfigurationError): | |
| """Error when invalid retry configuration is specified""" | |
| fmt = ( | |
| 'Value provided to "max_attempts": {provided_max_attempts} must ' | |
| 'be an integer greater than or equal to {min_value}.' | |
| ) | |
| class InvalidRetryModeError(InvalidRetryConfigurationError): | |
| """Error when invalid retry mode configuration is specified""" | |
| fmt = ( | |
| 'Invalid value provided to "mode": "{provided_retry_mode}" must ' | |
| 'be one of: {valid_modes}' | |
| ) | |
| class InvalidS3UsEast1RegionalEndpointConfigError(BotoCoreError): | |
| """Error for invalid s3 us-east-1 regional endpoints configuration""" | |
| fmt = ( | |
| 'S3 us-east-1 regional endpoint option ' | |
| '{s3_us_east_1_regional_endpoint_config} is ' | |
| 'invalid. Valid options are: "legacy", "regional"' | |
| ) | |
| class InvalidSTSRegionalEndpointsConfigError(BotoCoreError): | |
| """Error when invalid sts regional endpoints configuration is specified""" | |
| fmt = ( | |
| 'STS regional endpoints option {sts_regional_endpoints_config} is ' | |
| 'invalid. Valid options are: "legacy", "regional"' | |
| ) | |
| class StubResponseError(BotoCoreError): | |
| fmt = ( | |
| 'Error getting response stub for operation {operation_name}: {reason}' | |
| ) | |
| class StubAssertionError(StubResponseError, AssertionError): | |
| pass | |
| class UnStubbedResponseError(StubResponseError): | |
| pass | |
| class InvalidConfigError(BotoCoreError): | |
| fmt = '{error_msg}' | |
| class InfiniteLoopConfigError(InvalidConfigError): | |
| fmt = ( | |
| 'Infinite loop in credential configuration detected. Attempting to ' | |
| 'load from profile {source_profile} which has already been visited. ' | |
| 'Visited profiles: {visited_profiles}' | |
| ) | |
| class RefreshWithMFAUnsupportedError(BotoCoreError): | |
| fmt = 'Cannot refresh credentials: MFA token required.' | |
| class MD5UnavailableError(BotoCoreError): | |
| fmt = "This system does not support MD5 generation." | |
| class MissingDependencyException(BotoCoreError): | |
| fmt = "Missing Dependency: {msg}" | |
| class MetadataRetrievalError(BotoCoreError): | |
| fmt = "Error retrieving metadata: {error_msg}" | |
| class UndefinedModelAttributeError(Exception): | |
| pass | |
| class MissingServiceIdError(UndefinedModelAttributeError): | |
| fmt = ( | |
| "The model being used for the service {service_name} is missing the " | |
| "serviceId metadata property, which is required." | |
| ) | |
| def __init__(self, **kwargs): | |
| msg = self.fmt.format(**kwargs) | |
| Exception.__init__(self, msg) | |
| self.kwargs = kwargs | |
| class SSOError(BotoCoreError): | |
| fmt = ( | |
| "An unspecified error happened when resolving AWS credentials or an " | |
| "access token from SSO." | |
| ) | |
| class SSOTokenLoadError(SSOError): | |
| fmt = "Error loading SSO Token: {error_msg}" | |
| class UnauthorizedSSOTokenError(SSOError): | |
| fmt = ( | |
| "The SSO session associated with this profile has expired or is " | |
| "otherwise invalid. To refresh this SSO session run aws sso login " | |
| "with the corresponding profile." | |
| ) | |
| class CapacityNotAvailableError(BotoCoreError): | |
| fmt = 'Insufficient request capacity available.' | |
| class InvalidProxiesConfigError(BotoCoreError): | |
| fmt = 'Invalid configuration value(s) provided for proxies_config.' | |
| class InvalidDefaultsMode(BotoCoreError): | |
| fmt = ( | |
| 'Client configured with invalid defaults mode: {mode}. ' | |
| 'Valid defaults modes include: {valid_modes}.' | |
| ) | |
| class AwsChunkedWrapperError(BotoCoreError): | |
| fmt = '{error_msg}' | |
| class FlexibleChecksumError(BotoCoreError): | |
| fmt = '{error_msg}' | |
| class InvalidEndpointConfigurationError(BotoCoreError): | |
| fmt = 'Invalid endpoint configuration: {msg}' | |
| class EndpointProviderError(BotoCoreError): | |
| """Base error for the EndpointProvider class""" | |
| fmt = '{msg}' | |
| class EndpointResolutionError(EndpointProviderError): | |
| """Error when input parameters resolve to an error rule""" | |
| fmt = '{msg}' | |
| class UnknownEndpointResolutionBuiltInName(EndpointProviderError): | |
| fmt = 'Unknown builtin variable name: {name}' | |