blob: a632726e6493108b615101a4e6837e1ec3857024 [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
Attila Fazekasd7e08a62016-10-07 13:05:05 +020021from tempest.common.utils import net_info
David Patersonce781492014-09-18 01:07:01 -040022from tempest import config
David Patersonce781492014-09-18 01:07:01 -040023from tempest import test
24
25LOG = logging.getLogger(__name__)
26CONF = config.CONF
27
David Patersonce781492014-09-18 01:07:01 -040028CONF_FLAVORS = None
29CONF_IMAGES = None
David Patersond6babc52014-10-14 00:11:56 -040030CONF_NETWORKS = []
31CONF_PRIV_NETWORK_NAME = None
32CONF_PUB_NETWORK = None
33CONF_PUB_ROUTER = None
34CONF_TENANTS = None
35CONF_USERS = None
David Patersonce781492014-09-18 01:07:01 -040036
David Patersonce781492014-09-18 01:07:01 -040037IS_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_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
62 IS_HEAT = CONF.service_available.heat
63 IS_NEUTRON = CONF.service_available.neutron
64 IS_NOVA = CONF.service_available.nova
65
David Patersond6babc52014-10-14 00:11:56 -040066 CONF_FLAVORS = [CONF.compute.flavor_ref, CONF.compute.flavor_ref_alt]
67 CONF_IMAGES = [CONF.compute.image_ref, CONF.compute.image_ref_alt]
68 CONF_PRIV_NETWORK_NAME = CONF.compute.fixed_network_name
69 CONF_PUB_NETWORK = CONF.network.public_network_id
70 CONF_PUB_ROUTER = CONF.network.public_router_id
Jeffrey Zhangb5e23212016-07-06 14:18:53 +080071 CONF_TENANTS = [CONF.auth.admin_project_name]
72 CONF_USERS = [CONF.auth.admin_username]
David Patersond6babc52014-10-14 00:11:56 -040073
74 if IS_NEUTRON:
David Paterson82234022015-04-12 14:07:40 -040075 CONF_PRIV_NETWORK = _get_network_id(CONF.compute.fixed_network_name,
Daniel Melladod4d0b932016-04-08 08:57:29 +000076 CONF.auth.admin_project_name)
David Patersond6babc52014-10-14 00:11:56 -040077 CONF_NETWORKS = [CONF_PUB_NETWORK, CONF_PRIV_NETWORK]
78
79
Daniel Melladod4d0b932016-04-08 08:57:29 +000080def _get_network_id(net_name, project_name):
Andrea Frittoli (andreaf)290b3e12015-10-08 10:25:02 +010081 am = credentials.AdminManager()
John Warren94d8faf2015-09-15 12:22:24 -040082 net_cl = am.networks_client
Daniel Melladob04da902015-11-20 17:43:12 +010083 tn_cl = am.tenants_client
David Patersond6babc52014-10-14 00:11:56 -040084
David Kranz34e88122014-12-11 15:24:05 -050085 networks = net_cl.list_networks()
Daniel Melladod4d0b932016-04-08 08:57:29 +000086 tenant = identity.get_tenant_by_name(tn_cl, project_name)
David Patersond6babc52014-10-14 00:11:56 -040087 t_id = tenant['id']
88 n_id = None
89 for net in networks['networks']:
David Paterson82234022015-04-12 14:07:40 -040090 if (net['tenant_id'] == t_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):
107 if (item_list is None
108 or len(item_list) == 0
109 or not hasattr(self, 'tenant_id')
110 or self.tenant_id is None
111 or 'tenant_id' not in item_list[0]):
112 return item_list
113
David Patersond6babc52014-10-14 00:11:56 -0400114 return [item for item in item_list
115 if item['tenant_id'] == self.tenant_id]
David Patersonce781492014-09-18 01:07:01 -0400116
117 def list(self):
118 pass
119
120 def delete(self):
121 pass
122
123 def dry_run(self):
124 pass
125
126 def save_state(self):
127 pass
128
129 def run(self):
130 if self.is_dry_run:
131 self.dry_run()
132 elif self.is_save_state:
133 self.save_state()
134 else:
135 self.delete()
136
137
138class SnapshotService(BaseService):
139
140 def __init__(self, manager, **kwargs):
141 super(SnapshotService, self).__init__(kwargs)
142 self.client = manager.snapshots_client
143
144 def list(self):
145 client = self.client
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
213class StackService(BaseService):
214 def __init__(self, manager, **kwargs):
215 super(StackService, self).__init__(kwargs)
216 self.client = manager.orchestration_client
217
218 def list(self):
219 client = self.client
Anusha Ramineniab6c3a32015-08-18 08:33:09 +0530220 stacks = client.list_stacks()['stacks']
Jordan Pittier525ec712016-12-07 17:51:26 +0100221 LOG.debug("List count, %s Stacks", len(stacks))
David Patersonce781492014-09-18 01:07:01 -0400222 return stacks
223
224 def delete(self):
225 client = self.client
226 stacks = self.list()
227 for stack in stacks:
228 try:
229 client.delete_stack(stack['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400230 except Exception:
231 LOG.exception("Delete Stack exception.")
David Patersonce781492014-09-18 01:07:01 -0400232
233 def dry_run(self):
234 stacks = self.list()
235 self.data['stacks'] = stacks
236
237
238class KeyPairService(BaseService):
239 def __init__(self, manager, **kwargs):
240 super(KeyPairService, self).__init__(kwargs)
241 self.client = manager.keypairs_client
242
243 def list(self):
244 client = self.client
ghanshyamdee01f22015-08-17 11:41:47 +0900245 keypairs = client.list_keypairs()['keypairs']
Jordan Pittier525ec712016-12-07 17:51:26 +0100246 LOG.debug("List count, %s Keypairs", len(keypairs))
David Patersonce781492014-09-18 01:07:01 -0400247 return keypairs
248
249 def delete(self):
250 client = self.client
251 keypairs = self.list()
252 for k in keypairs:
253 try:
254 name = k['keypair']['name']
255 client.delete_keypair(name)
David Patersone41ebca2015-04-09 05:40:12 -0400256 except Exception:
257 LOG.exception("Delete Keypairs exception.")
David Patersonce781492014-09-18 01:07:01 -0400258
259 def dry_run(self):
260 keypairs = self.list()
261 self.data['keypairs'] = keypairs
262
263
264class SecurityGroupService(BaseService):
265 def __init__(self, manager, **kwargs):
266 super(SecurityGroupService, self).__init__(kwargs)
John Warrenf2345512015-12-10 13:39:30 -0500267 self.client = manager.compute_security_groups_client
David Patersonce781492014-09-18 01:07:01 -0400268
269 def list(self):
270 client = self.client
ghanshyamb610b772015-08-24 17:29:38 +0900271 secgrps = client.list_security_groups()['security_groups']
David Patersonce781492014-09-18 01:07:01 -0400272 secgrp_del = [grp for grp in secgrps if grp['name'] != 'default']
Jordan Pittier525ec712016-12-07 17:51:26 +0100273 LOG.debug("List count, %s Security Groups", len(secgrp_del))
David Patersonce781492014-09-18 01:07:01 -0400274 return secgrp_del
275
276 def delete(self):
277 client = self.client
278 secgrp_del = self.list()
279 for g in secgrp_del:
280 try:
281 client.delete_security_group(g['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400282 except Exception:
283 LOG.exception("Delete Security Groups exception.")
David Patersonce781492014-09-18 01:07:01 -0400284
285 def dry_run(self):
286 secgrp_del = self.list()
287 self.data['security_groups'] = secgrp_del
288
289
290class FloatingIpService(BaseService):
291 def __init__(self, manager, **kwargs):
292 super(FloatingIpService, self).__init__(kwargs)
John Warrene74890a2015-11-11 15:18:01 -0500293 self.client = manager.compute_floating_ips_client
David Patersonce781492014-09-18 01:07:01 -0400294
295 def list(self):
296 client = self.client
ghanshyam9a3a9a22015-08-18 17:03:55 +0900297 floating_ips = client.list_floating_ips()['floating_ips']
Jordan Pittier525ec712016-12-07 17:51:26 +0100298 LOG.debug("List count, %s Floating IPs", len(floating_ips))
David Patersonce781492014-09-18 01:07:01 -0400299 return floating_ips
300
301 def delete(self):
302 client = self.client
303 floating_ips = self.list()
304 for f in floating_ips:
305 try:
306 client.delete_floating_ip(f['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400307 except Exception:
308 LOG.exception("Delete Floating IPs exception.")
David Patersonce781492014-09-18 01:07:01 -0400309
310 def dry_run(self):
311 floating_ips = self.list()
312 self.data['floating_ips'] = floating_ips
313
314
315class VolumeService(BaseService):
316 def __init__(self, manager, **kwargs):
317 super(VolumeService, self).__init__(kwargs)
318 self.client = manager.volumes_client
319
320 def list(self):
321 client = self.client
John Warren6177c9e2015-08-19 20:00:17 +0000322 vols = client.list_volumes()['volumes']
Jordan Pittier525ec712016-12-07 17:51:26 +0100323 LOG.debug("List count, %s Volumes", len(vols))
David Patersonce781492014-09-18 01:07:01 -0400324 return vols
325
326 def delete(self):
327 client = self.client
328 vols = self.list()
329 for v in vols:
330 try:
331 client.delete_volume(v['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400332 except Exception:
333 LOG.exception("Delete Volume exception.")
David Patersonce781492014-09-18 01:07:01 -0400334
335 def dry_run(self):
336 vols = self.list()
337 self.data['volumes'] = vols
338
339
David Paterson35c8df02015-04-05 04:35:31 -0400340class VolumeQuotaService(BaseService):
341 def __init__(self, manager, **kwargs):
342 super(VolumeQuotaService, self).__init__(kwargs)
343 self.client = manager.volume_quotas_client
344
345 def delete(self):
346 client = self.client
347 try:
348 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400349 except Exception:
350 LOG.exception("Delete Volume Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400351
352 def dry_run(self):
Ken'ichi Ohmichi3cf9eaf2016-07-29 11:05:21 -0700353 quotas = self.client.show_quota_set(
354 self.tenant_id, params={'usage': True})['quota_set']
David Paterson35c8df02015-04-05 04:35:31 -0400355 self.data['volume_quotas'] = quotas
356
357
358class NovaQuotaService(BaseService):
359 def __init__(self, manager, **kwargs):
360 super(NovaQuotaService, self).__init__(kwargs)
361 self.client = manager.quotas_client
362 self.limits_client = manager.limits_client
363
364 def delete(self):
365 client = self.client
366 try:
367 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400368 except Exception:
369 LOG.exception("Delete Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400370
371 def dry_run(self):
372 client = self.limits_client
ghanshyam8a599492015-08-24 15:55:59 +0900373 quotas = client.show_limits()['limits']
Ken'ichi Ohmichib93e6762015-06-15 07:11:29 +0000374 self.data['compute_quotas'] = quotas['absolute']
David Paterson35c8df02015-04-05 04:35:31 -0400375
376
David Patersonce781492014-09-18 01:07:01 -0400377# Begin network service classes
378class NetworkService(BaseService):
379 def __init__(self, manager, **kwargs):
380 super(NetworkService, self).__init__(kwargs)
John Warren94d8faf2015-09-15 12:22:24 -0400381 self.networks_client = manager.networks_client
John Warren3961acd2015-10-02 14:38:53 -0400382 self.subnets_client = manager.subnets_client
John Warren49c0fe52015-10-22 12:35:54 -0400383 self.ports_client = manager.ports_client
John Warrenfbf2a892015-11-17 12:36:14 -0500384 self.floating_ips_client = manager.floating_ips_client
John Warren6d0083a2015-11-30 18:12:30 -0500385 self.metering_labels_client = manager.metering_labels_client
John Warrendd20b3e2015-12-03 13:11:28 -0500386 self.metering_label_rules_client = manager.metering_label_rules_client
John Warrenf9606e92015-12-10 12:12:42 -0500387 self.security_groups_client = manager.security_groups_client
ghanshyama25c4192016-03-11 18:38:12 +0900388 self.routers_client = manager.routers_client
David Patersonce781492014-09-18 01:07:01 -0400389
David Patersond6babc52014-10-14 00:11:56 -0400390 def _filter_by_conf_networks(self, item_list):
391 if not item_list or not all(('network_id' in i for i in item_list)):
392 return item_list
393
394 return [item for item in item_list if item['network_id']
395 not in CONF_NETWORKS]
396
David Patersonce781492014-09-18 01:07:01 -0400397 def list(self):
John Warren94d8faf2015-09-15 12:22:24 -0400398 client = self.networks_client
David Paterson82234022015-04-12 14:07:40 -0400399 networks = client.list_networks(**self.tenant_filter)
400 networks = networks['networks']
David Patersonce781492014-09-18 01:07:01 -0400401 # filter out networks declared in tempest.conf
402 if self.is_preserve:
403 networks = [network for network in networks
David Patersond6babc52014-10-14 00:11:56 -0400404 if network['id'] not in CONF_NETWORKS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100405 LOG.debug("List count, %s Networks", networks)
David Patersonce781492014-09-18 01:07:01 -0400406 return networks
407
408 def delete(self):
John Warren94d8faf2015-09-15 12:22:24 -0400409 client = self.networks_client
David Patersonce781492014-09-18 01:07:01 -0400410 networks = self.list()
411 for n in networks:
412 try:
413 client.delete_network(n['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400414 except Exception:
415 LOG.exception("Delete Network exception.")
David Patersonce781492014-09-18 01:07:01 -0400416
417 def dry_run(self):
418 networks = self.list()
419 self.data['networks'] = networks
420
421
David Patersonce781492014-09-18 01:07:01 -0400422class NetworkFloatingIpService(NetworkService):
423
424 def list(self):
John Warrenfbf2a892015-11-17 12:36:14 -0500425 client = self.floating_ips_client
David Paterson82234022015-04-12 14:07:40 -0400426 flips = client.list_floatingips(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400427 flips = flips['floatingips']
Jordan Pittier525ec712016-12-07 17:51:26 +0100428 LOG.debug("List count, %s Network Floating IPs", len(flips))
David Patersonce781492014-09-18 01:07:01 -0400429 return flips
430
431 def delete(self):
432 client = self.client
433 flips = self.list()
434 for flip in flips:
435 try:
436 client.delete_floatingip(flip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400437 except Exception:
438 LOG.exception("Delete Network Floating IP exception.")
David Patersonce781492014-09-18 01:07:01 -0400439
440 def dry_run(self):
441 flips = self.list()
442 self.data['floating_ips'] = flips
443
444
445class NetworkRouterService(NetworkService):
446
447 def list(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000448 client = self.routers_client
David Paterson82234022015-04-12 14:07:40 -0400449 routers = client.list_routers(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400450 routers = routers['routers']
David Patersonce781492014-09-18 01:07:01 -0400451 if self.is_preserve:
452 routers = [router for router in routers
453 if router['id'] != CONF_PUB_ROUTER]
454
Jordan Pittier525ec712016-12-07 17:51:26 +0100455 LOG.debug("List count, %s Routers", len(routers))
David Patersonce781492014-09-18 01:07:01 -0400456 return routers
457
458 def delete(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000459 client = self.routers_client
Ken'ichi Ohmichif3110f02016-03-21 12:29:03 -0700460 ports_client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400461 routers = self.list()
462 for router in routers:
463 try:
464 rid = router['id']
David Paterson82234022015-04-12 14:07:40 -0400465 ports = [port for port
Ken'ichi Ohmichif3110f02016-03-21 12:29:03 -0700466 in ports_client.list_ports(device_id=rid)['ports']
Attila Fazekasd7e08a62016-10-07 13:05:05 +0200467 if net_info.is_router_interface_port(port)]
David Patersonce781492014-09-18 01:07:01 -0400468 for port in ports:
piyush11078694aca952015-12-17 12:54:44 +0530469 client.remove_router_interface(rid, port_id=port['id'])
David Patersond6babc52014-10-14 00:11:56 -0400470 client.delete_router(rid)
David Patersone41ebca2015-04-09 05:40:12 -0400471 except Exception:
472 LOG.exception("Delete Router exception.")
David Patersonce781492014-09-18 01:07:01 -0400473
474 def dry_run(self):
475 routers = self.list()
476 self.data['routers'] = routers
477
478
479class NetworkHealthMonitorService(NetworkService):
480
481 def list(self):
482 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500483 hms = client.list_health_monitors()
David Patersonce781492014-09-18 01:07:01 -0400484 hms = hms['health_monitors']
485 hms = self._filter_by_tenant_id(hms)
Jordan Pittier525ec712016-12-07 17:51:26 +0100486 LOG.debug("List count, %s Health Monitors", len(hms))
David Patersonce781492014-09-18 01:07:01 -0400487 return hms
488
489 def delete(self):
490 client = self.client
491 hms = self.list()
492 for hm in hms:
493 try:
494 client.delete_health_monitor(hm['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400495 except Exception:
496 LOG.exception("Delete Health Monitor exception.")
David Patersonce781492014-09-18 01:07:01 -0400497
498 def dry_run(self):
499 hms = self.list()
500 self.data['health_monitors'] = hms
501
502
503class NetworkMemberService(NetworkService):
504
505 def list(self):
506 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500507 members = client.list_members()
David Patersonce781492014-09-18 01:07:01 -0400508 members = members['members']
509 members = self._filter_by_tenant_id(members)
Jordan Pittier525ec712016-12-07 17:51:26 +0100510 LOG.debug("List count, %s Members", len(members))
David Patersonce781492014-09-18 01:07:01 -0400511 return members
512
513 def delete(self):
514 client = self.client
515 members = self.list()
516 for member in members:
517 try:
518 client.delete_member(member['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400519 except Exception:
520 LOG.exception("Delete Member exception.")
David Patersonce781492014-09-18 01:07:01 -0400521
522 def dry_run(self):
523 members = self.list()
524 self.data['members'] = members
525
526
527class NetworkVipService(NetworkService):
528
529 def list(self):
530 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500531 vips = client.list_vips()
David Patersonce781492014-09-18 01:07:01 -0400532 vips = vips['vips']
533 vips = self._filter_by_tenant_id(vips)
Jordan Pittier525ec712016-12-07 17:51:26 +0100534 LOG.debug("List count, %s VIPs", len(vips))
David Patersonce781492014-09-18 01:07:01 -0400535 return vips
536
537 def delete(self):
538 client = self.client
539 vips = self.list()
540 for vip in vips:
541 try:
542 client.delete_vip(vip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400543 except Exception:
544 LOG.exception("Delete VIP exception.")
David Patersonce781492014-09-18 01:07:01 -0400545
546 def dry_run(self):
547 vips = self.list()
548 self.data['vips'] = vips
549
550
551class NetworkPoolService(NetworkService):
552
553 def list(self):
554 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500555 pools = client.list_pools()
David Patersonce781492014-09-18 01:07:01 -0400556 pools = pools['pools']
557 pools = self._filter_by_tenant_id(pools)
Jordan Pittier525ec712016-12-07 17:51:26 +0100558 LOG.debug("List count, %s Pools", len(pools))
David Patersonce781492014-09-18 01:07:01 -0400559 return pools
560
561 def delete(self):
562 client = self.client
563 pools = self.list()
564 for pool in pools:
565 try:
566 client.delete_pool(pool['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400567 except Exception:
568 LOG.exception("Delete Pool exception.")
David Patersonce781492014-09-18 01:07:01 -0400569
570 def dry_run(self):
571 pools = self.list()
572 self.data['pools'] = pools
573
574
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300575class NetworkMeteringLabelRuleService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400576
577 def list(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500578 client = self.metering_label_rules_client
David Kranz34e88122014-12-11 15:24:05 -0500579 rules = client.list_metering_label_rules()
David Patersonce781492014-09-18 01:07:01 -0400580 rules = rules['metering_label_rules']
581 rules = self._filter_by_tenant_id(rules)
Jordan Pittier525ec712016-12-07 17:51:26 +0100582 LOG.debug("List count, %s Metering Label Rules", len(rules))
David Patersonce781492014-09-18 01:07:01 -0400583 return rules
584
585 def delete(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500586 client = self.metering_label_rules_client
David Patersonce781492014-09-18 01:07:01 -0400587 rules = self.list()
588 for rule in rules:
589 try:
590 client.delete_metering_label_rule(rule['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400591 except Exception:
592 LOG.exception("Delete Metering Label Rule exception.")
David Patersonce781492014-09-18 01:07:01 -0400593
594 def dry_run(self):
595 rules = self.list()
596 self.data['rules'] = rules
597
598
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300599class NetworkMeteringLabelService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400600
601 def list(self):
John Warren6d0083a2015-11-30 18:12:30 -0500602 client = self.metering_labels_client
David Kranz34e88122014-12-11 15:24:05 -0500603 labels = client.list_metering_labels()
David Patersonce781492014-09-18 01:07:01 -0400604 labels = labels['metering_labels']
605 labels = self._filter_by_tenant_id(labels)
Jordan Pittier525ec712016-12-07 17:51:26 +0100606 LOG.debug("List count, %s Metering Labels", len(labels))
David Patersonce781492014-09-18 01:07:01 -0400607 return labels
608
609 def delete(self):
John Warren6d0083a2015-11-30 18:12:30 -0500610 client = self.metering_labels_client
David Patersonce781492014-09-18 01:07:01 -0400611 labels = self.list()
612 for label in labels:
613 try:
614 client.delete_metering_label(label['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400615 except Exception:
616 LOG.exception("Delete Metering Label exception.")
David Patersonce781492014-09-18 01:07:01 -0400617
618 def dry_run(self):
619 labels = self.list()
620 self.data['labels'] = labels
621
622
623class NetworkPortService(NetworkService):
624
625 def list(self):
John Warren49c0fe52015-10-22 12:35:54 -0400626 client = self.ports_client
David Paterson82234022015-04-12 14:07:40 -0400627 ports = [port for port in
628 client.list_ports(**self.tenant_filter)['ports']
629 if port["device_owner"] == "" or
630 port["device_owner"].startswith("compute:")]
631
David Patersond6babc52014-10-14 00:11:56 -0400632 if self.is_preserve:
633 ports = self._filter_by_conf_networks(ports)
David Paterson82234022015-04-12 14:07:40 -0400634
Jordan Pittier525ec712016-12-07 17:51:26 +0100635 LOG.debug("List count, %s Ports", len(ports))
David Patersonce781492014-09-18 01:07:01 -0400636 return ports
637
638 def delete(self):
John Warren49c0fe52015-10-22 12:35:54 -0400639 client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400640 ports = self.list()
641 for port in ports:
642 try:
643 client.delete_port(port['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400644 except Exception:
645 LOG.exception("Delete Port exception.")
David Patersonce781492014-09-18 01:07:01 -0400646
647 def dry_run(self):
648 ports = self.list()
649 self.data['ports'] = ports
650
651
David Paterson82234022015-04-12 14:07:40 -0400652class NetworkSecGroupService(NetworkService):
653 def list(self):
John Warrenf9606e92015-12-10 12:12:42 -0500654 client = self.security_groups_client
David Paterson82234022015-04-12 14:07:40 -0400655 filter = self.tenant_filter
656 # cannot delete default sec group so never show it.
657 secgroups = [secgroup for secgroup in
658 client.list_security_groups(**filter)['security_groups']
659 if secgroup['name'] != 'default']
660
661 if self.is_preserve:
662 secgroups = self._filter_by_conf_networks(secgroups)
Jordan Pittier525ec712016-12-07 17:51:26 +0100663 LOG.debug("List count, %s security_groups", len(secgroups))
David Paterson82234022015-04-12 14:07:40 -0400664 return secgroups
665
666 def delete(self):
667 client = self.client
668 secgroups = self.list()
669 for secgroup in secgroups:
670 try:
671 client.delete_secgroup(secgroup['id'])
672 except Exception:
673 LOG.exception("Delete security_group exception.")
674
675 def dry_run(self):
676 secgroups = self.list()
677 self.data['secgroups'] = secgroups
678
679
David Patersonce781492014-09-18 01:07:01 -0400680class NetworkSubnetService(NetworkService):
681
682 def list(self):
John Warren3961acd2015-10-02 14:38:53 -0400683 client = self.subnets_client
David Paterson82234022015-04-12 14:07:40 -0400684 subnets = client.list_subnets(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400685 subnets = subnets['subnets']
David Patersond6babc52014-10-14 00:11:56 -0400686 if self.is_preserve:
687 subnets = self._filter_by_conf_networks(subnets)
Jordan Pittier525ec712016-12-07 17:51:26 +0100688 LOG.debug("List count, %s Subnets", len(subnets))
David Patersonce781492014-09-18 01:07:01 -0400689 return subnets
690
691 def delete(self):
John Warren3961acd2015-10-02 14:38:53 -0400692 client = self.subnets_client
David Patersonce781492014-09-18 01:07:01 -0400693 subnets = self.list()
694 for subnet in subnets:
695 try:
696 client.delete_subnet(subnet['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400697 except Exception:
698 LOG.exception("Delete Subnet exception.")
David Patersonce781492014-09-18 01:07:01 -0400699
700 def dry_run(self):
701 subnets = self.list()
702 self.data['subnets'] = subnets
703
704
David Patersonce781492014-09-18 01:07:01 -0400705# begin global services
706class FlavorService(BaseService):
707 def __init__(self, manager, **kwargs):
708 super(FlavorService, self).__init__(kwargs)
709 self.client = manager.flavors_client
710
711 def list(self):
712 client = self.client
ghanshyam19973be2015-08-18 15:46:42 +0900713 flavors = client.list_flavors({"is_public": None})['flavors']
David Patersonce781492014-09-18 01:07:01 -0400714 if not self.is_save_state:
715 # recreate list removing saved flavors
716 flavors = [flavor for flavor in flavors if flavor['id']
717 not in self.saved_state_json['flavors'].keys()]
718
719 if self.is_preserve:
720 flavors = [flavor for flavor in flavors
721 if flavor['id'] not in CONF_FLAVORS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100722 LOG.debug("List count, %s Flavors after reconcile", len(flavors))
David Patersonce781492014-09-18 01:07:01 -0400723 return flavors
724
725 def delete(self):
726 client = self.client
727 flavors = self.list()
728 for flavor in flavors:
729 try:
730 client.delete_flavor(flavor['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400731 except Exception:
732 LOG.exception("Delete Flavor exception.")
David Patersonce781492014-09-18 01:07:01 -0400733
734 def dry_run(self):
735 flavors = self.list()
736 self.data['flavors'] = flavors
737
738 def save_state(self):
739 flavors = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500740 self.data['flavors'] = {}
David Patersonce781492014-09-18 01:07:01 -0400741 for flavor in flavors:
gordon chungc15f1bc2015-02-23 18:00:41 -0500742 self.data['flavors'][flavor['id']] = flavor['name']
David Patersonce781492014-09-18 01:07:01 -0400743
744
745class ImageService(BaseService):
746 def __init__(self, manager, **kwargs):
747 super(ImageService, self).__init__(kwargs)
Ghanshyamae76c122015-12-22 13:41:35 +0900748 self.client = manager.compute_images_client
David Patersonce781492014-09-18 01:07:01 -0400749
750 def list(self):
751 client = self.client
ghanshyam1756e0b2015-08-18 19:19:05 +0900752 images = client.list_images({"all_tenants": True})['images']
David Patersonce781492014-09-18 01:07:01 -0400753 if not self.is_save_state:
754 images = [image for image in images if image['id']
755 not in self.saved_state_json['images'].keys()]
756 if self.is_preserve:
757 images = [image for image in images
758 if image['id'] not in CONF_IMAGES]
Jordan Pittier525ec712016-12-07 17:51:26 +0100759 LOG.debug("List count, %s Images after reconcile", len(images))
David Patersonce781492014-09-18 01:07:01 -0400760 return images
761
762 def delete(self):
763 client = self.client
764 images = self.list()
765 for image in images:
766 try:
767 client.delete_image(image['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400768 except Exception:
769 LOG.exception("Delete Image exception.")
David Patersonce781492014-09-18 01:07:01 -0400770
771 def dry_run(self):
772 images = self.list()
773 self.data['images'] = images
774
775 def save_state(self):
gordon chungc15f1bc2015-02-23 18:00:41 -0500776 self.data['images'] = {}
David Paterson82234022015-04-12 14:07:40 -0400777 images = self.list()
David Patersonce781492014-09-18 01:07:01 -0400778 for image in images:
gordon chungc15f1bc2015-02-23 18:00:41 -0500779 self.data['images'][image['id']] = image['name']
David Patersonce781492014-09-18 01:07:01 -0400780
781
782class IdentityService(BaseService):
783 def __init__(self, manager, **kwargs):
784 super(IdentityService, self).__init__(kwargs)
785 self.client = manager.identity_client
786
787
Daniel Mellado82c83a52015-12-09 15:16:49 +0000788class UserService(BaseService):
789
790 def __init__(self, manager, **kwargs):
791 super(UserService, self).__init__(kwargs)
792 self.client = manager.users_client
David Patersonce781492014-09-18 01:07:01 -0400793
794 def list(self):
Daniel Mellado82c83a52015-12-09 15:16:49 +0000795 users = self.client.list_users()['users']
David Patersonce781492014-09-18 01:07:01 -0400796
797 if not self.is_save_state:
798 users = [user for user in users if user['id']
799 not in self.saved_state_json['users'].keys()]
800
801 if self.is_preserve:
802 users = [user for user in users if user['name']
803 not in CONF_USERS]
804
805 elif not self.is_save_state: # Never delete admin user
806 users = [user for user in users if user['name'] !=
David Paterson07661de2015-10-29 20:15:04 -0700807 CONF.auth.admin_username]
David Patersonce781492014-09-18 01:07:01 -0400808
Jordan Pittier525ec712016-12-07 17:51:26 +0100809 LOG.debug("List count, %s Users after reconcile", len(users))
David Patersonce781492014-09-18 01:07:01 -0400810 return users
811
812 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400813 users = self.list()
814 for user in users:
815 try:
Daniel Mellado82c83a52015-12-09 15:16:49 +0000816 self.client.delete_user(user['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400817 except Exception:
818 LOG.exception("Delete User exception.")
David Patersonce781492014-09-18 01:07:01 -0400819
820 def dry_run(self):
821 users = self.list()
822 self.data['users'] = users
823
824 def save_state(self):
825 users = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500826 self.data['users'] = {}
David Patersonce781492014-09-18 01:07:01 -0400827 for user in users:
gordon chungc15f1bc2015-02-23 18:00:41 -0500828 self.data['users'][user['id']] = user['name']
David Patersonce781492014-09-18 01:07:01 -0400829
830
Daniel Melladob83ea562015-12-18 09:12:49 +0000831class RoleService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400832
Daniel Mellado6b16b922015-12-07 12:43:08 +0000833 def __init__(self, manager, **kwargs):
834 super(RoleService, self).__init__(kwargs)
835 self.client = manager.roles_client
836
David Patersonce781492014-09-18 01:07:01 -0400837 def list(self):
David Patersonce781492014-09-18 01:07:01 -0400838 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000839 roles = self.client.list_roles()['roles']
David Patersonce781492014-09-18 01:07:01 -0400840 # reconcile roles with saved state and never list admin role
841 if not self.is_save_state:
842 roles = [role for role in roles if
843 (role['id'] not in
844 self.saved_state_json['roles'].keys()
845 and role['name'] != CONF.identity.admin_role)]
Jordan Pittier525ec712016-12-07 17:51:26 +0100846 LOG.debug("List count, %s Roles after reconcile", len(roles))
David Patersonce781492014-09-18 01:07:01 -0400847 return roles
David Patersone41ebca2015-04-09 05:40:12 -0400848 except Exception:
849 LOG.exception("Cannot retrieve Roles.")
David Patersonce781492014-09-18 01:07:01 -0400850 return []
851
852 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400853 roles = self.list()
854 for role in roles:
855 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000856 self.client.delete_role(role['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400857 except Exception:
858 LOG.exception("Delete Role exception.")
David Patersonce781492014-09-18 01:07:01 -0400859
860 def dry_run(self):
861 roles = self.list()
862 self.data['roles'] = roles
863
864 def save_state(self):
865 roles = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500866 self.data['roles'] = {}
David Patersonce781492014-09-18 01:07:01 -0400867 for role in roles:
gordon chungc15f1bc2015-02-23 18:00:41 -0500868 self.data['roles'][role['id']] = role['name']
David Patersonce781492014-09-18 01:07:01 -0400869
870
Daniel Melladob83ea562015-12-18 09:12:49 +0000871class TenantService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400872
Daniel Melladob04da902015-11-20 17:43:12 +0100873 def __init__(self, manager, **kwargs):
874 super(TenantService, self).__init__(kwargs)
875 self.client = manager.tenants_client
876
David Patersonce781492014-09-18 01:07:01 -0400877 def list(self):
Daniel Melladob04da902015-11-20 17:43:12 +0100878 tenants = self.client.list_tenants()['tenants']
David Patersonce781492014-09-18 01:07:01 -0400879 if not self.is_save_state:
880 tenants = [tenant for tenant in tenants if (tenant['id']
881 not in self.saved_state_json['tenants'].keys()
Daniel Melladod4d0b932016-04-08 08:57:29 +0000882 and tenant['name'] != CONF.auth.admin_project_name)]
David Patersonce781492014-09-18 01:07:01 -0400883
884 if self.is_preserve:
885 tenants = [tenant for tenant in tenants if tenant['name']
886 not in CONF_TENANTS]
887
Jordan Pittier525ec712016-12-07 17:51:26 +0100888 LOG.debug("List count, %s Tenants after reconcile", len(tenants))
David Patersonce781492014-09-18 01:07:01 -0400889 return tenants
890
891 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400892 tenants = self.list()
893 for tenant in tenants:
894 try:
Daniel Melladob04da902015-11-20 17:43:12 +0100895 self.client.delete_tenant(tenant['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400896 except Exception:
897 LOG.exception("Delete Tenant exception.")
David Patersonce781492014-09-18 01:07:01 -0400898
899 def dry_run(self):
900 tenants = self.list()
901 self.data['tenants'] = tenants
902
903 def save_state(self):
904 tenants = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500905 self.data['tenants'] = {}
David Patersonce781492014-09-18 01:07:01 -0400906 for tenant in tenants:
gordon chungc15f1bc2015-02-23 18:00:41 -0500907 self.data['tenants'][tenant['id']] = tenant['name']
David Patersonce781492014-09-18 01:07:01 -0400908
909
910class DomainService(BaseService):
911
912 def __init__(self, manager, **kwargs):
913 super(DomainService, self).__init__(kwargs)
Daniel Mellado91a26b62016-02-11 11:13:04 +0000914 self.client = manager.domains_client
David Patersonce781492014-09-18 01:07:01 -0400915
916 def list(self):
917 client = self.client
Thomas Bechtold48268a02015-08-30 19:37:46 +0200918 domains = client.list_domains()['domains']
David Patersonce781492014-09-18 01:07:01 -0400919 if not self.is_save_state:
920 domains = [domain for domain in domains if domain['id']
921 not in self.saved_state_json['domains'].keys()]
922
Jordan Pittier525ec712016-12-07 17:51:26 +0100923 LOG.debug("List count, %s Domains after reconcile", len(domains))
David Patersonce781492014-09-18 01:07:01 -0400924 return domains
925
926 def delete(self):
927 client = self.client
928 domains = self.list()
929 for domain in domains:
930 try:
931 client.update_domain(domain['id'], enabled=False)
932 client.delete_domain(domain['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400933 except Exception:
934 LOG.exception("Delete Domain exception.")
David Patersonce781492014-09-18 01:07:01 -0400935
936 def dry_run(self):
937 domains = self.list()
938 self.data['domains'] = domains
939
940 def save_state(self):
941 domains = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500942 self.data['domains'] = {}
David Patersonce781492014-09-18 01:07:01 -0400943 for domain in domains:
gordon chungc15f1bc2015-02-23 18:00:41 -0500944 self.data['domains'][domain['id']] = domain['name']
David Patersonce781492014-09-18 01:07:01 -0400945
946
947def get_tenant_cleanup_services():
948 tenant_services = []
ghanshyame4796f82016-04-13 15:49:22 +0900949 # TODO(gmann): Tempest should provide some plugin hook for cleanup
950 # script extension to plugin tests also.
David Patersonce781492014-09-18 01:07:01 -0400951 if IS_NOVA:
952 tenant_services.append(ServerService)
953 tenant_services.append(KeyPairService)
954 tenant_services.append(SecurityGroupService)
955 tenant_services.append(ServerGroupService)
956 if not IS_NEUTRON:
957 tenant_services.append(FloatingIpService)
David Paterson35c8df02015-04-05 04:35:31 -0400958 tenant_services.append(NovaQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400959 if IS_HEAT:
960 tenant_services.append(StackService)
961 if IS_NEUTRON:
David Paterson82234022015-04-12 14:07:40 -0400962 tenant_services.append(NetworkFloatingIpService)
David Patersonce781492014-09-18 01:07:01 -0400963 if test.is_extension_enabled('metering', 'network'):
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300964 tenant_services.append(NetworkMeteringLabelRuleService)
965 tenant_services.append(NetworkMeteringLabelService)
David Patersonce781492014-09-18 01:07:01 -0400966 tenant_services.append(NetworkRouterService)
David Patersonce781492014-09-18 01:07:01 -0400967 tenant_services.append(NetworkPortService)
968 tenant_services.append(NetworkSubnetService)
969 tenant_services.append(NetworkService)
David Paterson82234022015-04-12 14:07:40 -0400970 tenant_services.append(NetworkSecGroupService)
David Patersonce781492014-09-18 01:07:01 -0400971 if IS_CINDER:
972 tenant_services.append(SnapshotService)
973 tenant_services.append(VolumeService)
David Paterson35c8df02015-04-05 04:35:31 -0400974 tenant_services.append(VolumeQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400975 return tenant_services
976
977
978def get_global_cleanup_services():
979 global_services = []
980 if IS_NOVA:
981 global_services.append(FlavorService)
982 if IS_GLANCE:
983 global_services.append(ImageService)
984 global_services.append(UserService)
985 global_services.append(TenantService)
986 global_services.append(DomainService)
987 global_services.append(RoleService)
988 return global_services