Update swift constructor to be Session aware

python-swiftclient has Session support now! Use it, and remove a pile of
customization specific for swift.

We still need to put a few parameters in different places, but that's
no worse than glance or trove.

Change-Id: Ic51aee2bc7b535aa4b6e261fb3deb59bd921f563
This commit is contained in:
Monty Taylor 2016-12-22 06:42:25 -06:00
parent 6615160361
commit fcead29c3f
No known key found for this signature in database
GPG Key ID: 7BAE94BC7141A594
2 changed files with 34 additions and 142 deletions

View File

@ -312,9 +312,6 @@ class CloudConfig(object):
if not client_class:
client_class = _get_client(service_key)
# Because of course swift is different
if service_key == 'object-store':
return self._get_swift_client(client_class=client_class, **kwargs)
interface = self.get_interface(service_key)
# trigger exception on lack of service
endpoint = self.get_session_endpoint(service_key)
@ -326,12 +323,20 @@ class CloudConfig(object):
else:
interface_key = 'endpoint_type'
constructor_kwargs = dict(
session=self.get_session(),
service_name=self.get_service_name(service_key),
service_type=self.get_service_type(service_key),
endpoint_override=endpoint_override,
region_name=self.region)
if service_key == 'object-store':
constructor_kwargs = dict(
session=self.get_session(),
os_options=dict(
service_type=self.get_service_type(service_key),
object_storage_url=endpoint_override,
region_name=self.region))
else:
constructor_kwargs = dict(
session=self.get_session(),
service_name=self.get_service_name(service_key),
service_type=self.get_service_type(service_key),
endpoint_override=endpoint_override,
region_name=self.region)
if service_key == 'image':
# os-client-config does not depend on glanceclient, but if
@ -350,8 +355,11 @@ class CloudConfig(object):
if not endpoint_override:
constructor_kwargs['endpoint_override'] = endpoint
constructor_kwargs.update(kwargs)
constructor_kwargs[interface_key] = interface
if pass_version_arg:
if service_key == 'object-store':
constructor_kwargs['os_options'][interface_key] = interface
else:
constructor_kwargs[interface_key] = interface
if pass_version_arg and service_key != 'object-store':
if not version:
version = self.get_api_version(service_key)
# Temporary workaround while we wait for python-openstackclient
@ -377,56 +385,6 @@ class CloudConfig(object):
return client_class(**constructor_kwargs)
def _get_swift_client(self, client_class, **kwargs):
auth_args = self.get_auth_args()
auth_version = self.get_api_version('identity')
session = self.get_session()
token = session.get_token()
endpoint = self.get_session_endpoint(service_key='object-store')
if not endpoint:
return None
# If we have a username/password, we want to pass them to
# swift - because otherwise it will not re-up tokens appropriately
# However, if we only have non-password auth, then get a token
# and pass it in
swift_kwargs = dict(
auth_version=auth_version,
preauthurl=endpoint,
preauthtoken=token,
os_options=dict(
region_name=self.get_region_name(),
auth_token=token,
object_storage_url=endpoint,
service_type=self.get_service_type('object-store'),
endpoint_type=self.get_interface('object-store'),
))
if self.config['api_timeout'] is not None:
swift_kwargs['timeout'] = float(self.config['api_timeout'])
# create with password
swift_kwargs['user'] = auth_args.get('username')
swift_kwargs['key'] = auth_args.get('password')
swift_kwargs['authurl'] = auth_args.get('auth_url')
os_options = {}
if auth_version == '2.0':
os_options['tenant_name'] = auth_args.get('project_name')
os_options['tenant_id'] = auth_args.get('project_id')
else:
os_options['project_name'] = auth_args.get('project_name')
os_options['project_id'] = auth_args.get('project_id')
for key in (
'user_id',
'project_domain_id',
'project_domain_name',
'user_domain_id',
'user_domain_name'):
os_options[key] = auth_args.get(key)
swift_kwargs['os_options'].update(os_options)
return client_class(**swift_kwargs)
def get_cache_expiration_time(self):
if self._openstack_config:
return self._openstack_config.get_cache_expiration_time()

View File

@ -272,26 +272,13 @@ class TestCloudConfig(base.TestCase):
"test1", "region-al", config_dict, auth_plugin=mock.Mock())
cc.get_legacy_client('object-store', mock_client)
mock_client.assert_called_with(
preauthtoken=mock.ANY,
auth_version=u'3',
authurl='http://example.com',
key='testpassword',
session=mock.ANY,
os_options={
'auth_token': mock.ANY,
'region_name': 'region-al',
'object_storage_url': 'http://swift.example.com',
'user_id': None,
'user_domain_name': None,
'project_name': 'testproject',
'project_domain_name': None,
'project_domain_id': None,
'project_id': None,
'service_type': 'object-store',
'object_storage_url': None,
'endpoint_type': 'public',
'user_domain_id': None
},
preauthurl='http://swift.example.com',
user='testuser')
})
@mock.patch.object(cloud_config.CloudConfig, 'get_auth_args')
@mock.patch.object(cloud_config.CloudConfig, 'get_session_endpoint')
@ -311,26 +298,13 @@ class TestCloudConfig(base.TestCase):
"test1", "region-al", config_dict, auth_plugin=mock.Mock())
cc.get_legacy_client('object-store', mock_client)
mock_client.assert_called_with(
preauthtoken=mock.ANY,
auth_version=u'2.0',
authurl='http://example.com',
key='testpassword',
session=mock.ANY,
os_options={
'auth_token': mock.ANY,
'region_name': 'region-al',
'object_storage_url': 'http://swift.example.com',
'user_id': None,
'user_domain_name': None,
'tenant_name': 'testproject',
'project_domain_name': None,
'project_domain_id': None,
'tenant_id': None,
'service_type': 'object-store',
'object_storage_url': None,
'endpoint_type': 'public',
'user_domain_id': None
},
preauthurl='http://swift.example.com',
user='testuser')
})
@mock.patch.object(cloud_config.CloudConfig, 'get_auth_args')
@mock.patch.object(cloud_config.CloudConfig, 'get_session_endpoint')
@ -345,26 +319,13 @@ class TestCloudConfig(base.TestCase):
"test1", "region-al", config_dict, auth_plugin=mock.Mock())
cc.get_legacy_client('object-store', mock_client)
mock_client.assert_called_with(
preauthtoken=mock.ANY,
auth_version=u'2.0',
authurl=None,
key=None,
session=mock.ANY,
os_options={
'auth_token': mock.ANY,
'region_name': 'region-al',
'object_storage_url': 'http://example.com/v2',
'user_id': None,
'user_domain_name': None,
'tenant_name': None,
'project_domain_name': None,
'project_domain_id': None,
'tenant_id': None,
'service_type': 'object-store',
'object_storage_url': None,
'endpoint_type': 'public',
'user_domain_id': None
},
preauthurl='http://example.com/v2',
user=None)
})
@mock.patch.object(cloud_config.CloudConfig, 'get_auth_args')
@mock.patch.object(cloud_config.CloudConfig, 'get_session_endpoint')
@ -380,27 +341,13 @@ class TestCloudConfig(base.TestCase):
"test1", "region-al", config_dict, auth_plugin=mock.Mock())
cc.get_legacy_client('object-store', mock_client)
mock_client.assert_called_with(
preauthtoken=mock.ANY,
auth_version=u'2.0',
authurl=None,
key=None,
session=mock.ANY,
os_options={
'auth_token': mock.ANY,
'region_name': 'region-al',
'object_storage_url': 'http://example.com/v2',
'user_id': None,
'user_domain_name': None,
'tenant_name': None,
'project_domain_name': None,
'project_domain_id': None,
'tenant_id': None,
'service_type': 'object-store',
'object_storage_url': None,
'endpoint_type': 'public',
'user_domain_id': None
},
preauthurl='http://example.com/v2',
timeout=9.0,
user=None)
})
@mock.patch.object(cloud_config.CloudConfig, 'get_auth_args')
def test_legacy_client_object_store_endpoint(
@ -414,26 +361,13 @@ class TestCloudConfig(base.TestCase):
"test1", "region-al", config_dict, auth_plugin=mock.Mock())
cc.get_legacy_client('object-store', mock_client)
mock_client.assert_called_with(
preauthtoken=mock.ANY,
auth_version=u'2.0',
authurl=None,
key=None,
session=mock.ANY,
os_options={
'auth_token': mock.ANY,
'region_name': 'region-al',
'object_storage_url': 'http://example.com/swift',
'user_id': None,
'user_domain_name': None,
'tenant_name': None,
'project_domain_name': None,
'project_domain_id': None,
'tenant_id': None,
'service_type': 'object-store',
'object_storage_url': 'http://example.com/swift',
'endpoint_type': 'public',
'user_domain_id': None
},
preauthurl='http://example.com/swift',
user=None)
})
@mock.patch.object(cloud_config.CloudConfig, 'get_session_endpoint')
def test_legacy_client_image(self, mock_get_session_endpoint):