blob: 6ce91f8d5fc3824a5946d5ceda8d845571bb1a2d [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 kdanilov7e0f7cf2015-05-01 17:24:35 +0300102 conn = nova_connect(name, passwd, tenant, auth_url)
103 while True:
104 status = conn.images.find(name='wally_ubuntu').status
105 if status == 'ACTIVE':
106 break
107 msg = "Image {0} is still in {1} state. Waiting 10 more seconds"
108 logger.info(msg.format('wally_ubuntu', status))
109 time.sleep(10)
110
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300111
112def prepare_os(nova, params):
113 allow_ssh(nova, params['security_group'])
114
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300115 MAX_VM_PER_NODE = 8
116 serv_groups = " ".join(map(params['aa_group_name'].format,
117 range(MAX_VM_PER_NODE)))
118
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300119 shed_ids = []
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300120 for shed_group in serv_groups:
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300121 shed_ids.append(get_or_create_aa_group(nova, shed_group))
122
123 create_keypair(nova,
124 params['keypair_name'],
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300125 params['keypair_name'] + ".pub",
126 params['keypair_name'] + ".pem")
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300127
128 create_image(nova, params['image']['name'],
129 params['image']['url'])
130
131 create_flavor(nova, **params['flavor'])
koder aka kdanilov4e9f3ed2015-04-14 11:26:12 +0300132
133
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300134def get_or_create_aa_group(nova, name):
135 try:
136 group = nova.server_groups.find(name=name)
137 except NotFound:
138 group = nova.server_groups.create({'name': name,
139 'policies': ['anti-affinity']})
koder aka kdanilov652cd802015-04-13 12:21:07 +0300140
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300141 return group.id
koder aka kdanilov652cd802015-04-13 12:21:07 +0300142
143
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300144def allow_ssh(nova, group_name):
145 try:
146 secgroup = nova.security_groups.find(name=group_name)
147 except NotFound:
148 secgroup = nova.security_groups.create(group_name,
149 "allow ssh/ping to node")
150
koder aka kdanilov652cd802015-04-13 12:21:07 +0300151 nova.security_group_rules.create(secgroup.id,
152 ip_protocol="tcp",
153 from_port="22",
154 to_port="22",
155 cidr="0.0.0.0/0")
156
157 nova.security_group_rules.create(secgroup.id,
158 ip_protocol="icmp",
159 from_port=-1,
160 cidr="0.0.0.0/0",
161 to_port=-1)
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300162 return secgroup.id
koder aka kdanilov652cd802015-04-13 12:21:07 +0300163
164
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300165def create_image(nova, name, url):
166 pass
167
168
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300169def create_flavor(nova, name, ram_size, hdd_size, cpu_count):
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300170 pass
171
172
173def create_keypair(nova, name, pub_key_path, priv_key_path):
174 try:
175 nova.keypairs.find(name=name)
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300176 # if file not found- delete and recreate
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300177 except NotFound:
178 if os.path.exists(pub_key_path):
179 with open(pub_key_path) as pub_key_fd:
180 return nova.keypairs.create(name, pub_key_fd.read())
181 else:
182 key = nova.keypairs.create(name)
183
184 with open(priv_key_path, "w") as priv_key_fd:
185 priv_key_fd.write(key.private_key)
186
187 with open(pub_key_path, "w") as pub_key_fd:
188 pub_key_fd.write(key.public_key)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800189
190
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800191def create_volume(size, name):
koder aka kdanilove87ae652015-04-20 02:14:35 +0300192 cinder = cinder_connect()
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800193 vol = cinder.volumes.create(size=size, display_name=name)
194 err_count = 0
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300195
koder aka kdanilove87ae652015-04-20 02:14:35 +0300196 while vol.status != 'available':
197 if vol.status == 'error':
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800198 if err_count == 3:
koder aka kdanilove21d7472015-02-14 19:02:04 -0800199 logger.critical("Fail to create volume")
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800200 raise RuntimeError("Fail to create volume")
201 else:
202 err_count += 1
203 cinder.volumes.delete(vol)
204 time.sleep(1)
205 vol = cinder.volumes.create(size=size, display_name=name)
206 continue
207 time.sleep(1)
koder aka kdanilove87ae652015-04-20 02:14:35 +0300208 vol = cinder.volumes.get(vol.id)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800209 return vol
210
211
212def wait_for_server_active(nova, server, timeout=240):
213 t = time.time()
214 while True:
koder aka kdanilov3f356262015-02-13 08:06:14 -0800215 time.sleep(1)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800216 sstate = getattr(server, 'OS-EXT-STS:vm_state').lower()
217
218 if sstate == 'active':
219 return True
220
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800221 if sstate == 'error':
222 return False
223
224 if time.time() - t > timeout:
225 return False
226
227 server = nova.servers.get(server)
228
229
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800230class Allocate(object):
231 pass
232
233
234def get_floating_ips(nova, pool, amount):
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800235 ip_list = nova.floating_ips.list()
236
237 if pool is not None:
238 ip_list = [ip for ip in ip_list if ip.pool == pool]
239
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800240 return [ip for ip in ip_list if ip.instance_id is None][:amount]
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800241
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800242
koder aka kdanilovcee43342015-04-14 22:52:53 +0300243def launch_vms(params):
koder aka kdanilovda45e882015-04-06 02:24:42 +0300244 logger.debug("Starting new nodes on openstack")
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300245 count = params['count']
koder aka kdanilovda45e882015-04-06 02:24:42 +0300246
247 if isinstance(count, basestring):
248 assert count.startswith("x")
koder aka kdanilov1c2b5112015-04-10 16:53:51 +0300249 lst = NOVA_CONNECTION.services.list(binary='nova-compute')
koder aka kdanilovda45e882015-04-06 02:24:42 +0300250 srv_count = len([srv for srv in lst if srv.status == 'enabled'])
251 count = srv_count * int(count[1:])
252
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300253 assert isinstance(count, (int, long))
254
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300255 srv_params = "img: {image[name]}, flavor: {flavor[name]}".format(**params)
koder aka kdanilov66839a92015-04-11 13:22:31 +0300256 msg_templ = "Will start {0} servers with next params: {1}"
koder aka kdanilovcee43342015-04-14 22:52:53 +0300257 logger.info(msg_templ.format(count, srv_params))
koder aka kdanilovda45e882015-04-06 02:24:42 +0300258
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300259 vm_params = dict(
260 img_name=params['image']['name'],
261 flavor_name=params['flavor']['name'],
262 group_name=params['group_name'],
263 keypair_name=params['keypair_name'],
264 vol_sz=params.get('vol_sz'),
265 network_zone_name=params.get("network_zone_name"),
266 flt_ip_pool=params.get('flt_ip_pool'),
267 name_templ=params.get('name_templ'),
268 scheduler_hints={"group": params['aa_group_name']},
269 security_group=params['security_group'],
270 sec_group_size=srv_count
271 )
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300272
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300273 # precache all errors before start creating vms
274 private_key_path = params['keypair_file_private']
275 creds = params['image']['creds']
276 creds.format(ip="1.1.1.1", private_key_path="/some_path/xx")
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300277
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300278 for ip, os_node in create_vms_mt(NOVA_CONNECTION, count, **vm_params):
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300279
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300280 conn_uri = creds.format(ip=ip, private_key_path=private_key_path)
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300281 yield Node(conn_uri, []), os_node.id
koder aka kdanilovda45e882015-04-06 02:24:42 +0300282
283
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300284def create_vms_mt(nova, amount, group_name, keypair_name, img_name,
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800285 flavor_name, vol_sz=None, network_zone_name=None,
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300286 flt_ip_pool=None, name_templ='wally-{id}',
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300287 scheduler_hints=None, security_group=None,
288 sec_group_size=None):
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800289
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800290 with ThreadPoolExecutor(max_workers=16) as executor:
koder aka kdanilov97644f92015-02-13 11:11:08 -0800291 if network_zone_name is not None:
292 network_future = executor.submit(nova.networks.find,
293 label=network_zone_name)
294 else:
295 network_future = None
296
297 fl_future = executor.submit(nova.flavors.find, name=flavor_name)
298 img_future = executor.submit(nova.images.find, name=img_name)
299
300 if flt_ip_pool is not None:
301 ips_future = executor.submit(get_floating_ips,
302 nova, flt_ip_pool, amount)
koder aka kdanilove21d7472015-02-14 19:02:04 -0800303 logger.debug("Wait for floating ip")
koder aka kdanilov97644f92015-02-13 11:11:08 -0800304 ips = ips_future.result()
305 ips += [Allocate] * (amount - len(ips))
306 else:
307 ips = [None] * amount
308
koder aka kdanilov7dec9df2015-02-15 21:35:19 -0800309 logger.debug("Getting flavor object")
koder aka kdanilov97644f92015-02-13 11:11:08 -0800310 fl = fl_future.result()
koder aka kdanilov7dec9df2015-02-15 21:35:19 -0800311 logger.debug("Getting image object")
koder aka kdanilov97644f92015-02-13 11:11:08 -0800312 img = img_future.result()
313
314 if network_future is not None:
koder aka kdanilove21d7472015-02-14 19:02:04 -0800315 logger.debug("Waiting for network results")
koder aka kdanilov97644f92015-02-13 11:11:08 -0800316 nics = [{'net-id': network_future.result().id}]
317 else:
318 nics = None
319
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300320 names = []
321 for i in range(amount):
322 names.append(name_templ.format(group=group_name, id=i))
koder aka kdanilov97644f92015-02-13 11:11:08 -0800323
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800324 futures = []
koder aka kdanilov168f6092015-04-19 02:33:38 +0300325 logger.debug("Requesting new vm's")
koder aka kdanilov6e2ae792015-03-04 18:02:24 -0800326
koder aka kdanilovc368eb62015-04-28 18:22:01 +0300327 orig_scheduler_hints = scheduler_hints.copy()
328
329 for idx, (name, flt_ip) in enumerate(zip(names, ips)):
330
331 scheduler_hints = None
332 if orig_scheduler_hints is not None and sec_group_size is not None:
333 if "group" in orig_scheduler_hints:
334 scheduler_hints = orig_scheduler_hints.copy()
335 scheduler_hints['group'] = \
336 scheduler_hints['group'].format(idx // sec_group_size)
337
338 if scheduler_hints is None:
339 scheduler_hints = orig_scheduler_hints.copy()
340
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800341 params = (nova, name, keypair_name, img, fl,
342 nics, vol_sz, flt_ip, scheduler_hints,
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300343 flt_ip_pool, [security_group])
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800344
345 futures.append(executor.submit(create_vm, *params))
koder aka kdanilove21d7472015-02-14 19:02:04 -0800346 res = [future.result() for future in futures]
347 logger.debug("Done spawning")
348 return res
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800349
350
351def create_vm(nova, name, keypair_name, img,
352 fl, nics, vol_sz=None,
353 flt_ip=False,
354 scheduler_hints=None,
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300355 pool=None,
356 security_groups=None):
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800357 for i in range(3):
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800358 srv = nova.servers.create(name,
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300359 flavor=fl,
360 image=img,
361 nics=nics,
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800362 key_name=keypair_name,
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300363 scheduler_hints=scheduler_hints,
364 security_groups=security_groups)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800365
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800366 if not wait_for_server_active(nova, srv):
367 msg = "Server {0} fails to start. Kill it and try again"
koder aka kdanilove21d7472015-02-14 19:02:04 -0800368 logger.debug(msg.format(srv))
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800369 nova.servers.delete(srv)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800370
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300371 for j in range(120):
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800372 all_id = set(alive_srv.id for alive_srv in nova.servers.list())
373 if srv.id not in all_id:
374 break
375 time.sleep(1)
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300376 else:
377 raise RuntimeError("Server {0} delete timeout".format(srv.id))
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800378 else:
379 break
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +0300380 else:
381 raise RuntimeError("Failed to start server".format(srv.id))
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800382
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800383 if vol_sz is not None:
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800384 vol = create_volume(vol_sz, name)
koder aka kdanilove87ae652015-04-20 02:14:35 +0300385 nova.volumes.create_server_volume(srv.id, vol.id, None)
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800386
387 if flt_ip is Allocate:
388 flt_ip = nova.floating_ips.create(pool)
koder aka kdanilovda45e882015-04-06 02:24:42 +0300389
koder aka kdanilov7acd6bd2015-02-12 14:28:30 -0800390 if flt_ip is not None:
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800391 srv.add_floating_ip(flt_ip)
Yulia Portnova0e64ea22015-03-20 17:27:22 +0200392
koder aka kdanilovda45e882015-04-06 02:24:42 +0300393 return flt_ip.ip, nova.servers.get(srv.id)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800394
395
koder aka kdanilov1c2b5112015-04-10 16:53:51 +0300396def clear_nodes(nodes_ids):
397 clear_all(NOVA_CONNECTION, nodes_ids, None)
gstepanov023c1e42015-04-08 15:50:19 +0300398
399
koder aka kdanilove87ae652015-04-20 02:14:35 +0300400def clear_all(nova, ids=None, name_templ=None):
koder aka kdanilov1c2b5112015-04-10 16:53:51 +0300401
402 def need_delete(srv):
403 if name_templ is not None:
404 return re.match(name_templ.format("\\d+"), srv.name) is not None
405 else:
406 return srv.id in ids
407
koder aka kdanilove87ae652015-04-20 02:14:35 +0300408 volumes_to_delete = []
409 cinder = cinder_connect()
410 for vol in cinder.volumes.list():
411 for attachment in vol.attachments:
412 if attachment['server_id'] in ids:
413 volumes_to_delete.append(vol)
414 break
415
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800416 deleted_srvs = set()
417 for srv in nova.servers.list():
koder aka kdanilov1c2b5112015-04-10 16:53:51 +0300418 if need_delete(srv):
koder aka kdanilove21d7472015-02-14 19:02:04 -0800419 logger.debug("Deleting server {0}".format(srv.name))
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800420 nova.servers.delete(srv)
421 deleted_srvs.add(srv.id)
422
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300423 count = 0
424 while True:
425 if count % 60 == 0:
426 logger.debug("Waiting till all servers are actually deleted")
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800427 all_id = set(srv.id for srv in nova.servers.list())
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300428 if len(all_id.intersection(deleted_srvs)) == 0:
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800429 break
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300430 count += 1
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800431 time.sleep(1)
koder aka kdanilov4500a5f2015-04-17 16:55:17 +0300432 logger.debug("Done, deleting volumes")
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800433
434 # wait till vm actually deleted
435
koder aka kdanilov6b1341a2015-04-21 22:44:21 +0300436 # logger.warning("Volume deletion commented out")
437 for vol in volumes_to_delete:
438 logger.debug("Deleting volume " + vol.display_name)
439 cinder.volumes.delete(vol)
koder aka kdanilov4643fd62015-02-10 16:20:13 -0800440
koder aka kdanilove21d7472015-02-14 19:02:04 -0800441 logger.debug("Clearing done (yet some volumes may still deleting)")