diff --git a/boto3/session.py b/boto3/session.py index efd9fb7faf..26fcadfe1f 100644 --- a/boto3/session.py +++ b/boto3/session.py @@ -37,10 +37,13 @@ class Session(object): :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. """ def __init__(self, aws_access_key_id=None, aws_secret_access_key=None, aws_session_token=None, region_name=None, - botocore_session=None): + botocore_session=None, profile_name=None): if botocore_session is not None: self._session = botocore_session else: @@ -58,6 +61,9 @@ def __init__(self, aws_access_key_id=None, aws_secret_access_key=None, self._session.user_agent_name = 'Boto3' self._session.user_agent_version = boto3.__version__ + if profile_name is not None: + self._session.profile = profile_name + if aws_access_key_id or aws_secret_access_key or aws_session_token: self._session.set_credentials(aws_access_key_id, aws_secret_access_key, aws_session_token) @@ -72,6 +78,13 @@ def __repr__(self): return 'Session(region={0})'.format( repr(self._session.get_config_variable('region'))) + @property + def profile_name(self): + """ + The **read-only** profile name. + """ + return self._session.profile or 'default' + def _setup_loader(self): """ Setup loader paths so that we can load resources. diff --git a/tests/unit/test_session.py b/tests/unit/test_session.py index 3555b132be..d014518be2 100644 --- a/tests/unit/test_session.py +++ b/tests/unit/test_session.py @@ -66,6 +66,23 @@ def test_credentials_can_be_set(self): bc_session.set_credentials.assert_called_with( 'key', 'secret', 'token') + def test_profile_can_be_set(self): + bc_session = self.bc_session_cls.return_value + + session = Session(profile_name='foo') + + self.assertEqual(bc_session.profile, 'foo') + + # We should also be able to read the value + self.assertEqual(session.profile_name, 'foo') + + def test_profile_default(self): + self.bc_session_cls.return_value.profile = None + + session = Session() + + self.assertEqual(session.profile_name, 'default') + def test_custom_session(self): bc_session = self.bc_session_cls() self.bc_session_cls.reset_mock()