blob: 3f9881554ac1414e16a70e5607c6f488c8adaafc [file] [log] [blame]
Oleksiy Petrenko777d7822018-11-06 13:32:44 +02001import logging
2
3
4def __virtual__():
5 return 'designatev2' if 'designatev2.zone_list' in __salt__ else False # noqa
6
7
8log = logging.getLogger(__name__)
9
10
11def _designatev2_call(fname, *args, **kwargs):
12 return __salt__['designatev2.{}'.format(fname)](*args, **kwargs) # noqa
13
14
15def _resource_present(resource, name, cloud_name, **kwargs):
16 try:
17 method_name = '{}_get_details'.format(resource)
18 exact_resource = _designatev2_call(
19 method_name, name, cloud_name=cloud_name
20 )[resource]
21 except Exception as e:
22 if 'ResourceNotFound' in repr(e):
23 try:
24 method_name = '{}_create'.format(resource)
25 resp = _designatev2_call(
26 method_name, name=name, cloud_name=cloud_name, **kwargs
27 )
28 except Exception as e:
29 log.exception('Designate {0} create failed with {1}'.
30 format(resource, e))
31 return _failed('create', name, resource)
32 return _succeeded('create', name, resource, resp)
33 elif 'MultipleResourcesFound' in repr(e):
34 return _failed('find', name, resource)
35 else:
36 raise
37
38 to_update = {}
39 for key in kwargs:
40 if key not in exact_resource or kwargs[key] != exact_resource[key]:
41 to_update[key] = kwargs[key]
42 try:
43 method_name = '{}_update'.format(resource)
44 resp = _designatev2_call(
45 method_name, name, cloud_name=cloud_name, **to_update
46 )
47 except Exception as e:
48 log.exception('Designate {0} update failed with {1}'.format(resource, e))
49 return _failed('update', name, resource)
50 return _succeeded('update', name, resource, resp)
51
52
53def _resource_absent(resource, name, cloud_name):
54 try:
55 method_name = '{}_get_details'.format(resource)
56 _designatev2_call(
57 method_name, name, cloud_name=cloud_name
58 )[resource]
59 except Exception as e:
60 if 'ResourceNotFound' in repr(e):
61 return _succeeded('absent', name, resource)
62 if 'MultipleResourcesFound' in repr(e):
63 return _failed('find', name, resource)
64 try:
65 method_name = '{}_delete'.format(resource)
66 _designatev2_call(
67 method_name, name, cloud_name=cloud_name
68 )
69 except Exception as e:
70 log.error('Designate delete {0} failed with {1}'.format(resource, e))
71 return _failed('delete', name, resource)
72 return _succeeded('delete', name, resource)
73
74
75def zone_present(name, cloud_name, email, **kwargs):
76 kwargs.update({'email': email})
77 return _resource_present('zone', name, cloud_name, **kwargs)
78
79
80def zone_absent(name, cloud_name):
81 return _resource_absent('zone', name, cloud_name)
82
83
84def _succeeded(op, name, resource, changes=None):
85 msg_map = {
86 'create': '{0} {1} created',
87 'delete': '{0} {1} removed',
88 'update': '{0} {1} updated',
89 'no_changes': '{0} {1} is in desired state',
90 'absent': '{0} {1} not present',
91 'resources_moved': '{1} resources were moved from {0}',
92 }
93 changes_dict = {
94 'name': name,
95 'result': True,
96 'comment': msg_map[op].format(resource, name),
97 'changes': changes or {},
98 }
99 return changes_dict
100
101
102def _failed(op, name, resource):
103 msg_map = {
104 'create': '{0} {1} failed to create',
105 'delete': '{0} {1} failed to delete',
106 'update': '{0} {1} failed to update',
107 'find': '{0} {1} found multiple {0}',
108 'resources_moved': 'failed to move {1} from {0}',
109 }
110 changes_dict = {
111 'name': name,
112 'result': False,
113 'comment': msg_map[op].format(resource, name),
114 'changes': {},
115 }
116 return changes_dict