blob: 28ffb5697598fe83f9c622b948ba513c7171af06 [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
Andrea Frittoli (andreaf)290b3e12015-10-08 10:25:02 +010019from tempest.common import credentials_factory as credentials
Ken'ichi Ohmichi6ea3f982015-11-09 12:41:13 +000020from tempest.common import identity
David Patersonce781492014-09-18 01:07:01 -040021from tempest import config
David Patersonce781492014-09-18 01:07:01 -040022from tempest import test
23
24LOG = logging.getLogger(__name__)
25CONF = config.CONF
26
David Patersonce781492014-09-18 01:07:01 -040027CONF_FLAVORS = None
28CONF_IMAGES = None
David Patersond6babc52014-10-14 00:11:56 -040029CONF_NETWORKS = []
30CONF_PRIV_NETWORK_NAME = None
31CONF_PUB_NETWORK = None
32CONF_PUB_ROUTER = None
33CONF_TENANTS = None
34CONF_USERS = None
David Patersonce781492014-09-18 01:07:01 -040035
36IS_CEILOMETER = None
37IS_CINDER = None
38IS_GLANCE = None
39IS_HEAT = None
40IS_NEUTRON = None
41IS_NOVA = None
42
43
44def init_conf():
David Patersonce781492014-09-18 01:07:01 -040045 global CONF_FLAVORS
46 global CONF_IMAGES
David Patersond6babc52014-10-14 00:11:56 -040047 global CONF_NETWORKS
48 global CONF_PRIV_NETWORK
49 global CONF_PRIV_NETWORK_NAME
50 global CONF_PUB_NETWORK
51 global CONF_PUB_ROUTER
52 global CONF_TENANTS
53 global CONF_USERS
David Patersonce781492014-09-18 01:07:01 -040054 global IS_CEILOMETER
55 global IS_CINDER
56 global IS_GLANCE
57 global IS_HEAT
58 global IS_NEUTRON
59 global IS_NOVA
60
David Patersonce781492014-09-18 01:07:01 -040061 IS_CEILOMETER = CONF.service_available.ceilometer
62 IS_CINDER = CONF.service_available.cinder
63 IS_GLANCE = CONF.service_available.glance
64 IS_HEAT = CONF.service_available.heat
65 IS_NEUTRON = CONF.service_available.neutron
66 IS_NOVA = CONF.service_available.nova
67
David Patersond6babc52014-10-14 00:11:56 -040068 CONF_FLAVORS = [CONF.compute.flavor_ref, CONF.compute.flavor_ref_alt]
69 CONF_IMAGES = [CONF.compute.image_ref, CONF.compute.image_ref_alt]
70 CONF_PRIV_NETWORK_NAME = CONF.compute.fixed_network_name
71 CONF_PUB_NETWORK = CONF.network.public_network_id
72 CONF_PUB_ROUTER = CONF.network.public_router_id
David Paterson07661de2015-10-29 20:15:04 -070073 CONF_TENANTS = [CONF.auth.admin_tenant_name,
David Patersond6babc52014-10-14 00:11:56 -040074 CONF.identity.tenant_name,
75 CONF.identity.alt_tenant_name]
David Paterson07661de2015-10-29 20:15:04 -070076 CONF_USERS = [CONF.auth.admin_username, CONF.identity.username,
David Patersond6babc52014-10-14 00:11:56 -040077 CONF.identity.alt_username]
78
79 if IS_NEUTRON:
David Paterson82234022015-04-12 14:07:40 -040080 CONF_PRIV_NETWORK = _get_network_id(CONF.compute.fixed_network_name,
Ghanshyam41711d32016-02-17 17:11:22 +090081 CONF.auth.admin_tenant_name)
David Patersond6babc52014-10-14 00:11:56 -040082 CONF_NETWORKS = [CONF_PUB_NETWORK, CONF_PRIV_NETWORK]
83
84
David Paterson82234022015-04-12 14:07:40 -040085def _get_network_id(net_name, tenant_name):
Andrea Frittoli (andreaf)290b3e12015-10-08 10:25:02 +010086 am = credentials.AdminManager()
John Warren94d8faf2015-09-15 12:22:24 -040087 net_cl = am.networks_client
Daniel Melladob04da902015-11-20 17:43:12 +010088 tn_cl = am.tenants_client
David Patersond6babc52014-10-14 00:11:56 -040089
David Kranz34e88122014-12-11 15:24:05 -050090 networks = net_cl.list_networks()
Daniel Melladob04da902015-11-20 17:43:12 +010091 tenant = identity.get_tenant_by_name(tn_cl, tenant_name)
David Patersond6babc52014-10-14 00:11:56 -040092 t_id = tenant['id']
93 n_id = None
94 for net in networks['networks']:
David Paterson82234022015-04-12 14:07:40 -040095 if (net['tenant_id'] == t_id and net['name'] == net_name):
David Patersond6babc52014-10-14 00:11:56 -040096 n_id = net['id']
97 break
98 return n_id
99
David Patersonce781492014-09-18 01:07:01 -0400100
101class BaseService(object):
102 def __init__(self, kwargs):
103 self.client = None
104 for key, value in kwargs.items():
105 setattr(self, key, value)
106
David Paterson82234022015-04-12 14:07:40 -0400107 self.tenant_filter = {}
108 if hasattr(self, 'tenant_id'):
109 self.tenant_filter['tenant_id'] = self.tenant_id
110
David Patersonce781492014-09-18 01:07:01 -0400111 def _filter_by_tenant_id(self, item_list):
112 if (item_list is None
113 or len(item_list) == 0
114 or not hasattr(self, 'tenant_id')
115 or self.tenant_id is None
116 or 'tenant_id' not in item_list[0]):
117 return item_list
118
David Patersond6babc52014-10-14 00:11:56 -0400119 return [item for item in item_list
120 if item['tenant_id'] == self.tenant_id]
David Patersonce781492014-09-18 01:07:01 -0400121
122 def list(self):
123 pass
124
125 def delete(self):
126 pass
127
128 def dry_run(self):
129 pass
130
131 def save_state(self):
132 pass
133
134 def run(self):
135 if self.is_dry_run:
136 self.dry_run()
137 elif self.is_save_state:
138 self.save_state()
139 else:
140 self.delete()
141
142
143class SnapshotService(BaseService):
144
145 def __init__(self, manager, **kwargs):
146 super(SnapshotService, self).__init__(kwargs)
147 self.client = manager.snapshots_client
148
149 def list(self):
150 client = self.client
David Paterson07661de2015-10-29 20:15:04 -0700151 snaps = client.list_snapshots()['snapshots']
David Patersonce781492014-09-18 01:07:01 -0400152 LOG.debug("List count, %s Snapshots" % len(snaps))
153 return snaps
154
155 def delete(self):
156 snaps = self.list()
157 client = self.client
158 for snap in snaps:
159 try:
160 client.delete_snapshot(snap['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400161 except Exception:
162 LOG.exception("Delete Snapshot exception.")
David Patersonce781492014-09-18 01:07:01 -0400163
164 def dry_run(self):
165 snaps = self.list()
166 self.data['snapshots'] = snaps
167
168
169class ServerService(BaseService):
170 def __init__(self, manager, **kwargs):
171 super(ServerService, self).__init__(kwargs)
172 self.client = manager.servers_client
David Paterson07661de2015-10-29 20:15:04 -0700173 self.server_groups_client = manager.server_groups_client
David Patersonce781492014-09-18 01:07:01 -0400174
175 def list(self):
176 client = self.client
David Kranzae99b9a2015-02-16 13:37:01 -0500177 servers_body = client.list_servers()
David Patersonce781492014-09-18 01:07:01 -0400178 servers = servers_body['servers']
179 LOG.debug("List count, %s Servers" % len(servers))
180 return servers
181
182 def delete(self):
183 client = self.client
184 servers = self.list()
185 for server in servers:
186 try:
187 client.delete_server(server['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400188 except Exception:
189 LOG.exception("Delete Server exception.")
David Patersonce781492014-09-18 01:07:01 -0400190
191 def dry_run(self):
192 servers = self.list()
193 self.data['servers'] = servers
194
195
196class ServerGroupService(ServerService):
197
198 def list(self):
David Paterson07661de2015-10-29 20:15:04 -0700199 client = self.server_groups_client
ghanshyam2dc13452015-08-24 17:39:25 +0900200 sgs = client.list_server_groups()['server_groups']
David Patersonce781492014-09-18 01:07:01 -0400201 LOG.debug("List count, %s Server Groups" % len(sgs))
202 return sgs
203
204 def delete(self):
205 client = self.client
206 sgs = self.list()
207 for sg in sgs:
208 try:
209 client.delete_server_group(sg['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400210 except Exception:
211 LOG.exception("Delete Server Group exception.")
David Patersonce781492014-09-18 01:07:01 -0400212
213 def dry_run(self):
214 sgs = self.list()
215 self.data['server_groups'] = sgs
216
217
218class StackService(BaseService):
219 def __init__(self, manager, **kwargs):
220 super(StackService, self).__init__(kwargs)
221 self.client = manager.orchestration_client
222
223 def list(self):
224 client = self.client
Anusha Ramineniab6c3a32015-08-18 08:33:09 +0530225 stacks = client.list_stacks()['stacks']
David Patersonce781492014-09-18 01:07:01 -0400226 LOG.debug("List count, %s Stacks" % len(stacks))
227 return stacks
228
229 def delete(self):
230 client = self.client
231 stacks = self.list()
232 for stack in stacks:
233 try:
234 client.delete_stack(stack['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400235 except Exception:
236 LOG.exception("Delete Stack exception.")
David Patersonce781492014-09-18 01:07:01 -0400237
238 def dry_run(self):
239 stacks = self.list()
240 self.data['stacks'] = stacks
241
242
243class KeyPairService(BaseService):
244 def __init__(self, manager, **kwargs):
245 super(KeyPairService, self).__init__(kwargs)
246 self.client = manager.keypairs_client
247
248 def list(self):
249 client = self.client
ghanshyamdee01f22015-08-17 11:41:47 +0900250 keypairs = client.list_keypairs()['keypairs']
David Patersonce781492014-09-18 01:07:01 -0400251 LOG.debug("List count, %s Keypairs" % len(keypairs))
252 return keypairs
253
254 def delete(self):
255 client = self.client
256 keypairs = self.list()
257 for k in keypairs:
258 try:
259 name = k['keypair']['name']
260 client.delete_keypair(name)
David Patersone41ebca2015-04-09 05:40:12 -0400261 except Exception:
262 LOG.exception("Delete Keypairs exception.")
David Patersonce781492014-09-18 01:07:01 -0400263
264 def dry_run(self):
265 keypairs = self.list()
266 self.data['keypairs'] = keypairs
267
268
269class SecurityGroupService(BaseService):
270 def __init__(self, manager, **kwargs):
271 super(SecurityGroupService, self).__init__(kwargs)
John Warrenf2345512015-12-10 13:39:30 -0500272 self.client = manager.compute_security_groups_client
David Patersonce781492014-09-18 01:07:01 -0400273
274 def list(self):
275 client = self.client
ghanshyamb610b772015-08-24 17:29:38 +0900276 secgrps = client.list_security_groups()['security_groups']
David Patersonce781492014-09-18 01:07:01 -0400277 secgrp_del = [grp for grp in secgrps if grp['name'] != 'default']
278 LOG.debug("List count, %s Security Groups" % len(secgrp_del))
279 return secgrp_del
280
281 def delete(self):
282 client = self.client
283 secgrp_del = self.list()
284 for g in secgrp_del:
285 try:
286 client.delete_security_group(g['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400287 except Exception:
288 LOG.exception("Delete Security Groups exception.")
David Patersonce781492014-09-18 01:07:01 -0400289
290 def dry_run(self):
291 secgrp_del = self.list()
292 self.data['security_groups'] = secgrp_del
293
294
295class FloatingIpService(BaseService):
296 def __init__(self, manager, **kwargs):
297 super(FloatingIpService, self).__init__(kwargs)
John Warrene74890a2015-11-11 15:18:01 -0500298 self.client = manager.compute_floating_ips_client
David Patersonce781492014-09-18 01:07:01 -0400299
300 def list(self):
301 client = self.client
ghanshyam9a3a9a22015-08-18 17:03:55 +0900302 floating_ips = client.list_floating_ips()['floating_ips']
David Patersonce781492014-09-18 01:07:01 -0400303 LOG.debug("List count, %s Floating IPs" % len(floating_ips))
304 return floating_ips
305
306 def delete(self):
307 client = self.client
308 floating_ips = self.list()
309 for f in floating_ips:
310 try:
311 client.delete_floating_ip(f['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400312 except Exception:
313 LOG.exception("Delete Floating IPs exception.")
David Patersonce781492014-09-18 01:07:01 -0400314
315 def dry_run(self):
316 floating_ips = self.list()
317 self.data['floating_ips'] = floating_ips
318
319
320class VolumeService(BaseService):
321 def __init__(self, manager, **kwargs):
322 super(VolumeService, self).__init__(kwargs)
323 self.client = manager.volumes_client
324
325 def list(self):
326 client = self.client
John Warren6177c9e2015-08-19 20:00:17 +0000327 vols = client.list_volumes()['volumes']
David Patersonce781492014-09-18 01:07:01 -0400328 LOG.debug("List count, %s Volumes" % len(vols))
329 return vols
330
331 def delete(self):
332 client = self.client
333 vols = self.list()
334 for v in vols:
335 try:
336 client.delete_volume(v['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400337 except Exception:
338 LOG.exception("Delete Volume exception.")
David Patersonce781492014-09-18 01:07:01 -0400339
340 def dry_run(self):
341 vols = self.list()
342 self.data['volumes'] = vols
343
344
David Paterson35c8df02015-04-05 04:35:31 -0400345class VolumeQuotaService(BaseService):
346 def __init__(self, manager, **kwargs):
347 super(VolumeQuotaService, self).__init__(kwargs)
348 self.client = manager.volume_quotas_client
349
350 def delete(self):
351 client = self.client
352 try:
353 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400354 except Exception:
355 LOG.exception("Delete Volume Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400356
357 def dry_run(self):
ghanshyam08a73f92015-08-31 17:32:49 +0900358 quotas = self.client.show_quota_usage(self.tenant_id)['quota_set']
David Paterson35c8df02015-04-05 04:35:31 -0400359 self.data['volume_quotas'] = quotas
360
361
362class NovaQuotaService(BaseService):
363 def __init__(self, manager, **kwargs):
364 super(NovaQuotaService, self).__init__(kwargs)
365 self.client = manager.quotas_client
366 self.limits_client = manager.limits_client
367
368 def delete(self):
369 client = self.client
370 try:
371 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400372 except Exception:
373 LOG.exception("Delete Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400374
375 def dry_run(self):
376 client = self.limits_client
ghanshyam8a599492015-08-24 15:55:59 +0900377 quotas = client.show_limits()['limits']
Ken'ichi Ohmichib93e6762015-06-15 07:11:29 +0000378 self.data['compute_quotas'] = quotas['absolute']
David Paterson35c8df02015-04-05 04:35:31 -0400379
380
David Patersonce781492014-09-18 01:07:01 -0400381# Begin network service classes
382class NetworkService(BaseService):
383 def __init__(self, manager, **kwargs):
384 super(NetworkService, self).__init__(kwargs)
385 self.client = manager.network_client
John Warren94d8faf2015-09-15 12:22:24 -0400386 self.networks_client = manager.networks_client
John Warren3961acd2015-10-02 14:38:53 -0400387 self.subnets_client = manager.subnets_client
John Warren49c0fe52015-10-22 12:35:54 -0400388 self.ports_client = manager.ports_client
John Warrenfbf2a892015-11-17 12:36:14 -0500389 self.floating_ips_client = manager.floating_ips_client
John Warren6d0083a2015-11-30 18:12:30 -0500390 self.metering_labels_client = manager.metering_labels_client
John Warrendd20b3e2015-12-03 13:11:28 -0500391 self.metering_label_rules_client = manager.metering_label_rules_client
John Warrenf9606e92015-12-10 12:12:42 -0500392 self.security_groups_client = manager.security_groups_client
David Patersonce781492014-09-18 01:07:01 -0400393
David Patersond6babc52014-10-14 00:11:56 -0400394 def _filter_by_conf_networks(self, item_list):
395 if not item_list or not all(('network_id' in i for i in item_list)):
396 return item_list
397
398 return [item for item in item_list if item['network_id']
399 not in CONF_NETWORKS]
400
David Patersonce781492014-09-18 01:07:01 -0400401 def list(self):
John Warren94d8faf2015-09-15 12:22:24 -0400402 client = self.networks_client
David Paterson82234022015-04-12 14:07:40 -0400403 networks = client.list_networks(**self.tenant_filter)
404 networks = networks['networks']
David Patersonce781492014-09-18 01:07:01 -0400405 # filter out networks declared in tempest.conf
406 if self.is_preserve:
407 networks = [network for network in networks
David Patersond6babc52014-10-14 00:11:56 -0400408 if network['id'] not in CONF_NETWORKS]
David Patersonce781492014-09-18 01:07:01 -0400409 LOG.debug("List count, %s Networks" % networks)
410 return networks
411
412 def delete(self):
John Warren94d8faf2015-09-15 12:22:24 -0400413 client = self.networks_client
David Patersonce781492014-09-18 01:07:01 -0400414 networks = self.list()
415 for n in networks:
416 try:
417 client.delete_network(n['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400418 except Exception:
419 LOG.exception("Delete Network exception.")
David Patersonce781492014-09-18 01:07:01 -0400420
421 def dry_run(self):
422 networks = self.list()
423 self.data['networks'] = networks
424
425
David Patersonce781492014-09-18 01:07:01 -0400426class NetworkFloatingIpService(NetworkService):
427
428 def list(self):
John Warrenfbf2a892015-11-17 12:36:14 -0500429 client = self.floating_ips_client
David Paterson82234022015-04-12 14:07:40 -0400430 flips = client.list_floatingips(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400431 flips = flips['floatingips']
David Patersonce781492014-09-18 01:07:01 -0400432 LOG.debug("List count, %s Network Floating IPs" % len(flips))
433 return flips
434
435 def delete(self):
436 client = self.client
437 flips = self.list()
438 for flip in flips:
439 try:
440 client.delete_floatingip(flip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400441 except Exception:
442 LOG.exception("Delete Network Floating IP exception.")
David Patersonce781492014-09-18 01:07:01 -0400443
444 def dry_run(self):
445 flips = self.list()
446 self.data['floating_ips'] = flips
447
448
449class NetworkRouterService(NetworkService):
450
451 def list(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000452 client = self.routers_client
David Paterson82234022015-04-12 14:07:40 -0400453 routers = client.list_routers(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400454 routers = routers['routers']
David Patersonce781492014-09-18 01:07:01 -0400455 if self.is_preserve:
456 routers = [router for router in routers
457 if router['id'] != CONF_PUB_ROUTER]
458
459 LOG.debug("List count, %s Routers" % len(routers))
460 return routers
461
462 def delete(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000463 client = self.routers_client
David Patersonce781492014-09-18 01:07:01 -0400464 routers = self.list()
465 for router in routers:
466 try:
467 rid = router['id']
David Paterson82234022015-04-12 14:07:40 -0400468 ports = [port for port
469 in client.list_router_interfaces(rid)['ports']
470 if port["device_owner"] == "network:router_interface"]
David Patersonce781492014-09-18 01:07:01 -0400471 for port in ports:
piyush11078694aca952015-12-17 12:54:44 +0530472 client.remove_router_interface(rid, port_id=port['id'])
David Patersond6babc52014-10-14 00:11:56 -0400473 client.delete_router(rid)
David Patersone41ebca2015-04-09 05:40:12 -0400474 except Exception:
475 LOG.exception("Delete Router exception.")
David Patersonce781492014-09-18 01:07:01 -0400476
477 def dry_run(self):
478 routers = self.list()
479 self.data['routers'] = routers
480
481
482class NetworkHealthMonitorService(NetworkService):
483
484 def list(self):
485 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500486 hms = client.list_health_monitors()
David Patersonce781492014-09-18 01:07:01 -0400487 hms = hms['health_monitors']
488 hms = self._filter_by_tenant_id(hms)
489 LOG.debug("List count, %s Health Monitors" % len(hms))
490 return hms
491
492 def delete(self):
493 client = self.client
494 hms = self.list()
495 for hm in hms:
496 try:
497 client.delete_health_monitor(hm['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400498 except Exception:
499 LOG.exception("Delete Health Monitor exception.")
David Patersonce781492014-09-18 01:07:01 -0400500
501 def dry_run(self):
502 hms = self.list()
503 self.data['health_monitors'] = hms
504
505
506class NetworkMemberService(NetworkService):
507
508 def list(self):
509 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500510 members = client.list_members()
David Patersonce781492014-09-18 01:07:01 -0400511 members = members['members']
512 members = self._filter_by_tenant_id(members)
513 LOG.debug("List count, %s Members" % len(members))
514 return members
515
516 def delete(self):
517 client = self.client
518 members = self.list()
519 for member in members:
520 try:
521 client.delete_member(member['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400522 except Exception:
523 LOG.exception("Delete Member exception.")
David Patersonce781492014-09-18 01:07:01 -0400524
525 def dry_run(self):
526 members = self.list()
527 self.data['members'] = members
528
529
530class NetworkVipService(NetworkService):
531
532 def list(self):
533 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500534 vips = client.list_vips()
David Patersonce781492014-09-18 01:07:01 -0400535 vips = vips['vips']
536 vips = self._filter_by_tenant_id(vips)
537 LOG.debug("List count, %s VIPs" % len(vips))
538 return vips
539
540 def delete(self):
541 client = self.client
542 vips = self.list()
543 for vip in vips:
544 try:
545 client.delete_vip(vip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400546 except Exception:
547 LOG.exception("Delete VIP exception.")
David Patersonce781492014-09-18 01:07:01 -0400548
549 def dry_run(self):
550 vips = self.list()
551 self.data['vips'] = vips
552
553
554class NetworkPoolService(NetworkService):
555
556 def list(self):
557 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500558 pools = client.list_pools()
David Patersonce781492014-09-18 01:07:01 -0400559 pools = pools['pools']
560 pools = self._filter_by_tenant_id(pools)
561 LOG.debug("List count, %s Pools" % len(pools))
562 return pools
563
564 def delete(self):
565 client = self.client
566 pools = self.list()
567 for pool in pools:
568 try:
569 client.delete_pool(pool['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400570 except Exception:
571 LOG.exception("Delete Pool exception.")
David Patersonce781492014-09-18 01:07:01 -0400572
573 def dry_run(self):
574 pools = self.list()
575 self.data['pools'] = pools
576
577
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300578class NetworkMeteringLabelRuleService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400579
580 def list(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500581 client = self.metering_label_rules_client
David Kranz34e88122014-12-11 15:24:05 -0500582 rules = client.list_metering_label_rules()
David Patersonce781492014-09-18 01:07:01 -0400583 rules = rules['metering_label_rules']
584 rules = self._filter_by_tenant_id(rules)
585 LOG.debug("List count, %s Metering Label Rules" % len(rules))
586 return rules
587
588 def delete(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500589 client = self.metering_label_rules_client
David Patersonce781492014-09-18 01:07:01 -0400590 rules = self.list()
591 for rule in rules:
592 try:
593 client.delete_metering_label_rule(rule['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400594 except Exception:
595 LOG.exception("Delete Metering Label Rule exception.")
David Patersonce781492014-09-18 01:07:01 -0400596
597 def dry_run(self):
598 rules = self.list()
599 self.data['rules'] = rules
600
601
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300602class NetworkMeteringLabelService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400603
604 def list(self):
John Warren6d0083a2015-11-30 18:12:30 -0500605 client = self.metering_labels_client
David Kranz34e88122014-12-11 15:24:05 -0500606 labels = client.list_metering_labels()
David Patersonce781492014-09-18 01:07:01 -0400607 labels = labels['metering_labels']
608 labels = self._filter_by_tenant_id(labels)
609 LOG.debug("List count, %s Metering Labels" % len(labels))
610 return labels
611
612 def delete(self):
John Warren6d0083a2015-11-30 18:12:30 -0500613 client = self.metering_labels_client
David Patersonce781492014-09-18 01:07:01 -0400614 labels = self.list()
615 for label in labels:
616 try:
617 client.delete_metering_label(label['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400618 except Exception:
619 LOG.exception("Delete Metering Label exception.")
David Patersonce781492014-09-18 01:07:01 -0400620
621 def dry_run(self):
622 labels = self.list()
623 self.data['labels'] = labels
624
625
626class NetworkPortService(NetworkService):
627
628 def list(self):
John Warren49c0fe52015-10-22 12:35:54 -0400629 client = self.ports_client
David Paterson82234022015-04-12 14:07:40 -0400630 ports = [port for port in
631 client.list_ports(**self.tenant_filter)['ports']
632 if port["device_owner"] == "" or
633 port["device_owner"].startswith("compute:")]
634
David Patersond6babc52014-10-14 00:11:56 -0400635 if self.is_preserve:
636 ports = self._filter_by_conf_networks(ports)
David Paterson82234022015-04-12 14:07:40 -0400637
David Patersonce781492014-09-18 01:07:01 -0400638 LOG.debug("List count, %s Ports" % len(ports))
639 return ports
640
641 def delete(self):
John Warren49c0fe52015-10-22 12:35:54 -0400642 client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400643 ports = self.list()
644 for port in ports:
645 try:
646 client.delete_port(port['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400647 except Exception:
648 LOG.exception("Delete Port exception.")
David Patersonce781492014-09-18 01:07:01 -0400649
650 def dry_run(self):
651 ports = self.list()
652 self.data['ports'] = ports
653
654
David Paterson82234022015-04-12 14:07:40 -0400655class NetworkSecGroupService(NetworkService):
656 def list(self):
John Warrenf9606e92015-12-10 12:12:42 -0500657 client = self.security_groups_client
David Paterson82234022015-04-12 14:07:40 -0400658 filter = self.tenant_filter
659 # cannot delete default sec group so never show it.
660 secgroups = [secgroup for secgroup in
661 client.list_security_groups(**filter)['security_groups']
662 if secgroup['name'] != 'default']
663
664 if self.is_preserve:
665 secgroups = self._filter_by_conf_networks(secgroups)
666 LOG.debug("List count, %s securtiy_groups" % len(secgroups))
667 return secgroups
668
669 def delete(self):
670 client = self.client
671 secgroups = self.list()
672 for secgroup in secgroups:
673 try:
674 client.delete_secgroup(secgroup['id'])
675 except Exception:
676 LOG.exception("Delete security_group exception.")
677
678 def dry_run(self):
679 secgroups = self.list()
680 self.data['secgroups'] = secgroups
681
682
David Patersonce781492014-09-18 01:07:01 -0400683class NetworkSubnetService(NetworkService):
684
685 def list(self):
John Warren3961acd2015-10-02 14:38:53 -0400686 client = self.subnets_client
David Paterson82234022015-04-12 14:07:40 -0400687 subnets = client.list_subnets(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400688 subnets = subnets['subnets']
David Patersond6babc52014-10-14 00:11:56 -0400689 if self.is_preserve:
690 subnets = self._filter_by_conf_networks(subnets)
David Patersonce781492014-09-18 01:07:01 -0400691 LOG.debug("List count, %s Subnets" % len(subnets))
692 return subnets
693
694 def delete(self):
John Warren3961acd2015-10-02 14:38:53 -0400695 client = self.subnets_client
David Patersonce781492014-09-18 01:07:01 -0400696 subnets = self.list()
697 for subnet in subnets:
698 try:
699 client.delete_subnet(subnet['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400700 except Exception:
701 LOG.exception("Delete Subnet exception.")
David Patersonce781492014-09-18 01:07:01 -0400702
703 def dry_run(self):
704 subnets = self.list()
705 self.data['subnets'] = subnets
706
707
708# Telemetry services
709class TelemetryAlarmService(BaseService):
710 def __init__(self, manager, **kwargs):
711 super(TelemetryAlarmService, self).__init__(kwargs)
712 self.client = manager.telemetry_client
713
714 def list(self):
715 client = self.client
David Kranz20d06f42015-02-09 14:54:15 -0500716 alarms = client.list_alarms()
David Patersonce781492014-09-18 01:07:01 -0400717 LOG.debug("List count, %s Alarms" % len(alarms))
718 return alarms
719
720 def delete(self):
721 client = self.client
722 alarms = self.list()
723 for alarm in alarms:
724 try:
725 client.delete_alarm(alarm['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400726 except Exception:
727 LOG.exception("Delete Alarms exception.")
David Patersonce781492014-09-18 01:07:01 -0400728
729 def dry_run(self):
730 alarms = self.list()
731 self.data['alarms'] = alarms
732
733
734# begin global services
735class FlavorService(BaseService):
736 def __init__(self, manager, **kwargs):
737 super(FlavorService, self).__init__(kwargs)
738 self.client = manager.flavors_client
739
740 def list(self):
741 client = self.client
ghanshyam19973be2015-08-18 15:46:42 +0900742 flavors = client.list_flavors({"is_public": None})['flavors']
David Patersonce781492014-09-18 01:07:01 -0400743 if not self.is_save_state:
744 # recreate list removing saved flavors
745 flavors = [flavor for flavor in flavors if flavor['id']
746 not in self.saved_state_json['flavors'].keys()]
747
748 if self.is_preserve:
749 flavors = [flavor for flavor in flavors
750 if flavor['id'] not in CONF_FLAVORS]
751 LOG.debug("List count, %s Flavors after reconcile" % len(flavors))
752 return flavors
753
754 def delete(self):
755 client = self.client
756 flavors = self.list()
757 for flavor in flavors:
758 try:
759 client.delete_flavor(flavor['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400760 except Exception:
761 LOG.exception("Delete Flavor exception.")
David Patersonce781492014-09-18 01:07:01 -0400762
763 def dry_run(self):
764 flavors = self.list()
765 self.data['flavors'] = flavors
766
767 def save_state(self):
768 flavors = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500769 self.data['flavors'] = {}
David Patersonce781492014-09-18 01:07:01 -0400770 for flavor in flavors:
gordon chungc15f1bc2015-02-23 18:00:41 -0500771 self.data['flavors'][flavor['id']] = flavor['name']
David Patersonce781492014-09-18 01:07:01 -0400772
773
774class ImageService(BaseService):
775 def __init__(self, manager, **kwargs):
776 super(ImageService, self).__init__(kwargs)
Ghanshyamae76c122015-12-22 13:41:35 +0900777 self.client = manager.compute_images_client
David Patersonce781492014-09-18 01:07:01 -0400778
779 def list(self):
780 client = self.client
ghanshyam1756e0b2015-08-18 19:19:05 +0900781 images = client.list_images({"all_tenants": True})['images']
David Patersonce781492014-09-18 01:07:01 -0400782 if not self.is_save_state:
783 images = [image for image in images if image['id']
784 not in self.saved_state_json['images'].keys()]
785 if self.is_preserve:
786 images = [image for image in images
787 if image['id'] not in CONF_IMAGES]
788 LOG.debug("List count, %s Images after reconcile" % len(images))
789 return images
790
791 def delete(self):
792 client = self.client
793 images = self.list()
794 for image in images:
795 try:
796 client.delete_image(image['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400797 except Exception:
798 LOG.exception("Delete Image exception.")
David Patersonce781492014-09-18 01:07:01 -0400799
800 def dry_run(self):
801 images = self.list()
802 self.data['images'] = images
803
804 def save_state(self):
gordon chungc15f1bc2015-02-23 18:00:41 -0500805 self.data['images'] = {}
David Paterson82234022015-04-12 14:07:40 -0400806 images = self.list()
David Patersonce781492014-09-18 01:07:01 -0400807 for image in images:
gordon chungc15f1bc2015-02-23 18:00:41 -0500808 self.data['images'][image['id']] = image['name']
David Patersonce781492014-09-18 01:07:01 -0400809
810
811class IdentityService(BaseService):
812 def __init__(self, manager, **kwargs):
813 super(IdentityService, self).__init__(kwargs)
814 self.client = manager.identity_client
815
816
Daniel Mellado82c83a52015-12-09 15:16:49 +0000817class UserService(BaseService):
818
819 def __init__(self, manager, **kwargs):
820 super(UserService, self).__init__(kwargs)
821 self.client = manager.users_client
David Patersonce781492014-09-18 01:07:01 -0400822
823 def list(self):
Daniel Mellado82c83a52015-12-09 15:16:49 +0000824 users = self.client.list_users()['users']
David Patersonce781492014-09-18 01:07:01 -0400825
826 if not self.is_save_state:
827 users = [user for user in users if user['id']
828 not in self.saved_state_json['users'].keys()]
829
830 if self.is_preserve:
831 users = [user for user in users if user['name']
832 not in CONF_USERS]
833
834 elif not self.is_save_state: # Never delete admin user
835 users = [user for user in users if user['name'] !=
David Paterson07661de2015-10-29 20:15:04 -0700836 CONF.auth.admin_username]
David Patersonce781492014-09-18 01:07:01 -0400837
838 LOG.debug("List count, %s Users after reconcile" % len(users))
839 return users
840
841 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400842 users = self.list()
843 for user in users:
844 try:
Daniel Mellado82c83a52015-12-09 15:16:49 +0000845 self.client.delete_user(user['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400846 except Exception:
847 LOG.exception("Delete User exception.")
David Patersonce781492014-09-18 01:07:01 -0400848
849 def dry_run(self):
850 users = self.list()
851 self.data['users'] = users
852
853 def save_state(self):
854 users = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500855 self.data['users'] = {}
David Patersonce781492014-09-18 01:07:01 -0400856 for user in users:
gordon chungc15f1bc2015-02-23 18:00:41 -0500857 self.data['users'][user['id']] = user['name']
David Patersonce781492014-09-18 01:07:01 -0400858
859
Daniel Melladob83ea562015-12-18 09:12:49 +0000860class RoleService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400861
Daniel Mellado6b16b922015-12-07 12:43:08 +0000862 def __init__(self, manager, **kwargs):
863 super(RoleService, self).__init__(kwargs)
864 self.client = manager.roles_client
865
David Patersonce781492014-09-18 01:07:01 -0400866 def list(self):
David Patersonce781492014-09-18 01:07:01 -0400867 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000868 roles = self.client.list_roles()['roles']
David Patersonce781492014-09-18 01:07:01 -0400869 # reconcile roles with saved state and never list admin role
870 if not self.is_save_state:
871 roles = [role for role in roles if
872 (role['id'] not in
873 self.saved_state_json['roles'].keys()
874 and role['name'] != CONF.identity.admin_role)]
875 LOG.debug("List count, %s Roles after reconcile" % len(roles))
876 return roles
David Patersone41ebca2015-04-09 05:40:12 -0400877 except Exception:
878 LOG.exception("Cannot retrieve Roles.")
David Patersonce781492014-09-18 01:07:01 -0400879 return []
880
881 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400882 roles = self.list()
883 for role in roles:
884 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000885 self.client.delete_role(role['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400886 except Exception:
887 LOG.exception("Delete Role exception.")
David Patersonce781492014-09-18 01:07:01 -0400888
889 def dry_run(self):
890 roles = self.list()
891 self.data['roles'] = roles
892
893 def save_state(self):
894 roles = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500895 self.data['roles'] = {}
David Patersonce781492014-09-18 01:07:01 -0400896 for role in roles:
gordon chungc15f1bc2015-02-23 18:00:41 -0500897 self.data['roles'][role['id']] = role['name']
David Patersonce781492014-09-18 01:07:01 -0400898
899
Daniel Melladob83ea562015-12-18 09:12:49 +0000900class TenantService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400901
Daniel Melladob04da902015-11-20 17:43:12 +0100902 def __init__(self, manager, **kwargs):
903 super(TenantService, self).__init__(kwargs)
904 self.client = manager.tenants_client
905
David Patersonce781492014-09-18 01:07:01 -0400906 def list(self):
Daniel Melladob04da902015-11-20 17:43:12 +0100907 tenants = self.client.list_tenants()['tenants']
David Patersonce781492014-09-18 01:07:01 -0400908 if not self.is_save_state:
909 tenants = [tenant for tenant in tenants if (tenant['id']
910 not in self.saved_state_json['tenants'].keys()
David Paterson07661de2015-10-29 20:15:04 -0700911 and tenant['name'] != CONF.auth.admin_tenant_name)]
David Patersonce781492014-09-18 01:07:01 -0400912
913 if self.is_preserve:
914 tenants = [tenant for tenant in tenants if tenant['name']
915 not in CONF_TENANTS]
916
917 LOG.debug("List count, %s Tenants after reconcile" % len(tenants))
918 return tenants
919
920 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400921 tenants = self.list()
922 for tenant in tenants:
923 try:
Daniel Melladob04da902015-11-20 17:43:12 +0100924 self.client.delete_tenant(tenant['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400925 except Exception:
926 LOG.exception("Delete Tenant exception.")
David Patersonce781492014-09-18 01:07:01 -0400927
928 def dry_run(self):
929 tenants = self.list()
930 self.data['tenants'] = tenants
931
932 def save_state(self):
933 tenants = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500934 self.data['tenants'] = {}
David Patersonce781492014-09-18 01:07:01 -0400935 for tenant in tenants:
gordon chungc15f1bc2015-02-23 18:00:41 -0500936 self.data['tenants'][tenant['id']] = tenant['name']
David Patersonce781492014-09-18 01:07:01 -0400937
938
939class DomainService(BaseService):
940
941 def __init__(self, manager, **kwargs):
942 super(DomainService, self).__init__(kwargs)
Daniel Mellado91a26b62016-02-11 11:13:04 +0000943 self.client = manager.domains_client
David Patersonce781492014-09-18 01:07:01 -0400944
945 def list(self):
946 client = self.client
Thomas Bechtold48268a02015-08-30 19:37:46 +0200947 domains = client.list_domains()['domains']
David Patersonce781492014-09-18 01:07:01 -0400948 if not self.is_save_state:
949 domains = [domain for domain in domains if domain['id']
950 not in self.saved_state_json['domains'].keys()]
951
952 LOG.debug("List count, %s Domains after reconcile" % len(domains))
953 return domains
954
955 def delete(self):
956 client = self.client
957 domains = self.list()
958 for domain in domains:
959 try:
960 client.update_domain(domain['id'], enabled=False)
961 client.delete_domain(domain['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400962 except Exception:
963 LOG.exception("Delete Domain exception.")
David Patersonce781492014-09-18 01:07:01 -0400964
965 def dry_run(self):
966 domains = self.list()
967 self.data['domains'] = domains
968
969 def save_state(self):
970 domains = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500971 self.data['domains'] = {}
David Patersonce781492014-09-18 01:07:01 -0400972 for domain in domains:
gordon chungc15f1bc2015-02-23 18:00:41 -0500973 self.data['domains'][domain['id']] = domain['name']
David Patersonce781492014-09-18 01:07:01 -0400974
975
976def get_tenant_cleanup_services():
977 tenant_services = []
David Patersonce781492014-09-18 01:07:01 -0400978 if IS_CEILOMETER:
979 tenant_services.append(TelemetryAlarmService)
980 if IS_NOVA:
981 tenant_services.append(ServerService)
982 tenant_services.append(KeyPairService)
983 tenant_services.append(SecurityGroupService)
984 tenant_services.append(ServerGroupService)
985 if not IS_NEUTRON:
986 tenant_services.append(FloatingIpService)
David Paterson35c8df02015-04-05 04:35:31 -0400987 tenant_services.append(NovaQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400988 if IS_HEAT:
989 tenant_services.append(StackService)
990 if IS_NEUTRON:
David Paterson82234022015-04-12 14:07:40 -0400991 tenant_services.append(NetworkFloatingIpService)
David Patersonce781492014-09-18 01:07:01 -0400992 if test.is_extension_enabled('metering', 'network'):
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300993 tenant_services.append(NetworkMeteringLabelRuleService)
994 tenant_services.append(NetworkMeteringLabelService)
David Patersonce781492014-09-18 01:07:01 -0400995 tenant_services.append(NetworkRouterService)
David Patersonce781492014-09-18 01:07:01 -0400996 tenant_services.append(NetworkPortService)
997 tenant_services.append(NetworkSubnetService)
998 tenant_services.append(NetworkService)
David Paterson82234022015-04-12 14:07:40 -0400999 tenant_services.append(NetworkSecGroupService)
David Patersonce781492014-09-18 01:07:01 -04001000 if IS_CINDER:
1001 tenant_services.append(SnapshotService)
1002 tenant_services.append(VolumeService)
David Paterson35c8df02015-04-05 04:35:31 -04001003 tenant_services.append(VolumeQuotaService)
David Patersonce781492014-09-18 01:07:01 -04001004 return tenant_services
1005
1006
1007def get_global_cleanup_services():
1008 global_services = []
1009 if IS_NOVA:
1010 global_services.append(FlavorService)
1011 if IS_GLANCE:
1012 global_services.append(ImageService)
1013 global_services.append(UserService)
1014 global_services.append(TenantService)
1015 global_services.append(DomainService)
1016 global_services.append(RoleService)
1017 return global_services