blob: af7df711387cdeaf8947110749ea4e368ac25d15 [file] [log] [blame]
koder aka kdanilov4643fd62015-02-10 16:20:13 -08001import re
2import os
3import time
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +03004import os.path
koder aka kdanilove21d7472015-02-14 19:02:04 -08005import logging
koder aka kdanilov4e9f3ed2015-04-14 11:26:12 +03006import subprocess
koder aka kdanilov4643fd62015-02-10 16:20:13 -08007
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -08008from concurrent.futures import ThreadPoolExecutor
9
koder aka kdanilov4500a5f2015-04-17 16:55:17 +030010from novaclient.exceptions import NotFound
koder aka kdanilov4643fd62015-02-10 16:20:13 -080011from novaclient.client import Client as n_client
12from cinderclient.v1.client import Client as c_client
13
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030014import wally
15from wally.discover import Node
koder aka kdanilov1c2b5112015-04-10 16:53:51 +030016
koder aka kdanilov4643fd62015-02-10 16:20:13 -080017
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030018logger = logging.getLogger("wally.vms")
koder aka kdanilove21d7472015-02-14 19:02:04 -080019
20
koder aka kdanilove87ae652015-04-20 02:14:35 +030021STORED_OPENSTACK_CREDS = None
koder aka kdanilov1c2b5112015-04-10 16:53:51 +030022NOVA_CONNECTION = None
koder aka kdanilove87ae652015-04-20 02:14:35 +030023CINDER_CONNECTION = None
24
25
26def ostack_get_creds():
27 if STORED_OPENSTACK_CREDS is None:
28 env = os.environ.get
29 name = env('OS_USERNAME')
30 passwd = env('OS_PASSWORD')
31 tenant = env('OS_TENANT_NAME')
32 auth_url = env('OS_AUTH_URL')
33 return name, passwd, tenant, auth_url
34 else:
35 return STORED_OPENSTACK_CREDS
koder aka kdanilov1c2b5112015-04-10 16:53:51 +030036
37
38def nova_connect(name=None, passwd=None, tenant=None, auth_url=None):
39 global NOVA_CONNECTION
koder aka kdanilove87ae652015-04-20 02:14:35 +030040 global STORED_OPENSTACK_CREDS
41
koder aka kdanilov1c2b5112015-04-10 16:53:51 +030042 if NOVA_CONNECTION is None:
43 if name is None:
44 name, passwd, tenant, auth_url = ostack_get_creds()
koder aka kdanilove87ae652015-04-20 02:14:35 +030045 else:
46 STORED_OPENSTACK_CREDS = (name, passwd, tenant, auth_url)
47
koder aka kdanilov1c2b5112015-04-10 16:53:51 +030048 NOVA_CONNECTION = n_client('1.1', name, passwd, tenant, auth_url)
49 return NOVA_CONNECTION
50
51
koder aka kdanilove87ae652015-04-20 02:14:35 +030052def cinder_connect(name=None, passwd=None, tenant=None, auth_url=None):
53 global CINDER_CONNECTION
54 global STORED_OPENSTACK_CREDS
55
56 if CINDER_CONNECTION is None:
57 if name is None:
58 name, passwd, tenant, auth_url = ostack_get_creds()
59 else:
60 STORED_OPENSTACK_CREDS = (name, passwd, tenant, auth_url)
61 CINDER_CONNECTION = c_client(name, passwd, tenant, auth_url)
62 return CINDER_CONNECTION
63
64
koder aka kdanilovc368eb62015-04-28 18:22:01 +030065def prepare_os_subpr(params, name=None, passwd=None, tenant=None,
66 auth_url=None):
koder aka kdanilov4e9f3ed2015-04-14 11:26:12 +030067 if name is None:
68 name, passwd, tenant, auth_url = ostack_get_creds()
69
koder aka kdanilovc368eb62015-04-28 18:22:01 +030070 MAX_VM_PER_NODE = 8
71 serv_groups = " ".join(map(params['aa_group_name'].format,
72 range(MAX_VM_PER_NODE)))
koder aka kdanilov4e9f3ed2015-04-14 11:26:12 +030073
koder aka kdanilovc368eb62015-04-28 18:22:01 +030074 env = os.environ.copy()
75 env.update(dict(
76 OS_USERNAME=name,
77 OS_PASSWORD=passwd,
78 OS_TENANT_NAME=tenant,
79 OS_AUTH_URL=auth_url,
koder aka kdanilov4e9f3ed2015-04-14 11:26:12 +030080
koder aka kdanilovc368eb62015-04-28 18:22:01 +030081 FLAVOR_NAME=params['flavor']['name'],
82 FLAVOR_RAM=str(params['flavor']['ram_size']),
83 FLAVOR_HDD=str(params['flavor']['hdd_size']),
84 FLAVOR_CPU_COUNT=str(params['flavor']['cpu_count']),
85
86 SERV_GROUPS=serv_groups,
87 KEYPAIR_NAME=params['keypair_name'],
88
89 SECGROUP=params['security_group'],
90
91 IMAGE_NAME=params['image']['name'],
92 KEY_FILE_NAME=params['keypair_file_private'],
93 IMAGE_URL=params['image']['url'],
94 ))
95
96 spath = os.path.dirname(os.path.dirname(wally.__file__))
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030097 spath = os.path.join(spath, 'scripts/prepare.sh')
98
koder aka kdanilovc368eb62015-04-28 18:22:01 +030099 cmd = "bash {spath} >/dev/null".format(spath=spath)
100 subprocess.check_call(cmd, shell=True, env=env)
koder aka kdanilov4e9f3ed2015-04-14 11:26:12 +0300101
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300102
103def prepare_os(nova, params):
104 allow_ssh(nova, params['security_group'])
105
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300106 MAX_VM_PER_NODE = 8
107 serv_groups = " ".join(map(params['aa_group_name'].format,
108 range(MAX_VM_PER_NODE)))
109
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300110 shed_ids = []
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300111 for shed_group in serv_groups:
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300112 shed_ids.append(get_or_create_aa_group(nova, shed_group))
113
114 create_keypair(nova,
115 params['keypair_name'],
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300116 params['keypair_name'] + ".pub",
117 params['keypair_name'] + ".pem")
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300118
119 create_image(nova, params['image']['name'],
120 params['image']['url'])
121
122 create_flavor(nova, **params['flavor'])
koder aka kdanilov4e9f3ed2015-04-14 11:26:12 +0300123
124
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300125def get_or_create_aa_group(nova, name):
126 try:
127 group = nova.server_groups.find(name=name)
128 except NotFound:
129 group = nova.server_groups.create({'name': name,
130 'policies': ['anti-affinity']})
koder aka kdanilov652cd802015-04-13 12:21:07 +0300131
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300132 return group.id
koder aka kdanilov652cd802015-04-13 12:21:07 +0300133
134
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300135def allow_ssh(nova, group_name):
136 try:
137 secgroup = nova.security_groups.find(name=group_name)
138 except NotFound:
139 secgroup = nova.security_groups.create(group_name,
140 "allow ssh/ping to node")
141
koder aka kdanilov652cd802015-04-13 12:21:07 +0300142 nova.security_group_rules.create(secgroup.id,
143 ip_protocol="tcp",
144 from_port="22",
145 to_port="22",
146 cidr="0.0.0.0/0")
147
148 nova.security_group_rules.create(secgroup.id,
149 ip_protocol="icmp",
150 from_port=-1,
151 cidr="0.0.0.0/0",
152 to_port=-1)
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300153 return secgroup.id
koder aka kdanilov652cd802015-04-13 12:21:07 +0300154
155
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300156def create_image(nova, name, url):
157 pass
158
159
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300160def create_flavor(nova, name, ram_size, hdd_size, cpu_count):
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300161 pass
162
163
164def create_keypair(nova, name, pub_key_path, priv_key_path):
165 try:
166 nova.keypairs.find(name=name)
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300167 # if file not found- delete and recreate
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300168 except NotFound:
169 if os.path.exists(pub_key_path):
170 with open(pub_key_path) as pub_key_fd:
171 return nova.keypairs.create(name, pub_key_fd.read())
172 else:
173 key = nova.keypairs.create(name)
174
175 with open(priv_key_path, "w") as priv_key_fd:
176 priv_key_fd.write(key.private_key)
177
178 with open(pub_key_path, "w") as pub_key_fd:
179 pub_key_fd.write(key.public_key)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800180
181
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800182def create_volume(size, name):
koder aka kdanilove87ae652015-04-20 02:14:35 +0300183 cinder = cinder_connect()
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800184 vol = cinder.volumes.create(size=size, display_name=name)
185 err_count = 0
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300186
koder aka kdanilove87ae652015-04-20 02:14:35 +0300187 while vol.status != 'available':
188 if vol.status == 'error':
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800189 if err_count == 3:
koder aka kdanilove21d7472015-02-14 19:02:04 -0800190 logger.critical("Fail to create volume")
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800191 raise RuntimeError("Fail to create volume")
192 else:
193 err_count += 1
194 cinder.volumes.delete(vol)
195 time.sleep(1)
196 vol = cinder.volumes.create(size=size, display_name=name)
197 continue
198 time.sleep(1)
koder aka kdanilove87ae652015-04-20 02:14:35 +0300199 vol = cinder.volumes.get(vol.id)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800200 return vol
201
202
203def wait_for_server_active(nova, server, timeout=240):
204 t = time.time()
205 while True:
koder aka kdanilov3f356262015-02-13 08:06:14 -0800206 time.sleep(1)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800207 sstate = getattr(server, 'OS-EXT-STS:vm_state').lower()
208
209 if sstate == 'active':
210 return True
211
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800212 if sstate == 'error':
213 return False
214
215 if time.time() - t > timeout:
216 return False
217
218 server = nova.servers.get(server)
219
220
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800221class Allocate(object):
222 pass
223
224
225def get_floating_ips(nova, pool, amount):
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800226 ip_list = nova.floating_ips.list()
227
228 if pool is not None:
229 ip_list = [ip for ip in ip_list if ip.pool == pool]
230
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800231 return [ip for ip in ip_list if ip.instance_id is None][:amount]
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800232
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800233
koder aka kdanilovcee43342015-04-14 22:52:53 +0300234def launch_vms(params):
koder aka kdanilovda45e882015-04-06 02:24:42 +0300235 logger.debug("Starting new nodes on openstack")
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300236 count = params['count']
koder aka kdanilovda45e882015-04-06 02:24:42 +0300237
238 if isinstance(count, basestring):
239 assert count.startswith("x")
koder aka kdanilov1c2b5112015-04-10 16:53:51 +0300240 lst = NOVA_CONNECTION.services.list(binary='nova-compute')
koder aka kdanilovda45e882015-04-06 02:24:42 +0300241 srv_count = len([srv for srv in lst if srv.status == 'enabled'])
242 count = srv_count * int(count[1:])
243
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300244 assert isinstance(count, (int, long))
245
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300246 srv_params = "img: {image[name]}, flavor: {flavor[name]}".format(**params)
koder aka kdanilov66839a92015-04-11 13:22:31 +0300247 msg_templ = "Will start {0} servers with next params: {1}"
koder aka kdanilovcee43342015-04-14 22:52:53 +0300248 logger.info(msg_templ.format(count, srv_params))
koder aka kdanilovda45e882015-04-06 02:24:42 +0300249
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300250 vm_params = dict(
251 img_name=params['image']['name'],
252 flavor_name=params['flavor']['name'],
253 group_name=params['group_name'],
254 keypair_name=params['keypair_name'],
255 vol_sz=params.get('vol_sz'),
256 network_zone_name=params.get("network_zone_name"),
257 flt_ip_pool=params.get('flt_ip_pool'),
258 name_templ=params.get('name_templ'),
259 scheduler_hints={"group": params['aa_group_name']},
260 security_group=params['security_group'],
261 sec_group_size=srv_count
262 )
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300263
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300264 # precache all errors before start creating vms
265 private_key_path = params['keypair_file_private']
266 creds = params['image']['creds']
267 creds.format(ip="1.1.1.1", private_key_path="/some_path/xx")
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300268
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300269 for ip, os_node in create_vms_mt(NOVA_CONNECTION, count, **vm_params):
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300270
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300271 conn_uri = creds.format(ip=ip, private_key_path=private_key_path)
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300272 yield Node(conn_uri, []), os_node.id
koder aka kdanilovda45e882015-04-06 02:24:42 +0300273
274
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300275def create_vms_mt(nova, amount, group_name, keypair_name, img_name,
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800276 flavor_name, vol_sz=None, network_zone_name=None,
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300277 flt_ip_pool=None, name_templ='wally-{id}',
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300278 scheduler_hints=None, security_group=None,
279 sec_group_size=None):
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800280
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800281 with ThreadPoolExecutor(max_workers=16) as executor:
koder aka kdanilov97644f92015-02-13 11:11:08 -0800282 if network_zone_name is not None:
283 network_future = executor.submit(nova.networks.find,
284 label=network_zone_name)
285 else:
286 network_future = None
287
288 fl_future = executor.submit(nova.flavors.find, name=flavor_name)
289 img_future = executor.submit(nova.images.find, name=img_name)
290
291 if flt_ip_pool is not None:
292 ips_future = executor.submit(get_floating_ips,
293 nova, flt_ip_pool, amount)
koder aka kdanilove21d7472015-02-14 19:02:04 -0800294 logger.debug("Wait for floating ip")
koder aka kdanilov97644f92015-02-13 11:11:08 -0800295 ips = ips_future.result()
296 ips += [Allocate] * (amount - len(ips))
297 else:
298 ips = [None] * amount
299
koder aka kdanilov7dec9df2015-02-15 21:35:19 -0800300 logger.debug("Getting flavor object")
koder aka kdanilov97644f92015-02-13 11:11:08 -0800301 fl = fl_future.result()
koder aka kdanilov7dec9df2015-02-15 21:35:19 -0800302 logger.debug("Getting image object")
koder aka kdanilov97644f92015-02-13 11:11:08 -0800303 img = img_future.result()
304
305 if network_future is not None:
koder aka kdanilove21d7472015-02-14 19:02:04 -0800306 logger.debug("Waiting for network results")
koder aka kdanilov97644f92015-02-13 11:11:08 -0800307 nics = [{'net-id': network_future.result().id}]
308 else:
309 nics = None
310
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300311 names = []
312 for i in range(amount):
313 names.append(name_templ.format(group=group_name, id=i))
koder aka kdanilov97644f92015-02-13 11:11:08 -0800314
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800315 futures = []
koder aka kdanilov168f6092015-04-19 02:33:38 +0300316 logger.debug("Requesting new vm's")
koder aka kdanilov6e2ae792015-03-04 18:02:24 -0800317
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300318 orig_scheduler_hints = scheduler_hints.copy()
319
320 for idx, (name, flt_ip) in enumerate(zip(names, ips)):
321
322 scheduler_hints = None
323 if orig_scheduler_hints is not None and sec_group_size is not None:
324 if "group" in orig_scheduler_hints:
325 scheduler_hints = orig_scheduler_hints.copy()
326 scheduler_hints['group'] = \
327 scheduler_hints['group'].format(idx // sec_group_size)
328
329 if scheduler_hints is None:
330 scheduler_hints = orig_scheduler_hints.copy()
331
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800332 params = (nova, name, keypair_name, img, fl,
333 nics, vol_sz, flt_ip, scheduler_hints,
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300334 flt_ip_pool, [security_group])
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800335
336 futures.append(executor.submit(create_vm, *params))
koder aka kdanilove21d7472015-02-14 19:02:04 -0800337 res = [future.result() for future in futures]
338 logger.debug("Done spawning")
339 return res
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800340
341
342def create_vm(nova, name, keypair_name, img,
343 fl, nics, vol_sz=None,
344 flt_ip=False,
345 scheduler_hints=None,
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300346 pool=None,
347 security_groups=None):
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800348 for i in range(3):
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800349 srv = nova.servers.create(name,
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300350 flavor=fl,
351 image=img,
352 nics=nics,
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800353 key_name=keypair_name,
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300354 scheduler_hints=scheduler_hints,
355 security_groups=security_groups)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800356
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800357 if not wait_for_server_active(nova, srv):
358 msg = "Server {0} fails to start. Kill it and try again"
koder aka kdanilove21d7472015-02-14 19:02:04 -0800359 logger.debug(msg.format(srv))
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800360 nova.servers.delete(srv)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800361
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300362 for j in range(120):
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800363 all_id = set(alive_srv.id for alive_srv in nova.servers.list())
364 if srv.id not in all_id:
365 break
366 time.sleep(1)
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300367 else:
368 raise RuntimeError("Server {0} delete timeout".format(srv.id))
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800369 else:
370 break
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300371 else:
372 raise RuntimeError("Failed to start server".format(srv.id))
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800373
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800374 if vol_sz is not None:
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800375 vol = create_volume(vol_sz, name)
koder aka kdanilove87ae652015-04-20 02:14:35 +0300376 nova.volumes.create_server_volume(srv.id, vol.id, None)
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800377
378 if flt_ip is Allocate:
379 flt_ip = nova.floating_ips.create(pool)
koder aka kdanilovda45e882015-04-06 02:24:42 +0300380
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800381 if flt_ip is not None:
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800382 srv.add_floating_ip(flt_ip)
Yulia Portnova0e64ea22015-03-20 17:27:22 +0200383
koder aka kdanilovda45e882015-04-06 02:24:42 +0300384 return flt_ip.ip, nova.servers.get(srv.id)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800385
386
koder aka kdanilov1c2b5112015-04-10 16:53:51 +0300387def clear_nodes(nodes_ids):
388 clear_all(NOVA_CONNECTION, nodes_ids, None)
gstepanov023c1e42015-04-08 15:50:19 +0300389
390
koder aka kdanilove87ae652015-04-20 02:14:35 +0300391def clear_all(nova, ids=None, name_templ=None):
koder aka kdanilov1c2b5112015-04-10 16:53:51 +0300392
393 def need_delete(srv):
394 if name_templ is not None:
395 return re.match(name_templ.format("\\d+"), srv.name) is not None
396 else:
397 return srv.id in ids
398
koder aka kdanilove87ae652015-04-20 02:14:35 +0300399 volumes_to_delete = []
400 cinder = cinder_connect()
401 for vol in cinder.volumes.list():
402 for attachment in vol.attachments:
403 if attachment['server_id'] in ids:
404 volumes_to_delete.append(vol)
405 break
406
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800407 deleted_srvs = set()
408 for srv in nova.servers.list():
koder aka kdanilov1c2b5112015-04-10 16:53:51 +0300409 if need_delete(srv):
koder aka kdanilove21d7472015-02-14 19:02:04 -0800410 logger.debug("Deleting server {0}".format(srv.name))
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800411 nova.servers.delete(srv)
412 deleted_srvs.add(srv.id)
413
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300414 count = 0
415 while True:
416 if count % 60 == 0:
417 logger.debug("Waiting till all servers are actually deleted")
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800418 all_id = set(srv.id for srv in nova.servers.list())
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300419 if len(all_id.intersection(deleted_srvs)) == 0:
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800420 break
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300421 count += 1
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800422 time.sleep(1)
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300423 logger.debug("Done, deleting volumes")
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800424
425 # wait till vm actually deleted
426
koder aka kdanilov6b1341a2015-04-21 22:44:21 +0300427 # logger.warning("Volume deletion commented out")
428 for vol in volumes_to_delete:
429 logger.debug("Deleting volume " + vol.display_name)
430 cinder.volumes.delete(vol)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800431
koder aka kdanilove21d7472015-02-14 19:02:04 -0800432 logger.debug("Clearing done (yet some volumes may still deleting)")