blob: 64e1303f74c0f540d3a12de82fbb20fbdc233f4d [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:
David Paterson82234022015-04-12 14:07:40 -040079 CONF_PRIV_NETWORK = _get_network_id(CONF.compute.fixed_network_name,
80 CONF.identity.tenant_name)
David Patersond6babc52014-10-14 00:11:56 -040081 CONF_NETWORKS = [CONF_PUB_NETWORK, CONF_PRIV_NETWORK]
82
83
David Paterson82234022015-04-12 14:07:40 -040084def _get_network_id(net_name, tenant_name):
David Patersond6babc52014-10-14 00:11:56 -040085 am = clients.AdminManager()
John Warren94d8faf2015-09-15 12:22:24 -040086 net_cl = am.networks_client
David Patersond6babc52014-10-14 00:11:56 -040087 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']:
David Paterson82234022015-04-12 14:07:40 -040094 if (net['tenant_id'] == t_id and net['name'] == net_name):
David Patersond6babc52014-10-14 00:11:56 -040095 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
David Paterson82234022015-04-12 14:07:40 -0400106 self.tenant_filter = {}
107 if hasattr(self, 'tenant_id'):
108 self.tenant_filter['tenant_id'] = self.tenant_id
109
David Patersonce781492014-09-18 01:07:01 -0400110 def _filter_by_tenant_id(self, item_list):
111 if (item_list is None
112 or len(item_list) == 0
113 or not hasattr(self, 'tenant_id')
114 or self.tenant_id is None
115 or 'tenant_id' not in item_list[0]):
116 return item_list
117
David Patersond6babc52014-10-14 00:11:56 -0400118 return [item for item in item_list
119 if item['tenant_id'] == self.tenant_id]
David Patersonce781492014-09-18 01:07:01 -0400120
121 def list(self):
122 pass
123
124 def delete(self):
125 pass
126
127 def dry_run(self):
128 pass
129
130 def save_state(self):
131 pass
132
133 def run(self):
134 if self.is_dry_run:
135 self.dry_run()
136 elif self.is_save_state:
137 self.save_state()
138 else:
139 self.delete()
140
141
142class SnapshotService(BaseService):
143
144 def __init__(self, manager, **kwargs):
145 super(SnapshotService, self).__init__(kwargs)
146 self.client = manager.snapshots_client
147
148 def list(self):
149 client = self.client
Joseph Lanoux6809bab2014-12-18 14:57:18 +0000150 snaps = client.list_snapshots()
David Patersonce781492014-09-18 01:07:01 -0400151 LOG.debug("List count, %s Snapshots" % len(snaps))
152 return snaps
153
154 def delete(self):
155 snaps = self.list()
156 client = self.client
157 for snap in snaps:
158 try:
159 client.delete_snapshot(snap['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400160 except Exception:
161 LOG.exception("Delete Snapshot exception.")
David Patersonce781492014-09-18 01:07:01 -0400162
163 def dry_run(self):
164 snaps = self.list()
165 self.data['snapshots'] = snaps
166
167
168class ServerService(BaseService):
169 def __init__(self, manager, **kwargs):
170 super(ServerService, self).__init__(kwargs)
171 self.client = manager.servers_client
172
173 def list(self):
174 client = self.client
David Kranzae99b9a2015-02-16 13:37:01 -0500175 servers_body = client.list_servers()
David Patersonce781492014-09-18 01:07:01 -0400176 servers = servers_body['servers']
177 LOG.debug("List count, %s Servers" % len(servers))
178 return servers
179
180 def delete(self):
181 client = self.client
182 servers = self.list()
183 for server in servers:
184 try:
185 client.delete_server(server['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400186 except Exception:
187 LOG.exception("Delete Server exception.")
David Patersonce781492014-09-18 01:07:01 -0400188
189 def dry_run(self):
190 servers = self.list()
191 self.data['servers'] = servers
192
193
194class ServerGroupService(ServerService):
195
196 def list(self):
197 client = self.client
ghanshyam2dc13452015-08-24 17:39:25 +0900198 sgs = client.list_server_groups()['server_groups']
David Patersonce781492014-09-18 01:07:01 -0400199 LOG.debug("List count, %s Server Groups" % len(sgs))
200 return sgs
201
202 def delete(self):
203 client = self.client
204 sgs = self.list()
205 for sg in sgs:
206 try:
207 client.delete_server_group(sg['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400208 except Exception:
209 LOG.exception("Delete Server Group exception.")
David Patersonce781492014-09-18 01:07:01 -0400210
211 def dry_run(self):
212 sgs = self.list()
213 self.data['server_groups'] = sgs
214
215
216class StackService(BaseService):
217 def __init__(self, manager, **kwargs):
218 super(StackService, self).__init__(kwargs)
219 self.client = manager.orchestration_client
220
221 def list(self):
222 client = self.client
Anusha Ramineniab6c3a32015-08-18 08:33:09 +0530223 stacks = client.list_stacks()['stacks']
David Patersonce781492014-09-18 01:07:01 -0400224 LOG.debug("List count, %s Stacks" % len(stacks))
225 return stacks
226
227 def delete(self):
228 client = self.client
229 stacks = self.list()
230 for stack in stacks:
231 try:
232 client.delete_stack(stack['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400233 except Exception:
234 LOG.exception("Delete Stack exception.")
David Patersonce781492014-09-18 01:07:01 -0400235
236 def dry_run(self):
237 stacks = self.list()
238 self.data['stacks'] = stacks
239
240
241class KeyPairService(BaseService):
242 def __init__(self, manager, **kwargs):
243 super(KeyPairService, self).__init__(kwargs)
244 self.client = manager.keypairs_client
245
246 def list(self):
247 client = self.client
ghanshyamdee01f22015-08-17 11:41:47 +0900248 keypairs = client.list_keypairs()['keypairs']
David Patersonce781492014-09-18 01:07:01 -0400249 LOG.debug("List count, %s Keypairs" % len(keypairs))
250 return keypairs
251
252 def delete(self):
253 client = self.client
254 keypairs = self.list()
255 for k in keypairs:
256 try:
257 name = k['keypair']['name']
258 client.delete_keypair(name)
David Patersone41ebca2015-04-09 05:40:12 -0400259 except Exception:
260 LOG.exception("Delete Keypairs exception.")
David Patersonce781492014-09-18 01:07:01 -0400261
262 def dry_run(self):
263 keypairs = self.list()
264 self.data['keypairs'] = keypairs
265
266
267class SecurityGroupService(BaseService):
268 def __init__(self, manager, **kwargs):
269 super(SecurityGroupService, self).__init__(kwargs)
270 self.client = manager.security_groups_client
271
272 def list(self):
273 client = self.client
ghanshyamb610b772015-08-24 17:29:38 +0900274 secgrps = client.list_security_groups()['security_groups']
David Patersonce781492014-09-18 01:07:01 -0400275 secgrp_del = [grp for grp in secgrps if grp['name'] != 'default']
276 LOG.debug("List count, %s Security Groups" % len(secgrp_del))
277 return secgrp_del
278
279 def delete(self):
280 client = self.client
281 secgrp_del = self.list()
282 for g in secgrp_del:
283 try:
284 client.delete_security_group(g['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400285 except Exception:
286 LOG.exception("Delete Security Groups exception.")
David Patersonce781492014-09-18 01:07:01 -0400287
288 def dry_run(self):
289 secgrp_del = self.list()
290 self.data['security_groups'] = secgrp_del
291
292
293class FloatingIpService(BaseService):
294 def __init__(self, manager, **kwargs):
295 super(FloatingIpService, self).__init__(kwargs)
296 self.client = manager.floating_ips_client
297
298 def list(self):
299 client = self.client
ghanshyam9a3a9a22015-08-18 17:03:55 +0900300 floating_ips = client.list_floating_ips()['floating_ips']
David Patersonce781492014-09-18 01:07:01 -0400301 LOG.debug("List count, %s Floating IPs" % len(floating_ips))
302 return floating_ips
303
304 def delete(self):
305 client = self.client
306 floating_ips = self.list()
307 for f in floating_ips:
308 try:
309 client.delete_floating_ip(f['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400310 except Exception:
311 LOG.exception("Delete Floating IPs exception.")
David Patersonce781492014-09-18 01:07:01 -0400312
313 def dry_run(self):
314 floating_ips = self.list()
315 self.data['floating_ips'] = floating_ips
316
317
318class VolumeService(BaseService):
319 def __init__(self, manager, **kwargs):
320 super(VolumeService, self).__init__(kwargs)
321 self.client = manager.volumes_client
322
323 def list(self):
324 client = self.client
John Warren6177c9e2015-08-19 20:00:17 +0000325 vols = client.list_volumes()['volumes']
David Patersonce781492014-09-18 01:07:01 -0400326 LOG.debug("List count, %s Volumes" % len(vols))
327 return vols
328
329 def delete(self):
330 client = self.client
331 vols = self.list()
332 for v in vols:
333 try:
334 client.delete_volume(v['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400335 except Exception:
336 LOG.exception("Delete Volume exception.")
David Patersonce781492014-09-18 01:07:01 -0400337
338 def dry_run(self):
339 vols = self.list()
340 self.data['volumes'] = vols
341
342
David Paterson35c8df02015-04-05 04:35:31 -0400343class VolumeQuotaService(BaseService):
344 def __init__(self, manager, **kwargs):
345 super(VolumeQuotaService, self).__init__(kwargs)
346 self.client = manager.volume_quotas_client
347
348 def delete(self):
349 client = self.client
350 try:
351 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400352 except Exception:
353 LOG.exception("Delete Volume Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400354
355 def dry_run(self):
ghanshyam08a73f92015-08-31 17:32:49 +0900356 quotas = self.client.show_quota_usage(self.tenant_id)['quota_set']
David Paterson35c8df02015-04-05 04:35:31 -0400357 self.data['volume_quotas'] = quotas
358
359
360class NovaQuotaService(BaseService):
361 def __init__(self, manager, **kwargs):
362 super(NovaQuotaService, self).__init__(kwargs)
363 self.client = manager.quotas_client
364 self.limits_client = manager.limits_client
365
366 def delete(self):
367 client = self.client
368 try:
369 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400370 except Exception:
371 LOG.exception("Delete Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400372
373 def dry_run(self):
374 client = self.limits_client
ghanshyam8a599492015-08-24 15:55:59 +0900375 quotas = client.show_limits()['limits']
Ken'ichi Ohmichib93e6762015-06-15 07:11:29 +0000376 self.data['compute_quotas'] = quotas['absolute']
David Paterson35c8df02015-04-05 04:35:31 -0400377
378
David Patersonce781492014-09-18 01:07:01 -0400379# Begin network service classes
380class NetworkService(BaseService):
381 def __init__(self, manager, **kwargs):
382 super(NetworkService, self).__init__(kwargs)
383 self.client = manager.network_client
John Warren94d8faf2015-09-15 12:22:24 -0400384 self.networks_client = manager.networks_client
John Warren3961acd2015-10-02 14:38:53 -0400385 self.subnets_client = manager.subnets_client
David Patersonce781492014-09-18 01:07:01 -0400386
David Patersond6babc52014-10-14 00:11:56 -0400387 def _filter_by_conf_networks(self, item_list):
388 if not item_list or not all(('network_id' in i for i in item_list)):
389 return item_list
390
391 return [item for item in item_list if item['network_id']
392 not in CONF_NETWORKS]
393
David Patersonce781492014-09-18 01:07:01 -0400394 def list(self):
John Warren94d8faf2015-09-15 12:22:24 -0400395 client = self.networks_client
David Paterson82234022015-04-12 14:07:40 -0400396 networks = client.list_networks(**self.tenant_filter)
397 networks = networks['networks']
David Patersonce781492014-09-18 01:07:01 -0400398 # filter out networks declared in tempest.conf
399 if self.is_preserve:
400 networks = [network for network in networks
David Patersond6babc52014-10-14 00:11:56 -0400401 if network['id'] not in CONF_NETWORKS]
David Patersonce781492014-09-18 01:07:01 -0400402 LOG.debug("List count, %s Networks" % networks)
403 return networks
404
405 def delete(self):
John Warren94d8faf2015-09-15 12:22:24 -0400406 client = self.networks_client
David Patersonce781492014-09-18 01:07:01 -0400407 networks = self.list()
408 for n in networks:
409 try:
410 client.delete_network(n['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400411 except Exception:
412 LOG.exception("Delete Network exception.")
David Patersonce781492014-09-18 01:07:01 -0400413
414 def dry_run(self):
415 networks = self.list()
416 self.data['networks'] = networks
417
418
David Patersonce781492014-09-18 01:07:01 -0400419class NetworkFloatingIpService(NetworkService):
420
421 def list(self):
422 client = self.client
David Paterson82234022015-04-12 14:07:40 -0400423 flips = client.list_floatingips(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400424 flips = flips['floatingips']
David Patersonce781492014-09-18 01:07:01 -0400425 LOG.debug("List count, %s Network Floating IPs" % len(flips))
426 return flips
427
428 def delete(self):
429 client = self.client
430 flips = self.list()
431 for flip in flips:
432 try:
433 client.delete_floatingip(flip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400434 except Exception:
435 LOG.exception("Delete Network Floating IP exception.")
David Patersonce781492014-09-18 01:07:01 -0400436
437 def dry_run(self):
438 flips = self.list()
439 self.data['floating_ips'] = flips
440
441
442class NetworkRouterService(NetworkService):
443
444 def list(self):
445 client = self.client
David Paterson82234022015-04-12 14:07:40 -0400446 routers = client.list_routers(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400447 routers = routers['routers']
David Patersonce781492014-09-18 01:07:01 -0400448 if self.is_preserve:
449 routers = [router for router in routers
450 if router['id'] != CONF_PUB_ROUTER]
451
452 LOG.debug("List count, %s Routers" % len(routers))
453 return routers
454
455 def delete(self):
456 client = self.client
457 routers = self.list()
458 for router in routers:
459 try:
460 rid = router['id']
David Paterson82234022015-04-12 14:07:40 -0400461 ports = [port for port
462 in client.list_router_interfaces(rid)['ports']
463 if port["device_owner"] == "network:router_interface"]
David Patersonce781492014-09-18 01:07:01 -0400464 for port in ports:
David Paterson82234022015-04-12 14:07:40 -0400465 client.remove_router_interface_with_port_id(rid,
466 port['id'])
David Patersond6babc52014-10-14 00:11:56 -0400467 client.delete_router(rid)
David Patersone41ebca2015-04-09 05:40:12 -0400468 except Exception:
469 LOG.exception("Delete Router exception.")
David Patersonce781492014-09-18 01:07:01 -0400470
471 def dry_run(self):
472 routers = self.list()
473 self.data['routers'] = routers
474
475
476class NetworkHealthMonitorService(NetworkService):
477
478 def list(self):
479 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500480 hms = client.list_health_monitors()
David Patersonce781492014-09-18 01:07:01 -0400481 hms = hms['health_monitors']
482 hms = self._filter_by_tenant_id(hms)
483 LOG.debug("List count, %s Health Monitors" % len(hms))
484 return hms
485
486 def delete(self):
487 client = self.client
488 hms = self.list()
489 for hm in hms:
490 try:
491 client.delete_health_monitor(hm['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400492 except Exception:
493 LOG.exception("Delete Health Monitor exception.")
David Patersonce781492014-09-18 01:07:01 -0400494
495 def dry_run(self):
496 hms = self.list()
497 self.data['health_monitors'] = hms
498
499
500class NetworkMemberService(NetworkService):
501
502 def list(self):
503 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500504 members = client.list_members()
David Patersonce781492014-09-18 01:07:01 -0400505 members = members['members']
506 members = self._filter_by_tenant_id(members)
507 LOG.debug("List count, %s Members" % len(members))
508 return members
509
510 def delete(self):
511 client = self.client
512 members = self.list()
513 for member in members:
514 try:
515 client.delete_member(member['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400516 except Exception:
517 LOG.exception("Delete Member exception.")
David Patersonce781492014-09-18 01:07:01 -0400518
519 def dry_run(self):
520 members = self.list()
521 self.data['members'] = members
522
523
524class NetworkVipService(NetworkService):
525
526 def list(self):
527 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500528 vips = client.list_vips()
David Patersonce781492014-09-18 01:07:01 -0400529 vips = vips['vips']
530 vips = self._filter_by_tenant_id(vips)
531 LOG.debug("List count, %s VIPs" % len(vips))
532 return vips
533
534 def delete(self):
535 client = self.client
536 vips = self.list()
537 for vip in vips:
538 try:
539 client.delete_vip(vip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400540 except Exception:
541 LOG.exception("Delete VIP exception.")
David Patersonce781492014-09-18 01:07:01 -0400542
543 def dry_run(self):
544 vips = self.list()
545 self.data['vips'] = vips
546
547
548class NetworkPoolService(NetworkService):
549
550 def list(self):
551 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500552 pools = client.list_pools()
David Patersonce781492014-09-18 01:07:01 -0400553 pools = pools['pools']
554 pools = self._filter_by_tenant_id(pools)
555 LOG.debug("List count, %s Pools" % len(pools))
556 return pools
557
558 def delete(self):
559 client = self.client
560 pools = self.list()
561 for pool in pools:
562 try:
563 client.delete_pool(pool['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400564 except Exception:
565 LOG.exception("Delete Pool exception.")
David Patersonce781492014-09-18 01:07:01 -0400566
567 def dry_run(self):
568 pools = self.list()
569 self.data['pools'] = pools
570
571
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300572class NetworkMeteringLabelRuleService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400573
574 def list(self):
575 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500576 rules = client.list_metering_label_rules()
David Patersonce781492014-09-18 01:07:01 -0400577 rules = rules['metering_label_rules']
578 rules = self._filter_by_tenant_id(rules)
579 LOG.debug("List count, %s Metering Label Rules" % len(rules))
580 return rules
581
582 def delete(self):
583 client = self.client
584 rules = self.list()
585 for rule in rules:
586 try:
587 client.delete_metering_label_rule(rule['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400588 except Exception:
589 LOG.exception("Delete Metering Label Rule exception.")
David Patersonce781492014-09-18 01:07:01 -0400590
591 def dry_run(self):
592 rules = self.list()
593 self.data['rules'] = rules
594
595
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300596class NetworkMeteringLabelService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400597
598 def list(self):
599 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500600 labels = client.list_metering_labels()
David Patersonce781492014-09-18 01:07:01 -0400601 labels = labels['metering_labels']
602 labels = self._filter_by_tenant_id(labels)
603 LOG.debug("List count, %s Metering Labels" % len(labels))
604 return labels
605
606 def delete(self):
607 client = self.client
608 labels = self.list()
609 for label in labels:
610 try:
611 client.delete_metering_label(label['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400612 except Exception:
613 LOG.exception("Delete Metering Label exception.")
David Patersonce781492014-09-18 01:07:01 -0400614
615 def dry_run(self):
616 labels = self.list()
617 self.data['labels'] = labels
618
619
620class NetworkPortService(NetworkService):
621
622 def list(self):
623 client = self.client
David Paterson82234022015-04-12 14:07:40 -0400624 ports = [port for port in
625 client.list_ports(**self.tenant_filter)['ports']
626 if port["device_owner"] == "" or
627 port["device_owner"].startswith("compute:")]
628
David Patersond6babc52014-10-14 00:11:56 -0400629 if self.is_preserve:
630 ports = self._filter_by_conf_networks(ports)
David Paterson82234022015-04-12 14:07:40 -0400631
David Patersonce781492014-09-18 01:07:01 -0400632 LOG.debug("List count, %s Ports" % len(ports))
633 return ports
634
635 def delete(self):
636 client = self.client
637 ports = self.list()
638 for port in ports:
639 try:
640 client.delete_port(port['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400641 except Exception:
642 LOG.exception("Delete Port exception.")
David Patersonce781492014-09-18 01:07:01 -0400643
644 def dry_run(self):
645 ports = self.list()
646 self.data['ports'] = ports
647
648
David Paterson82234022015-04-12 14:07:40 -0400649class NetworkSecGroupService(NetworkService):
650 def list(self):
651 client = self.client
652 filter = self.tenant_filter
653 # cannot delete default sec group so never show it.
654 secgroups = [secgroup for secgroup in
655 client.list_security_groups(**filter)['security_groups']
656 if secgroup['name'] != 'default']
657
658 if self.is_preserve:
659 secgroups = self._filter_by_conf_networks(secgroups)
660 LOG.debug("List count, %s securtiy_groups" % len(secgroups))
661 return secgroups
662
663 def delete(self):
664 client = self.client
665 secgroups = self.list()
666 for secgroup in secgroups:
667 try:
668 client.delete_secgroup(secgroup['id'])
669 except Exception:
670 LOG.exception("Delete security_group exception.")
671
672 def dry_run(self):
673 secgroups = self.list()
674 self.data['secgroups'] = secgroups
675
676
David Patersonce781492014-09-18 01:07:01 -0400677class NetworkSubnetService(NetworkService):
678
679 def list(self):
John Warren3961acd2015-10-02 14:38:53 -0400680 client = self.subnets_client
David Paterson82234022015-04-12 14:07:40 -0400681 subnets = client.list_subnets(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400682 subnets = subnets['subnets']
David Patersond6babc52014-10-14 00:11:56 -0400683 if self.is_preserve:
684 subnets = self._filter_by_conf_networks(subnets)
David Patersonce781492014-09-18 01:07:01 -0400685 LOG.debug("List count, %s Subnets" % len(subnets))
686 return subnets
687
688 def delete(self):
John Warren3961acd2015-10-02 14:38:53 -0400689 client = self.subnets_client
David Patersonce781492014-09-18 01:07:01 -0400690 subnets = self.list()
691 for subnet in subnets:
692 try:
693 client.delete_subnet(subnet['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400694 except Exception:
695 LOG.exception("Delete Subnet exception.")
David Patersonce781492014-09-18 01:07:01 -0400696
697 def dry_run(self):
698 subnets = self.list()
699 self.data['subnets'] = subnets
700
701
702# Telemetry services
703class TelemetryAlarmService(BaseService):
704 def __init__(self, manager, **kwargs):
705 super(TelemetryAlarmService, self).__init__(kwargs)
706 self.client = manager.telemetry_client
707
708 def list(self):
709 client = self.client
David Kranz20d06f42015-02-09 14:54:15 -0500710 alarms = client.list_alarms()
David Patersonce781492014-09-18 01:07:01 -0400711 LOG.debug("List count, %s Alarms" % len(alarms))
712 return alarms
713
714 def delete(self):
715 client = self.client
716 alarms = self.list()
717 for alarm in alarms:
718 try:
719 client.delete_alarm(alarm['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400720 except Exception:
721 LOG.exception("Delete Alarms exception.")
David Patersonce781492014-09-18 01:07:01 -0400722
723 def dry_run(self):
724 alarms = self.list()
725 self.data['alarms'] = alarms
726
727
728# begin global services
729class FlavorService(BaseService):
730 def __init__(self, manager, **kwargs):
731 super(FlavorService, self).__init__(kwargs)
732 self.client = manager.flavors_client
733
734 def list(self):
735 client = self.client
ghanshyam19973be2015-08-18 15:46:42 +0900736 flavors = client.list_flavors({"is_public": None})['flavors']
David Patersonce781492014-09-18 01:07:01 -0400737 if not self.is_save_state:
738 # recreate list removing saved flavors
739 flavors = [flavor for flavor in flavors if flavor['id']
740 not in self.saved_state_json['flavors'].keys()]
741
742 if self.is_preserve:
743 flavors = [flavor for flavor in flavors
744 if flavor['id'] not in CONF_FLAVORS]
745 LOG.debug("List count, %s Flavors after reconcile" % len(flavors))
746 return flavors
747
748 def delete(self):
749 client = self.client
750 flavors = self.list()
751 for flavor in flavors:
752 try:
753 client.delete_flavor(flavor['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400754 except Exception:
755 LOG.exception("Delete Flavor exception.")
David Patersonce781492014-09-18 01:07:01 -0400756
757 def dry_run(self):
758 flavors = self.list()
759 self.data['flavors'] = flavors
760
761 def save_state(self):
762 flavors = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500763 self.data['flavors'] = {}
David Patersonce781492014-09-18 01:07:01 -0400764 for flavor in flavors:
gordon chungc15f1bc2015-02-23 18:00:41 -0500765 self.data['flavors'][flavor['id']] = flavor['name']
David Patersonce781492014-09-18 01:07:01 -0400766
767
768class ImageService(BaseService):
769 def __init__(self, manager, **kwargs):
770 super(ImageService, self).__init__(kwargs)
771 self.client = manager.images_client
772
773 def list(self):
774 client = self.client
ghanshyam1756e0b2015-08-18 19:19:05 +0900775 images = client.list_images({"all_tenants": True})['images']
David Patersonce781492014-09-18 01:07:01 -0400776 if not self.is_save_state:
777 images = [image for image in images if image['id']
778 not in self.saved_state_json['images'].keys()]
779 if self.is_preserve:
780 images = [image for image in images
781 if image['id'] not in CONF_IMAGES]
782 LOG.debug("List count, %s Images after reconcile" % len(images))
783 return images
784
785 def delete(self):
786 client = self.client
787 images = self.list()
788 for image in images:
789 try:
790 client.delete_image(image['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400791 except Exception:
792 LOG.exception("Delete Image exception.")
David Patersonce781492014-09-18 01:07:01 -0400793
794 def dry_run(self):
795 images = self.list()
796 self.data['images'] = images
797
798 def save_state(self):
gordon chungc15f1bc2015-02-23 18:00:41 -0500799 self.data['images'] = {}
David Paterson82234022015-04-12 14:07:40 -0400800 images = self.list()
David Patersonce781492014-09-18 01:07:01 -0400801 for image in images:
gordon chungc15f1bc2015-02-23 18:00:41 -0500802 self.data['images'][image['id']] = image['name']
David Patersonce781492014-09-18 01:07:01 -0400803
804
805class IdentityService(BaseService):
806 def __init__(self, manager, **kwargs):
807 super(IdentityService, self).__init__(kwargs)
808 self.client = manager.identity_client
809
810
811class UserService(IdentityService):
812
813 def list(self):
814 client = self.client
David Kranzb7afa922014-12-30 10:56:26 -0500815 users = client.get_users()
David Patersonce781492014-09-18 01:07:01 -0400816
817 if not self.is_save_state:
818 users = [user for user in users if user['id']
819 not in self.saved_state_json['users'].keys()]
820
821 if self.is_preserve:
822 users = [user for user in users if user['name']
823 not in CONF_USERS]
824
825 elif not self.is_save_state: # Never delete admin user
826 users = [user for user in users if user['name'] !=
827 CONF.identity.admin_username]
828
829 LOG.debug("List count, %s Users after reconcile" % len(users))
830 return users
831
832 def delete(self):
833 client = self.client
834 users = self.list()
835 for user in users:
836 try:
837 client.delete_user(user['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400838 except Exception:
839 LOG.exception("Delete User exception.")
David Patersonce781492014-09-18 01:07:01 -0400840
841 def dry_run(self):
842 users = self.list()
843 self.data['users'] = users
844
845 def save_state(self):
846 users = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500847 self.data['users'] = {}
David Patersonce781492014-09-18 01:07:01 -0400848 for user in users:
gordon chungc15f1bc2015-02-23 18:00:41 -0500849 self.data['users'][user['id']] = user['name']
David Patersonce781492014-09-18 01:07:01 -0400850
851
852class RoleService(IdentityService):
853
854 def list(self):
855 client = self.client
856 try:
David Kranzb7afa922014-12-30 10:56:26 -0500857 roles = client.list_roles()
David Patersonce781492014-09-18 01:07:01 -0400858 # reconcile roles with saved state and never list admin role
859 if not self.is_save_state:
860 roles = [role for role in roles if
861 (role['id'] not in
862 self.saved_state_json['roles'].keys()
863 and role['name'] != CONF.identity.admin_role)]
864 LOG.debug("List count, %s Roles after reconcile" % len(roles))
865 return roles
David Patersone41ebca2015-04-09 05:40:12 -0400866 except Exception:
867 LOG.exception("Cannot retrieve Roles.")
David Patersonce781492014-09-18 01:07:01 -0400868 return []
869
870 def delete(self):
871 client = self.client
872 roles = self.list()
873 for role in roles:
874 try:
875 client.delete_role(role['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400876 except Exception:
877 LOG.exception("Delete Role exception.")
David Patersonce781492014-09-18 01:07:01 -0400878
879 def dry_run(self):
880 roles = self.list()
881 self.data['roles'] = roles
882
883 def save_state(self):
884 roles = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500885 self.data['roles'] = {}
David Patersonce781492014-09-18 01:07:01 -0400886 for role in roles:
gordon chungc15f1bc2015-02-23 18:00:41 -0500887 self.data['roles'][role['id']] = role['name']
David Patersonce781492014-09-18 01:07:01 -0400888
889
890class TenantService(IdentityService):
891
892 def list(self):
893 client = self.client
John Warrenacf00512015-08-06 16:13:58 -0400894 tenants = client.list_tenants()['tenants']
David Patersonce781492014-09-18 01:07:01 -0400895 if not self.is_save_state:
896 tenants = [tenant for tenant in tenants if (tenant['id']
897 not in self.saved_state_json['tenants'].keys()
898 and tenant['name'] != CONF.identity.admin_tenant_name)]
899
900 if self.is_preserve:
901 tenants = [tenant for tenant in tenants if tenant['name']
902 not in CONF_TENANTS]
903
904 LOG.debug("List count, %s Tenants after reconcile" % len(tenants))
905 return tenants
906
907 def delete(self):
908 client = self.client
909 tenants = self.list()
910 for tenant in tenants:
911 try:
912 client.delete_tenant(tenant['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400913 except Exception:
914 LOG.exception("Delete Tenant exception.")
David Patersonce781492014-09-18 01:07:01 -0400915
916 def dry_run(self):
917 tenants = self.list()
918 self.data['tenants'] = tenants
919
920 def save_state(self):
921 tenants = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500922 self.data['tenants'] = {}
David Patersonce781492014-09-18 01:07:01 -0400923 for tenant in tenants:
gordon chungc15f1bc2015-02-23 18:00:41 -0500924 self.data['tenants'][tenant['id']] = tenant['name']
David Patersonce781492014-09-18 01:07:01 -0400925
926
927class DomainService(BaseService):
928
929 def __init__(self, manager, **kwargs):
930 super(DomainService, self).__init__(kwargs)
931 self.client = manager.identity_v3_client
932
933 def list(self):
934 client = self.client
Thomas Bechtold48268a02015-08-30 19:37:46 +0200935 domains = client.list_domains()['domains']
David Patersonce781492014-09-18 01:07:01 -0400936 if not self.is_save_state:
937 domains = [domain for domain in domains if domain['id']
938 not in self.saved_state_json['domains'].keys()]
939
940 LOG.debug("List count, %s Domains after reconcile" % len(domains))
941 return domains
942
943 def delete(self):
944 client = self.client
945 domains = self.list()
946 for domain in domains:
947 try:
948 client.update_domain(domain['id'], enabled=False)
949 client.delete_domain(domain['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400950 except Exception:
951 LOG.exception("Delete Domain exception.")
David Patersonce781492014-09-18 01:07:01 -0400952
953 def dry_run(self):
954 domains = self.list()
955 self.data['domains'] = domains
956
957 def save_state(self):
958 domains = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500959 self.data['domains'] = {}
David Patersonce781492014-09-18 01:07:01 -0400960 for domain in domains:
gordon chungc15f1bc2015-02-23 18:00:41 -0500961 self.data['domains'][domain['id']] = domain['name']
David Patersonce781492014-09-18 01:07:01 -0400962
963
964def get_tenant_cleanup_services():
965 tenant_services = []
David Patersonce781492014-09-18 01:07:01 -0400966 if IS_CEILOMETER:
967 tenant_services.append(TelemetryAlarmService)
968 if IS_NOVA:
969 tenant_services.append(ServerService)
970 tenant_services.append(KeyPairService)
971 tenant_services.append(SecurityGroupService)
972 tenant_services.append(ServerGroupService)
973 if not IS_NEUTRON:
974 tenant_services.append(FloatingIpService)
David Paterson35c8df02015-04-05 04:35:31 -0400975 tenant_services.append(NovaQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400976 if IS_HEAT:
977 tenant_services.append(StackService)
978 if IS_NEUTRON:
David Paterson82234022015-04-12 14:07:40 -0400979 tenant_services.append(NetworkFloatingIpService)
David Patersonce781492014-09-18 01:07:01 -0400980 if test.is_extension_enabled('metering', 'network'):
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300981 tenant_services.append(NetworkMeteringLabelRuleService)
982 tenant_services.append(NetworkMeteringLabelService)
David Patersonce781492014-09-18 01:07:01 -0400983 tenant_services.append(NetworkRouterService)
David Patersonce781492014-09-18 01:07:01 -0400984 tenant_services.append(NetworkPortService)
985 tenant_services.append(NetworkSubnetService)
986 tenant_services.append(NetworkService)
David Paterson82234022015-04-12 14:07:40 -0400987 tenant_services.append(NetworkSecGroupService)
David Patersonce781492014-09-18 01:07:01 -0400988 if IS_CINDER:
989 tenant_services.append(SnapshotService)
990 tenant_services.append(VolumeService)
David Paterson35c8df02015-04-05 04:35:31 -0400991 tenant_services.append(VolumeQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400992 return tenant_services
993
994
995def get_global_cleanup_services():
996 global_services = []
997 if IS_NOVA:
998 global_services.append(FlavorService)
999 if IS_GLANCE:
1000 global_services.append(ImageService)
1001 global_services.append(UserService)
1002 global_services.append(TenantService)
1003 global_services.append(DomainService)
1004 global_services.append(RoleService)
1005 return global_services