aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/boto3/session.py
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/boto3/session.py')
-rw-r--r--.venv/lib/python3.12/site-packages/boto3/session.py564
1 files changed, 564 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/boto3/session.py b/.venv/lib/python3.12/site-packages/boto3/session.py
new file mode 100644
index 00000000..1e3d3611
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/boto3/session.py
@@ -0,0 +1,564 @@
+# Copyright 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
+#
+# https://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.
+
+import copy
+import os
+
+import botocore.session
+from botocore.client import Config
+from botocore.exceptions import (
+ DataNotFoundError,
+ NoCredentialsError,
+ UnknownServiceError,
+)
+
+import boto3
+import boto3.utils
+from boto3.exceptions import ResourceNotExistsError, UnknownAPIVersionError
+
+from .resources.factory import ResourceFactory
+
+
+class Session:
+ """
+ A session stores configuration state and allows you to create service
+ clients and resources.
+
+ :type aws_access_key_id: string
+ :param aws_access_key_id: AWS access key ID
+ :type aws_secret_access_key: string
+ :param aws_secret_access_key: AWS secret access key
+ :type aws_session_token: string
+ :param aws_session_token: AWS temporary session token
+ :type region_name: string
+ :param region_name: Default region when creating new connections
+ :type botocore_session: botocore.session.Session
+ :param botocore_session: Use this Botocore session instead of creating
+ a new default one.
+ :type profile_name: string
+ :param profile_name: The name of a profile to use. If not given, then
+ the default profile is used.
+ :type aws_account_id: string
+ :param aws_account_id: AWS account ID
+ """
+
+ def __init__(
+ self,
+ aws_access_key_id=None,
+ aws_secret_access_key=None,
+ aws_session_token=None,
+ region_name=None,
+ botocore_session=None,
+ profile_name=None,
+ aws_account_id=None,
+ ):
+ if botocore_session is not None:
+ self._session = botocore_session
+ else:
+ # Create a new default session
+ self._session = botocore.session.get_session()
+
+ # Setup custom user-agent string if it isn't already customized
+ if self._session.user_agent_name == 'Botocore':
+ botocore_info = f'Botocore/{self._session.user_agent_version}'
+ if self._session.user_agent_extra:
+ self._session.user_agent_extra += ' ' + botocore_info
+ else:
+ self._session.user_agent_extra = botocore_info
+ self._session.user_agent_name = 'Boto3'
+ self._session.user_agent_version = boto3.__version__
+
+ if profile_name is not None:
+ self._session.set_config_variable('profile', profile_name)
+
+ creds = (
+ aws_access_key_id,
+ aws_secret_access_key,
+ aws_session_token,
+ aws_account_id,
+ )
+ if any(creds):
+ if self._account_id_set_without_credentials(
+ aws_account_id, aws_access_key_id, aws_secret_access_key
+ ):
+ raise NoCredentialsError()
+ self._session.set_credentials(
+ aws_access_key_id,
+ aws_secret_access_key,
+ aws_session_token,
+ aws_account_id,
+ )
+
+ if region_name is not None:
+ self._session.set_config_variable('region', region_name)
+
+ self.resource_factory = ResourceFactory(
+ self._session.get_component('event_emitter')
+ )
+ self._setup_loader()
+ self._register_default_handlers()
+
+ def __repr__(self):
+ return '{}(region_name={})'.format(
+ self.__class__.__name__,
+ repr(self._session.get_config_variable('region')),
+ )
+
+ @property
+ def profile_name(self):
+ """
+ The **read-only** profile name.
+ """
+ return self._session.profile or 'default'
+
+ @property
+ def region_name(self):
+ """
+ The **read-only** region name.
+ """
+ return self._session.get_config_variable('region')
+
+ @property
+ def events(self):
+ """
+ The event emitter for a session
+ """
+ return self._session.get_component('event_emitter')
+
+ @property
+ def available_profiles(self):
+ """
+ The profiles available to the session credentials
+ """
+ return self._session.available_profiles
+
+ def _setup_loader(self):
+ """
+ Setup loader paths so that we can load resources.
+ """
+ self._loader = self._session.get_component('data_loader')
+ self._loader.search_paths.append(
+ os.path.join(os.path.dirname(__file__), 'data')
+ )
+
+ def get_available_services(self):
+ """
+ Get a list of available services that can be loaded as low-level
+ clients via :py:meth:`Session.client`.
+
+ :rtype: list
+ :return: List of service names
+ """
+ return self._session.get_available_services()
+
+ def get_available_resources(self):
+ """
+ Get a list of available services that can be loaded as resource
+ clients via :py:meth:`Session.resource`.
+
+ :rtype: list
+ :return: List of service names
+ """
+ return self._loader.list_available_services(type_name='resources-1')
+
+ def get_available_partitions(self):
+ """Lists the available partitions
+
+ :rtype: list
+ :return: Returns a list of partition names (e.g., ["aws", "aws-cn"])
+ """
+ return self._session.get_available_partitions()
+
+ def get_available_regions(
+ self, service_name, partition_name='aws', allow_non_regional=False
+ ):
+ """Lists the region and endpoint names of a particular partition.
+
+ The list of regions returned by this method are regions that are
+ explicitly known by the client to exist and is not comprehensive. A
+ region not returned in this list may still be available for the
+ provided service.
+
+ :type service_name: string
+ :param service_name: Name of a service to list endpoint for (e.g., s3).
+
+ :type partition_name: string
+ :param partition_name: Name of the partition to limit endpoints to.
+ (e.g., aws for the public AWS endpoints, aws-cn for AWS China
+ endpoints, aws-us-gov for AWS GovCloud (US) Endpoints, etc.)
+
+ :type allow_non_regional: bool
+ :param allow_non_regional: Set to True to include endpoints that are
+ not regional endpoints (e.g., s3-external-1,
+ fips-us-gov-west-1, etc).
+
+ :return: Returns a list of endpoint names (e.g., ["us-east-1"]).
+ """
+ return self._session.get_available_regions(
+ service_name=service_name,
+ partition_name=partition_name,
+ allow_non_regional=allow_non_regional,
+ )
+
+ def get_credentials(self):
+ """
+ Return the :class:`botocore.credentials.Credentials` object
+ associated with this session. If the credentials have not
+ yet been loaded, this will attempt to load them. If they
+ have already been loaded, this will return the cached
+ credentials.
+ """
+ return self._session.get_credentials()
+
+ def get_partition_for_region(self, region_name):
+ """Lists the partition name of a particular region.
+
+ :type region_name: string
+ :param region_name: Name of the region to list partition for (e.g.,
+ us-east-1).
+
+ :rtype: string
+ :return: Returns the respective partition name (e.g., aws).
+ """
+ return self._session.get_partition_for_region(region_name)
+
+ def client(
+ self,
+ service_name,
+ region_name=None,
+ api_version=None,
+ use_ssl=True,
+ verify=None,
+ endpoint_url=None,
+ aws_access_key_id=None,
+ aws_secret_access_key=None,
+ aws_session_token=None,
+ config=None,
+ aws_account_id=None,
+ ):
+ """
+ Create a low-level service client by name.
+
+ :type service_name: string
+ :param service_name: The name of a service, e.g. 's3' or 'ec2'. You
+ can get a list of available services via
+ :py:meth:`get_available_services`.
+
+ :type region_name: string
+ :param region_name: The name of the region associated with the client.
+ A client is associated with a single region.
+
+ :type api_version: string
+ :param api_version: The API version to use. By default, botocore will
+ use the latest API version when creating a client. You only need
+ to specify this parameter if you want to use a previous API version
+ of the client.
+
+ :type use_ssl: boolean
+ :param use_ssl: Whether or not to use SSL. By default, SSL is used.
+ Note that not all services support non-ssl connections.
+
+ :type verify: boolean/string
+ :param verify: Whether or not to verify SSL certificates. By default
+ SSL certificates are verified. You can provide the following
+ values:
+
+ * False - do not validate SSL certificates. SSL will still be
+ used (unless use_ssl is False), but SSL certificates
+ will not be verified.
+ * path/to/cert/bundle.pem - A filename of the CA cert bundle to
+ uses. You can specify this argument if you want to use a
+ different CA cert bundle than the one used by botocore.
+
+ :type endpoint_url: string
+ :param endpoint_url: The complete URL to use for the constructed
+ client. Normally, botocore will automatically construct the
+ appropriate URL to use when communicating with a service. You
+ can specify a complete URL (including the "http/https" scheme)
+ to override this behavior. If this value is provided,
+ then ``use_ssl`` is ignored.
+
+ :type aws_access_key_id: string
+ :param aws_access_key_id: The access key to use when creating
+ the client. This is entirely optional, and if not provided,
+ the credentials configured for the session will automatically
+ be used. You only need to provide this argument if you want
+ to override the credentials used for this specific client.
+
+ :type aws_secret_access_key: string
+ :param aws_secret_access_key: The secret key to use when creating
+ the client. Same semantics as aws_access_key_id above.
+
+ :type aws_session_token: string
+ :param aws_session_token: The session token to use when creating
+ the client. Same semantics as aws_access_key_id above.
+
+ :type config: botocore.client.Config
+ :param config: Advanced client configuration options. If region_name
+ is specified in the client config, its value will take precedence
+ over environment variables and configuration values, but not over
+ a region_name value passed explicitly to the method. See
+ `botocore config documentation
+ <https://botocore.amazonaws.com/v1/documentation/api/latest/reference/config.html>`_
+ for more details.
+
+ :type aws_account_id: string
+ :param aws_account_id: The account id to use when creating
+ the client. Same semantics as aws_access_key_id above.
+
+ :return: Service client instance
+
+ """
+ return self._session.create_client(
+ service_name,
+ region_name=region_name,
+ api_version=api_version,
+ use_ssl=use_ssl,
+ verify=verify,
+ endpoint_url=endpoint_url,
+ aws_access_key_id=aws_access_key_id,
+ aws_secret_access_key=aws_secret_access_key,
+ aws_session_token=aws_session_token,
+ config=config,
+ aws_account_id=aws_account_id,
+ )
+
+ def resource(
+ self,
+ service_name,
+ region_name=None,
+ api_version=None,
+ use_ssl=True,
+ verify=None,
+ endpoint_url=None,
+ aws_access_key_id=None,
+ aws_secret_access_key=None,
+ aws_session_token=None,
+ config=None,
+ ):
+ """
+ Create a resource service client by name.
+
+ :type service_name: string
+ :param service_name: The name of a service, e.g. 's3' or 'ec2'. You
+ can get a list of available services via
+ :py:meth:`get_available_resources`.
+
+ :type region_name: string
+ :param region_name: The name of the region associated with the client.
+ A client is associated with a single region.
+
+ :type api_version: string
+ :param api_version: The API version to use. By default, botocore will
+ use the latest API version when creating a client. You only need
+ to specify this parameter if you want to use a previous API version
+ of the client.
+
+ :type use_ssl: boolean
+ :param use_ssl: Whether or not to use SSL. By default, SSL is used.
+ Note that not all services support non-ssl connections.
+
+ :type verify: boolean/string
+ :param verify: Whether or not to verify SSL certificates. By default
+ SSL certificates are verified. You can provide the following
+ values:
+
+ * False - do not validate SSL certificates. SSL will still be
+ used (unless use_ssl is False), but SSL certificates
+ will not be verified.
+ * path/to/cert/bundle.pem - A filename of the CA cert bundle to
+ uses. You can specify this argument if you want to use a
+ different CA cert bundle than the one used by botocore.
+
+ :type endpoint_url: string
+ :param endpoint_url: The complete URL to use for the constructed
+ client. Normally, botocore will automatically construct the
+ appropriate URL to use when communicating with a service. You
+ can specify a complete URL (including the "http/https" scheme)
+ to override this behavior. If this value is provided,
+ then ``use_ssl`` is ignored.
+
+ :type aws_access_key_id: string
+ :param aws_access_key_id: The access key to use when creating
+ the client. This is entirely optional, and if not provided,
+ the credentials configured for the session will automatically
+ be used. You only need to provide this argument if you want
+ to override the credentials used for this specific client.
+
+ :type aws_secret_access_key: string
+ :param aws_secret_access_key: The secret key to use when creating
+ the client. Same semantics as aws_access_key_id above.
+
+ :type aws_session_token: string
+ :param aws_session_token: The session token to use when creating
+ the client. Same semantics as aws_access_key_id above.
+
+ :type config: botocore.client.Config
+ :param config: Advanced client configuration options. If region_name
+ is specified in the client config, its value will take precedence
+ over environment variables and configuration values, but not over
+ a region_name value passed explicitly to the method. If
+ user_agent_extra is specified in the client config, it overrides
+ the default user_agent_extra provided by the resource API. See
+ `botocore config documentation
+ <https://botocore.amazonaws.com/v1/documentation/api/latest/reference/config.html>`_
+ for more details.
+
+ :return: Subclass of :py:class:`~boto3.resources.base.ServiceResource`
+ """
+ try:
+ resource_model = self._loader.load_service_model(
+ service_name, 'resources-1', api_version
+ )
+ except UnknownServiceError:
+ available = self.get_available_resources()
+ has_low_level_client = (
+ service_name in self.get_available_services()
+ )
+ raise ResourceNotExistsError(
+ service_name, available, has_low_level_client
+ )
+ except DataNotFoundError:
+ # This is because we've provided an invalid API version.
+ available_api_versions = self._loader.list_api_versions(
+ service_name, 'resources-1'
+ )
+ raise UnknownAPIVersionError(
+ service_name, api_version, ', '.join(available_api_versions)
+ )
+
+ if api_version is None:
+ # Even though botocore's load_service_model() can handle
+ # using the latest api_version if not provided, we need
+ # to track this api_version in boto3 in order to ensure
+ # we're pairing a resource model with a client model
+ # of the same API version. It's possible for the latest
+ # API version of a resource model in boto3 to not be
+ # the same API version as a service model in botocore.
+ # So we need to look up the api_version if one is not
+ # provided to ensure we load the same API version of the
+ # client.
+ #
+ # Note: This is relying on the fact that
+ # loader.load_service_model(..., api_version=None)
+ # and loader.determine_latest_version(..., 'resources-1')
+ # both load the same api version of the file.
+ api_version = self._loader.determine_latest_version(
+ service_name, 'resources-1'
+ )
+
+ # Creating a new resource instance requires the low-level client
+ # and service model, the resource version and resource JSON data.
+ # We pass these to the factory and get back a class, which is
+ # instantiated on top of the low-level client.
+ if config is not None:
+ if config.user_agent_extra is None:
+ config = copy.deepcopy(config)
+ config.user_agent_extra = 'Resource'
+ else:
+ config = Config(user_agent_extra='Resource')
+ client = self.client(
+ service_name,
+ region_name=region_name,
+ api_version=api_version,
+ use_ssl=use_ssl,
+ verify=verify,
+ endpoint_url=endpoint_url,
+ aws_access_key_id=aws_access_key_id,
+ aws_secret_access_key=aws_secret_access_key,
+ aws_session_token=aws_session_token,
+ config=config,
+ )
+ service_model = client.meta.service_model
+
+ # Create a ServiceContext object to serve as a reference to
+ # important read-only information about the general service.
+ service_context = boto3.utils.ServiceContext(
+ service_name=service_name,
+ service_model=service_model,
+ resource_json_definitions=resource_model['resources'],
+ service_waiter_model=boto3.utils.LazyLoadedWaiterModel(
+ self._session, service_name, api_version
+ ),
+ )
+
+ # Create the service resource class.
+ cls = self.resource_factory.load_from_definition(
+ resource_name=service_name,
+ single_resource_json_definition=resource_model['service'],
+ service_context=service_context,
+ )
+
+ return cls(client=client)
+
+ def _register_default_handlers(self):
+ # S3 customizations
+ self._session.register(
+ 'creating-client-class.s3',
+ boto3.utils.lazy_call(
+ 'boto3.s3.inject.inject_s3_transfer_methods'
+ ),
+ )
+ self._session.register(
+ 'creating-resource-class.s3.Bucket',
+ boto3.utils.lazy_call('boto3.s3.inject.inject_bucket_methods'),
+ )
+ self._session.register(
+ 'creating-resource-class.s3.Object',
+ boto3.utils.lazy_call('boto3.s3.inject.inject_object_methods'),
+ )
+ self._session.register(
+ 'creating-resource-class.s3.ObjectSummary',
+ boto3.utils.lazy_call(
+ 'boto3.s3.inject.inject_object_summary_methods'
+ ),
+ )
+
+ # DynamoDb customizations
+ self._session.register(
+ 'creating-resource-class.dynamodb',
+ boto3.utils.lazy_call(
+ 'boto3.dynamodb.transform.register_high_level_interface'
+ ),
+ unique_id='high-level-dynamodb',
+ )
+ self._session.register(
+ 'creating-resource-class.dynamodb.Table',
+ boto3.utils.lazy_call(
+ 'boto3.dynamodb.table.register_table_methods'
+ ),
+ unique_id='high-level-dynamodb-table',
+ )
+
+ # EC2 Customizations
+ self._session.register(
+ 'creating-resource-class.ec2.ServiceResource',
+ boto3.utils.lazy_call('boto3.ec2.createtags.inject_create_tags'),
+ )
+
+ self._session.register(
+ 'creating-resource-class.ec2.Instance',
+ boto3.utils.lazy_call(
+ 'boto3.ec2.deletetags.inject_delete_tags',
+ event_emitter=self.events,
+ ),
+ )
+
+ def _account_id_set_without_credentials(
+ self, account_id, access_key, secret_key
+ ):
+ if account_id is None:
+ return False
+ elif access_key is None or secret_key is None:
+ return True
+ return False