blob: 3506c6dcc70a41b57d6c6c21a4a347c8fc078840 [file] [log] [blame]
import uuid
from cinderv3 import common
from cinderv3 import lists
class CheckId(object):
def check_id(self, val):
try:
return str(uuid.UUID(val)) == val
except (TypeError, ValueError, AttributeError):
return False
def named_checker(resource, ref, cloud_name):
resp_key = response_keys[resource]
resp = resource_lists[resource](
name=ref, cloud_name=cloud_name)
try:
resp = resp[resp_key]
except KeyError:
raise common.ResourceNotFound(resp_key, ref)
if len(resp) == 0:
raise common.ResourceNotFound(resp_key, ref)
elif len(resp) > 1:
raise common.MultipleResourcesFound(resp_key, ref)
return resp[0]['id']
def nameless_checker(resource, ref, cloud_name):
item_id = None
resp_key = response_keys[resource]
resp = resource_lists[resource](cloud_name=cloud_name)
try:
resp = resp[resp_key]
except KeyError:
raise common.ResourceNotFound(resp_key, ref)
for item in resp:
if item["name"] == ref:
if item_id is not None:
raise common.MultipleResourcesFound(resp_key, ref)
item_id = item["id"]
if not item_id:
raise common.ResourceNotFound(resp_key, ref)
return item_id
resource_lists = {
'volume': lists.volume_list,
'volume_type': lists.volume_type_list
}
response_keys = {
'volume': 'volumes',
'volume_type': 'volume_types',
}
name_checkers = {
'volume': named_checker,
'volume_type': nameless_checker,
}
def get_by_name_or_uuid_multiple(resource_arg_name_pairs):
def wrap(func):
def wrapped_f(*args, **kwargs):
results = []
args_start = 0
for index, (resource, arg_name) in enumerate(
resource_arg_name_pairs):
if arg_name in kwargs:
ref = kwargs.pop(arg_name, None)
else:
ref = args[index]
args_start += 1
cloud_name = kwargs['cloud_name']
checker = CheckId()
if checker.check_id(ref):
results.append(ref)
else:
# Then we have name not uuid
res = name_checkers[resource](resource, ref, cloud_name)
results.append(res)
results.extend(args[args_start:])
return func(*results, **kwargs)
return wrapped_f
return wrap