blob: 1b5820b21f0ad7eac81ebfe53dc771b1b6cbbf5a [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
David Paterson07661de2015-10-29 20:15:04 -070072 CONF_TENANTS = [CONF.auth.admin_tenant_name,
David Patersond6babc52014-10-14 00:11:56 -040073 CONF.identity.tenant_name,
74 CONF.identity.alt_tenant_name]
David Paterson07661de2015-10-29 20:15:04 -070075 CONF_USERS = [CONF.auth.admin_username, CONF.identity.username,
David Patersond6babc52014-10-14 00:11:56 -040076 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
David Paterson07661de2015-10-29 20:15:04 -0700150 snaps = client.list_snapshots()['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
David Paterson07661de2015-10-29 20:15:04 -0700172 self.server_groups_client = manager.server_groups_client
David Patersonce781492014-09-18 01:07:01 -0400173
174 def list(self):
175 client = self.client
David Kranzae99b9a2015-02-16 13:37:01 -0500176 servers_body = client.list_servers()
David Patersonce781492014-09-18 01:07:01 -0400177 servers = servers_body['servers']
178 LOG.debug("List count, %s Servers" % len(servers))
179 return servers
180
181 def delete(self):
182 client = self.client
183 servers = self.list()
184 for server in servers:
185 try:
186 client.delete_server(server['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400187 except Exception:
188 LOG.exception("Delete Server exception.")
David Patersonce781492014-09-18 01:07:01 -0400189
190 def dry_run(self):
191 servers = self.list()
192 self.data['servers'] = servers
193
194
195class ServerGroupService(ServerService):
196
197 def list(self):
David Paterson07661de2015-10-29 20:15:04 -0700198 client = self.server_groups_client
ghanshyam2dc13452015-08-24 17:39:25 +0900199 sgs = client.list_server_groups()['server_groups']
David Patersonce781492014-09-18 01:07:01 -0400200 LOG.debug("List count, %s Server Groups" % len(sgs))
201 return sgs
202
203 def delete(self):
204 client = self.client
205 sgs = self.list()
206 for sg in sgs:
207 try:
208 client.delete_server_group(sg['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400209 except Exception:
210 LOG.exception("Delete Server Group exception.")
David Patersonce781492014-09-18 01:07:01 -0400211
212 def dry_run(self):
213 sgs = self.list()
214 self.data['server_groups'] = sgs
215
216
217class StackService(BaseService):
218 def __init__(self, manager, **kwargs):
219 super(StackService, self).__init__(kwargs)
220 self.client = manager.orchestration_client
221
222 def list(self):
223 client = self.client
Anusha Ramineniab6c3a32015-08-18 08:33:09 +0530224 stacks = client.list_stacks()['stacks']
David Patersonce781492014-09-18 01:07:01 -0400225 LOG.debug("List count, %s Stacks" % len(stacks))
226 return stacks
227
228 def delete(self):
229 client = self.client
230 stacks = self.list()
231 for stack in stacks:
232 try:
233 client.delete_stack(stack['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400234 except Exception:
235 LOG.exception("Delete Stack exception.")
David Patersonce781492014-09-18 01:07:01 -0400236
237 def dry_run(self):
238 stacks = self.list()
239 self.data['stacks'] = stacks
240
241
242class KeyPairService(BaseService):
243 def __init__(self, manager, **kwargs):
244 super(KeyPairService, self).__init__(kwargs)
245 self.client = manager.keypairs_client
246
247 def list(self):
248 client = self.client
ghanshyamdee01f22015-08-17 11:41:47 +0900249 keypairs = client.list_keypairs()['keypairs']
David Patersonce781492014-09-18 01:07:01 -0400250 LOG.debug("List count, %s Keypairs" % len(keypairs))
251 return keypairs
252
253 def delete(self):
254 client = self.client
255 keypairs = self.list()
256 for k in keypairs:
257 try:
258 name = k['keypair']['name']
259 client.delete_keypair(name)
David Patersone41ebca2015-04-09 05:40:12 -0400260 except Exception:
261 LOG.exception("Delete Keypairs exception.")
David Patersonce781492014-09-18 01:07:01 -0400262
263 def dry_run(self):
264 keypairs = self.list()
265 self.data['keypairs'] = keypairs
266
267
268class SecurityGroupService(BaseService):
269 def __init__(self, manager, **kwargs):
270 super(SecurityGroupService, self).__init__(kwargs)
271 self.client = manager.security_groups_client
272
273 def list(self):
274 client = self.client
ghanshyamb610b772015-08-24 17:29:38 +0900275 secgrps = client.list_security_groups()['security_groups']
David Patersonce781492014-09-18 01:07:01 -0400276 secgrp_del = [grp for grp in secgrps if grp['name'] != 'default']
277 LOG.debug("List count, %s Security Groups" % len(secgrp_del))
278 return secgrp_del
279
280 def delete(self):
281 client = self.client
282 secgrp_del = self.list()
283 for g in secgrp_del:
284 try:
285 client.delete_security_group(g['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400286 except Exception:
287 LOG.exception("Delete Security Groups exception.")
David Patersonce781492014-09-18 01:07:01 -0400288
289 def dry_run(self):
290 secgrp_del = self.list()
291 self.data['security_groups'] = secgrp_del
292
293
294class FloatingIpService(BaseService):
295 def __init__(self, manager, **kwargs):
296 super(FloatingIpService, self).__init__(kwargs)
297 self.client = manager.floating_ips_client
298
299 def list(self):
300 client = self.client
ghanshyam9a3a9a22015-08-18 17:03:55 +0900301 floating_ips = client.list_floating_ips()['floating_ips']
David Patersonce781492014-09-18 01:07:01 -0400302 LOG.debug("List count, %s Floating IPs" % len(floating_ips))
303 return floating_ips
304
305 def delete(self):
306 client = self.client
307 floating_ips = self.list()
308 for f in floating_ips:
309 try:
310 client.delete_floating_ip(f['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400311 except Exception:
312 LOG.exception("Delete Floating IPs exception.")
David Patersonce781492014-09-18 01:07:01 -0400313
314 def dry_run(self):
315 floating_ips = self.list()
316 self.data['floating_ips'] = floating_ips
317
318
319class VolumeService(BaseService):
320 def __init__(self, manager, **kwargs):
321 super(VolumeService, self).__init__(kwargs)
322 self.client = manager.volumes_client
323
324 def list(self):
325 client = self.client
John Warren6177c9e2015-08-19 20:00:17 +0000326 vols = client.list_volumes()['volumes']
David Patersonce781492014-09-18 01:07:01 -0400327 LOG.debug("List count, %s Volumes" % len(vols))
328 return vols
329
330 def delete(self):
331 client = self.client
332 vols = self.list()
333 for v in vols:
334 try:
335 client.delete_volume(v['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400336 except Exception:
337 LOG.exception("Delete Volume exception.")
David Patersonce781492014-09-18 01:07:01 -0400338
339 def dry_run(self):
340 vols = self.list()
341 self.data['volumes'] = vols
342
343
David Paterson35c8df02015-04-05 04:35:31 -0400344class VolumeQuotaService(BaseService):
345 def __init__(self, manager, **kwargs):
346 super(VolumeQuotaService, self).__init__(kwargs)
347 self.client = manager.volume_quotas_client
348
349 def delete(self):
350 client = self.client
351 try:
352 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400353 except Exception:
354 LOG.exception("Delete Volume Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400355
356 def dry_run(self):
ghanshyam08a73f92015-08-31 17:32:49 +0900357 quotas = self.client.show_quota_usage(self.tenant_id)['quota_set']
David Paterson35c8df02015-04-05 04:35:31 -0400358 self.data['volume_quotas'] = quotas
359
360
361class NovaQuotaService(BaseService):
362 def __init__(self, manager, **kwargs):
363 super(NovaQuotaService, self).__init__(kwargs)
364 self.client = manager.quotas_client
365 self.limits_client = manager.limits_client
366
367 def delete(self):
368 client = self.client
369 try:
370 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400371 except Exception:
372 LOG.exception("Delete Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400373
374 def dry_run(self):
375 client = self.limits_client
ghanshyam8a599492015-08-24 15:55:59 +0900376 quotas = client.show_limits()['limits']
Ken'ichi Ohmichib93e6762015-06-15 07:11:29 +0000377 self.data['compute_quotas'] = quotas['absolute']
David Paterson35c8df02015-04-05 04:35:31 -0400378
379
David Patersonce781492014-09-18 01:07:01 -0400380# Begin network service classes
381class NetworkService(BaseService):
382 def __init__(self, manager, **kwargs):
383 super(NetworkService, self).__init__(kwargs)
384 self.client = manager.network_client
John Warren94d8faf2015-09-15 12:22:24 -0400385 self.networks_client = manager.networks_client
John Warren3961acd2015-10-02 14:38:53 -0400386 self.subnets_client = manager.subnets_client
David Patersonce781492014-09-18 01:07:01 -0400387
David Patersond6babc52014-10-14 00:11:56 -0400388 def _filter_by_conf_networks(self, item_list):
389 if not item_list or not all(('network_id' in i for i in item_list)):
390 return item_list
391
392 return [item for item in item_list if item['network_id']
393 not in CONF_NETWORKS]
394
David Patersonce781492014-09-18 01:07:01 -0400395 def list(self):
John Warren94d8faf2015-09-15 12:22:24 -0400396 client = self.networks_client
David Paterson82234022015-04-12 14:07:40 -0400397 networks = client.list_networks(**self.tenant_filter)
398 networks = networks['networks']
David Patersonce781492014-09-18 01:07:01 -0400399 # filter out networks declared in tempest.conf
400 if self.is_preserve:
401 networks = [network for network in networks
David Patersond6babc52014-10-14 00:11:56 -0400402 if network['id'] not in CONF_NETWORKS]
David Patersonce781492014-09-18 01:07:01 -0400403 LOG.debug("List count, %s Networks" % networks)
404 return networks
405
406 def delete(self):
John Warren94d8faf2015-09-15 12:22:24 -0400407 client = self.networks_client
David Patersonce781492014-09-18 01:07:01 -0400408 networks = self.list()
409 for n in networks:
410 try:
411 client.delete_network(n['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400412 except Exception:
413 LOG.exception("Delete Network exception.")
David Patersonce781492014-09-18 01:07:01 -0400414
415 def dry_run(self):
416 networks = self.list()
417 self.data['networks'] = networks
418
419
David Patersonce781492014-09-18 01:07:01 -0400420class NetworkFloatingIpService(NetworkService):
421
422 def list(self):
423 client = self.client
David Paterson82234022015-04-12 14:07:40 -0400424 flips = client.list_floatingips(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400425 flips = flips['floatingips']
David Patersonce781492014-09-18 01:07:01 -0400426 LOG.debug("List count, %s Network Floating IPs" % len(flips))
427 return flips
428
429 def delete(self):
430 client = self.client
431 flips = self.list()
432 for flip in flips:
433 try:
434 client.delete_floatingip(flip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400435 except Exception:
436 LOG.exception("Delete Network Floating IP exception.")
David Patersonce781492014-09-18 01:07:01 -0400437
438 def dry_run(self):
439 flips = self.list()
440 self.data['floating_ips'] = flips
441
442
443class NetworkRouterService(NetworkService):
444
445 def list(self):
446 client = self.client
David Paterson82234022015-04-12 14:07:40 -0400447 routers = client.list_routers(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400448 routers = routers['routers']
David Patersonce781492014-09-18 01:07:01 -0400449 if self.is_preserve:
450 routers = [router for router in routers
451 if router['id'] != CONF_PUB_ROUTER]
452
453 LOG.debug("List count, %s Routers" % len(routers))
454 return routers
455
456 def delete(self):
457 client = self.client
458 routers = self.list()
459 for router in routers:
460 try:
461 rid = router['id']
David Paterson82234022015-04-12 14:07:40 -0400462 ports = [port for port
463 in client.list_router_interfaces(rid)['ports']
464 if port["device_owner"] == "network:router_interface"]
David Patersonce781492014-09-18 01:07:01 -0400465 for port in ports:
David Paterson82234022015-04-12 14:07:40 -0400466 client.remove_router_interface_with_port_id(rid,
467 port['id'])
David Patersond6babc52014-10-14 00:11:56 -0400468 client.delete_router(rid)
David Patersone41ebca2015-04-09 05:40:12 -0400469 except Exception:
470 LOG.exception("Delete Router exception.")
David Patersonce781492014-09-18 01:07:01 -0400471
472 def dry_run(self):
473 routers = self.list()
474 self.data['routers'] = routers
475
476
477class NetworkHealthMonitorService(NetworkService):
478
479 def list(self):
480 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500481 hms = client.list_health_monitors()
David Patersonce781492014-09-18 01:07:01 -0400482 hms = hms['health_monitors']
483 hms = self._filter_by_tenant_id(hms)
484 LOG.debug("List count, %s Health Monitors" % len(hms))
485 return hms
486
487 def delete(self):
488 client = self.client
489 hms = self.list()
490 for hm in hms:
491 try:
492 client.delete_health_monitor(hm['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400493 except Exception:
494 LOG.exception("Delete Health Monitor exception.")
David Patersonce781492014-09-18 01:07:01 -0400495
496 def dry_run(self):
497 hms = self.list()
498 self.data['health_monitors'] = hms
499
500
501class NetworkMemberService(NetworkService):
502
503 def list(self):
504 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500505 members = client.list_members()
David Patersonce781492014-09-18 01:07:01 -0400506 members = members['members']
507 members = self._filter_by_tenant_id(members)
508 LOG.debug("List count, %s Members" % len(members))
509 return members
510
511 def delete(self):
512 client = self.client
513 members = self.list()
514 for member in members:
515 try:
516 client.delete_member(member['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400517 except Exception:
518 LOG.exception("Delete Member exception.")
David Patersonce781492014-09-18 01:07:01 -0400519
520 def dry_run(self):
521 members = self.list()
522 self.data['members'] = members
523
524
525class NetworkVipService(NetworkService):
526
527 def list(self):
528 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500529 vips = client.list_vips()
David Patersonce781492014-09-18 01:07:01 -0400530 vips = vips['vips']
531 vips = self._filter_by_tenant_id(vips)
532 LOG.debug("List count, %s VIPs" % len(vips))
533 return vips
534
535 def delete(self):
536 client = self.client
537 vips = self.list()
538 for vip in vips:
539 try:
540 client.delete_vip(vip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400541 except Exception:
542 LOG.exception("Delete VIP exception.")
David Patersonce781492014-09-18 01:07:01 -0400543
544 def dry_run(self):
545 vips = self.list()
546 self.data['vips'] = vips
547
548
549class NetworkPoolService(NetworkService):
550
551 def list(self):
552 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500553 pools = client.list_pools()
David Patersonce781492014-09-18 01:07:01 -0400554 pools = pools['pools']
555 pools = self._filter_by_tenant_id(pools)
556 LOG.debug("List count, %s Pools" % len(pools))
557 return pools
558
559 def delete(self):
560 client = self.client
561 pools = self.list()
562 for pool in pools:
563 try:
564 client.delete_pool(pool['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400565 except Exception:
566 LOG.exception("Delete Pool exception.")
David Patersonce781492014-09-18 01:07:01 -0400567
568 def dry_run(self):
569 pools = self.list()
570 self.data['pools'] = pools
571
572
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300573class NetworkMeteringLabelRuleService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400574
575 def list(self):
576 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500577 rules = client.list_metering_label_rules()
David Patersonce781492014-09-18 01:07:01 -0400578 rules = rules['metering_label_rules']
579 rules = self._filter_by_tenant_id(rules)
580 LOG.debug("List count, %s Metering Label Rules" % len(rules))
581 return rules
582
583 def delete(self):
584 client = self.client
585 rules = self.list()
586 for rule in rules:
587 try:
588 client.delete_metering_label_rule(rule['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400589 except Exception:
590 LOG.exception("Delete Metering Label Rule exception.")
David Patersonce781492014-09-18 01:07:01 -0400591
592 def dry_run(self):
593 rules = self.list()
594 self.data['rules'] = rules
595
596
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300597class NetworkMeteringLabelService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400598
599 def list(self):
600 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500601 labels = client.list_metering_labels()
David Patersonce781492014-09-18 01:07:01 -0400602 labels = labels['metering_labels']
603 labels = self._filter_by_tenant_id(labels)
604 LOG.debug("List count, %s Metering Labels" % len(labels))
605 return labels
606
607 def delete(self):
608 client = self.client
609 labels = self.list()
610 for label in labels:
611 try:
612 client.delete_metering_label(label['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400613 except Exception:
614 LOG.exception("Delete Metering Label exception.")
David Patersonce781492014-09-18 01:07:01 -0400615
616 def dry_run(self):
617 labels = self.list()
618 self.data['labels'] = labels
619
620
621class NetworkPortService(NetworkService):
622
623 def list(self):
624 client = self.client
David Paterson82234022015-04-12 14:07:40 -0400625 ports = [port for port in
626 client.list_ports(**self.tenant_filter)['ports']
627 if port["device_owner"] == "" or
628 port["device_owner"].startswith("compute:")]
629
David Patersond6babc52014-10-14 00:11:56 -0400630 if self.is_preserve:
631 ports = self._filter_by_conf_networks(ports)
David Paterson82234022015-04-12 14:07:40 -0400632
David Patersonce781492014-09-18 01:07:01 -0400633 LOG.debug("List count, %s Ports" % len(ports))
634 return ports
635
636 def delete(self):
637 client = self.client
638 ports = self.list()
639 for port in ports:
640 try:
641 client.delete_port(port['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400642 except Exception:
643 LOG.exception("Delete Port exception.")
David Patersonce781492014-09-18 01:07:01 -0400644
645 def dry_run(self):
646 ports = self.list()
647 self.data['ports'] = ports
648
649
David Paterson82234022015-04-12 14:07:40 -0400650class NetworkSecGroupService(NetworkService):
651 def list(self):
652 client = self.client
653 filter = self.tenant_filter
654 # cannot delete default sec group so never show it.
655 secgroups = [secgroup for secgroup in
656 client.list_security_groups(**filter)['security_groups']
657 if secgroup['name'] != 'default']
658
659 if self.is_preserve:
660 secgroups = self._filter_by_conf_networks(secgroups)
661 LOG.debug("List count, %s securtiy_groups" % len(secgroups))
662 return secgroups
663
664 def delete(self):
665 client = self.client
666 secgroups = self.list()
667 for secgroup in secgroups:
668 try:
669 client.delete_secgroup(secgroup['id'])
670 except Exception:
671 LOG.exception("Delete security_group exception.")
672
673 def dry_run(self):
674 secgroups = self.list()
675 self.data['secgroups'] = secgroups
676
677
David Patersonce781492014-09-18 01:07:01 -0400678class NetworkSubnetService(NetworkService):
679
680 def list(self):
John Warren3961acd2015-10-02 14:38:53 -0400681 client = self.subnets_client
David Paterson82234022015-04-12 14:07:40 -0400682 subnets = client.list_subnets(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400683 subnets = subnets['subnets']
David Patersond6babc52014-10-14 00:11:56 -0400684 if self.is_preserve:
685 subnets = self._filter_by_conf_networks(subnets)
David Patersonce781492014-09-18 01:07:01 -0400686 LOG.debug("List count, %s Subnets" % len(subnets))
687 return subnets
688
689 def delete(self):
John Warren3961acd2015-10-02 14:38:53 -0400690 client = self.subnets_client
David Patersonce781492014-09-18 01:07:01 -0400691 subnets = self.list()
692 for subnet in subnets:
693 try:
694 client.delete_subnet(subnet['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400695 except Exception:
696 LOG.exception("Delete Subnet exception.")
David Patersonce781492014-09-18 01:07:01 -0400697
698 def dry_run(self):
699 subnets = self.list()
700 self.data['subnets'] = subnets
701
702
703# Telemetry services
704class TelemetryAlarmService(BaseService):
705 def __init__(self, manager, **kwargs):
706 super(TelemetryAlarmService, self).__init__(kwargs)
707 self.client = manager.telemetry_client
708
709 def list(self):
710 client = self.client
David Kranz20d06f42015-02-09 14:54:15 -0500711 alarms = client.list_alarms()
David Patersonce781492014-09-18 01:07:01 -0400712 LOG.debug("List count, %s Alarms" % len(alarms))
713 return alarms
714
715 def delete(self):
716 client = self.client
717 alarms = self.list()
718 for alarm in alarms:
719 try:
720 client.delete_alarm(alarm['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400721 except Exception:
722 LOG.exception("Delete Alarms exception.")
David Patersonce781492014-09-18 01:07:01 -0400723
724 def dry_run(self):
725 alarms = self.list()
726 self.data['alarms'] = alarms
727
728
729# begin global services
730class FlavorService(BaseService):
731 def __init__(self, manager, **kwargs):
732 super(FlavorService, self).__init__(kwargs)
733 self.client = manager.flavors_client
734
735 def list(self):
736 client = self.client
ghanshyam19973be2015-08-18 15:46:42 +0900737 flavors = client.list_flavors({"is_public": None})['flavors']
David Patersonce781492014-09-18 01:07:01 -0400738 if not self.is_save_state:
739 # recreate list removing saved flavors
740 flavors = [flavor for flavor in flavors if flavor['id']
741 not in self.saved_state_json['flavors'].keys()]
742
743 if self.is_preserve:
744 flavors = [flavor for flavor in flavors
745 if flavor['id'] not in CONF_FLAVORS]
746 LOG.debug("List count, %s Flavors after reconcile" % len(flavors))
747 return flavors
748
749 def delete(self):
750 client = self.client
751 flavors = self.list()
752 for flavor in flavors:
753 try:
754 client.delete_flavor(flavor['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400755 except Exception:
756 LOG.exception("Delete Flavor exception.")
David Patersonce781492014-09-18 01:07:01 -0400757
758 def dry_run(self):
759 flavors = self.list()
760 self.data['flavors'] = flavors
761
762 def save_state(self):
763 flavors = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500764 self.data['flavors'] = {}
David Patersonce781492014-09-18 01:07:01 -0400765 for flavor in flavors:
gordon chungc15f1bc2015-02-23 18:00:41 -0500766 self.data['flavors'][flavor['id']] = flavor['name']
David Patersonce781492014-09-18 01:07:01 -0400767
768
769class ImageService(BaseService):
770 def __init__(self, manager, **kwargs):
771 super(ImageService, self).__init__(kwargs)
772 self.client = manager.images_client
773
774 def list(self):
775 client = self.client
ghanshyam1756e0b2015-08-18 19:19:05 +0900776 images = client.list_images({"all_tenants": True})['images']
David Patersonce781492014-09-18 01:07:01 -0400777 if not self.is_save_state:
778 images = [image for image in images if image['id']
779 not in self.saved_state_json['images'].keys()]
780 if self.is_preserve:
781 images = [image for image in images
782 if image['id'] not in CONF_IMAGES]
783 LOG.debug("List count, %s Images after reconcile" % len(images))
784 return images
785
786 def delete(self):
787 client = self.client
788 images = self.list()
789 for image in images:
790 try:
791 client.delete_image(image['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400792 except Exception:
793 LOG.exception("Delete Image exception.")
David Patersonce781492014-09-18 01:07:01 -0400794
795 def dry_run(self):
796 images = self.list()
797 self.data['images'] = images
798
799 def save_state(self):
gordon chungc15f1bc2015-02-23 18:00:41 -0500800 self.data['images'] = {}
David Paterson82234022015-04-12 14:07:40 -0400801 images = self.list()
David Patersonce781492014-09-18 01:07:01 -0400802 for image in images:
gordon chungc15f1bc2015-02-23 18:00:41 -0500803 self.data['images'][image['id']] = image['name']
David Patersonce781492014-09-18 01:07:01 -0400804
805
806class IdentityService(BaseService):
807 def __init__(self, manager, **kwargs):
808 super(IdentityService, self).__init__(kwargs)
809 self.client = manager.identity_client
810
811
812class UserService(IdentityService):
813
814 def list(self):
815 client = self.client
David Paterson07661de2015-10-29 20:15:04 -0700816 users = client.get_users()['users']
David Patersonce781492014-09-18 01:07:01 -0400817
818 if not self.is_save_state:
819 users = [user for user in users if user['id']
820 not in self.saved_state_json['users'].keys()]
821
822 if self.is_preserve:
823 users = [user for user in users if user['name']
824 not in CONF_USERS]
825
826 elif not self.is_save_state: # Never delete admin user
827 users = [user for user in users if user['name'] !=
David Paterson07661de2015-10-29 20:15:04 -0700828 CONF.auth.admin_username]
David Patersonce781492014-09-18 01:07:01 -0400829
830 LOG.debug("List count, %s Users after reconcile" % len(users))
831 return users
832
833 def delete(self):
834 client = self.client
835 users = self.list()
836 for user in users:
837 try:
838 client.delete_user(user['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400839 except Exception:
840 LOG.exception("Delete User exception.")
David Patersonce781492014-09-18 01:07:01 -0400841
842 def dry_run(self):
843 users = self.list()
844 self.data['users'] = users
845
846 def save_state(self):
847 users = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500848 self.data['users'] = {}
David Patersonce781492014-09-18 01:07:01 -0400849 for user in users:
gordon chungc15f1bc2015-02-23 18:00:41 -0500850 self.data['users'][user['id']] = user['name']
David Patersonce781492014-09-18 01:07:01 -0400851
852
853class RoleService(IdentityService):
854
855 def list(self):
856 client = self.client
857 try:
David Paterson07661de2015-10-29 20:15:04 -0700858 roles = client.list_roles()['roles']
David Patersonce781492014-09-18 01:07:01 -0400859 # reconcile roles with saved state and never list admin role
860 if not self.is_save_state:
861 roles = [role for role in roles if
862 (role['id'] not in
863 self.saved_state_json['roles'].keys()
864 and role['name'] != CONF.identity.admin_role)]
865 LOG.debug("List count, %s Roles after reconcile" % len(roles))
866 return roles
David Patersone41ebca2015-04-09 05:40:12 -0400867 except Exception:
868 LOG.exception("Cannot retrieve Roles.")
David Patersonce781492014-09-18 01:07:01 -0400869 return []
870
871 def delete(self):
872 client = self.client
873 roles = self.list()
874 for role in roles:
875 try:
876 client.delete_role(role['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400877 except Exception:
878 LOG.exception("Delete Role exception.")
David Patersonce781492014-09-18 01:07:01 -0400879
880 def dry_run(self):
881 roles = self.list()
882 self.data['roles'] = roles
883
884 def save_state(self):
885 roles = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500886 self.data['roles'] = {}
David Patersonce781492014-09-18 01:07:01 -0400887 for role in roles:
gordon chungc15f1bc2015-02-23 18:00:41 -0500888 self.data['roles'][role['id']] = role['name']
David Patersonce781492014-09-18 01:07:01 -0400889
890
891class TenantService(IdentityService):
892
893 def list(self):
894 client = self.client
John Warrenacf00512015-08-06 16:13:58 -0400895 tenants = client.list_tenants()['tenants']
David Patersonce781492014-09-18 01:07:01 -0400896 if not self.is_save_state:
897 tenants = [tenant for tenant in tenants if (tenant['id']
898 not in self.saved_state_json['tenants'].keys()
David Paterson07661de2015-10-29 20:15:04 -0700899 and tenant['name'] != CONF.auth.admin_tenant_name)]
David Patersonce781492014-09-18 01:07:01 -0400900
901 if self.is_preserve:
902 tenants = [tenant for tenant in tenants if tenant['name']
903 not in CONF_TENANTS]
904
905 LOG.debug("List count, %s Tenants after reconcile" % len(tenants))
906 return tenants
907
908 def delete(self):
909 client = self.client
910 tenants = self.list()
911 for tenant in tenants:
912 try:
913 client.delete_tenant(tenant['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400914 except Exception:
915 LOG.exception("Delete Tenant exception.")
David Patersonce781492014-09-18 01:07:01 -0400916
917 def dry_run(self):
918 tenants = self.list()
919 self.data['tenants'] = tenants
920
921 def save_state(self):
922 tenants = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500923 self.data['tenants'] = {}
David Patersonce781492014-09-18 01:07:01 -0400924 for tenant in tenants:
gordon chungc15f1bc2015-02-23 18:00:41 -0500925 self.data['tenants'][tenant['id']] = tenant['name']
David Patersonce781492014-09-18 01:07:01 -0400926
927
928class DomainService(BaseService):
929
930 def __init__(self, manager, **kwargs):
931 super(DomainService, self).__init__(kwargs)
932 self.client = manager.identity_v3_client
933
934 def list(self):
935 client = self.client
Thomas Bechtold48268a02015-08-30 19:37:46 +0200936 domains = client.list_domains()['domains']
David Patersonce781492014-09-18 01:07:01 -0400937 if not self.is_save_state:
938 domains = [domain for domain in domains if domain['id']
939 not in self.saved_state_json['domains'].keys()]
940
941 LOG.debug("List count, %s Domains after reconcile" % len(domains))
942 return domains
943
944 def delete(self):
945 client = self.client
946 domains = self.list()
947 for domain in domains:
948 try:
949 client.update_domain(domain['id'], enabled=False)
950 client.delete_domain(domain['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400951 except Exception:
952 LOG.exception("Delete Domain exception.")
David Patersonce781492014-09-18 01:07:01 -0400953
954 def dry_run(self):
955 domains = self.list()
956 self.data['domains'] = domains
957
958 def save_state(self):
959 domains = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500960 self.data['domains'] = {}
David Patersonce781492014-09-18 01:07:01 -0400961 for domain in domains:
gordon chungc15f1bc2015-02-23 18:00:41 -0500962 self.data['domains'][domain['id']] = domain['name']
David Patersonce781492014-09-18 01:07:01 -0400963
964
965def get_tenant_cleanup_services():
966 tenant_services = []
David Patersonce781492014-09-18 01:07:01 -0400967 if IS_CEILOMETER:
968 tenant_services.append(TelemetryAlarmService)
969 if IS_NOVA:
970 tenant_services.append(ServerService)
971 tenant_services.append(KeyPairService)
972 tenant_services.append(SecurityGroupService)
973 tenant_services.append(ServerGroupService)
974 if not IS_NEUTRON:
975 tenant_services.append(FloatingIpService)
David Paterson35c8df02015-04-05 04:35:31 -0400976 tenant_services.append(NovaQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400977 if IS_HEAT:
978 tenant_services.append(StackService)
979 if IS_NEUTRON:
David Paterson82234022015-04-12 14:07:40 -0400980 tenant_services.append(NetworkFloatingIpService)
David Patersonce781492014-09-18 01:07:01 -0400981 if test.is_extension_enabled('metering', 'network'):
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300982 tenant_services.append(NetworkMeteringLabelRuleService)
983 tenant_services.append(NetworkMeteringLabelService)
David Patersonce781492014-09-18 01:07:01 -0400984 tenant_services.append(NetworkRouterService)
David Patersonce781492014-09-18 01:07:01 -0400985 tenant_services.append(NetworkPortService)
986 tenant_services.append(NetworkSubnetService)
987 tenant_services.append(NetworkService)
David Paterson82234022015-04-12 14:07:40 -0400988 tenant_services.append(NetworkSecGroupService)
David Patersonce781492014-09-18 01:07:01 -0400989 if IS_CINDER:
990 tenant_services.append(SnapshotService)
991 tenant_services.append(VolumeService)
David Paterson35c8df02015-04-05 04:35:31 -0400992 tenant_services.append(VolumeQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400993 return tenant_services
994
995
996def get_global_cleanup_services():
997 global_services = []
998 if IS_NOVA:
999 global_services.append(FlavorService)
1000 if IS_GLANCE:
1001 global_services.append(ImageService)
1002 global_services.append(UserService)
1003 global_services.append(TenantService)
1004 global_services.append(DomainService)
1005 global_services.append(RoleService)
1006 return global_services