Merge "Check volume endpoint availability in the same order" into stable/train

This commit is contained in:
Zuul 2020-04-01 15:00:43 +00:00 committed by Gerrit Code Review
commit a3751d9161
1 changed files with 28 additions and 50 deletions

View File

@ -201,78 +201,56 @@ class GroupType(base.APIResourceWrapper):
_attrs = ['id', 'name', 'description', 'is_public', 'group_specs']
def get_auth_params_from_request(request):
auth_url = base.url_for(request, 'identity')
cinder_urls = []
for service_name in ('volumev3', 'volumev2', 'volume'):
def _find_cinder_url(request, version=None):
if version is None:
api_version = VERSIONS.get_active_version()
version = api_version['version']
version = base.Version(version)
# We support only cinder v2 and v3.
if version.major == 3:
candidates = ['volumev3', 'volume']
else:
candidates = ['volumev2', 'volume']
for service_name in candidates:
try:
cinder_url = base.url_for(request, service_name)
cinder_urls.append((service_name, cinder_url))
return version, base.url_for(request, service_name)
except exceptions.ServiceCatalogException:
pass
if not cinder_urls:
else:
raise exceptions.ServiceCatalogException(
"no volume service configured")
cinder_urls = tuple(cinder_urls) # need to make it cacheable
return(
request.user.username,
request.user.token.id,
request.user.tenant_id,
cinder_urls,
auth_url,
)
("Cinder %(version)s requested but no '%(service)s' service "
"type available in Keystone catalog.") %
{'version': version, 'service': candidates})
@memoized
def cinderclient(request, version=None):
if version is None:
api_version = VERSIONS.get_active_version()
version = api_version['version']
version, cinder_url = _find_cinder_url(request, version)
insecure = settings.OPENSTACK_SSL_NO_VERIFY
cacert = settings.OPENSTACK_SSL_CACERT
(username, token_id, tenant_id, cinder_urls,
auth_url) = get_auth_params_from_request(request)
version = base.Version(version)
if version.major == 2:
service_names = ('volumev2', 'volume')
elif version.major == 3:
service_names = ('volumev3', 'volume')
else:
service_names = ('volume',)
for name, _url in cinder_urls:
if name in service_names:
cinder_url = _url
break
else:
raise exceptions.ServiceCatalogException(
"Cinder {version} requested but no '{service}' service "
"type available in Keystone catalog.".format(version=version,
service=service_names)
)
c = cinder_client.Client(
version,
username,
token_id,
project_id=tenant_id,
auth_url=auth_url,
request.user.username,
request.user.token.id,
project_id=request.user.tenant_id,
auth_url=base.url_for(request, 'identity'),
insecure=insecure,
cacert=cacert,
http_log_debug=settings.DEBUG,
)
c.client.auth_token = token_id
c.client.auth_token = request.user.token.id
c.client.management_url = cinder_url
return c
def get_microversion(request, features):
for service_name in ('volume', 'volumev2', 'volumev3'):
try:
cinder_url = base.url_for(request, service_name)
break
except exceptions.ServiceCatalogException:
continue
else:
try:
version, cinder_url = _find_cinder_url(request)
except exceptions.ServiceCatalogException:
return None
min_ver, max_ver = cinder_client.get_server_version(cinder_url)
return microversions.get_microversion_for_features(