blob: dcdf7c525eab04995a4079d675edcf04bf0b5fe5 [file] [log] [blame]
David Patersond6babc52014-10-14 00:11:56 -04001#!/usr/bin/env python
2
David Patersone41ebca2015-04-09 05:40:12 -04003# Copyright 2015 Dell Inc.
David Patersonce781492014-09-18 01:07:01 -04004#
5# Licensed under the Apache License, Version 2.0 (the "License"); you may
6# not use this file except in compliance with the License. You may obtain
7# a copy of the License at
8#
David Patersone41ebca2015-04-09 05:40:12 -04009# http://www.apache.org/licenses/LICENSE-2.0
David Patersonce781492014-09-18 01:07:01 -040010#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14# License for the specific language governing permissions and limitations
15# under the License.
David Patersonce781492014-09-18 01:07:01 -040016
Doug Hellmann583ce2c2015-03-11 14:55:46 +000017from oslo_log import log as logging
18
David Patersond6babc52014-10-14 00:11:56 -040019from tempest import clients
David Patersonce781492014-09-18 01:07:01 -040020from tempest import config
David Patersonce781492014-09-18 01:07:01 -040021from tempest import test
22
23LOG = logging.getLogger(__name__)
24CONF = config.CONF
25
David Patersonce781492014-09-18 01:07:01 -040026CONF_FLAVORS = None
27CONF_IMAGES = None
David Patersond6babc52014-10-14 00:11:56 -040028CONF_NETWORKS = []
29CONF_PRIV_NETWORK_NAME = None
30CONF_PUB_NETWORK = None
31CONF_PUB_ROUTER = None
32CONF_TENANTS = None
33CONF_USERS = None
David Patersonce781492014-09-18 01:07:01 -040034
35IS_CEILOMETER = None
36IS_CINDER = None
37IS_GLANCE = None
38IS_HEAT = None
39IS_NEUTRON = None
40IS_NOVA = None
41
42
43def init_conf():
David Patersonce781492014-09-18 01:07:01 -040044 global CONF_FLAVORS
45 global CONF_IMAGES
David Patersond6babc52014-10-14 00:11:56 -040046 global CONF_NETWORKS
47 global CONF_PRIV_NETWORK
48 global CONF_PRIV_NETWORK_NAME
49 global CONF_PUB_NETWORK
50 global CONF_PUB_ROUTER
51 global CONF_TENANTS
52 global CONF_USERS
David Patersonce781492014-09-18 01:07:01 -040053 global IS_CEILOMETER
54 global IS_CINDER
55 global IS_GLANCE
56 global IS_HEAT
57 global IS_NEUTRON
58 global IS_NOVA
59
David Patersonce781492014-09-18 01:07:01 -040060 IS_CEILOMETER = CONF.service_available.ceilometer
61 IS_CINDER = CONF.service_available.cinder
62 IS_GLANCE = CONF.service_available.glance
63 IS_HEAT = CONF.service_available.heat
64 IS_NEUTRON = CONF.service_available.neutron
65 IS_NOVA = CONF.service_available.nova
66
David Patersond6babc52014-10-14 00:11:56 -040067 CONF_FLAVORS = [CONF.compute.flavor_ref, CONF.compute.flavor_ref_alt]
68 CONF_IMAGES = [CONF.compute.image_ref, CONF.compute.image_ref_alt]
69 CONF_PRIV_NETWORK_NAME = CONF.compute.fixed_network_name
70 CONF_PUB_NETWORK = CONF.network.public_network_id
71 CONF_PUB_ROUTER = CONF.network.public_router_id
72 CONF_TENANTS = [CONF.identity.admin_tenant_name,
73 CONF.identity.tenant_name,
74 CONF.identity.alt_tenant_name]
75 CONF_USERS = [CONF.identity.admin_username, CONF.identity.username,
76 CONF.identity.alt_username]
77
78 if IS_NEUTRON:
79 CONF_PRIV_NETWORK = _get_priv_net_id(CONF.compute.fixed_network_name,
80 CONF.identity.tenant_name)
81 CONF_NETWORKS = [CONF_PUB_NETWORK, CONF_PRIV_NETWORK]
82
83
84def _get_priv_net_id(prv_net_name, tenant_name):
85 am = clients.AdminManager()
86 net_cl = am.network_client
87 id_cl = am.identity_client
88
David Kranz34e88122014-12-11 15:24:05 -050089 networks = net_cl.list_networks()
David Patersond6babc52014-10-14 00:11:56 -040090 tenant = id_cl.get_tenant_by_name(tenant_name)
91 t_id = tenant['id']
92 n_id = None
93 for net in networks['networks']:
94 if (net['tenant_id'] == t_id and net['name'] == prv_net_name):
95 n_id = net['id']
96 break
97 return n_id
98
David Patersonce781492014-09-18 01:07:01 -040099
100class BaseService(object):
101 def __init__(self, kwargs):
102 self.client = None
103 for key, value in kwargs.items():
104 setattr(self, key, value)
105
106 def _filter_by_tenant_id(self, item_list):
107 if (item_list is None
108 or len(item_list) == 0
109 or not hasattr(self, 'tenant_id')
110 or self.tenant_id is None
111 or 'tenant_id' not in item_list[0]):
112 return item_list
113
David Patersond6babc52014-10-14 00:11:56 -0400114 return [item for item in item_list
115 if item['tenant_id'] == self.tenant_id]
David Patersonce781492014-09-18 01:07:01 -0400116
117 def list(self):
118 pass
119
120 def delete(self):
121 pass
122
123 def dry_run(self):
124 pass
125
126 def save_state(self):
127 pass
128
129 def run(self):
130 if self.is_dry_run:
131 self.dry_run()
132 elif self.is_save_state:
133 self.save_state()
134 else:
135 self.delete()
136
137
138class SnapshotService(BaseService):
139
140 def __init__(self, manager, **kwargs):
141 super(SnapshotService, self).__init__(kwargs)
142 self.client = manager.snapshots_client
143
144 def list(self):
145 client = self.client
Joseph Lanoux6809bab2014-12-18 14:57:18 +0000146 snaps = client.list_snapshots()
David Patersonce781492014-09-18 01:07:01 -0400147 LOG.debug("List count, %s Snapshots" % len(snaps))
148 return snaps
149
150 def delete(self):
151 snaps = self.list()
152 client = self.client
153 for snap in snaps:
154 try:
155 client.delete_snapshot(snap['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400156 except Exception:
157 LOG.exception("Delete Snapshot exception.")
David Patersonce781492014-09-18 01:07:01 -0400158
159 def dry_run(self):
160 snaps = self.list()
161 self.data['snapshots'] = snaps
162
163
164class ServerService(BaseService):
165 def __init__(self, manager, **kwargs):
166 super(ServerService, self).__init__(kwargs)
167 self.client = manager.servers_client
168
169 def list(self):
170 client = self.client
David Kranzae99b9a2015-02-16 13:37:01 -0500171 servers_body = client.list_servers()
David Patersonce781492014-09-18 01:07:01 -0400172 servers = servers_body['servers']
173 LOG.debug("List count, %s Servers" % len(servers))
174 return servers
175
176 def delete(self):
177 client = self.client
178 servers = self.list()
179 for server in servers:
180 try:
181 client.delete_server(server['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400182 except Exception:
183 LOG.exception("Delete Server exception.")
David Patersonce781492014-09-18 01:07:01 -0400184
185 def dry_run(self):
186 servers = self.list()
187 self.data['servers'] = servers
188
189
190class ServerGroupService(ServerService):
191
192 def list(self):
193 client = self.client
David Kranzae99b9a2015-02-16 13:37:01 -0500194 sgs = client.list_server_groups()
David Patersonce781492014-09-18 01:07:01 -0400195 LOG.debug("List count, %s Server Groups" % len(sgs))
196 return sgs
197
198 def delete(self):
199 client = self.client
200 sgs = self.list()
201 for sg in sgs:
202 try:
203 client.delete_server_group(sg['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400204 except Exception:
205 LOG.exception("Delete Server Group exception.")
David Patersonce781492014-09-18 01:07:01 -0400206
207 def dry_run(self):
208 sgs = self.list()
209 self.data['server_groups'] = sgs
210
211
212class StackService(BaseService):
213 def __init__(self, manager, **kwargs):
214 super(StackService, self).__init__(kwargs)
215 self.client = manager.orchestration_client
216
217 def list(self):
218 client = self.client
David Kranz8ad924b2015-01-16 16:50:18 -0500219 stacks = client.list_stacks()
David Patersonce781492014-09-18 01:07:01 -0400220 LOG.debug("List count, %s Stacks" % len(stacks))
221 return stacks
222
223 def delete(self):
224 client = self.client
225 stacks = self.list()
226 for stack in stacks:
227 try:
228 client.delete_stack(stack['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400229 except Exception:
230 LOG.exception("Delete Stack exception.")
David Patersonce781492014-09-18 01:07:01 -0400231
232 def dry_run(self):
233 stacks = self.list()
234 self.data['stacks'] = stacks
235
236
237class KeyPairService(BaseService):
238 def __init__(self, manager, **kwargs):
239 super(KeyPairService, self).__init__(kwargs)
240 self.client = manager.keypairs_client
241
242 def list(self):
243 client = self.client
David Kranz173f0e02015-02-06 13:47:57 -0500244 keypairs = client.list_keypairs()
David Patersonce781492014-09-18 01:07:01 -0400245 LOG.debug("List count, %s Keypairs" % len(keypairs))
246 return keypairs
247
248 def delete(self):
249 client = self.client
250 keypairs = self.list()
251 for k in keypairs:
252 try:
253 name = k['keypair']['name']
254 client.delete_keypair(name)
David Patersone41ebca2015-04-09 05:40:12 -0400255 except Exception:
256 LOG.exception("Delete Keypairs exception.")
David Patersonce781492014-09-18 01:07:01 -0400257
258 def dry_run(self):
259 keypairs = self.list()
260 self.data['keypairs'] = keypairs
261
262
263class SecurityGroupService(BaseService):
264 def __init__(self, manager, **kwargs):
265 super(SecurityGroupService, self).__init__(kwargs)
266 self.client = manager.security_groups_client
267
268 def list(self):
269 client = self.client
David Kranz9964b4e2015-02-06 15:45:29 -0500270 secgrps = client.list_security_groups()
David Patersonce781492014-09-18 01:07:01 -0400271 secgrp_del = [grp for grp in secgrps if grp['name'] != 'default']
272 LOG.debug("List count, %s Security Groups" % len(secgrp_del))
273 return secgrp_del
274
275 def delete(self):
276 client = self.client
277 secgrp_del = self.list()
278 for g in secgrp_del:
279 try:
280 client.delete_security_group(g['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400281 except Exception:
282 LOG.exception("Delete Security Groups exception.")
David Patersonce781492014-09-18 01:07:01 -0400283
284 def dry_run(self):
285 secgrp_del = self.list()
286 self.data['security_groups'] = secgrp_del
287
288
289class FloatingIpService(BaseService):
290 def __init__(self, manager, **kwargs):
291 super(FloatingIpService, self).__init__(kwargs)
292 self.client = manager.floating_ips_client
293
294 def list(self):
295 client = self.client
David Kranze4e3b412015-02-10 10:50:42 -0500296 floating_ips = client.list_floating_ips()
David Patersonce781492014-09-18 01:07:01 -0400297 LOG.debug("List count, %s Floating IPs" % len(floating_ips))
298 return floating_ips
299
300 def delete(self):
301 client = self.client
302 floating_ips = self.list()
303 for f in floating_ips:
304 try:
305 client.delete_floating_ip(f['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400306 except Exception:
307 LOG.exception("Delete Floating IPs exception.")
David Patersonce781492014-09-18 01:07:01 -0400308
309 def dry_run(self):
310 floating_ips = self.list()
311 self.data['floating_ips'] = floating_ips
312
313
314class VolumeService(BaseService):
315 def __init__(self, manager, **kwargs):
316 super(VolumeService, self).__init__(kwargs)
317 self.client = manager.volumes_client
318
319 def list(self):
320 client = self.client
Joseph Lanoux6809bab2014-12-18 14:57:18 +0000321 vols = client.list_volumes()
David Patersonce781492014-09-18 01:07:01 -0400322 LOG.debug("List count, %s Volumes" % len(vols))
323 return vols
324
325 def delete(self):
326 client = self.client
327 vols = self.list()
328 for v in vols:
329 try:
330 client.delete_volume(v['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400331 except Exception:
332 LOG.exception("Delete Volume exception.")
David Patersonce781492014-09-18 01:07:01 -0400333
334 def dry_run(self):
335 vols = self.list()
336 self.data['volumes'] = vols
337
338
David Paterson35c8df02015-04-05 04:35:31 -0400339class VolumeQuotaService(BaseService):
340 def __init__(self, manager, **kwargs):
341 super(VolumeQuotaService, self).__init__(kwargs)
342 self.client = manager.volume_quotas_client
343
344 def delete(self):
345 client = self.client
346 try:
347 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400348 except Exception:
349 LOG.exception("Delete Volume Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400350
351 def dry_run(self):
352 quotas = self.client.show_quota_usage(self.tenant_id)
353 self.data['volume_quotas'] = quotas
354
355
356class NovaQuotaService(BaseService):
357 def __init__(self, manager, **kwargs):
358 super(NovaQuotaService, self).__init__(kwargs)
359 self.client = manager.quotas_client
360 self.limits_client = manager.limits_client
361
362 def delete(self):
363 client = self.client
364 try:
365 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400366 except Exception:
367 LOG.exception("Delete Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400368
369 def dry_run(self):
370 client = self.limits_client
Ken'ichi Ohmichi354338d2015-06-11 05:28:42 +0000371 quotas = client.show_limits()
Ken'ichi Ohmichib93e6762015-06-15 07:11:29 +0000372 self.data['compute_quotas'] = quotas['absolute']
David Paterson35c8df02015-04-05 04:35:31 -0400373
374
David Patersonce781492014-09-18 01:07:01 -0400375# Begin network service classes
376class NetworkService(BaseService):
377 def __init__(self, manager, **kwargs):
378 super(NetworkService, self).__init__(kwargs)
379 self.client = manager.network_client
380
David Patersond6babc52014-10-14 00:11:56 -0400381 def _filter_by_conf_networks(self, item_list):
382 if not item_list or not all(('network_id' in i for i in item_list)):
383 return item_list
384
385 return [item for item in item_list if item['network_id']
386 not in CONF_NETWORKS]
387
David Patersonce781492014-09-18 01:07:01 -0400388 def list(self):
389 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500390 networks = client.list_networks()
David Patersonce781492014-09-18 01:07:01 -0400391 networks = self._filter_by_tenant_id(networks['networks'])
392 # filter out networks declared in tempest.conf
393 if self.is_preserve:
394 networks = [network for network in networks
David Patersond6babc52014-10-14 00:11:56 -0400395 if network['id'] not in CONF_NETWORKS]
David Patersonce781492014-09-18 01:07:01 -0400396 LOG.debug("List count, %s Networks" % networks)
397 return networks
398
399 def delete(self):
400 client = self.client
401 networks = self.list()
402 for n in networks:
403 try:
404 client.delete_network(n['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400405 except Exception:
406 LOG.exception("Delete Network exception.")
David Patersonce781492014-09-18 01:07:01 -0400407
408 def dry_run(self):
409 networks = self.list()
410 self.data['networks'] = networks
411
412
David Patersonce781492014-09-18 01:07:01 -0400413class NetworkFloatingIpService(NetworkService):
414
415 def list(self):
416 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500417 flips = client.list_floatingips()
David Patersonce781492014-09-18 01:07:01 -0400418 flips = flips['floatingips']
419 flips = self._filter_by_tenant_id(flips)
420 LOG.debug("List count, %s Network Floating IPs" % len(flips))
421 return flips
422
423 def delete(self):
424 client = self.client
425 flips = self.list()
426 for flip in flips:
427 try:
428 client.delete_floatingip(flip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400429 except Exception:
430 LOG.exception("Delete Network Floating IP exception.")
David Patersonce781492014-09-18 01:07:01 -0400431
432 def dry_run(self):
433 flips = self.list()
434 self.data['floating_ips'] = flips
435
436
437class NetworkRouterService(NetworkService):
438
439 def list(self):
440 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500441 routers = client.list_routers()
David Patersonce781492014-09-18 01:07:01 -0400442 routers = routers['routers']
443 routers = self._filter_by_tenant_id(routers)
444 if self.is_preserve:
445 routers = [router for router in routers
446 if router['id'] != CONF_PUB_ROUTER]
447
448 LOG.debug("List count, %s Routers" % len(routers))
449 return routers
450
451 def delete(self):
452 client = self.client
453 routers = self.list()
454 for router in routers:
455 try:
456 rid = router['id']
David Kranz34e88122014-12-11 15:24:05 -0500457 ports = client.list_router_interfaces(rid)
David Patersonce781492014-09-18 01:07:01 -0400458 ports = ports['ports']
459 for port in ports:
460 subid = port['fixed_ips'][0]['subnet_id']
461 client.remove_router_interface_with_subnet_id(rid, subid)
David Patersond6babc52014-10-14 00:11:56 -0400462 client.delete_router(rid)
David Patersone41ebca2015-04-09 05:40:12 -0400463 except Exception:
464 LOG.exception("Delete Router exception.")
David Patersonce781492014-09-18 01:07:01 -0400465
466 def dry_run(self):
467 routers = self.list()
468 self.data['routers'] = routers
469
470
471class NetworkHealthMonitorService(NetworkService):
472
473 def list(self):
474 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500475 hms = client.list_health_monitors()
David Patersonce781492014-09-18 01:07:01 -0400476 hms = hms['health_monitors']
477 hms = self._filter_by_tenant_id(hms)
478 LOG.debug("List count, %s Health Monitors" % len(hms))
479 return hms
480
481 def delete(self):
482 client = self.client
483 hms = self.list()
484 for hm in hms:
485 try:
486 client.delete_health_monitor(hm['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400487 except Exception:
488 LOG.exception("Delete Health Monitor exception.")
David Patersonce781492014-09-18 01:07:01 -0400489
490 def dry_run(self):
491 hms = self.list()
492 self.data['health_monitors'] = hms
493
494
495class NetworkMemberService(NetworkService):
496
497 def list(self):
498 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500499 members = client.list_members()
David Patersonce781492014-09-18 01:07:01 -0400500 members = members['members']
501 members = self._filter_by_tenant_id(members)
502 LOG.debug("List count, %s Members" % len(members))
503 return members
504
505 def delete(self):
506 client = self.client
507 members = self.list()
508 for member in members:
509 try:
510 client.delete_member(member['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400511 except Exception:
512 LOG.exception("Delete Member exception.")
David Patersonce781492014-09-18 01:07:01 -0400513
514 def dry_run(self):
515 members = self.list()
516 self.data['members'] = members
517
518
519class NetworkVipService(NetworkService):
520
521 def list(self):
522 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500523 vips = client.list_vips()
David Patersonce781492014-09-18 01:07:01 -0400524 vips = vips['vips']
525 vips = self._filter_by_tenant_id(vips)
526 LOG.debug("List count, %s VIPs" % len(vips))
527 return vips
528
529 def delete(self):
530 client = self.client
531 vips = self.list()
532 for vip in vips:
533 try:
534 client.delete_vip(vip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400535 except Exception:
536 LOG.exception("Delete VIP exception.")
David Patersonce781492014-09-18 01:07:01 -0400537
538 def dry_run(self):
539 vips = self.list()
540 self.data['vips'] = vips
541
542
543class NetworkPoolService(NetworkService):
544
545 def list(self):
546 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500547 pools = client.list_pools()
David Patersonce781492014-09-18 01:07:01 -0400548 pools = pools['pools']
549 pools = self._filter_by_tenant_id(pools)
550 LOG.debug("List count, %s Pools" % len(pools))
551 return pools
552
553 def delete(self):
554 client = self.client
555 pools = self.list()
556 for pool in pools:
557 try:
558 client.delete_pool(pool['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400559 except Exception:
560 LOG.exception("Delete Pool exception.")
David Patersonce781492014-09-18 01:07:01 -0400561
562 def dry_run(self):
563 pools = self.list()
564 self.data['pools'] = pools
565
566
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300567class NetworkMeteringLabelRuleService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400568
569 def list(self):
570 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500571 rules = client.list_metering_label_rules()
David Patersonce781492014-09-18 01:07:01 -0400572 rules = rules['metering_label_rules']
573 rules = self._filter_by_tenant_id(rules)
574 LOG.debug("List count, %s Metering Label Rules" % len(rules))
575 return rules
576
577 def delete(self):
578 client = self.client
579 rules = self.list()
580 for rule in rules:
581 try:
582 client.delete_metering_label_rule(rule['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400583 except Exception:
584 LOG.exception("Delete Metering Label Rule exception.")
David Patersonce781492014-09-18 01:07:01 -0400585
586 def dry_run(self):
587 rules = self.list()
588 self.data['rules'] = rules
589
590
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300591class NetworkMeteringLabelService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400592
593 def list(self):
594 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500595 labels = client.list_metering_labels()
David Patersonce781492014-09-18 01:07:01 -0400596 labels = labels['metering_labels']
597 labels = self._filter_by_tenant_id(labels)
598 LOG.debug("List count, %s Metering Labels" % len(labels))
599 return labels
600
601 def delete(self):
602 client = self.client
603 labels = self.list()
604 for label in labels:
605 try:
606 client.delete_metering_label(label['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400607 except Exception:
608 LOG.exception("Delete Metering Label exception.")
David Patersonce781492014-09-18 01:07:01 -0400609
610 def dry_run(self):
611 labels = self.list()
612 self.data['labels'] = labels
613
614
615class NetworkPortService(NetworkService):
616
617 def list(self):
618 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500619 ports = client.list_ports()
David Patersonce781492014-09-18 01:07:01 -0400620 ports = ports['ports']
621 ports = self._filter_by_tenant_id(ports)
David Patersond6babc52014-10-14 00:11:56 -0400622 if self.is_preserve:
623 ports = self._filter_by_conf_networks(ports)
David Patersonce781492014-09-18 01:07:01 -0400624 LOG.debug("List count, %s Ports" % len(ports))
625 return ports
626
627 def delete(self):
628 client = self.client
629 ports = self.list()
630 for port in ports:
631 try:
632 client.delete_port(port['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400633 except Exception:
634 LOG.exception("Delete Port exception.")
David Patersonce781492014-09-18 01:07:01 -0400635
636 def dry_run(self):
637 ports = self.list()
638 self.data['ports'] = ports
639
640
641class NetworkSubnetService(NetworkService):
642
643 def list(self):
644 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500645 subnets = client.list_subnets()
David Patersonce781492014-09-18 01:07:01 -0400646 subnets = subnets['subnets']
647 subnets = self._filter_by_tenant_id(subnets)
David Patersond6babc52014-10-14 00:11:56 -0400648 if self.is_preserve:
649 subnets = self._filter_by_conf_networks(subnets)
David Patersonce781492014-09-18 01:07:01 -0400650 LOG.debug("List count, %s Subnets" % len(subnets))
651 return subnets
652
653 def delete(self):
654 client = self.client
655 subnets = self.list()
656 for subnet in subnets:
657 try:
658 client.delete_subnet(subnet['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400659 except Exception:
660 LOG.exception("Delete Subnet exception.")
David Patersonce781492014-09-18 01:07:01 -0400661
662 def dry_run(self):
663 subnets = self.list()
664 self.data['subnets'] = subnets
665
666
667# Telemetry services
668class TelemetryAlarmService(BaseService):
669 def __init__(self, manager, **kwargs):
670 super(TelemetryAlarmService, self).__init__(kwargs)
671 self.client = manager.telemetry_client
672
673 def list(self):
674 client = self.client
David Kranz20d06f42015-02-09 14:54:15 -0500675 alarms = client.list_alarms()
David Patersonce781492014-09-18 01:07:01 -0400676 LOG.debug("List count, %s Alarms" % len(alarms))
677 return alarms
678
679 def delete(self):
680 client = self.client
681 alarms = self.list()
682 for alarm in alarms:
683 try:
684 client.delete_alarm(alarm['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400685 except Exception:
686 LOG.exception("Delete Alarms exception.")
David Patersonce781492014-09-18 01:07:01 -0400687
688 def dry_run(self):
689 alarms = self.list()
690 self.data['alarms'] = alarms
691
692
693# begin global services
694class FlavorService(BaseService):
695 def __init__(self, manager, **kwargs):
696 super(FlavorService, self).__init__(kwargs)
697 self.client = manager.flavors_client
698
699 def list(self):
700 client = self.client
David Kranz2fa77b22015-02-09 11:39:50 -0500701 flavors = client.list_flavors({"is_public": None})
David Patersonce781492014-09-18 01:07:01 -0400702 if not self.is_save_state:
703 # recreate list removing saved flavors
704 flavors = [flavor for flavor in flavors if flavor['id']
705 not in self.saved_state_json['flavors'].keys()]
706
707 if self.is_preserve:
708 flavors = [flavor for flavor in flavors
709 if flavor['id'] not in CONF_FLAVORS]
710 LOG.debug("List count, %s Flavors after reconcile" % len(flavors))
711 return flavors
712
713 def delete(self):
714 client = self.client
715 flavors = self.list()
716 for flavor in flavors:
717 try:
718 client.delete_flavor(flavor['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400719 except Exception:
720 LOG.exception("Delete Flavor exception.")
David Patersonce781492014-09-18 01:07:01 -0400721
722 def dry_run(self):
723 flavors = self.list()
724 self.data['flavors'] = flavors
725
726 def save_state(self):
727 flavors = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500728 self.data['flavors'] = {}
David Patersonce781492014-09-18 01:07:01 -0400729 for flavor in flavors:
gordon chungc15f1bc2015-02-23 18:00:41 -0500730 self.data['flavors'][flavor['id']] = flavor['name']
David Patersonce781492014-09-18 01:07:01 -0400731
732
733class ImageService(BaseService):
734 def __init__(self, manager, **kwargs):
735 super(ImageService, self).__init__(kwargs)
736 self.client = manager.images_client
737
738 def list(self):
739 client = self.client
David Kranz34f18782015-01-06 13:43:55 -0500740 images = client.list_images({"all_tenants": True})
David Patersonce781492014-09-18 01:07:01 -0400741 if not self.is_save_state:
742 images = [image for image in images if image['id']
743 not in self.saved_state_json['images'].keys()]
744 if self.is_preserve:
745 images = [image for image in images
746 if image['id'] not in CONF_IMAGES]
747 LOG.debug("List count, %s Images after reconcile" % len(images))
748 return images
749
750 def delete(self):
751 client = self.client
752 images = self.list()
753 for image in images:
754 try:
755 client.delete_image(image['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400756 except Exception:
757 LOG.exception("Delete Image exception.")
David Patersonce781492014-09-18 01:07:01 -0400758
759 def dry_run(self):
760 images = self.list()
761 self.data['images'] = images
762
763 def save_state(self):
764 images = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500765 self.data['images'] = {}
David Patersonce781492014-09-18 01:07:01 -0400766 for image in images:
gordon chungc15f1bc2015-02-23 18:00:41 -0500767 self.data['images'][image['id']] = image['name']
David Patersonce781492014-09-18 01:07:01 -0400768
769
770class IdentityService(BaseService):
771 def __init__(self, manager, **kwargs):
772 super(IdentityService, self).__init__(kwargs)
773 self.client = manager.identity_client
774
775
776class UserService(IdentityService):
777
778 def list(self):
779 client = self.client
David Kranzb7afa922014-12-30 10:56:26 -0500780 users = client.get_users()
David Patersonce781492014-09-18 01:07:01 -0400781
782 if not self.is_save_state:
783 users = [user for user in users if user['id']
784 not in self.saved_state_json['users'].keys()]
785
786 if self.is_preserve:
787 users = [user for user in users if user['name']
788 not in CONF_USERS]
789
790 elif not self.is_save_state: # Never delete admin user
791 users = [user for user in users if user['name'] !=
792 CONF.identity.admin_username]
793
794 LOG.debug("List count, %s Users after reconcile" % len(users))
795 return users
796
797 def delete(self):
798 client = self.client
799 users = self.list()
800 for user in users:
801 try:
802 client.delete_user(user['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400803 except Exception:
804 LOG.exception("Delete User exception.")
David Patersonce781492014-09-18 01:07:01 -0400805
806 def dry_run(self):
807 users = self.list()
808 self.data['users'] = users
809
810 def save_state(self):
811 users = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500812 self.data['users'] = {}
David Patersonce781492014-09-18 01:07:01 -0400813 for user in users:
gordon chungc15f1bc2015-02-23 18:00:41 -0500814 self.data['users'][user['id']] = user['name']
David Patersonce781492014-09-18 01:07:01 -0400815
816
817class RoleService(IdentityService):
818
819 def list(self):
820 client = self.client
821 try:
David Kranzb7afa922014-12-30 10:56:26 -0500822 roles = client.list_roles()
David Patersonce781492014-09-18 01:07:01 -0400823 # reconcile roles with saved state and never list admin role
824 if not self.is_save_state:
825 roles = [role for role in roles if
826 (role['id'] not in
827 self.saved_state_json['roles'].keys()
828 and role['name'] != CONF.identity.admin_role)]
829 LOG.debug("List count, %s Roles after reconcile" % len(roles))
830 return roles
David Patersone41ebca2015-04-09 05:40:12 -0400831 except Exception:
832 LOG.exception("Cannot retrieve Roles.")
David Patersonce781492014-09-18 01:07:01 -0400833 return []
834
835 def delete(self):
836 client = self.client
837 roles = self.list()
838 for role in roles:
839 try:
840 client.delete_role(role['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400841 except Exception:
842 LOG.exception("Delete Role exception.")
David Patersonce781492014-09-18 01:07:01 -0400843
844 def dry_run(self):
845 roles = self.list()
846 self.data['roles'] = roles
847
848 def save_state(self):
849 roles = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500850 self.data['roles'] = {}
David Patersonce781492014-09-18 01:07:01 -0400851 for role in roles:
gordon chungc15f1bc2015-02-23 18:00:41 -0500852 self.data['roles'][role['id']] = role['name']
David Patersonce781492014-09-18 01:07:01 -0400853
854
855class TenantService(IdentityService):
856
857 def list(self):
858 client = self.client
David Kranzb7afa922014-12-30 10:56:26 -0500859 tenants = client.list_tenants()
David Patersonce781492014-09-18 01:07:01 -0400860 if not self.is_save_state:
861 tenants = [tenant for tenant in tenants if (tenant['id']
862 not in self.saved_state_json['tenants'].keys()
863 and tenant['name'] != CONF.identity.admin_tenant_name)]
864
865 if self.is_preserve:
866 tenants = [tenant for tenant in tenants if tenant['name']
867 not in CONF_TENANTS]
868
869 LOG.debug("List count, %s Tenants after reconcile" % len(tenants))
870 return tenants
871
872 def delete(self):
873 client = self.client
874 tenants = self.list()
875 for tenant in tenants:
876 try:
877 client.delete_tenant(tenant['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400878 except Exception:
879 LOG.exception("Delete Tenant exception.")
David Patersonce781492014-09-18 01:07:01 -0400880
881 def dry_run(self):
882 tenants = self.list()
883 self.data['tenants'] = tenants
884
885 def save_state(self):
886 tenants = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500887 self.data['tenants'] = {}
David Patersonce781492014-09-18 01:07:01 -0400888 for tenant in tenants:
gordon chungc15f1bc2015-02-23 18:00:41 -0500889 self.data['tenants'][tenant['id']] = tenant['name']
David Patersonce781492014-09-18 01:07:01 -0400890
891
892class DomainService(BaseService):
893
894 def __init__(self, manager, **kwargs):
895 super(DomainService, self).__init__(kwargs)
896 self.client = manager.identity_v3_client
897
898 def list(self):
899 client = self.client
David Kranzb7afa922014-12-30 10:56:26 -0500900 domains = client.list_domains()
David Patersonce781492014-09-18 01:07:01 -0400901 if not self.is_save_state:
902 domains = [domain for domain in domains if domain['id']
903 not in self.saved_state_json['domains'].keys()]
904
905 LOG.debug("List count, %s Domains after reconcile" % len(domains))
906 return domains
907
908 def delete(self):
909 client = self.client
910 domains = self.list()
911 for domain in domains:
912 try:
913 client.update_domain(domain['id'], enabled=False)
914 client.delete_domain(domain['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400915 except Exception:
916 LOG.exception("Delete Domain exception.")
David Patersonce781492014-09-18 01:07:01 -0400917
918 def dry_run(self):
919 domains = self.list()
920 self.data['domains'] = domains
921
922 def save_state(self):
923 domains = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500924 self.data['domains'] = {}
David Patersonce781492014-09-18 01:07:01 -0400925 for domain in domains:
gordon chungc15f1bc2015-02-23 18:00:41 -0500926 self.data['domains'][domain['id']] = domain['name']
David Patersonce781492014-09-18 01:07:01 -0400927
928
929def get_tenant_cleanup_services():
930 tenant_services = []
931
932 if IS_CEILOMETER:
933 tenant_services.append(TelemetryAlarmService)
934 if IS_NOVA:
935 tenant_services.append(ServerService)
936 tenant_services.append(KeyPairService)
937 tenant_services.append(SecurityGroupService)
938 tenant_services.append(ServerGroupService)
939 if not IS_NEUTRON:
940 tenant_services.append(FloatingIpService)
David Paterson35c8df02015-04-05 04:35:31 -0400941 tenant_services.append(NovaQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400942 if IS_HEAT:
943 tenant_services.append(StackService)
944 if IS_NEUTRON:
David Patersonce781492014-09-18 01:07:01 -0400945 if test.is_extension_enabled('metering', 'network'):
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300946 tenant_services.append(NetworkMeteringLabelRuleService)
947 tenant_services.append(NetworkMeteringLabelService)
David Patersonce781492014-09-18 01:07:01 -0400948 tenant_services.append(NetworkRouterService)
949 tenant_services.append(NetworkFloatingIpService)
950 tenant_services.append(NetworkPortService)
951 tenant_services.append(NetworkSubnetService)
952 tenant_services.append(NetworkService)
953 if IS_CINDER:
954 tenant_services.append(SnapshotService)
955 tenant_services.append(VolumeService)
David Paterson35c8df02015-04-05 04:35:31 -0400956 tenant_services.append(VolumeQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400957 return tenant_services
958
959
960def get_global_cleanup_services():
961 global_services = []
962 if IS_NOVA:
963 global_services.append(FlavorService)
964 if IS_GLANCE:
965 global_services.append(ImageService)
966 global_services.append(UserService)
967 global_services.append(TenantService)
968 global_services.append(DomainService)
969 global_services.append(RoleService)
970 return global_services