blob: 97580618b1baa4c90626bbd8c92c50c86b7a25e9 [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
David Patersonce781492014-09-18 01:07:01 -040036IS_CINDER = None
37IS_GLANCE = None
38IS_HEAT = None
39IS_NEUTRON = None
40IS_NOVA = None
41
42
43def init_conf():
David Patersonce781492014-09-18 01:07:01 -040044 global CONF_FLAVORS
45 global CONF_IMAGES
David Patersond6babc52014-10-14 00:11:56 -040046 global CONF_NETWORKS
47 global CONF_PRIV_NETWORK
48 global CONF_PRIV_NETWORK_NAME
49 global CONF_PUB_NETWORK
50 global CONF_PUB_ROUTER
51 global CONF_TENANTS
52 global CONF_USERS
David Patersonce781492014-09-18 01:07:01 -040053 global IS_CINDER
54 global IS_GLANCE
55 global IS_HEAT
56 global IS_NEUTRON
57 global IS_NOVA
58
David Patersonce781492014-09-18 01:07:01 -040059 IS_CINDER = CONF.service_available.cinder
60 IS_GLANCE = CONF.service_available.glance
61 IS_HEAT = CONF.service_available.heat
62 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
Jeffrey Zhangb5e23212016-07-06 14:18:53 +080070 CONF_TENANTS = [CONF.auth.admin_project_name]
71 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):
Andrea Frittoli (andreaf)290b3e12015-10-08 10:25:02 +010080 am = credentials.AdminManager()
John Warren94d8faf2015-09-15 12:22:24 -040081 net_cl = am.networks_client
Daniel Melladob04da902015-11-20 17:43:12 +010082 tn_cl = am.tenants_client
David Patersond6babc52014-10-14 00:11:56 -040083
David Kranz34e88122014-12-11 15:24:05 -050084 networks = net_cl.list_networks()
Daniel Melladod4d0b932016-04-08 08:57:29 +000085 tenant = identity.get_tenant_by_name(tn_cl, project_name)
David Patersond6babc52014-10-14 00:11:56 -040086 t_id = tenant['id']
87 n_id = None
88 for net in networks['networks']:
David Paterson82234022015-04-12 14:07:40 -040089 if (net['tenant_id'] == t_id and net['name'] == net_name):
David Patersond6babc52014-10-14 00:11:56 -040090 n_id = net['id']
91 break
92 return n_id
93
David Patersonce781492014-09-18 01:07:01 -040094
95class BaseService(object):
96 def __init__(self, kwargs):
97 self.client = None
98 for key, value in kwargs.items():
99 setattr(self, key, value)
100
David Paterson82234022015-04-12 14:07:40 -0400101 self.tenant_filter = {}
102 if hasattr(self, 'tenant_id'):
103 self.tenant_filter['tenant_id'] = self.tenant_id
104
David Patersonce781492014-09-18 01:07:01 -0400105 def _filter_by_tenant_id(self, item_list):
106 if (item_list is None
107 or len(item_list) == 0
108 or not hasattr(self, 'tenant_id')
109 or self.tenant_id is None
110 or 'tenant_id' not in item_list[0]):
111 return item_list
112
David Patersond6babc52014-10-14 00:11:56 -0400113 return [item for item in item_list
114 if item['tenant_id'] == self.tenant_id]
David Patersonce781492014-09-18 01:07:01 -0400115
116 def list(self):
117 pass
118
119 def delete(self):
120 pass
121
122 def dry_run(self):
123 pass
124
125 def save_state(self):
126 pass
127
128 def run(self):
129 if self.is_dry_run:
130 self.dry_run()
131 elif self.is_save_state:
132 self.save_state()
133 else:
134 self.delete()
135
136
137class SnapshotService(BaseService):
138
139 def __init__(self, manager, **kwargs):
140 super(SnapshotService, self).__init__(kwargs)
141 self.client = manager.snapshots_client
142
143 def list(self):
144 client = self.client
David Paterson07661de2015-10-29 20:15:04 -0700145 snaps = client.list_snapshots()['snapshots']
David Patersonce781492014-09-18 01:07:01 -0400146 LOG.debug("List count, %s Snapshots" % len(snaps))
147 return snaps
148
149 def delete(self):
150 snaps = self.list()
151 client = self.client
152 for snap in snaps:
153 try:
154 client.delete_snapshot(snap['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400155 except Exception:
156 LOG.exception("Delete Snapshot exception.")
David Patersonce781492014-09-18 01:07:01 -0400157
158 def dry_run(self):
159 snaps = self.list()
160 self.data['snapshots'] = snaps
161
162
163class ServerService(BaseService):
164 def __init__(self, manager, **kwargs):
165 super(ServerService, self).__init__(kwargs)
166 self.client = manager.servers_client
David Paterson07661de2015-10-29 20:15:04 -0700167 self.server_groups_client = manager.server_groups_client
David Patersonce781492014-09-18 01:07:01 -0400168
169 def list(self):
170 client = self.client
David Kranzae99b9a2015-02-16 13:37:01 -0500171 servers_body = client.list_servers()
David Patersonce781492014-09-18 01:07:01 -0400172 servers = servers_body['servers']
173 LOG.debug("List count, %s Servers" % len(servers))
174 return servers
175
176 def delete(self):
177 client = self.client
178 servers = self.list()
179 for server in servers:
180 try:
181 client.delete_server(server['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400182 except Exception:
183 LOG.exception("Delete Server exception.")
David Patersonce781492014-09-18 01:07:01 -0400184
185 def dry_run(self):
186 servers = self.list()
187 self.data['servers'] = servers
188
189
190class ServerGroupService(ServerService):
191
192 def list(self):
David Paterson07661de2015-10-29 20:15:04 -0700193 client = self.server_groups_client
ghanshyam2dc13452015-08-24 17:39:25 +0900194 sgs = client.list_server_groups()['server_groups']
David Patersonce781492014-09-18 01:07:01 -0400195 LOG.debug("List count, %s Server Groups" % len(sgs))
196 return sgs
197
198 def delete(self):
199 client = self.client
200 sgs = self.list()
201 for sg in sgs:
202 try:
203 client.delete_server_group(sg['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400204 except Exception:
205 LOG.exception("Delete Server Group exception.")
David Patersonce781492014-09-18 01:07:01 -0400206
207 def dry_run(self):
208 sgs = self.list()
209 self.data['server_groups'] = sgs
210
211
212class StackService(BaseService):
213 def __init__(self, manager, **kwargs):
214 super(StackService, self).__init__(kwargs)
215 self.client = manager.orchestration_client
216
217 def list(self):
218 client = self.client
Anusha Ramineniab6c3a32015-08-18 08:33:09 +0530219 stacks = client.list_stacks()['stacks']
David Patersonce781492014-09-18 01:07:01 -0400220 LOG.debug("List count, %s Stacks" % len(stacks))
221 return stacks
222
223 def delete(self):
224 client = self.client
225 stacks = self.list()
226 for stack in stacks:
227 try:
228 client.delete_stack(stack['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400229 except Exception:
230 LOG.exception("Delete Stack exception.")
David Patersonce781492014-09-18 01:07:01 -0400231
232 def dry_run(self):
233 stacks = self.list()
234 self.data['stacks'] = stacks
235
236
237class KeyPairService(BaseService):
238 def __init__(self, manager, **kwargs):
239 super(KeyPairService, self).__init__(kwargs)
240 self.client = manager.keypairs_client
241
242 def list(self):
243 client = self.client
ghanshyamdee01f22015-08-17 11:41:47 +0900244 keypairs = client.list_keypairs()['keypairs']
David Patersonce781492014-09-18 01:07:01 -0400245 LOG.debug("List count, %s Keypairs" % len(keypairs))
246 return keypairs
247
248 def delete(self):
249 client = self.client
250 keypairs = self.list()
251 for k in keypairs:
252 try:
253 name = k['keypair']['name']
254 client.delete_keypair(name)
David Patersone41ebca2015-04-09 05:40:12 -0400255 except Exception:
256 LOG.exception("Delete Keypairs exception.")
David Patersonce781492014-09-18 01:07:01 -0400257
258 def dry_run(self):
259 keypairs = self.list()
260 self.data['keypairs'] = keypairs
261
262
263class SecurityGroupService(BaseService):
264 def __init__(self, manager, **kwargs):
265 super(SecurityGroupService, self).__init__(kwargs)
John Warrenf2345512015-12-10 13:39:30 -0500266 self.client = manager.compute_security_groups_client
David Patersonce781492014-09-18 01:07:01 -0400267
268 def list(self):
269 client = self.client
ghanshyamb610b772015-08-24 17:29:38 +0900270 secgrps = client.list_security_groups()['security_groups']
David Patersonce781492014-09-18 01:07:01 -0400271 secgrp_del = [grp for grp in secgrps if grp['name'] != 'default']
272 LOG.debug("List count, %s Security Groups" % len(secgrp_del))
273 return secgrp_del
274
275 def delete(self):
276 client = self.client
277 secgrp_del = self.list()
278 for g in secgrp_del:
279 try:
280 client.delete_security_group(g['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400281 except Exception:
282 LOG.exception("Delete Security Groups exception.")
David Patersonce781492014-09-18 01:07:01 -0400283
284 def dry_run(self):
285 secgrp_del = self.list()
286 self.data['security_groups'] = secgrp_del
287
288
289class FloatingIpService(BaseService):
290 def __init__(self, manager, **kwargs):
291 super(FloatingIpService, self).__init__(kwargs)
John Warrene74890a2015-11-11 15:18:01 -0500292 self.client = manager.compute_floating_ips_client
David Patersonce781492014-09-18 01:07:01 -0400293
294 def list(self):
295 client = self.client
ghanshyam9a3a9a22015-08-18 17:03:55 +0900296 floating_ips = client.list_floating_ips()['floating_ips']
David Patersonce781492014-09-18 01:07:01 -0400297 LOG.debug("List count, %s Floating IPs" % len(floating_ips))
298 return floating_ips
299
300 def delete(self):
301 client = self.client
302 floating_ips = self.list()
303 for f in floating_ips:
304 try:
305 client.delete_floating_ip(f['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400306 except Exception:
307 LOG.exception("Delete Floating IPs exception.")
David Patersonce781492014-09-18 01:07:01 -0400308
309 def dry_run(self):
310 floating_ips = self.list()
311 self.data['floating_ips'] = floating_ips
312
313
314class VolumeService(BaseService):
315 def __init__(self, manager, **kwargs):
316 super(VolumeService, self).__init__(kwargs)
317 self.client = manager.volumes_client
318
319 def list(self):
320 client = self.client
John Warren6177c9e2015-08-19 20:00:17 +0000321 vols = client.list_volumes()['volumes']
David Patersonce781492014-09-18 01:07:01 -0400322 LOG.debug("List count, %s Volumes" % len(vols))
323 return vols
324
325 def delete(self):
326 client = self.client
327 vols = self.list()
328 for v in vols:
329 try:
330 client.delete_volume(v['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400331 except Exception:
332 LOG.exception("Delete Volume exception.")
David Patersonce781492014-09-18 01:07:01 -0400333
334 def dry_run(self):
335 vols = self.list()
336 self.data['volumes'] = vols
337
338
David Paterson35c8df02015-04-05 04:35:31 -0400339class VolumeQuotaService(BaseService):
340 def __init__(self, manager, **kwargs):
341 super(VolumeQuotaService, self).__init__(kwargs)
342 self.client = manager.volume_quotas_client
343
344 def delete(self):
345 client = self.client
346 try:
347 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400348 except Exception:
349 LOG.exception("Delete Volume Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400350
351 def dry_run(self):
Ken'ichi Ohmichi3cf9eaf2016-07-29 11:05:21 -0700352 quotas = self.client.show_quota_set(
353 self.tenant_id, params={'usage': True})['quota_set']
David Paterson35c8df02015-04-05 04:35:31 -0400354 self.data['volume_quotas'] = quotas
355
356
357class NovaQuotaService(BaseService):
358 def __init__(self, manager, **kwargs):
359 super(NovaQuotaService, self).__init__(kwargs)
360 self.client = manager.quotas_client
361 self.limits_client = manager.limits_client
362
363 def delete(self):
364 client = self.client
365 try:
366 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400367 except Exception:
368 LOG.exception("Delete Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400369
370 def dry_run(self):
371 client = self.limits_client
ghanshyam8a599492015-08-24 15:55:59 +0900372 quotas = client.show_limits()['limits']
Ken'ichi Ohmichib93e6762015-06-15 07:11:29 +0000373 self.data['compute_quotas'] = quotas['absolute']
David Paterson35c8df02015-04-05 04:35:31 -0400374
375
David Patersonce781492014-09-18 01:07:01 -0400376# Begin network service classes
377class NetworkService(BaseService):
378 def __init__(self, manager, **kwargs):
379 super(NetworkService, self).__init__(kwargs)
John Warren94d8faf2015-09-15 12:22:24 -0400380 self.networks_client = manager.networks_client
John Warren3961acd2015-10-02 14:38:53 -0400381 self.subnets_client = manager.subnets_client
John Warren49c0fe52015-10-22 12:35:54 -0400382 self.ports_client = manager.ports_client
John Warrenfbf2a892015-11-17 12:36:14 -0500383 self.floating_ips_client = manager.floating_ips_client
John Warren6d0083a2015-11-30 18:12:30 -0500384 self.metering_labels_client = manager.metering_labels_client
John Warrendd20b3e2015-12-03 13:11:28 -0500385 self.metering_label_rules_client = manager.metering_label_rules_client
John Warrenf9606e92015-12-10 12:12:42 -0500386 self.security_groups_client = manager.security_groups_client
ghanshyama25c4192016-03-11 18:38:12 +0900387 self.routers_client = manager.routers_client
David Patersonce781492014-09-18 01:07:01 -0400388
David Patersond6babc52014-10-14 00:11:56 -0400389 def _filter_by_conf_networks(self, item_list):
390 if not item_list or not all(('network_id' in i for i in item_list)):
391 return item_list
392
393 return [item for item in item_list if item['network_id']
394 not in CONF_NETWORKS]
395
David Patersonce781492014-09-18 01:07:01 -0400396 def list(self):
John Warren94d8faf2015-09-15 12:22:24 -0400397 client = self.networks_client
David Paterson82234022015-04-12 14:07:40 -0400398 networks = client.list_networks(**self.tenant_filter)
399 networks = networks['networks']
David Patersonce781492014-09-18 01:07:01 -0400400 # filter out networks declared in tempest.conf
401 if self.is_preserve:
402 networks = [network for network in networks
David Patersond6babc52014-10-14 00:11:56 -0400403 if network['id'] not in CONF_NETWORKS]
David Patersonce781492014-09-18 01:07:01 -0400404 LOG.debug("List count, %s Networks" % networks)
405 return networks
406
407 def delete(self):
John Warren94d8faf2015-09-15 12:22:24 -0400408 client = self.networks_client
David Patersonce781492014-09-18 01:07:01 -0400409 networks = self.list()
410 for n in networks:
411 try:
412 client.delete_network(n['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400413 except Exception:
414 LOG.exception("Delete Network exception.")
David Patersonce781492014-09-18 01:07:01 -0400415
416 def dry_run(self):
417 networks = self.list()
418 self.data['networks'] = networks
419
420
David Patersonce781492014-09-18 01:07:01 -0400421class NetworkFloatingIpService(NetworkService):
422
423 def list(self):
John Warrenfbf2a892015-11-17 12:36:14 -0500424 client = self.floating_ips_client
David Paterson82234022015-04-12 14:07:40 -0400425 flips = client.list_floatingips(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400426 flips = flips['floatingips']
David Patersonce781492014-09-18 01:07:01 -0400427 LOG.debug("List count, %s Network Floating IPs" % len(flips))
428 return flips
429
430 def delete(self):
431 client = self.client
432 flips = self.list()
433 for flip in flips:
434 try:
435 client.delete_floatingip(flip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400436 except Exception:
437 LOG.exception("Delete Network Floating IP exception.")
David Patersonce781492014-09-18 01:07:01 -0400438
439 def dry_run(self):
440 flips = self.list()
441 self.data['floating_ips'] = flips
442
443
444class NetworkRouterService(NetworkService):
445
446 def list(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000447 client = self.routers_client
David Paterson82234022015-04-12 14:07:40 -0400448 routers = client.list_routers(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400449 routers = routers['routers']
David Patersonce781492014-09-18 01:07:01 -0400450 if self.is_preserve:
451 routers = [router for router in routers
452 if router['id'] != CONF_PUB_ROUTER]
453
454 LOG.debug("List count, %s Routers" % len(routers))
455 return routers
456
457 def delete(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000458 client = self.routers_client
Ken'ichi Ohmichif3110f02016-03-21 12:29:03 -0700459 ports_client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400460 routers = self.list()
461 for router in routers:
462 try:
463 rid = router['id']
David Paterson82234022015-04-12 14:07:40 -0400464 ports = [port for port
Ken'ichi Ohmichif3110f02016-03-21 12:29:03 -0700465 in ports_client.list_ports(device_id=rid)['ports']
David Paterson82234022015-04-12 14:07:40 -0400466 if port["device_owner"] == "network:router_interface"]
David Patersonce781492014-09-18 01:07:01 -0400467 for port in ports:
piyush11078694aca952015-12-17 12:54:44 +0530468 client.remove_router_interface(rid, port_id=port['id'])
David Patersond6babc52014-10-14 00:11:56 -0400469 client.delete_router(rid)
David Patersone41ebca2015-04-09 05:40:12 -0400470 except Exception:
471 LOG.exception("Delete Router exception.")
David Patersonce781492014-09-18 01:07:01 -0400472
473 def dry_run(self):
474 routers = self.list()
475 self.data['routers'] = routers
476
477
478class NetworkHealthMonitorService(NetworkService):
479
480 def list(self):
481 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500482 hms = client.list_health_monitors()
David Patersonce781492014-09-18 01:07:01 -0400483 hms = hms['health_monitors']
484 hms = self._filter_by_tenant_id(hms)
485 LOG.debug("List count, %s Health Monitors" % len(hms))
486 return hms
487
488 def delete(self):
489 client = self.client
490 hms = self.list()
491 for hm in hms:
492 try:
493 client.delete_health_monitor(hm['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400494 except Exception:
495 LOG.exception("Delete Health Monitor exception.")
David Patersonce781492014-09-18 01:07:01 -0400496
497 def dry_run(self):
498 hms = self.list()
499 self.data['health_monitors'] = hms
500
501
502class NetworkMemberService(NetworkService):
503
504 def list(self):
505 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500506 members = client.list_members()
David Patersonce781492014-09-18 01:07:01 -0400507 members = members['members']
508 members = self._filter_by_tenant_id(members)
509 LOG.debug("List count, %s Members" % len(members))
510 return members
511
512 def delete(self):
513 client = self.client
514 members = self.list()
515 for member in members:
516 try:
517 client.delete_member(member['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400518 except Exception:
519 LOG.exception("Delete Member exception.")
David Patersonce781492014-09-18 01:07:01 -0400520
521 def dry_run(self):
522 members = self.list()
523 self.data['members'] = members
524
525
526class NetworkVipService(NetworkService):
527
528 def list(self):
529 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500530 vips = client.list_vips()
David Patersonce781492014-09-18 01:07:01 -0400531 vips = vips['vips']
532 vips = self._filter_by_tenant_id(vips)
533 LOG.debug("List count, %s VIPs" % len(vips))
534 return vips
535
536 def delete(self):
537 client = self.client
538 vips = self.list()
539 for vip in vips:
540 try:
541 client.delete_vip(vip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400542 except Exception:
543 LOG.exception("Delete VIP exception.")
David Patersonce781492014-09-18 01:07:01 -0400544
545 def dry_run(self):
546 vips = self.list()
547 self.data['vips'] = vips
548
549
550class NetworkPoolService(NetworkService):
551
552 def list(self):
553 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500554 pools = client.list_pools()
David Patersonce781492014-09-18 01:07:01 -0400555 pools = pools['pools']
556 pools = self._filter_by_tenant_id(pools)
557 LOG.debug("List count, %s Pools" % len(pools))
558 return pools
559
560 def delete(self):
561 client = self.client
562 pools = self.list()
563 for pool in pools:
564 try:
565 client.delete_pool(pool['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400566 except Exception:
567 LOG.exception("Delete Pool exception.")
David Patersonce781492014-09-18 01:07:01 -0400568
569 def dry_run(self):
570 pools = self.list()
571 self.data['pools'] = pools
572
573
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300574class NetworkMeteringLabelRuleService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400575
576 def list(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500577 client = self.metering_label_rules_client
David Kranz34e88122014-12-11 15:24:05 -0500578 rules = client.list_metering_label_rules()
David Patersonce781492014-09-18 01:07:01 -0400579 rules = rules['metering_label_rules']
580 rules = self._filter_by_tenant_id(rules)
581 LOG.debug("List count, %s Metering Label Rules" % len(rules))
582 return rules
583
584 def delete(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500585 client = self.metering_label_rules_client
David Patersonce781492014-09-18 01:07:01 -0400586 rules = self.list()
587 for rule in rules:
588 try:
589 client.delete_metering_label_rule(rule['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400590 except Exception:
591 LOG.exception("Delete Metering Label Rule exception.")
David Patersonce781492014-09-18 01:07:01 -0400592
593 def dry_run(self):
594 rules = self.list()
595 self.data['rules'] = rules
596
597
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300598class NetworkMeteringLabelService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400599
600 def list(self):
John Warren6d0083a2015-11-30 18:12:30 -0500601 client = self.metering_labels_client
David Kranz34e88122014-12-11 15:24:05 -0500602 labels = client.list_metering_labels()
David Patersonce781492014-09-18 01:07:01 -0400603 labels = labels['metering_labels']
604 labels = self._filter_by_tenant_id(labels)
605 LOG.debug("List count, %s Metering Labels" % len(labels))
606 return labels
607
608 def delete(self):
John Warren6d0083a2015-11-30 18:12:30 -0500609 client = self.metering_labels_client
David Patersonce781492014-09-18 01:07:01 -0400610 labels = self.list()
611 for label in labels:
612 try:
613 client.delete_metering_label(label['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400614 except Exception:
615 LOG.exception("Delete Metering Label exception.")
David Patersonce781492014-09-18 01:07:01 -0400616
617 def dry_run(self):
618 labels = self.list()
619 self.data['labels'] = labels
620
621
622class NetworkPortService(NetworkService):
623
624 def list(self):
John Warren49c0fe52015-10-22 12:35:54 -0400625 client = self.ports_client
David Paterson82234022015-04-12 14:07:40 -0400626 ports = [port for port in
627 client.list_ports(**self.tenant_filter)['ports']
628 if port["device_owner"] == "" or
629 port["device_owner"].startswith("compute:")]
630
David Patersond6babc52014-10-14 00:11:56 -0400631 if self.is_preserve:
632 ports = self._filter_by_conf_networks(ports)
David Paterson82234022015-04-12 14:07:40 -0400633
David Patersonce781492014-09-18 01:07:01 -0400634 LOG.debug("List count, %s Ports" % len(ports))
635 return ports
636
637 def delete(self):
John Warren49c0fe52015-10-22 12:35:54 -0400638 client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400639 ports = self.list()
640 for port in ports:
641 try:
642 client.delete_port(port['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400643 except Exception:
644 LOG.exception("Delete Port exception.")
David Patersonce781492014-09-18 01:07:01 -0400645
646 def dry_run(self):
647 ports = self.list()
648 self.data['ports'] = ports
649
650
David Paterson82234022015-04-12 14:07:40 -0400651class NetworkSecGroupService(NetworkService):
652 def list(self):
John Warrenf9606e92015-12-10 12:12:42 -0500653 client = self.security_groups_client
David Paterson82234022015-04-12 14:07:40 -0400654 filter = self.tenant_filter
655 # cannot delete default sec group so never show it.
656 secgroups = [secgroup for secgroup in
657 client.list_security_groups(**filter)['security_groups']
658 if secgroup['name'] != 'default']
659
660 if self.is_preserve:
661 secgroups = self._filter_by_conf_networks(secgroups)
zhuflbedb2ad2016-06-20 11:39:01 +0800662 LOG.debug("List count, %s security_groups" % len(secgroups))
David Paterson82234022015-04-12 14:07:40 -0400663 return secgroups
664
665 def delete(self):
666 client = self.client
667 secgroups = self.list()
668 for secgroup in secgroups:
669 try:
670 client.delete_secgroup(secgroup['id'])
671 except Exception:
672 LOG.exception("Delete security_group exception.")
673
674 def dry_run(self):
675 secgroups = self.list()
676 self.data['secgroups'] = secgroups
677
678
David Patersonce781492014-09-18 01:07:01 -0400679class NetworkSubnetService(NetworkService):
680
681 def list(self):
John Warren3961acd2015-10-02 14:38:53 -0400682 client = self.subnets_client
David Paterson82234022015-04-12 14:07:40 -0400683 subnets = client.list_subnets(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400684 subnets = subnets['subnets']
David Patersond6babc52014-10-14 00:11:56 -0400685 if self.is_preserve:
686 subnets = self._filter_by_conf_networks(subnets)
David Patersonce781492014-09-18 01:07:01 -0400687 LOG.debug("List count, %s Subnets" % len(subnets))
688 return subnets
689
690 def delete(self):
John Warren3961acd2015-10-02 14:38:53 -0400691 client = self.subnets_client
David Patersonce781492014-09-18 01:07:01 -0400692 subnets = self.list()
693 for subnet in subnets:
694 try:
695 client.delete_subnet(subnet['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400696 except Exception:
697 LOG.exception("Delete Subnet exception.")
David Patersonce781492014-09-18 01:07:01 -0400698
699 def dry_run(self):
700 subnets = self.list()
701 self.data['subnets'] = subnets
702
703
David Patersonce781492014-09-18 01:07:01 -0400704# begin global services
705class FlavorService(BaseService):
706 def __init__(self, manager, **kwargs):
707 super(FlavorService, self).__init__(kwargs)
708 self.client = manager.flavors_client
709
710 def list(self):
711 client = self.client
ghanshyam19973be2015-08-18 15:46:42 +0900712 flavors = client.list_flavors({"is_public": None})['flavors']
David Patersonce781492014-09-18 01:07:01 -0400713 if not self.is_save_state:
714 # recreate list removing saved flavors
715 flavors = [flavor for flavor in flavors if flavor['id']
716 not in self.saved_state_json['flavors'].keys()]
717
718 if self.is_preserve:
719 flavors = [flavor for flavor in flavors
720 if flavor['id'] not in CONF_FLAVORS]
721 LOG.debug("List count, %s Flavors after reconcile" % len(flavors))
722 return flavors
723
724 def delete(self):
725 client = self.client
726 flavors = self.list()
727 for flavor in flavors:
728 try:
729 client.delete_flavor(flavor['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400730 except Exception:
731 LOG.exception("Delete Flavor exception.")
David Patersonce781492014-09-18 01:07:01 -0400732
733 def dry_run(self):
734 flavors = self.list()
735 self.data['flavors'] = flavors
736
737 def save_state(self):
738 flavors = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500739 self.data['flavors'] = {}
David Patersonce781492014-09-18 01:07:01 -0400740 for flavor in flavors:
gordon chungc15f1bc2015-02-23 18:00:41 -0500741 self.data['flavors'][flavor['id']] = flavor['name']
David Patersonce781492014-09-18 01:07:01 -0400742
743
744class ImageService(BaseService):
745 def __init__(self, manager, **kwargs):
746 super(ImageService, self).__init__(kwargs)
Ghanshyamae76c122015-12-22 13:41:35 +0900747 self.client = manager.compute_images_client
David Patersonce781492014-09-18 01:07:01 -0400748
749 def list(self):
750 client = self.client
ghanshyam1756e0b2015-08-18 19:19:05 +0900751 images = client.list_images({"all_tenants": True})['images']
David Patersonce781492014-09-18 01:07:01 -0400752 if not self.is_save_state:
753 images = [image for image in images if image['id']
754 not in self.saved_state_json['images'].keys()]
755 if self.is_preserve:
756 images = [image for image in images
757 if image['id'] not in CONF_IMAGES]
758 LOG.debug("List count, %s Images after reconcile" % len(images))
759 return images
760
761 def delete(self):
762 client = self.client
763 images = self.list()
764 for image in images:
765 try:
766 client.delete_image(image['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400767 except Exception:
768 LOG.exception("Delete Image exception.")
David Patersonce781492014-09-18 01:07:01 -0400769
770 def dry_run(self):
771 images = self.list()
772 self.data['images'] = images
773
774 def save_state(self):
gordon chungc15f1bc2015-02-23 18:00:41 -0500775 self.data['images'] = {}
David Paterson82234022015-04-12 14:07:40 -0400776 images = self.list()
David Patersonce781492014-09-18 01:07:01 -0400777 for image in images:
gordon chungc15f1bc2015-02-23 18:00:41 -0500778 self.data['images'][image['id']] = image['name']
David Patersonce781492014-09-18 01:07:01 -0400779
780
781class IdentityService(BaseService):
782 def __init__(self, manager, **kwargs):
783 super(IdentityService, self).__init__(kwargs)
784 self.client = manager.identity_client
785
786
Daniel Mellado82c83a52015-12-09 15:16:49 +0000787class UserService(BaseService):
788
789 def __init__(self, manager, **kwargs):
790 super(UserService, self).__init__(kwargs)
791 self.client = manager.users_client
David Patersonce781492014-09-18 01:07:01 -0400792
793 def list(self):
Daniel Mellado82c83a52015-12-09 15:16:49 +0000794 users = self.client.list_users()['users']
David Patersonce781492014-09-18 01:07:01 -0400795
796 if not self.is_save_state:
797 users = [user for user in users if user['id']
798 not in self.saved_state_json['users'].keys()]
799
800 if self.is_preserve:
801 users = [user for user in users if user['name']
802 not in CONF_USERS]
803
804 elif not self.is_save_state: # Never delete admin user
805 users = [user for user in users if user['name'] !=
David Paterson07661de2015-10-29 20:15:04 -0700806 CONF.auth.admin_username]
David Patersonce781492014-09-18 01:07:01 -0400807
808 LOG.debug("List count, %s Users after reconcile" % len(users))
809 return users
810
811 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400812 users = self.list()
813 for user in users:
814 try:
Daniel Mellado82c83a52015-12-09 15:16:49 +0000815 self.client.delete_user(user['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400816 except Exception:
817 LOG.exception("Delete User exception.")
David Patersonce781492014-09-18 01:07:01 -0400818
819 def dry_run(self):
820 users = self.list()
821 self.data['users'] = users
822
823 def save_state(self):
824 users = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500825 self.data['users'] = {}
David Patersonce781492014-09-18 01:07:01 -0400826 for user in users:
gordon chungc15f1bc2015-02-23 18:00:41 -0500827 self.data['users'][user['id']] = user['name']
David Patersonce781492014-09-18 01:07:01 -0400828
829
Daniel Melladob83ea562015-12-18 09:12:49 +0000830class RoleService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400831
Daniel Mellado6b16b922015-12-07 12:43:08 +0000832 def __init__(self, manager, **kwargs):
833 super(RoleService, self).__init__(kwargs)
834 self.client = manager.roles_client
835
David Patersonce781492014-09-18 01:07:01 -0400836 def list(self):
David Patersonce781492014-09-18 01:07:01 -0400837 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000838 roles = self.client.list_roles()['roles']
David Patersonce781492014-09-18 01:07:01 -0400839 # reconcile roles with saved state and never list admin role
840 if not self.is_save_state:
841 roles = [role for role in roles if
842 (role['id'] not in
843 self.saved_state_json['roles'].keys()
844 and role['name'] != CONF.identity.admin_role)]
845 LOG.debug("List count, %s Roles after reconcile" % len(roles))
846 return roles
David Patersone41ebca2015-04-09 05:40:12 -0400847 except Exception:
848 LOG.exception("Cannot retrieve Roles.")
David Patersonce781492014-09-18 01:07:01 -0400849 return []
850
851 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400852 roles = self.list()
853 for role in roles:
854 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000855 self.client.delete_role(role['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400856 except Exception:
857 LOG.exception("Delete Role exception.")
David Patersonce781492014-09-18 01:07:01 -0400858
859 def dry_run(self):
860 roles = self.list()
861 self.data['roles'] = roles
862
863 def save_state(self):
864 roles = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500865 self.data['roles'] = {}
David Patersonce781492014-09-18 01:07:01 -0400866 for role in roles:
gordon chungc15f1bc2015-02-23 18:00:41 -0500867 self.data['roles'][role['id']] = role['name']
David Patersonce781492014-09-18 01:07:01 -0400868
869
Daniel Melladob83ea562015-12-18 09:12:49 +0000870class TenantService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400871
Daniel Melladob04da902015-11-20 17:43:12 +0100872 def __init__(self, manager, **kwargs):
873 super(TenantService, self).__init__(kwargs)
874 self.client = manager.tenants_client
875
David Patersonce781492014-09-18 01:07:01 -0400876 def list(self):
Daniel Melladob04da902015-11-20 17:43:12 +0100877 tenants = self.client.list_tenants()['tenants']
David Patersonce781492014-09-18 01:07:01 -0400878 if not self.is_save_state:
879 tenants = [tenant for tenant in tenants if (tenant['id']
880 not in self.saved_state_json['tenants'].keys()
Daniel Melladod4d0b932016-04-08 08:57:29 +0000881 and tenant['name'] != CONF.auth.admin_project_name)]
David Patersonce781492014-09-18 01:07:01 -0400882
883 if self.is_preserve:
884 tenants = [tenant for tenant in tenants if tenant['name']
885 not in CONF_TENANTS]
886
887 LOG.debug("List count, %s Tenants after reconcile" % len(tenants))
888 return tenants
889
890 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400891 tenants = self.list()
892 for tenant in tenants:
893 try:
Daniel Melladob04da902015-11-20 17:43:12 +0100894 self.client.delete_tenant(tenant['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400895 except Exception:
896 LOG.exception("Delete Tenant exception.")
David Patersonce781492014-09-18 01:07:01 -0400897
898 def dry_run(self):
899 tenants = self.list()
900 self.data['tenants'] = tenants
901
902 def save_state(self):
903 tenants = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500904 self.data['tenants'] = {}
David Patersonce781492014-09-18 01:07:01 -0400905 for tenant in tenants:
gordon chungc15f1bc2015-02-23 18:00:41 -0500906 self.data['tenants'][tenant['id']] = tenant['name']
David Patersonce781492014-09-18 01:07:01 -0400907
908
909class DomainService(BaseService):
910
911 def __init__(self, manager, **kwargs):
912 super(DomainService, self).__init__(kwargs)
Daniel Mellado91a26b62016-02-11 11:13:04 +0000913 self.client = manager.domains_client
David Patersonce781492014-09-18 01:07:01 -0400914
915 def list(self):
916 client = self.client
Thomas Bechtold48268a02015-08-30 19:37:46 +0200917 domains = client.list_domains()['domains']
David Patersonce781492014-09-18 01:07:01 -0400918 if not self.is_save_state:
919 domains = [domain for domain in domains if domain['id']
920 not in self.saved_state_json['domains'].keys()]
921
922 LOG.debug("List count, %s Domains after reconcile" % len(domains))
923 return domains
924
925 def delete(self):
926 client = self.client
927 domains = self.list()
928 for domain in domains:
929 try:
930 client.update_domain(domain['id'], enabled=False)
931 client.delete_domain(domain['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400932 except Exception:
933 LOG.exception("Delete Domain exception.")
David Patersonce781492014-09-18 01:07:01 -0400934
935 def dry_run(self):
936 domains = self.list()
937 self.data['domains'] = domains
938
939 def save_state(self):
940 domains = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500941 self.data['domains'] = {}
David Patersonce781492014-09-18 01:07:01 -0400942 for domain in domains:
gordon chungc15f1bc2015-02-23 18:00:41 -0500943 self.data['domains'][domain['id']] = domain['name']
David Patersonce781492014-09-18 01:07:01 -0400944
945
946def get_tenant_cleanup_services():
947 tenant_services = []
ghanshyame4796f82016-04-13 15:49:22 +0900948 # TODO(gmann): Tempest should provide some plugin hook for cleanup
949 # script extension to plugin tests also.
David Patersonce781492014-09-18 01:07:01 -0400950 if IS_NOVA:
951 tenant_services.append(ServerService)
952 tenant_services.append(KeyPairService)
953 tenant_services.append(SecurityGroupService)
954 tenant_services.append(ServerGroupService)
955 if not IS_NEUTRON:
956 tenant_services.append(FloatingIpService)
David Paterson35c8df02015-04-05 04:35:31 -0400957 tenant_services.append(NovaQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400958 if IS_HEAT:
959 tenant_services.append(StackService)
960 if IS_NEUTRON:
David Paterson82234022015-04-12 14:07:40 -0400961 tenant_services.append(NetworkFloatingIpService)
David Patersonce781492014-09-18 01:07:01 -0400962 if test.is_extension_enabled('metering', 'network'):
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300963 tenant_services.append(NetworkMeteringLabelRuleService)
964 tenant_services.append(NetworkMeteringLabelService)
David Patersonce781492014-09-18 01:07:01 -0400965 tenant_services.append(NetworkRouterService)
David Patersonce781492014-09-18 01:07:01 -0400966 tenant_services.append(NetworkPortService)
967 tenant_services.append(NetworkSubnetService)
968 tenant_services.append(NetworkService)
David Paterson82234022015-04-12 14:07:40 -0400969 tenant_services.append(NetworkSecGroupService)
David Patersonce781492014-09-18 01:07:01 -0400970 if IS_CINDER:
971 tenant_services.append(SnapshotService)
972 tenant_services.append(VolumeService)
David Paterson35c8df02015-04-05 04:35:31 -0400973 tenant_services.append(VolumeQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400974 return tenant_services
975
976
977def get_global_cleanup_services():
978 global_services = []
979 if IS_NOVA:
980 global_services.append(FlavorService)
981 if IS_GLANCE:
982 global_services.append(ImageService)
983 global_services.append(UserService)
984 global_services.append(TenantService)
985 global_services.append(DomainService)
986 global_services.append(RoleService)
987 return global_services