blob: 3a57f8b69041e5d36997abe0bfe68e0eaa12bc2e [file] [log] [blame]
Oleksiy Petrenkoe38f5a62018-11-21 12:58:07 +02001import uuid
2from cinderv3 import common
3from cinderv3 import lists
4
5
6class CheckId(object):
7 def check_id(self, val):
8 try:
9 return str(uuid.UUID(val)) == val
10 except (TypeError, ValueError, AttributeError):
11 return False
12
13
14def named_checker(resource, ref, cloud_name):
15 resp_key = response_keys[resource]
16 resp = resource_lists[resource](
Oleksiy Petrenko61a84ff2018-12-07 19:14:28 +020017 name=ref, cloud_name=cloud_name)[resp_key]
Oleksiy Petrenkoe38f5a62018-11-21 12:58:07 +020018 if len(resp) == 0:
19 raise common.ResourceNotFound(resp_key, ref)
20 elif len(resp) > 1:
21 raise common.MultipleResourcesFound(resp_key, ref)
22 return resp[0]['id']
23
24
25def nameless_checker(resource, ref, cloud_name):
26 item_id = None
27 resp_key = response_keys[resource]
Oleksiy Petrenko61a84ff2018-12-07 19:14:28 +020028 resp = resource_lists[resource](cloud_name=cloud_name)[resp_key]
Oleksiy Petrenkoe38f5a62018-11-21 12:58:07 +020029 for item in resp:
30 if item["name"] == ref:
31 if item_id is not None:
32 raise common.MultipleResourcesFound(resp_key, ref)
33 item_id = item["id"]
34 if not item_id:
35 raise common.ResourceNotFound(resp_key, ref)
36 return item_id
37
38
39
40resource_lists = {
41 'volume': lists.volume_list,
42 'volume_type': lists.volume_type_list
43}
44
45
46response_keys = {
47 'volume': 'volumes',
48 'volume_type': 'volume_types',
49}
50
51
52name_checkers = {
53 'volume': named_checker,
54 'volume_type': nameless_checker,
55}
56
57
58def get_by_name_or_uuid_multiple(resource_arg_name_pairs):
59 def wrap(func):
60 def wrapped_f(*args, **kwargs):
61 results = []
62 args_start = 0
63 for index, (resource, arg_name) in enumerate(
64 resource_arg_name_pairs):
65 if arg_name in kwargs:
66 ref = kwargs.pop(arg_name, None)
67 else:
68 ref = args[index]
69 args_start += 1
70 cloud_name = kwargs['cloud_name']
71 checker = CheckId()
72 if checker.check_id(ref):
73 results.append(ref)
74 else:
75 # Then we have name not uuid
76 res = name_checkers[resource](resource, ref, cloud_name)
77 results.append(res)
78 results.extend(args[args_start:])
79 return func(*results, **kwargs)
80 return wrapped_f
81 return wrap