blob: 6e7789aa6a0514937d304d45cf08673bef78ea13 [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
ghanshyam009a1f62017-08-08 10:22:57 +030019from tempest import clients
Andrea Frittoli (andreaf)290b3e12015-10-08 10:25:02 +010020from tempest.common import credentials_factory as credentials
Ken'ichi Ohmichi6ea3f982015-11-09 12:41:13 +000021from tempest.common import identity
Andrea Frittolicd368412017-08-14 21:37:56 +010022from tempest.common import utils
Attila Fazekasd7e08a62016-10-07 13:05:05 +020023from tempest.common.utils import net_info
David Patersonce781492014-09-18 01:07:01 -040024from tempest import config
David Patersonce781492014-09-18 01:07:01 -040025
26LOG = logging.getLogger(__name__)
27CONF = config.CONF
28
David Patersonce781492014-09-18 01:07:01 -040029CONF_FLAVORS = None
30CONF_IMAGES = None
David Patersond6babc52014-10-14 00:11:56 -040031CONF_NETWORKS = []
32CONF_PRIV_NETWORK_NAME = None
33CONF_PUB_NETWORK = None
34CONF_PUB_ROUTER = None
Arx Cruz05fe4bc2017-10-20 10:48:28 +020035CONF_PROJECTS = None
David Patersond6babc52014-10-14 00:11:56 -040036CONF_USERS = None
David Patersonce781492014-09-18 01:07:01 -040037
David Patersonce781492014-09-18 01:07:01 -040038IS_CINDER = None
39IS_GLANCE = None
David Patersonce781492014-09-18 01:07:01 -040040IS_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
Arx Cruz05fe4bc2017-10-20 10:48:28 +020052 global CONF_PROJECTS
David Patersond6babc52014-10-14 00:11:56 -040053 global CONF_USERS
David Patersonce781492014-09-18 01:07:01 -040054 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_CINDER = CONF.service_available.cinder
61 IS_GLANCE = CONF.service_available.glance
David Patersonce781492014-09-18 01:07:01 -040062 IS_NEUTRON = CONF.service_available.neutron
63 IS_NOVA = CONF.service_available.nova
64
David Patersond6babc52014-10-14 00:11:56 -040065 CONF_FLAVORS = [CONF.compute.flavor_ref, CONF.compute.flavor_ref_alt]
66 CONF_IMAGES = [CONF.compute.image_ref, CONF.compute.image_ref_alt]
67 CONF_PRIV_NETWORK_NAME = CONF.compute.fixed_network_name
68 CONF_PUB_NETWORK = CONF.network.public_network_id
69 CONF_PUB_ROUTER = CONF.network.public_router_id
Arx Cruz05fe4bc2017-10-20 10:48:28 +020070 CONF_PROJECTS = [CONF.auth.admin_project_name]
Jeffrey Zhangb5e23212016-07-06 14:18:53 +080071 CONF_USERS = [CONF.auth.admin_username]
David Patersond6babc52014-10-14 00:11:56 -040072
73 if IS_NEUTRON:
David Paterson82234022015-04-12 14:07:40 -040074 CONF_PRIV_NETWORK = _get_network_id(CONF.compute.fixed_network_name,
Daniel Melladod4d0b932016-04-08 08:57:29 +000075 CONF.auth.admin_project_name)
David Patersond6babc52014-10-14 00:11:56 -040076 CONF_NETWORKS = [CONF_PUB_NETWORK, CONF_PRIV_NETWORK]
77
78
Daniel Melladod4d0b932016-04-08 08:57:29 +000079def _get_network_id(net_name, project_name):
ghanshyam009a1f62017-08-08 10:22:57 +030080 am = clients.Manager(
81 credentials.get_configured_admin_credentials())
John Warren94d8faf2015-09-15 12:22:24 -040082 net_cl = am.networks_client
Arx Cruz05fe4bc2017-10-20 10:48:28 +020083 pr_cl = am.projects_client
David Patersond6babc52014-10-14 00:11:56 -040084
David Kranz34e88122014-12-11 15:24:05 -050085 networks = net_cl.list_networks()
Arx Cruz05fe4bc2017-10-20 10:48:28 +020086 project = identity.get_project_by_name(pr_cl, project_name)
87 p_id = project['id']
David Patersond6babc52014-10-14 00:11:56 -040088 n_id = None
89 for net in networks['networks']:
Arx Cruz05fe4bc2017-10-20 10:48:28 +020090 if (net['project_id'] == p_id and net['name'] == net_name):
David Patersond6babc52014-10-14 00:11:56 -040091 n_id = net['id']
92 break
93 return n_id
94
David Patersonce781492014-09-18 01:07:01 -040095
96class BaseService(object):
97 def __init__(self, kwargs):
98 self.client = None
99 for key, value in kwargs.items():
100 setattr(self, key, value)
101
David Paterson82234022015-04-12 14:07:40 -0400102 self.tenant_filter = {}
103 if hasattr(self, 'tenant_id'):
104 self.tenant_filter['tenant_id'] = self.tenant_id
105
David Patersonce781492014-09-18 01:07:01 -0400106 def _filter_by_tenant_id(self, item_list):
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200107 if (item_list is None or
108 not item_list or
109 not hasattr(self, 'tenant_id') or
110 self.tenant_id is None or
111 'tenant_id' not in item_list[0]):
David Patersonce781492014-09-18 01:07:01 -0400112 return item_list
113
David Patersond6babc52014-10-14 00:11:56 -0400114 return [item for item in item_list
115 if item['tenant_id'] == self.tenant_id]
David Patersonce781492014-09-18 01:07:01 -0400116
117 def list(self):
118 pass
119
120 def delete(self):
121 pass
122
123 def dry_run(self):
124 pass
125
126 def save_state(self):
127 pass
128
129 def run(self):
130 if self.is_dry_run:
131 self.dry_run()
132 elif self.is_save_state:
133 self.save_state()
134 else:
135 self.delete()
136
137
138class SnapshotService(BaseService):
139
140 def __init__(self, manager, **kwargs):
141 super(SnapshotService, self).__init__(kwargs)
ghanshyam59928952017-10-26 01:38:45 +0000142 self.client = manager.snapshots_client_latest
David Patersonce781492014-09-18 01:07:01 -0400143
144 def list(self):
145 client = self.client
David Paterson07661de2015-10-29 20:15:04 -0700146 snaps = client.list_snapshots()['snapshots']
Jordan Pittier525ec712016-12-07 17:51:26 +0100147 LOG.debug("List count, %s Snapshots", len(snaps))
David Patersonce781492014-09-18 01:07:01 -0400148 return snaps
149
150 def delete(self):
151 snaps = self.list()
152 client = self.client
153 for snap in snaps:
154 try:
155 client.delete_snapshot(snap['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400156 except Exception:
157 LOG.exception("Delete Snapshot exception.")
David Patersonce781492014-09-18 01:07:01 -0400158
159 def dry_run(self):
160 snaps = self.list()
161 self.data['snapshots'] = snaps
162
163
164class ServerService(BaseService):
165 def __init__(self, manager, **kwargs):
166 super(ServerService, self).__init__(kwargs)
167 self.client = manager.servers_client
David Paterson07661de2015-10-29 20:15:04 -0700168 self.server_groups_client = manager.server_groups_client
David Patersonce781492014-09-18 01:07:01 -0400169
170 def list(self):
171 client = self.client
David Kranzae99b9a2015-02-16 13:37:01 -0500172 servers_body = client.list_servers()
David Patersonce781492014-09-18 01:07:01 -0400173 servers = servers_body['servers']
Jordan Pittier525ec712016-12-07 17:51:26 +0100174 LOG.debug("List count, %s Servers", len(servers))
David Patersonce781492014-09-18 01:07:01 -0400175 return servers
176
177 def delete(self):
178 client = self.client
179 servers = self.list()
180 for server in servers:
181 try:
182 client.delete_server(server['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400183 except Exception:
184 LOG.exception("Delete Server exception.")
David Patersonce781492014-09-18 01:07:01 -0400185
186 def dry_run(self):
187 servers = self.list()
188 self.data['servers'] = servers
189
190
191class ServerGroupService(ServerService):
192
193 def list(self):
David Paterson07661de2015-10-29 20:15:04 -0700194 client = self.server_groups_client
ghanshyam2dc13452015-08-24 17:39:25 +0900195 sgs = client.list_server_groups()['server_groups']
Jordan Pittier525ec712016-12-07 17:51:26 +0100196 LOG.debug("List count, %s Server Groups", len(sgs))
David Patersonce781492014-09-18 01:07:01 -0400197 return sgs
198
199 def delete(self):
200 client = self.client
201 sgs = self.list()
202 for sg in sgs:
203 try:
204 client.delete_server_group(sg['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400205 except Exception:
206 LOG.exception("Delete Server Group exception.")
David Patersonce781492014-09-18 01:07:01 -0400207
208 def dry_run(self):
209 sgs = self.list()
210 self.data['server_groups'] = sgs
211
212
David Patersonce781492014-09-18 01:07:01 -0400213class KeyPairService(BaseService):
214 def __init__(self, manager, **kwargs):
215 super(KeyPairService, self).__init__(kwargs)
216 self.client = manager.keypairs_client
217
218 def list(self):
219 client = self.client
ghanshyamdee01f22015-08-17 11:41:47 +0900220 keypairs = client.list_keypairs()['keypairs']
Jordan Pittier525ec712016-12-07 17:51:26 +0100221 LOG.debug("List count, %s Keypairs", len(keypairs))
David Patersonce781492014-09-18 01:07:01 -0400222 return keypairs
223
224 def delete(self):
225 client = self.client
226 keypairs = self.list()
227 for k in keypairs:
228 try:
229 name = k['keypair']['name']
230 client.delete_keypair(name)
David Patersone41ebca2015-04-09 05:40:12 -0400231 except Exception:
232 LOG.exception("Delete Keypairs exception.")
David Patersonce781492014-09-18 01:07:01 -0400233
234 def dry_run(self):
235 keypairs = self.list()
236 self.data['keypairs'] = keypairs
237
238
239class SecurityGroupService(BaseService):
240 def __init__(self, manager, **kwargs):
241 super(SecurityGroupService, self).__init__(kwargs)
John Warrenf2345512015-12-10 13:39:30 -0500242 self.client = manager.compute_security_groups_client
David Patersonce781492014-09-18 01:07:01 -0400243
244 def list(self):
245 client = self.client
ghanshyamb610b772015-08-24 17:29:38 +0900246 secgrps = client.list_security_groups()['security_groups']
David Patersonce781492014-09-18 01:07:01 -0400247 secgrp_del = [grp for grp in secgrps if grp['name'] != 'default']
Jordan Pittier525ec712016-12-07 17:51:26 +0100248 LOG.debug("List count, %s Security Groups", len(secgrp_del))
David Patersonce781492014-09-18 01:07:01 -0400249 return secgrp_del
250
251 def delete(self):
252 client = self.client
253 secgrp_del = self.list()
254 for g in secgrp_del:
255 try:
256 client.delete_security_group(g['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400257 except Exception:
258 LOG.exception("Delete Security Groups exception.")
David Patersonce781492014-09-18 01:07:01 -0400259
260 def dry_run(self):
261 secgrp_del = self.list()
262 self.data['security_groups'] = secgrp_del
263
264
265class FloatingIpService(BaseService):
266 def __init__(self, manager, **kwargs):
267 super(FloatingIpService, self).__init__(kwargs)
John Warrene74890a2015-11-11 15:18:01 -0500268 self.client = manager.compute_floating_ips_client
David Patersonce781492014-09-18 01:07:01 -0400269
270 def list(self):
271 client = self.client
ghanshyam9a3a9a22015-08-18 17:03:55 +0900272 floating_ips = client.list_floating_ips()['floating_ips']
Jordan Pittier525ec712016-12-07 17:51:26 +0100273 LOG.debug("List count, %s Floating IPs", len(floating_ips))
David Patersonce781492014-09-18 01:07:01 -0400274 return floating_ips
275
276 def delete(self):
277 client = self.client
278 floating_ips = self.list()
279 for f in floating_ips:
280 try:
281 client.delete_floating_ip(f['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400282 except Exception:
283 LOG.exception("Delete Floating IPs exception.")
David Patersonce781492014-09-18 01:07:01 -0400284
285 def dry_run(self):
286 floating_ips = self.list()
287 self.data['floating_ips'] = floating_ips
288
289
290class VolumeService(BaseService):
291 def __init__(self, manager, **kwargs):
292 super(VolumeService, self).__init__(kwargs)
ghanshyam59928952017-10-26 01:38:45 +0000293 self.client = manager.volumes_client_latest
David Patersonce781492014-09-18 01:07:01 -0400294
295 def list(self):
296 client = self.client
John Warren6177c9e2015-08-19 20:00:17 +0000297 vols = client.list_volumes()['volumes']
Jordan Pittier525ec712016-12-07 17:51:26 +0100298 LOG.debug("List count, %s Volumes", len(vols))
David Patersonce781492014-09-18 01:07:01 -0400299 return vols
300
301 def delete(self):
302 client = self.client
303 vols = self.list()
304 for v in vols:
305 try:
306 client.delete_volume(v['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400307 except Exception:
308 LOG.exception("Delete Volume exception.")
David Patersonce781492014-09-18 01:07:01 -0400309
310 def dry_run(self):
311 vols = self.list()
312 self.data['volumes'] = vols
313
314
David Paterson35c8df02015-04-05 04:35:31 -0400315class VolumeQuotaService(BaseService):
316 def __init__(self, manager, **kwargs):
317 super(VolumeQuotaService, self).__init__(kwargs)
ghanshyam59928952017-10-26 01:38:45 +0000318 self.client = manager.volume_quotas_v2_client
David Paterson35c8df02015-04-05 04:35:31 -0400319
320 def delete(self):
321 client = self.client
322 try:
323 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400324 except Exception:
325 LOG.exception("Delete Volume Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400326
327 def dry_run(self):
Ken'ichi Ohmichi3cf9eaf2016-07-29 11:05:21 -0700328 quotas = self.client.show_quota_set(
329 self.tenant_id, params={'usage': True})['quota_set']
David Paterson35c8df02015-04-05 04:35:31 -0400330 self.data['volume_quotas'] = quotas
331
332
333class NovaQuotaService(BaseService):
334 def __init__(self, manager, **kwargs):
335 super(NovaQuotaService, self).__init__(kwargs)
336 self.client = manager.quotas_client
337 self.limits_client = manager.limits_client
338
339 def delete(self):
340 client = self.client
341 try:
342 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400343 except Exception:
344 LOG.exception("Delete Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400345
346 def dry_run(self):
347 client = self.limits_client
ghanshyam8a599492015-08-24 15:55:59 +0900348 quotas = client.show_limits()['limits']
Ken'ichi Ohmichib93e6762015-06-15 07:11:29 +0000349 self.data['compute_quotas'] = quotas['absolute']
David Paterson35c8df02015-04-05 04:35:31 -0400350
351
David Patersonce781492014-09-18 01:07:01 -0400352# Begin network service classes
353class NetworkService(BaseService):
354 def __init__(self, manager, **kwargs):
355 super(NetworkService, self).__init__(kwargs)
John Warren94d8faf2015-09-15 12:22:24 -0400356 self.networks_client = manager.networks_client
John Warren3961acd2015-10-02 14:38:53 -0400357 self.subnets_client = manager.subnets_client
John Warren49c0fe52015-10-22 12:35:54 -0400358 self.ports_client = manager.ports_client
John Warrenfbf2a892015-11-17 12:36:14 -0500359 self.floating_ips_client = manager.floating_ips_client
John Warren6d0083a2015-11-30 18:12:30 -0500360 self.metering_labels_client = manager.metering_labels_client
John Warrendd20b3e2015-12-03 13:11:28 -0500361 self.metering_label_rules_client = manager.metering_label_rules_client
John Warrenf9606e92015-12-10 12:12:42 -0500362 self.security_groups_client = manager.security_groups_client
ghanshyama25c4192016-03-11 18:38:12 +0900363 self.routers_client = manager.routers_client
David Patersonce781492014-09-18 01:07:01 -0400364
David Patersond6babc52014-10-14 00:11:56 -0400365 def _filter_by_conf_networks(self, item_list):
366 if not item_list or not all(('network_id' in i for i in item_list)):
367 return item_list
368
369 return [item for item in item_list if item['network_id']
370 not in CONF_NETWORKS]
371
David Patersonce781492014-09-18 01:07:01 -0400372 def list(self):
John Warren94d8faf2015-09-15 12:22:24 -0400373 client = self.networks_client
David Paterson82234022015-04-12 14:07:40 -0400374 networks = client.list_networks(**self.tenant_filter)
375 networks = networks['networks']
David Patersonce781492014-09-18 01:07:01 -0400376 # filter out networks declared in tempest.conf
377 if self.is_preserve:
378 networks = [network for network in networks
David Patersond6babc52014-10-14 00:11:56 -0400379 if network['id'] not in CONF_NETWORKS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100380 LOG.debug("List count, %s Networks", networks)
David Patersonce781492014-09-18 01:07:01 -0400381 return networks
382
383 def delete(self):
John Warren94d8faf2015-09-15 12:22:24 -0400384 client = self.networks_client
David Patersonce781492014-09-18 01:07:01 -0400385 networks = self.list()
386 for n in networks:
387 try:
388 client.delete_network(n['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400389 except Exception:
390 LOG.exception("Delete Network exception.")
David Patersonce781492014-09-18 01:07:01 -0400391
392 def dry_run(self):
393 networks = self.list()
394 self.data['networks'] = networks
395
396
David Patersonce781492014-09-18 01:07:01 -0400397class NetworkFloatingIpService(NetworkService):
398
399 def list(self):
John Warrenfbf2a892015-11-17 12:36:14 -0500400 client = self.floating_ips_client
David Paterson82234022015-04-12 14:07:40 -0400401 flips = client.list_floatingips(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400402 flips = flips['floatingips']
Jordan Pittier525ec712016-12-07 17:51:26 +0100403 LOG.debug("List count, %s Network Floating IPs", len(flips))
David Patersonce781492014-09-18 01:07:01 -0400404 return flips
405
406 def delete(self):
407 client = self.client
408 flips = self.list()
409 for flip in flips:
410 try:
411 client.delete_floatingip(flip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400412 except Exception:
413 LOG.exception("Delete Network Floating IP exception.")
David Patersonce781492014-09-18 01:07:01 -0400414
415 def dry_run(self):
416 flips = self.list()
417 self.data['floating_ips'] = flips
418
419
420class NetworkRouterService(NetworkService):
421
422 def list(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000423 client = self.routers_client
David Paterson82234022015-04-12 14:07:40 -0400424 routers = client.list_routers(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400425 routers = routers['routers']
David Patersonce781492014-09-18 01:07:01 -0400426 if self.is_preserve:
427 routers = [router for router in routers
428 if router['id'] != CONF_PUB_ROUTER]
429
Jordan Pittier525ec712016-12-07 17:51:26 +0100430 LOG.debug("List count, %s Routers", len(routers))
David Patersonce781492014-09-18 01:07:01 -0400431 return routers
432
433 def delete(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000434 client = self.routers_client
Ken'ichi Ohmichif3110f02016-03-21 12:29:03 -0700435 ports_client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400436 routers = self.list()
437 for router in routers:
438 try:
439 rid = router['id']
David Paterson82234022015-04-12 14:07:40 -0400440 ports = [port for port
Ken'ichi Ohmichif3110f02016-03-21 12:29:03 -0700441 in ports_client.list_ports(device_id=rid)['ports']
Attila Fazekasd7e08a62016-10-07 13:05:05 +0200442 if net_info.is_router_interface_port(port)]
David Patersonce781492014-09-18 01:07:01 -0400443 for port in ports:
piyush11078694aca952015-12-17 12:54:44 +0530444 client.remove_router_interface(rid, port_id=port['id'])
David Patersond6babc52014-10-14 00:11:56 -0400445 client.delete_router(rid)
David Patersone41ebca2015-04-09 05:40:12 -0400446 except Exception:
447 LOG.exception("Delete Router exception.")
David Patersonce781492014-09-18 01:07:01 -0400448
449 def dry_run(self):
450 routers = self.list()
451 self.data['routers'] = routers
452
453
454class NetworkHealthMonitorService(NetworkService):
455
456 def list(self):
457 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500458 hms = client.list_health_monitors()
David Patersonce781492014-09-18 01:07:01 -0400459 hms = hms['health_monitors']
460 hms = self._filter_by_tenant_id(hms)
Jordan Pittier525ec712016-12-07 17:51:26 +0100461 LOG.debug("List count, %s Health Monitors", len(hms))
David Patersonce781492014-09-18 01:07:01 -0400462 return hms
463
464 def delete(self):
465 client = self.client
466 hms = self.list()
467 for hm in hms:
468 try:
469 client.delete_health_monitor(hm['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400470 except Exception:
471 LOG.exception("Delete Health Monitor exception.")
David Patersonce781492014-09-18 01:07:01 -0400472
473 def dry_run(self):
474 hms = self.list()
475 self.data['health_monitors'] = hms
476
477
478class NetworkMemberService(NetworkService):
479
480 def list(self):
481 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500482 members = client.list_members()
David Patersonce781492014-09-18 01:07:01 -0400483 members = members['members']
484 members = self._filter_by_tenant_id(members)
Jordan Pittier525ec712016-12-07 17:51:26 +0100485 LOG.debug("List count, %s Members", len(members))
David Patersonce781492014-09-18 01:07:01 -0400486 return members
487
488 def delete(self):
489 client = self.client
490 members = self.list()
491 for member in members:
492 try:
493 client.delete_member(member['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400494 except Exception:
495 LOG.exception("Delete Member exception.")
David Patersonce781492014-09-18 01:07:01 -0400496
497 def dry_run(self):
498 members = self.list()
499 self.data['members'] = members
500
501
502class NetworkVipService(NetworkService):
503
504 def list(self):
505 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500506 vips = client.list_vips()
David Patersonce781492014-09-18 01:07:01 -0400507 vips = vips['vips']
508 vips = self._filter_by_tenant_id(vips)
Jordan Pittier525ec712016-12-07 17:51:26 +0100509 LOG.debug("List count, %s VIPs", len(vips))
David Patersonce781492014-09-18 01:07:01 -0400510 return vips
511
512 def delete(self):
513 client = self.client
514 vips = self.list()
515 for vip in vips:
516 try:
517 client.delete_vip(vip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400518 except Exception:
519 LOG.exception("Delete VIP exception.")
David Patersonce781492014-09-18 01:07:01 -0400520
521 def dry_run(self):
522 vips = self.list()
523 self.data['vips'] = vips
524
525
526class NetworkPoolService(NetworkService):
527
528 def list(self):
529 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500530 pools = client.list_pools()
David Patersonce781492014-09-18 01:07:01 -0400531 pools = pools['pools']
532 pools = self._filter_by_tenant_id(pools)
Jordan Pittier525ec712016-12-07 17:51:26 +0100533 LOG.debug("List count, %s Pools", len(pools))
David Patersonce781492014-09-18 01:07:01 -0400534 return pools
535
536 def delete(self):
537 client = self.client
538 pools = self.list()
539 for pool in pools:
540 try:
541 client.delete_pool(pool['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400542 except Exception:
543 LOG.exception("Delete Pool exception.")
David Patersonce781492014-09-18 01:07:01 -0400544
545 def dry_run(self):
546 pools = self.list()
547 self.data['pools'] = pools
548
549
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300550class NetworkMeteringLabelRuleService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400551
552 def list(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500553 client = self.metering_label_rules_client
David Kranz34e88122014-12-11 15:24:05 -0500554 rules = client.list_metering_label_rules()
David Patersonce781492014-09-18 01:07:01 -0400555 rules = rules['metering_label_rules']
556 rules = self._filter_by_tenant_id(rules)
Jordan Pittier525ec712016-12-07 17:51:26 +0100557 LOG.debug("List count, %s Metering Label Rules", len(rules))
David Patersonce781492014-09-18 01:07:01 -0400558 return rules
559
560 def delete(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500561 client = self.metering_label_rules_client
David Patersonce781492014-09-18 01:07:01 -0400562 rules = self.list()
563 for rule in rules:
564 try:
565 client.delete_metering_label_rule(rule['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400566 except Exception:
567 LOG.exception("Delete Metering Label Rule exception.")
David Patersonce781492014-09-18 01:07:01 -0400568
569 def dry_run(self):
570 rules = self.list()
571 self.data['rules'] = rules
572
573
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300574class NetworkMeteringLabelService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400575
576 def list(self):
John Warren6d0083a2015-11-30 18:12:30 -0500577 client = self.metering_labels_client
David Kranz34e88122014-12-11 15:24:05 -0500578 labels = client.list_metering_labels()
David Patersonce781492014-09-18 01:07:01 -0400579 labels = labels['metering_labels']
580 labels = self._filter_by_tenant_id(labels)
Jordan Pittier525ec712016-12-07 17:51:26 +0100581 LOG.debug("List count, %s Metering Labels", len(labels))
David Patersonce781492014-09-18 01:07:01 -0400582 return labels
583
584 def delete(self):
John Warren6d0083a2015-11-30 18:12:30 -0500585 client = self.metering_labels_client
David Patersonce781492014-09-18 01:07:01 -0400586 labels = self.list()
587 for label in labels:
588 try:
589 client.delete_metering_label(label['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400590 except Exception:
591 LOG.exception("Delete Metering Label exception.")
David Patersonce781492014-09-18 01:07:01 -0400592
593 def dry_run(self):
594 labels = self.list()
595 self.data['labels'] = labels
596
597
598class NetworkPortService(NetworkService):
599
600 def list(self):
John Warren49c0fe52015-10-22 12:35:54 -0400601 client = self.ports_client
David Paterson82234022015-04-12 14:07:40 -0400602 ports = [port for port in
603 client.list_ports(**self.tenant_filter)['ports']
604 if port["device_owner"] == "" or
605 port["device_owner"].startswith("compute:")]
606
David Patersond6babc52014-10-14 00:11:56 -0400607 if self.is_preserve:
608 ports = self._filter_by_conf_networks(ports)
David Paterson82234022015-04-12 14:07:40 -0400609
Jordan Pittier525ec712016-12-07 17:51:26 +0100610 LOG.debug("List count, %s Ports", len(ports))
David Patersonce781492014-09-18 01:07:01 -0400611 return ports
612
613 def delete(self):
John Warren49c0fe52015-10-22 12:35:54 -0400614 client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400615 ports = self.list()
616 for port in ports:
617 try:
618 client.delete_port(port['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400619 except Exception:
620 LOG.exception("Delete Port exception.")
David Patersonce781492014-09-18 01:07:01 -0400621
622 def dry_run(self):
623 ports = self.list()
624 self.data['ports'] = ports
625
626
David Paterson82234022015-04-12 14:07:40 -0400627class NetworkSecGroupService(NetworkService):
628 def list(self):
John Warrenf9606e92015-12-10 12:12:42 -0500629 client = self.security_groups_client
David Paterson82234022015-04-12 14:07:40 -0400630 filter = self.tenant_filter
631 # cannot delete default sec group so never show it.
632 secgroups = [secgroup for secgroup in
633 client.list_security_groups(**filter)['security_groups']
634 if secgroup['name'] != 'default']
635
636 if self.is_preserve:
637 secgroups = self._filter_by_conf_networks(secgroups)
Jordan Pittier525ec712016-12-07 17:51:26 +0100638 LOG.debug("List count, %s security_groups", len(secgroups))
David Paterson82234022015-04-12 14:07:40 -0400639 return secgroups
640
641 def delete(self):
642 client = self.client
643 secgroups = self.list()
644 for secgroup in secgroups:
645 try:
646 client.delete_secgroup(secgroup['id'])
647 except Exception:
648 LOG.exception("Delete security_group exception.")
649
650 def dry_run(self):
651 secgroups = self.list()
652 self.data['secgroups'] = secgroups
653
654
David Patersonce781492014-09-18 01:07:01 -0400655class NetworkSubnetService(NetworkService):
656
657 def list(self):
John Warren3961acd2015-10-02 14:38:53 -0400658 client = self.subnets_client
David Paterson82234022015-04-12 14:07:40 -0400659 subnets = client.list_subnets(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400660 subnets = subnets['subnets']
David Patersond6babc52014-10-14 00:11:56 -0400661 if self.is_preserve:
662 subnets = self._filter_by_conf_networks(subnets)
Jordan Pittier525ec712016-12-07 17:51:26 +0100663 LOG.debug("List count, %s Subnets", len(subnets))
David Patersonce781492014-09-18 01:07:01 -0400664 return subnets
665
666 def delete(self):
John Warren3961acd2015-10-02 14:38:53 -0400667 client = self.subnets_client
David Patersonce781492014-09-18 01:07:01 -0400668 subnets = self.list()
669 for subnet in subnets:
670 try:
671 client.delete_subnet(subnet['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400672 except Exception:
673 LOG.exception("Delete Subnet exception.")
David Patersonce781492014-09-18 01:07:01 -0400674
675 def dry_run(self):
676 subnets = self.list()
677 self.data['subnets'] = subnets
678
679
David Patersonce781492014-09-18 01:07:01 -0400680# begin global services
681class FlavorService(BaseService):
682 def __init__(self, manager, **kwargs):
683 super(FlavorService, self).__init__(kwargs)
684 self.client = manager.flavors_client
685
686 def list(self):
687 client = self.client
ghanshyam19973be2015-08-18 15:46:42 +0900688 flavors = client.list_flavors({"is_public": None})['flavors']
David Patersonce781492014-09-18 01:07:01 -0400689 if not self.is_save_state:
690 # recreate list removing saved flavors
691 flavors = [flavor for flavor in flavors if flavor['id']
692 not in self.saved_state_json['flavors'].keys()]
693
694 if self.is_preserve:
695 flavors = [flavor for flavor in flavors
696 if flavor['id'] not in CONF_FLAVORS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100697 LOG.debug("List count, %s Flavors after reconcile", len(flavors))
David Patersonce781492014-09-18 01:07:01 -0400698 return flavors
699
700 def delete(self):
701 client = self.client
702 flavors = self.list()
703 for flavor in flavors:
704 try:
705 client.delete_flavor(flavor['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400706 except Exception:
707 LOG.exception("Delete Flavor exception.")
David Patersonce781492014-09-18 01:07:01 -0400708
709 def dry_run(self):
710 flavors = self.list()
711 self.data['flavors'] = flavors
712
713 def save_state(self):
714 flavors = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500715 self.data['flavors'] = {}
David Patersonce781492014-09-18 01:07:01 -0400716 for flavor in flavors:
gordon chungc15f1bc2015-02-23 18:00:41 -0500717 self.data['flavors'][flavor['id']] = flavor['name']
David Patersonce781492014-09-18 01:07:01 -0400718
719
720class ImageService(BaseService):
721 def __init__(self, manager, **kwargs):
722 super(ImageService, self).__init__(kwargs)
zhufl66275c22018-03-28 15:32:14 +0800723 self.client = manager.image_client_v2
David Patersonce781492014-09-18 01:07:01 -0400724
725 def list(self):
726 client = self.client
zhufl66275c22018-03-28 15:32:14 +0800727 images = client.list_images(params={"all_tenants": True})['images']
David Patersonce781492014-09-18 01:07:01 -0400728 if not self.is_save_state:
729 images = [image for image in images if image['id']
730 not in self.saved_state_json['images'].keys()]
731 if self.is_preserve:
732 images = [image for image in images
733 if image['id'] not in CONF_IMAGES]
Jordan Pittier525ec712016-12-07 17:51:26 +0100734 LOG.debug("List count, %s Images after reconcile", len(images))
David Patersonce781492014-09-18 01:07:01 -0400735 return images
736
737 def delete(self):
738 client = self.client
739 images = self.list()
740 for image in images:
741 try:
742 client.delete_image(image['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400743 except Exception:
744 LOG.exception("Delete Image exception.")
David Patersonce781492014-09-18 01:07:01 -0400745
746 def dry_run(self):
747 images = self.list()
748 self.data['images'] = images
749
750 def save_state(self):
gordon chungc15f1bc2015-02-23 18:00:41 -0500751 self.data['images'] = {}
David Paterson82234022015-04-12 14:07:40 -0400752 images = self.list()
David Patersonce781492014-09-18 01:07:01 -0400753 for image in images:
gordon chungc15f1bc2015-02-23 18:00:41 -0500754 self.data['images'][image['id']] = image['name']
David Patersonce781492014-09-18 01:07:01 -0400755
756
757class IdentityService(BaseService):
758 def __init__(self, manager, **kwargs):
759 super(IdentityService, self).__init__(kwargs)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200760 self.client = manager.identity_v3_client
David Patersonce781492014-09-18 01:07:01 -0400761
762
Daniel Mellado82c83a52015-12-09 15:16:49 +0000763class UserService(BaseService):
764
765 def __init__(self, manager, **kwargs):
766 super(UserService, self).__init__(kwargs)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200767 self.client = manager.users_v3_client
David Patersonce781492014-09-18 01:07:01 -0400768
769 def list(self):
Daniel Mellado82c83a52015-12-09 15:16:49 +0000770 users = self.client.list_users()['users']
David Patersonce781492014-09-18 01:07:01 -0400771
772 if not self.is_save_state:
773 users = [user for user in users if user['id']
774 not in self.saved_state_json['users'].keys()]
775
776 if self.is_preserve:
777 users = [user for user in users if user['name']
778 not in CONF_USERS]
779
780 elif not self.is_save_state: # Never delete admin user
781 users = [user for user in users if user['name'] !=
David Paterson07661de2015-10-29 20:15:04 -0700782 CONF.auth.admin_username]
David Patersonce781492014-09-18 01:07:01 -0400783
Jordan Pittier525ec712016-12-07 17:51:26 +0100784 LOG.debug("List count, %s Users after reconcile", len(users))
David Patersonce781492014-09-18 01:07:01 -0400785 return users
786
787 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400788 users = self.list()
789 for user in users:
790 try:
Daniel Mellado82c83a52015-12-09 15:16:49 +0000791 self.client.delete_user(user['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400792 except Exception:
793 LOG.exception("Delete User exception.")
David Patersonce781492014-09-18 01:07:01 -0400794
795 def dry_run(self):
796 users = self.list()
797 self.data['users'] = users
798
799 def save_state(self):
800 users = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500801 self.data['users'] = {}
David Patersonce781492014-09-18 01:07:01 -0400802 for user in users:
gordon chungc15f1bc2015-02-23 18:00:41 -0500803 self.data['users'][user['id']] = user['name']
David Patersonce781492014-09-18 01:07:01 -0400804
805
Daniel Melladob83ea562015-12-18 09:12:49 +0000806class RoleService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400807
Daniel Mellado6b16b922015-12-07 12:43:08 +0000808 def __init__(self, manager, **kwargs):
809 super(RoleService, self).__init__(kwargs)
810 self.client = manager.roles_client
811
David Patersonce781492014-09-18 01:07:01 -0400812 def list(self):
David Patersonce781492014-09-18 01:07:01 -0400813 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000814 roles = self.client.list_roles()['roles']
David Patersonce781492014-09-18 01:07:01 -0400815 # reconcile roles with saved state and never list admin role
816 if not self.is_save_state:
817 roles = [role for role in roles if
818 (role['id'] not in
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200819 self.saved_state_json['roles'].keys() and
820 role['name'] != CONF.identity.admin_role)]
Jordan Pittier525ec712016-12-07 17:51:26 +0100821 LOG.debug("List count, %s Roles after reconcile", len(roles))
David Patersonce781492014-09-18 01:07:01 -0400822 return roles
David Patersone41ebca2015-04-09 05:40:12 -0400823 except Exception:
824 LOG.exception("Cannot retrieve Roles.")
David Patersonce781492014-09-18 01:07:01 -0400825 return []
826
827 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400828 roles = self.list()
829 for role in roles:
830 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000831 self.client.delete_role(role['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400832 except Exception:
833 LOG.exception("Delete Role exception.")
David Patersonce781492014-09-18 01:07:01 -0400834
835 def dry_run(self):
836 roles = self.list()
837 self.data['roles'] = roles
838
839 def save_state(self):
840 roles = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500841 self.data['roles'] = {}
David Patersonce781492014-09-18 01:07:01 -0400842 for role in roles:
gordon chungc15f1bc2015-02-23 18:00:41 -0500843 self.data['roles'][role['id']] = role['name']
David Patersonce781492014-09-18 01:07:01 -0400844
845
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200846class ProjectService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400847
Daniel Melladob04da902015-11-20 17:43:12 +0100848 def __init__(self, manager, **kwargs):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200849 super(ProjectService, self).__init__(kwargs)
850 self.client = manager.projects_client
Daniel Melladob04da902015-11-20 17:43:12 +0100851
David Patersonce781492014-09-18 01:07:01 -0400852 def list(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200853 projects = self.client.list_projects()['projects']
David Patersonce781492014-09-18 01:07:01 -0400854 if not self.is_save_state:
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200855 project_ids = self.saved_state_json['projects']
856 projects = [project
857 for project in projects
858 if (project['id'] not in project_ids and
859 project['name'] != CONF.auth.admin_project_name)]
David Patersonce781492014-09-18 01:07:01 -0400860
861 if self.is_preserve:
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200862 projects = [project
863 for project in projects
864 if project['name'] not in CONF_PROJECTS]
David Patersonce781492014-09-18 01:07:01 -0400865
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200866 LOG.debug("List count, %s Projects after reconcile", len(projects))
867 return projects
David Patersonce781492014-09-18 01:07:01 -0400868
869 def delete(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200870 projects = self.list()
871 for project in projects:
David Patersonce781492014-09-18 01:07:01 -0400872 try:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200873 self.client.delete_project(project['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400874 except Exception:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200875 LOG.exception("Delete project exception.")
David Patersonce781492014-09-18 01:07:01 -0400876
877 def dry_run(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200878 projects = self.list()
879 self.data['projects'] = projects
David Patersonce781492014-09-18 01:07:01 -0400880
881 def save_state(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200882 projects = self.list()
883 self.data['projects'] = {}
884 for project in projects:
885 self.data['projects'][project['id']] = project['name']
David Patersonce781492014-09-18 01:07:01 -0400886
887
888class DomainService(BaseService):
889
890 def __init__(self, manager, **kwargs):
891 super(DomainService, self).__init__(kwargs)
Daniel Mellado91a26b62016-02-11 11:13:04 +0000892 self.client = manager.domains_client
David Patersonce781492014-09-18 01:07:01 -0400893
894 def list(self):
895 client = self.client
Thomas Bechtold48268a02015-08-30 19:37:46 +0200896 domains = client.list_domains()['domains']
David Patersonce781492014-09-18 01:07:01 -0400897 if not self.is_save_state:
898 domains = [domain for domain in domains if domain['id']
899 not in self.saved_state_json['domains'].keys()]
900
Jordan Pittier525ec712016-12-07 17:51:26 +0100901 LOG.debug("List count, %s Domains after reconcile", len(domains))
David Patersonce781492014-09-18 01:07:01 -0400902 return domains
903
904 def delete(self):
905 client = self.client
906 domains = self.list()
907 for domain in domains:
908 try:
909 client.update_domain(domain['id'], enabled=False)
910 client.delete_domain(domain['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400911 except Exception:
912 LOG.exception("Delete Domain exception.")
David Patersonce781492014-09-18 01:07:01 -0400913
914 def dry_run(self):
915 domains = self.list()
916 self.data['domains'] = domains
917
918 def save_state(self):
919 domains = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500920 self.data['domains'] = {}
David Patersonce781492014-09-18 01:07:01 -0400921 for domain in domains:
gordon chungc15f1bc2015-02-23 18:00:41 -0500922 self.data['domains'][domain['id']] = domain['name']
David Patersonce781492014-09-18 01:07:01 -0400923
924
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200925def get_project_cleanup_services():
926 project_services = []
ghanshyame4796f82016-04-13 15:49:22 +0900927 # TODO(gmann): Tempest should provide some plugin hook for cleanup
928 # script extension to plugin tests also.
David Patersonce781492014-09-18 01:07:01 -0400929 if IS_NOVA:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200930 project_services.append(ServerService)
931 project_services.append(KeyPairService)
932 project_services.append(SecurityGroupService)
933 project_services.append(ServerGroupService)
David Patersonce781492014-09-18 01:07:01 -0400934 if not IS_NEUTRON:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200935 project_services.append(FloatingIpService)
936 project_services.append(NovaQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400937 if IS_NEUTRON:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200938 project_services.append(NetworkFloatingIpService)
Andrea Frittolicd368412017-08-14 21:37:56 +0100939 if utils.is_extension_enabled('metering', 'network'):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200940 project_services.append(NetworkMeteringLabelRuleService)
941 project_services.append(NetworkMeteringLabelService)
942 project_services.append(NetworkRouterService)
943 project_services.append(NetworkPortService)
944 project_services.append(NetworkSubnetService)
945 project_services.append(NetworkService)
946 project_services.append(NetworkSecGroupService)
David Patersonce781492014-09-18 01:07:01 -0400947 if IS_CINDER:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200948 project_services.append(SnapshotService)
949 project_services.append(VolumeService)
950 project_services.append(VolumeQuotaService)
951 return project_services
David Patersonce781492014-09-18 01:07:01 -0400952
953
954def get_global_cleanup_services():
955 global_services = []
956 if IS_NOVA:
957 global_services.append(FlavorService)
958 if IS_GLANCE:
959 global_services.append(ImageService)
960 global_services.append(UserService)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200961 global_services.append(ProjectService)
David Patersonce781492014-09-18 01:07:01 -0400962 global_services.append(DomainService)
963 global_services.append(RoleService)
964 return global_services