root / snf-cyclades-app / synnefo / quotas / enforce.py @ ff5edb80
History | View | Annotate | Download (9.7 kB)
1 | ff5edb80 | Giorgos Korfiatis | # Copyright 2013-2014 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | d14155e3 | Giorgos Korfiatis | #
|
3 | d14155e3 | Giorgos Korfiatis | # Redistribution and use in source and binary forms, with or
|
4 | d14155e3 | Giorgos Korfiatis | # without modification, are permitted provided that the following
|
5 | d14155e3 | Giorgos Korfiatis | # conditions are met:
|
6 | d14155e3 | Giorgos Korfiatis | #
|
7 | d14155e3 | Giorgos Korfiatis | # 1. Redistributions of source code must retain the above
|
8 | d14155e3 | Giorgos Korfiatis | # copyright notice, this list of conditions and the following
|
9 | d14155e3 | Giorgos Korfiatis | # disclaimer.
|
10 | d14155e3 | Giorgos Korfiatis | #
|
11 | d14155e3 | Giorgos Korfiatis | # 2. Redistributions in binary form must reproduce the above
|
12 | d14155e3 | Giorgos Korfiatis | # copyright notice, this list of conditions and the following
|
13 | d14155e3 | Giorgos Korfiatis | # disclaimer in the documentation and/or other materials
|
14 | d14155e3 | Giorgos Korfiatis | # provided with the distribution.
|
15 | d14155e3 | Giorgos Korfiatis | #
|
16 | d14155e3 | Giorgos Korfiatis | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | d14155e3 | Giorgos Korfiatis | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | d14155e3 | Giorgos Korfiatis | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | d14155e3 | Giorgos Korfiatis | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | d14155e3 | Giorgos Korfiatis | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | d14155e3 | Giorgos Korfiatis | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | d14155e3 | Giorgos Korfiatis | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | d14155e3 | Giorgos Korfiatis | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | d14155e3 | Giorgos Korfiatis | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | d14155e3 | Giorgos Korfiatis | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | d14155e3 | Giorgos Korfiatis | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | d14155e3 | Giorgos Korfiatis | # POSSIBILITY OF SUCH DAMAGE.
|
28 | d14155e3 | Giorgos Korfiatis | #
|
29 | d14155e3 | Giorgos Korfiatis | # The views and conclusions contained in the software and
|
30 | d14155e3 | Giorgos Korfiatis | # documentation are those of the authors and should not be
|
31 | d14155e3 | Giorgos Korfiatis | # interpreted as representing official policies, either expressed
|
32 | d14155e3 | Giorgos Korfiatis | # or implied, of GRNET S.A.
|
33 | d14155e3 | Giorgos Korfiatis | |
34 | d14155e3 | Giorgos Korfiatis | import time |
35 | d14155e3 | Giorgos Korfiatis | from synnefo.db.models import VirtualMachine, IPAddress, NetworkInterface |
36 | d14155e3 | Giorgos Korfiatis | from synnefo.logic import servers |
37 | d14155e3 | Giorgos Korfiatis | from synnefo.logic import ips as logic_ips |
38 | d14155e3 | Giorgos Korfiatis | from synnefo.logic import backend |
39 | d14155e3 | Giorgos Korfiatis | |
40 | d14155e3 | Giorgos Korfiatis | |
41 | d14155e3 | Giorgos Korfiatis | MiB = 2 ** 20 |
42 | d14155e3 | Giorgos Korfiatis | GiB = 2 ** 30 |
43 | d14155e3 | Giorgos Korfiatis | |
44 | d14155e3 | Giorgos Korfiatis | |
45 | d14155e3 | Giorgos Korfiatis | def _partition_by(f, l, convert=None): |
46 | d14155e3 | Giorgos Korfiatis | if convert is None: |
47 | d14155e3 | Giorgos Korfiatis | convert = lambda x: x
|
48 | d14155e3 | Giorgos Korfiatis | d = {} |
49 | d14155e3 | Giorgos Korfiatis | for x in l: |
50 | d14155e3 | Giorgos Korfiatis | group = f(x) |
51 | d14155e3 | Giorgos Korfiatis | group_l = d.get(group, []) |
52 | d14155e3 | Giorgos Korfiatis | group_l.append(convert(x)) |
53 | d14155e3 | Giorgos Korfiatis | d[group] = group_l |
54 | d14155e3 | Giorgos Korfiatis | return d
|
55 | d14155e3 | Giorgos Korfiatis | |
56 | d14155e3 | Giorgos Korfiatis | |
57 | d14155e3 | Giorgos Korfiatis | CHANGE = { |
58 | d14155e3 | Giorgos Korfiatis | "cyclades.ram": lambda vm: vm.flavor.ram * MiB, |
59 | d14155e3 | Giorgos Korfiatis | "cyclades.cpu": lambda vm: vm.flavor.cpu, |
60 | d14155e3 | Giorgos Korfiatis | "cyclades.vm": lambda vm: 1, |
61 | d14155e3 | Giorgos Korfiatis | "cyclades.total_ram": lambda vm: vm.flavor.ram * MiB, |
62 | d14155e3 | Giorgos Korfiatis | "cyclades.total_cpu": lambda vm: vm.flavor.cpu, |
63 | d14155e3 | Giorgos Korfiatis | "cyclades.disk": lambda vm: vm.flavor.disk * GiB, |
64 | d14155e3 | Giorgos Korfiatis | "cyclades.floating_ip": lambda vm: 1, |
65 | d14155e3 | Giorgos Korfiatis | } |
66 | d14155e3 | Giorgos Korfiatis | |
67 | d14155e3 | Giorgos Korfiatis | |
68 | d14155e3 | Giorgos Korfiatis | def wait_server_job(server): |
69 | d14155e3 | Giorgos Korfiatis | jobID = server.task_job_id |
70 | d14155e3 | Giorgos Korfiatis | client = server.get_client() |
71 | d14155e3 | Giorgos Korfiatis | status, error = backend.wait_for_job(client, jobID) |
72 | d14155e3 | Giorgos Korfiatis | if status != "success": |
73 | d14155e3 | Giorgos Korfiatis | raise ValueError(error) |
74 | d14155e3 | Giorgos Korfiatis | |
75 | d14155e3 | Giorgos Korfiatis | |
76 | d14155e3 | Giorgos Korfiatis | VM_SORT_LEVEL = { |
77 | d14155e3 | Giorgos Korfiatis | "ERROR": 4, |
78 | d14155e3 | Giorgos Korfiatis | "BUILD": 3, |
79 | d14155e3 | Giorgos Korfiatis | "STOPPED": 2, |
80 | d14155e3 | Giorgos Korfiatis | "STARTED": 1, |
81 | d14155e3 | Giorgos Korfiatis | "RESIZE": 1, |
82 | d14155e3 | Giorgos Korfiatis | "DESTROYED": 0, |
83 | d14155e3 | Giorgos Korfiatis | } |
84 | d14155e3 | Giorgos Korfiatis | |
85 | d14155e3 | Giorgos Korfiatis | |
86 | d14155e3 | Giorgos Korfiatis | def sort_vms(): |
87 | d14155e3 | Giorgos Korfiatis | def f(vm): |
88 | d14155e3 | Giorgos Korfiatis | level = VM_SORT_LEVEL[vm.operstate] |
89 | d14155e3 | Giorgos Korfiatis | return (level, vm.id)
|
90 | d14155e3 | Giorgos Korfiatis | return f
|
91 | d14155e3 | Giorgos Korfiatis | |
92 | d14155e3 | Giorgos Korfiatis | |
93 | d14155e3 | Giorgos Korfiatis | def handle_stop_active(viol_id, resource, vms, diff, actions): |
94 | d14155e3 | Giorgos Korfiatis | vm_actions = actions["vm"]
|
95 | d14155e3 | Giorgos Korfiatis | vms = [vm for vm in vms if vm.operstate in ["STARTED", "BUILD", "ERROR"]] |
96 | d14155e3 | Giorgos Korfiatis | vms = sorted(vms, key=sort_vms(), reverse=True) |
97 | d14155e3 | Giorgos Korfiatis | for vm in vms: |
98 | d14155e3 | Giorgos Korfiatis | if diff < 1: |
99 | d14155e3 | Giorgos Korfiatis | break
|
100 | d14155e3 | Giorgos Korfiatis | diff -= CHANGE[resource](vm) |
101 | d14155e3 | Giorgos Korfiatis | if vm_actions.get(vm.id) is None: |
102 | d14155e3 | Giorgos Korfiatis | action = "REMOVE" if vm.operstate == "ERROR" else "SHUTDOWN" |
103 | 6aa9924d | Giorgos Korfiatis | vm_actions[vm.id] = viol_id, vm.operstate, vm.backend_id, action |
104 | d14155e3 | Giorgos Korfiatis | |
105 | d14155e3 | Giorgos Korfiatis | |
106 | d14155e3 | Giorgos Korfiatis | def handle_destroy(viol_id, resource, vms, diff, actions): |
107 | d14155e3 | Giorgos Korfiatis | vm_actions = actions["vm"]
|
108 | d14155e3 | Giorgos Korfiatis | vms = sorted(vms, key=sort_vms(), reverse=True) |
109 | d14155e3 | Giorgos Korfiatis | for vm in vms: |
110 | d14155e3 | Giorgos Korfiatis | if diff < 1: |
111 | d14155e3 | Giorgos Korfiatis | break
|
112 | d14155e3 | Giorgos Korfiatis | diff -= CHANGE[resource](vm) |
113 | 6aa9924d | Giorgos Korfiatis | vm_actions[vm.id] = viol_id, vm.operstate, vm.backend_id, "REMOVE"
|
114 | d14155e3 | Giorgos Korfiatis | |
115 | d14155e3 | Giorgos Korfiatis | |
116 | d14155e3 | Giorgos Korfiatis | def _state_after_action(vm, action): |
117 | d14155e3 | Giorgos Korfiatis | if action == "REMOVE": |
118 | d14155e3 | Giorgos Korfiatis | return "ERROR" # highest |
119 | d14155e3 | Giorgos Korfiatis | if action == "SHUTDOWN": |
120 | d14155e3 | Giorgos Korfiatis | return "STOPPED" |
121 | d14155e3 | Giorgos Korfiatis | return vm.operstate # no action |
122 | d14155e3 | Giorgos Korfiatis | |
123 | d14155e3 | Giorgos Korfiatis | |
124 | 6aa9924d | Giorgos Korfiatis | def _maybe_action(tpl): |
125 | 6aa9924d | Giorgos Korfiatis | if tpl is None: |
126 | 6aa9924d | Giorgos Korfiatis | return None |
127 | 6aa9924d | Giorgos Korfiatis | return tpl[-1] |
128 | 6aa9924d | Giorgos Korfiatis | |
129 | 6aa9924d | Giorgos Korfiatis | |
130 | d14155e3 | Giorgos Korfiatis | def sort_ips(vm_actions): |
131 | d14155e3 | Giorgos Korfiatis | def f(ip): |
132 | d14155e3 | Giorgos Korfiatis | if not ip.in_use(): |
133 | d14155e3 | Giorgos Korfiatis | level = 5
|
134 | d14155e3 | Giorgos Korfiatis | else:
|
135 | d14155e3 | Giorgos Korfiatis | machine = ip.nic.machine |
136 | 6aa9924d | Giorgos Korfiatis | action = _maybe_action(vm_actions.get(machine.id)) |
137 | d14155e3 | Giorgos Korfiatis | level = VM_SORT_LEVEL[_state_after_action(machine, action)] |
138 | d14155e3 | Giorgos Korfiatis | return (level, ip.id)
|
139 | d14155e3 | Giorgos Korfiatis | return f
|
140 | d14155e3 | Giorgos Korfiatis | |
141 | d14155e3 | Giorgos Korfiatis | |
142 | d14155e3 | Giorgos Korfiatis | def handle_floating_ip(viol_id, resource, ips, diff, actions): |
143 | d14155e3 | Giorgos Korfiatis | vm_actions = actions.get("vm", {})
|
144 | d14155e3 | Giorgos Korfiatis | ip_actions = actions["floating_ip"]
|
145 | d14155e3 | Giorgos Korfiatis | ips = sorted(ips, key=sort_ips(vm_actions), reverse=True) |
146 | d14155e3 | Giorgos Korfiatis | for ip in ips: |
147 | d14155e3 | Giorgos Korfiatis | if diff < 1: |
148 | d14155e3 | Giorgos Korfiatis | break
|
149 | d14155e3 | Giorgos Korfiatis | diff -= CHANGE[resource](ip) |
150 | d14155e3 | Giorgos Korfiatis | state = "USED" if ip.in_use() else "FREE" |
151 | 6aa9924d | Giorgos Korfiatis | if ip.nic and ip.nic.machine: |
152 | 6aa9924d | Giorgos Korfiatis | backend_id = ip.nic.machine.backend_id |
153 | 6aa9924d | Giorgos Korfiatis | else:
|
154 | 6aa9924d | Giorgos Korfiatis | backend_id = None
|
155 | 6aa9924d | Giorgos Korfiatis | ip_actions[ip.id] = viol_id, state, backend_id, "REMOVE"
|
156 | d14155e3 | Giorgos Korfiatis | |
157 | d14155e3 | Giorgos Korfiatis | |
158 | f600b74e | Giorgos Korfiatis | def get_vms(users=None, projects=None): |
159 | d14155e3 | Giorgos Korfiatis | vms = VirtualMachine.objects.filter(deleted=False).\
|
160 | d14155e3 | Giorgos Korfiatis | select_related("flavor").order_by('-id') |
161 | d14155e3 | Giorgos Korfiatis | if users is not None: |
162 | d14155e3 | Giorgos Korfiatis | vms = vms.filter(userid__in=users) |
163 | f600b74e | Giorgos Korfiatis | if projects is not None: |
164 | f600b74e | Giorgos Korfiatis | vms = vms.filter(project__in=projects) |
165 | d14155e3 | Giorgos Korfiatis | |
166 | f600b74e | Giorgos Korfiatis | vmsdict = _partition_by(lambda vm: vm.project, vms)
|
167 | f600b74e | Giorgos Korfiatis | for project, projectdict in vmsdict.iteritems(): |
168 | f600b74e | Giorgos Korfiatis | vmsdict[project] = _partition_by(lambda vm: vm.userid, projectdict)
|
169 | f600b74e | Giorgos Korfiatis | return vmsdict
|
170 | d14155e3 | Giorgos Korfiatis | |
171 | d14155e3 | Giorgos Korfiatis | |
172 | f600b74e | Giorgos Korfiatis | def get_floating_ips(users=None, projects=None): |
173 | d14155e3 | Giorgos Korfiatis | ips = IPAddress.objects.filter(deleted=False, floating_ip=True).\ |
174 | d14155e3 | Giorgos Korfiatis | select_related("nic__machine")
|
175 | d14155e3 | Giorgos Korfiatis | if users is not None: |
176 | d14155e3 | Giorgos Korfiatis | ips = ips.filter(userid__in=users) |
177 | f600b74e | Giorgos Korfiatis | if projects is not None: |
178 | f600b74e | Giorgos Korfiatis | ips = ips.filter(project__in=projects) |
179 | d14155e3 | Giorgos Korfiatis | |
180 | f600b74e | Giorgos Korfiatis | ipsdict = _partition_by(lambda ip: ip.project, ips)
|
181 | f600b74e | Giorgos Korfiatis | for project, projectdict in ipsdict.iteritems(): |
182 | f600b74e | Giorgos Korfiatis | ipsdict[project] = _partition_by(lambda ip: ip.userid, projectdict)
|
183 | f600b74e | Giorgos Korfiatis | return ipsdict
|
184 | d14155e3 | Giorgos Korfiatis | |
185 | d14155e3 | Giorgos Korfiatis | |
186 | f600b74e | Giorgos Korfiatis | def get_actual_resources(resource_type, users=None, projects=None): |
187 | d14155e3 | Giorgos Korfiatis | ACTUAL_RESOURCES = { |
188 | d14155e3 | Giorgos Korfiatis | "vm": get_vms,
|
189 | d14155e3 | Giorgos Korfiatis | "floating_ip": get_floating_ips,
|
190 | d14155e3 | Giorgos Korfiatis | } |
191 | f600b74e | Giorgos Korfiatis | return ACTUAL_RESOURCES[resource_type](users=users, projects=projects)
|
192 | f600b74e | Giorgos Korfiatis | |
193 | f600b74e | Giorgos Korfiatis | |
194 | f600b74e | Giorgos Korfiatis | def skip_check(obj, to_check=None, excluded=None): |
195 | f600b74e | Giorgos Korfiatis | return (to_check is not None and obj not in to_check or |
196 | f600b74e | Giorgos Korfiatis | excluded is not None and obj in excluded) |
197 | f600b74e | Giorgos Korfiatis | |
198 | f600b74e | Giorgos Korfiatis | |
199 | f600b74e | Giorgos Korfiatis | def pick_project_resources(project_dict, users=None, excluded_users=None): |
200 | f600b74e | Giorgos Korfiatis | resources = [] |
201 | f600b74e | Giorgos Korfiatis | for user, user_resources in project_dict.iteritems(): |
202 | f600b74e | Giorgos Korfiatis | if skip_check(user, users, excluded_users):
|
203 | f600b74e | Giorgos Korfiatis | continue
|
204 | f600b74e | Giorgos Korfiatis | resources += user_resources |
205 | f600b74e | Giorgos Korfiatis | return resources
|
206 | d14155e3 | Giorgos Korfiatis | |
207 | d14155e3 | Giorgos Korfiatis | |
208 | d14155e3 | Giorgos Korfiatis | VM_ACTION = { |
209 | d14155e3 | Giorgos Korfiatis | "REMOVE": servers.destroy,
|
210 | d14155e3 | Giorgos Korfiatis | "SHUTDOWN": servers.stop,
|
211 | d14155e3 | Giorgos Korfiatis | } |
212 | d14155e3 | Giorgos Korfiatis | |
213 | d14155e3 | Giorgos Korfiatis | |
214 | 29e3919d | Giorgos Korfiatis | def apply_to_vm(action, vm_id, shutdown_timeout): |
215 | d14155e3 | Giorgos Korfiatis | try:
|
216 | d14155e3 | Giorgos Korfiatis | vm = VirtualMachine.objects.select_for_update().get(id=vm_id) |
217 | 29e3919d | Giorgos Korfiatis | VM_ACTION[action](vm, shutdown_timeout=shutdown_timeout) |
218 | d14155e3 | Giorgos Korfiatis | return True |
219 | d14155e3 | Giorgos Korfiatis | except BaseException: |
220 | d14155e3 | Giorgos Korfiatis | return False |
221 | d14155e3 | Giorgos Korfiatis | |
222 | d14155e3 | Giorgos Korfiatis | |
223 | 6aa9924d | Giorgos Korfiatis | def allow_operation(backend_id, opcount, maxops): |
224 | 6aa9924d | Giorgos Korfiatis | if backend_id is None or maxops is None: |
225 | 6aa9924d | Giorgos Korfiatis | return True |
226 | 6aa9924d | Giorgos Korfiatis | backend_ops = opcount.get(backend_id, 0)
|
227 | 6aa9924d | Giorgos Korfiatis | if backend_ops >= maxops:
|
228 | 6aa9924d | Giorgos Korfiatis | return False |
229 | 6aa9924d | Giorgos Korfiatis | opcount[backend_id] = backend_ops + 1
|
230 | 6aa9924d | Giorgos Korfiatis | return True |
231 | 6aa9924d | Giorgos Korfiatis | |
232 | 6aa9924d | Giorgos Korfiatis | |
233 | 29e3919d | Giorgos Korfiatis | def perform_vm_actions(actions, opcount, maxops=None, fix=False, options={}): |
234 | d14155e3 | Giorgos Korfiatis | log = [] |
235 | 6aa9924d | Giorgos Korfiatis | for vm_id, (viol_id, state, backend_id, vm_action) in actions.iteritems(): |
236 | 6aa9924d | Giorgos Korfiatis | if not allow_operation(backend_id, opcount, maxops): |
237 | 6aa9924d | Giorgos Korfiatis | continue
|
238 | 6aa9924d | Giorgos Korfiatis | data = ("vm", vm_id, state, backend_id, vm_action, viol_id)
|
239 | d14155e3 | Giorgos Korfiatis | if fix:
|
240 | 29e3919d | Giorgos Korfiatis | r = apply_to_vm(vm_action, vm_id, options.get("shutdown_timeout"))
|
241 | d14155e3 | Giorgos Korfiatis | data += ("DONE" if r else "FAILED",) |
242 | d14155e3 | Giorgos Korfiatis | log.append(data) |
243 | d14155e3 | Giorgos Korfiatis | return log
|
244 | d14155e3 | Giorgos Korfiatis | |
245 | d14155e3 | Giorgos Korfiatis | |
246 | d14155e3 | Giorgos Korfiatis | def wait_for_ip(ip_id): |
247 | d14155e3 | Giorgos Korfiatis | for i in range(100): |
248 | d14155e3 | Giorgos Korfiatis | ip = IPAddress.objects.get(id=ip_id) |
249 | d14155e3 | Giorgos Korfiatis | if ip.nic_id is None: |
250 | d14155e3 | Giorgos Korfiatis | objs = IPAddress.objects.select_for_update() |
251 | d14155e3 | Giorgos Korfiatis | return objs.get(id=ip_id)
|
252 | d14155e3 | Giorgos Korfiatis | time.sleep(1)
|
253 | d14155e3 | Giorgos Korfiatis | raise ValueError( |
254 | d14155e3 | Giorgos Korfiatis | "Floating_ip %s: Waiting for port delete timed out." % ip_id)
|
255 | d14155e3 | Giorgos Korfiatis | |
256 | d14155e3 | Giorgos Korfiatis | |
257 | d14155e3 | Giorgos Korfiatis | def remove_ip(ip_id): |
258 | d14155e3 | Giorgos Korfiatis | try:
|
259 | d14155e3 | Giorgos Korfiatis | ip = IPAddress.objects.select_for_update().get(id=ip_id) |
260 | d14155e3 | Giorgos Korfiatis | port_id = ip.nic_id |
261 | d14155e3 | Giorgos Korfiatis | if port_id:
|
262 | d14155e3 | Giorgos Korfiatis | objs = NetworkInterface.objects.select_for_update() |
263 | d14155e3 | Giorgos Korfiatis | port = objs.get(id=port_id) |
264 | d14155e3 | Giorgos Korfiatis | servers.delete_port(port) |
265 | d14155e3 | Giorgos Korfiatis | if port.machine:
|
266 | d14155e3 | Giorgos Korfiatis | wait_server_job(port.machine) |
267 | d14155e3 | Giorgos Korfiatis | ip = wait_for_ip(ip_id) |
268 | d14155e3 | Giorgos Korfiatis | logic_ips.delete_floating_ip(ip) |
269 | d14155e3 | Giorgos Korfiatis | return True |
270 | d14155e3 | Giorgos Korfiatis | except BaseException: |
271 | d14155e3 | Giorgos Korfiatis | return False |
272 | d14155e3 | Giorgos Korfiatis | |
273 | d14155e3 | Giorgos Korfiatis | |
274 | 29e3919d | Giorgos Korfiatis | def perform_floating_ip_actions(actions, opcount, maxops=None, fix=False, |
275 | 29e3919d | Giorgos Korfiatis | options={}): |
276 | d14155e3 | Giorgos Korfiatis | log = [] |
277 | 6aa9924d | Giorgos Korfiatis | for ip_id, (viol_id, state, backend_id, ip_action) in actions.iteritems(): |
278 | 6aa9924d | Giorgos Korfiatis | if not allow_operation(backend_id, opcount, maxops): |
279 | 6aa9924d | Giorgos Korfiatis | continue
|
280 | 6aa9924d | Giorgos Korfiatis | data = ("floating_ip", ip_id, state, backend_id, ip_action, viol_id)
|
281 | d14155e3 | Giorgos Korfiatis | if ip_action == "REMOVE": |
282 | d14155e3 | Giorgos Korfiatis | if fix:
|
283 | d14155e3 | Giorgos Korfiatis | r = remove_ip(ip_id) |
284 | d14155e3 | Giorgos Korfiatis | data += ("DONE" if r else "FAILED",) |
285 | d14155e3 | Giorgos Korfiatis | log.append(data) |
286 | d14155e3 | Giorgos Korfiatis | return log
|
287 | d14155e3 | Giorgos Korfiatis | |
288 | d14155e3 | Giorgos Korfiatis | |
289 | 29e3919d | Giorgos Korfiatis | def perform_actions(actions, maxops=None, fix=False, options={}): |
290 | d14155e3 | Giorgos Korfiatis | ACTION_HANDLING = [ |
291 | d14155e3 | Giorgos Korfiatis | ("floating_ip", perform_floating_ip_actions),
|
292 | d14155e3 | Giorgos Korfiatis | ("vm", perform_vm_actions),
|
293 | d14155e3 | Giorgos Korfiatis | ] |
294 | d14155e3 | Giorgos Korfiatis | |
295 | 6aa9924d | Giorgos Korfiatis | opcount = {} |
296 | d14155e3 | Giorgos Korfiatis | logs = [] |
297 | d14155e3 | Giorgos Korfiatis | for resource_type, handler in ACTION_HANDLING: |
298 | d14155e3 | Giorgos Korfiatis | t_actions = actions.get(resource_type, {}) |
299 | 29e3919d | Giorgos Korfiatis | log = handler(t_actions, opcount, maxops=maxops, fix=fix, |
300 | 29e3919d | Giorgos Korfiatis | options=options) |
301 | d14155e3 | Giorgos Korfiatis | logs += log |
302 | d14155e3 | Giorgos Korfiatis | return logs
|
303 | d14155e3 | Giorgos Korfiatis | |
304 | d14155e3 | Giorgos Korfiatis | |
305 | d14155e3 | Giorgos Korfiatis | # It is important to check resources in this order, especially
|
306 | d14155e3 | Giorgos Korfiatis | # floating_ip after vm resources.
|
307 | d14155e3 | Giorgos Korfiatis | RESOURCE_HANDLING = [ |
308 | d14155e3 | Giorgos Korfiatis | ("cyclades.cpu", handle_stop_active, "vm"), |
309 | d14155e3 | Giorgos Korfiatis | ("cyclades.ram", handle_stop_active, "vm"), |
310 | d14155e3 | Giorgos Korfiatis | ("cyclades.total_cpu", handle_destroy, "vm"), |
311 | d14155e3 | Giorgos Korfiatis | ("cyclades.total_ram", handle_destroy, "vm"), |
312 | d14155e3 | Giorgos Korfiatis | ("cyclades.disk", handle_destroy, "vm"), |
313 | d14155e3 | Giorgos Korfiatis | ("cyclades.vm", handle_destroy, "vm"), |
314 | d14155e3 | Giorgos Korfiatis | ("cyclades.floating_ip", handle_floating_ip, "floating_ip"), |
315 | d14155e3 | Giorgos Korfiatis | ] |