blob: fd9f284a87c6d4e1b6904aeb90e0ccacfb16081f [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
Martin Kopec97857942019-06-12 15:23:21 +000025from tempest.lib import exceptions
David Patersonce781492014-09-18 01:07:01 -040026
27LOG = logging.getLogger(__name__)
28CONF = config.CONF
29
David Patersonce781492014-09-18 01:07:01 -040030CONF_FLAVORS = None
31CONF_IMAGES = None
David Patersond6babc52014-10-14 00:11:56 -040032CONF_NETWORKS = []
33CONF_PRIV_NETWORK_NAME = None
34CONF_PUB_NETWORK = None
35CONF_PUB_ROUTER = None
Arx Cruz05fe4bc2017-10-20 10:48:28 +020036CONF_PROJECTS = None
David Patersond6babc52014-10-14 00:11:56 -040037CONF_USERS = None
David Patersonce781492014-09-18 01:07:01 -040038
David Patersonce781492014-09-18 01:07:01 -040039IS_CINDER = None
40IS_GLANCE = None
David Patersonce781492014-09-18 01:07:01 -040041IS_NEUTRON = None
42IS_NOVA = None
43
44
45def init_conf():
David Patersonce781492014-09-18 01:07:01 -040046 global CONF_FLAVORS
47 global CONF_IMAGES
David Patersond6babc52014-10-14 00:11:56 -040048 global CONF_NETWORKS
49 global CONF_PRIV_NETWORK
50 global CONF_PRIV_NETWORK_NAME
51 global CONF_PUB_NETWORK
52 global CONF_PUB_ROUTER
Arx Cruz05fe4bc2017-10-20 10:48:28 +020053 global CONF_PROJECTS
David Patersond6babc52014-10-14 00:11:56 -040054 global CONF_USERS
David Patersonce781492014-09-18 01:07:01 -040055 global IS_CINDER
56 global IS_GLANCE
57 global IS_HEAT
58 global IS_NEUTRON
59 global IS_NOVA
60
David Patersonce781492014-09-18 01:07:01 -040061 IS_CINDER = CONF.service_available.cinder
62 IS_GLANCE = CONF.service_available.glance
David Patersonce781492014-09-18 01:07:01 -040063 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
Arx Cruz05fe4bc2017-10-20 10:48:28 +020071 CONF_PROJECTS = [CONF.auth.admin_project_name]
Jeffrey Zhangb5e23212016-07-06 14:18:53 +080072 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):
ghanshyam009a1f62017-08-08 10:22:57 +030081 am = clients.Manager(
82 credentials.get_configured_admin_credentials())
John Warren94d8faf2015-09-15 12:22:24 -040083 net_cl = am.networks_client
Arx Cruz05fe4bc2017-10-20 10:48:28 +020084 pr_cl = am.projects_client
David Patersond6babc52014-10-14 00:11:56 -040085
David Kranz34e88122014-12-11 15:24:05 -050086 networks = net_cl.list_networks()
Arx Cruz05fe4bc2017-10-20 10:48:28 +020087 project = identity.get_project_by_name(pr_cl, project_name)
88 p_id = project['id']
David Patersond6babc52014-10-14 00:11:56 -040089 n_id = None
90 for net in networks['networks']:
Arx Cruz05fe4bc2017-10-20 10:48:28 +020091 if (net['project_id'] == p_id and net['name'] == net_name):
David Patersond6babc52014-10-14 00:11:56 -040092 n_id = net['id']
93 break
94 return n_id
95
David Patersonce781492014-09-18 01:07:01 -040096
97class BaseService(object):
98 def __init__(self, kwargs):
99 self.client = None
100 for key, value in kwargs.items():
101 setattr(self, key, value)
102
David Paterson82234022015-04-12 14:07:40 -0400103 self.tenant_filter = {}
104 if hasattr(self, 'tenant_id'):
Martin Kopecb37903c2019-01-20 21:39:58 +0000105 self.tenant_filter['project_id'] = self.tenant_id
David Paterson82234022015-04-12 14:07:40 -0400106
David Patersonce781492014-09-18 01:07:01 -0400107 def _filter_by_tenant_id(self, item_list):
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200108 if (item_list is None or
109 not item_list or
110 not hasattr(self, 'tenant_id') or
111 self.tenant_id is None or
112 'tenant_id' not in item_list[0]):
David Patersonce781492014-09-18 01:07:01 -0400113 return item_list
114
David Patersond6babc52014-10-14 00:11:56 -0400115 return [item for item in item_list
116 if item['tenant_id'] == self.tenant_id]
David Patersonce781492014-09-18 01:07:01 -0400117
118 def list(self):
119 pass
120
121 def delete(self):
122 pass
123
124 def dry_run(self):
125 pass
126
127 def save_state(self):
128 pass
129
130 def run(self):
Martin Kopec97857942019-06-12 15:23:21 +0000131 try:
132 if self.is_dry_run:
133 self.dry_run()
134 elif self.is_save_state:
135 self.save_state()
136 else:
137 self.delete()
138 except exceptions.NotImplemented as exc:
139 # Many OpenStack services use extensions logic to implement the
140 # features or resources. Tempest cleanup tries to clean up the test
141 # resources without having much logic of extensions checks etc.
142 # If any of the extension is missing then, service will return
143 # NotImplemented error.
144 msg = ("Got NotImplemented error in %s, full exception: %s" %
145 (str(self.__class__), str(exc)))
146 LOG.exception(msg)
Martin Kopec219e3222019-08-05 20:02:20 +0000147 self.got_exceptions.append(exc)
David Patersonce781492014-09-18 01:07:01 -0400148
149
150class SnapshotService(BaseService):
151
152 def __init__(self, manager, **kwargs):
153 super(SnapshotService, self).__init__(kwargs)
ghanshyam59928952017-10-26 01:38:45 +0000154 self.client = manager.snapshots_client_latest
David Patersonce781492014-09-18 01:07:01 -0400155
156 def list(self):
157 client = self.client
David Paterson07661de2015-10-29 20:15:04 -0700158 snaps = client.list_snapshots()['snapshots']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000159 if not self.is_save_state:
160 # recreate list removing saved snapshots
161 snaps = [snap for snap in snaps if snap['id']
162 not in self.saved_state_json['snapshots'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100163 LOG.debug("List count, %s Snapshots", len(snaps))
David Patersonce781492014-09-18 01:07:01 -0400164 return snaps
165
166 def delete(self):
167 snaps = self.list()
168 client = self.client
169 for snap in snaps:
170 try:
171 client.delete_snapshot(snap['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400172 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000173 LOG.exception("Delete Snapshot %s exception.", snap['id'])
David Patersonce781492014-09-18 01:07:01 -0400174
175 def dry_run(self):
176 snaps = self.list()
177 self.data['snapshots'] = snaps
178
Martin Kopec5a884bf2019-02-11 18:10:55 +0000179 def save_state(self):
180 snaps = self.list()
181 self.data['snapshots'] = {}
182 for snap in snaps:
183 self.data['snapshots'][snap['id']] = snap['name']
184
David Patersonce781492014-09-18 01:07:01 -0400185
186class ServerService(BaseService):
187 def __init__(self, manager, **kwargs):
188 super(ServerService, self).__init__(kwargs)
189 self.client = manager.servers_client
David Paterson07661de2015-10-29 20:15:04 -0700190 self.server_groups_client = manager.server_groups_client
David Patersonce781492014-09-18 01:07:01 -0400191
192 def list(self):
193 client = self.client
David Kranzae99b9a2015-02-16 13:37:01 -0500194 servers_body = client.list_servers()
David Patersonce781492014-09-18 01:07:01 -0400195 servers = servers_body['servers']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000196 if not self.is_save_state:
197 # recreate list removing saved servers
198 servers = [server for server in servers if server['id']
199 not in self.saved_state_json['servers'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100200 LOG.debug("List count, %s Servers", len(servers))
David Patersonce781492014-09-18 01:07:01 -0400201 return servers
202
203 def delete(self):
204 client = self.client
205 servers = self.list()
206 for server in servers:
207 try:
208 client.delete_server(server['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400209 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000210 LOG.exception("Delete Server %s exception.", server['id'])
David Patersonce781492014-09-18 01:07:01 -0400211
212 def dry_run(self):
213 servers = self.list()
214 self.data['servers'] = servers
215
Martin Kopec5a884bf2019-02-11 18:10:55 +0000216 def save_state(self):
217 servers = self.list()
218 self.data['servers'] = {}
219 for server in servers:
220 self.data['servers'][server['id']] = server['name']
221
David Patersonce781492014-09-18 01:07:01 -0400222
223class ServerGroupService(ServerService):
224
225 def list(self):
David Paterson07661de2015-10-29 20:15:04 -0700226 client = self.server_groups_client
ghanshyam2dc13452015-08-24 17:39:25 +0900227 sgs = client.list_server_groups()['server_groups']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000228 if not self.is_save_state:
229 # recreate list removing saved server_groups
230 sgs = [sg for sg in sgs if sg['id']
231 not in self.saved_state_json['server_groups'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100232 LOG.debug("List count, %s Server Groups", len(sgs))
David Patersonce781492014-09-18 01:07:01 -0400233 return sgs
234
235 def delete(self):
Martin Kopec5a884bf2019-02-11 18:10:55 +0000236 client = self.server_groups_client
David Patersonce781492014-09-18 01:07:01 -0400237 sgs = self.list()
238 for sg in sgs:
239 try:
240 client.delete_server_group(sg['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400241 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000242 LOG.exception("Delete Server Group %s exception.", sg['id'])
David Patersonce781492014-09-18 01:07:01 -0400243
244 def dry_run(self):
245 sgs = self.list()
246 self.data['server_groups'] = sgs
247
Martin Kopec5a884bf2019-02-11 18:10:55 +0000248 def save_state(self):
249 sgs = self.list()
250 self.data['server_groups'] = {}
251 for sg in sgs:
252 self.data['server_groups'][sg['id']] = sg['name']
253
David Patersonce781492014-09-18 01:07:01 -0400254
David Patersonce781492014-09-18 01:07:01 -0400255class KeyPairService(BaseService):
256 def __init__(self, manager, **kwargs):
257 super(KeyPairService, self).__init__(kwargs)
258 self.client = manager.keypairs_client
259
260 def list(self):
261 client = self.client
ghanshyamdee01f22015-08-17 11:41:47 +0900262 keypairs = client.list_keypairs()['keypairs']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000263 if not self.is_save_state:
264 # recreate list removing saved keypairs
265 keypairs = [keypair for keypair in keypairs
266 if keypair['keypair']['name']
267 not in self.saved_state_json['keypairs'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100268 LOG.debug("List count, %s Keypairs", len(keypairs))
David Patersonce781492014-09-18 01:07:01 -0400269 return keypairs
270
271 def delete(self):
272 client = self.client
273 keypairs = self.list()
274 for k in keypairs:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000275 name = k['keypair']['name']
David Patersonce781492014-09-18 01:07:01 -0400276 try:
David Patersonce781492014-09-18 01:07:01 -0400277 client.delete_keypair(name)
David Patersone41ebca2015-04-09 05:40:12 -0400278 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000279 LOG.exception("Delete Keypair %s exception.", name)
David Patersonce781492014-09-18 01:07:01 -0400280
281 def dry_run(self):
282 keypairs = self.list()
283 self.data['keypairs'] = keypairs
284
Martin Kopec5a884bf2019-02-11 18:10:55 +0000285 def save_state(self):
286 keypairs = self.list()
287 self.data['keypairs'] = {}
288 for keypair in keypairs:
289 keypair = keypair['keypair']
290 self.data['keypairs'][keypair['name']] = keypair
291
David Patersonce781492014-09-18 01:07:01 -0400292
David Patersonce781492014-09-18 01:07:01 -0400293class VolumeService(BaseService):
294 def __init__(self, manager, **kwargs):
295 super(VolumeService, self).__init__(kwargs)
ghanshyam59928952017-10-26 01:38:45 +0000296 self.client = manager.volumes_client_latest
David Patersonce781492014-09-18 01:07:01 -0400297
298 def list(self):
299 client = self.client
John Warren6177c9e2015-08-19 20:00:17 +0000300 vols = client.list_volumes()['volumes']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000301 if not self.is_save_state:
302 # recreate list removing saved volumes
303 vols = [vol for vol in vols if vol['id']
304 not in self.saved_state_json['volumes'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100305 LOG.debug("List count, %s Volumes", len(vols))
David Patersonce781492014-09-18 01:07:01 -0400306 return vols
307
308 def delete(self):
309 client = self.client
310 vols = self.list()
311 for v in vols:
312 try:
313 client.delete_volume(v['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400314 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000315 LOG.exception("Delete Volume %s exception.", v['id'])
David Patersonce781492014-09-18 01:07:01 -0400316
317 def dry_run(self):
318 vols = self.list()
319 self.data['volumes'] = vols
320
Martin Kopec5a884bf2019-02-11 18:10:55 +0000321 def save_state(self):
322 vols = self.list()
323 self.data['volumes'] = {}
324 for vol in vols:
325 self.data['volumes'][vol['id']] = vol['name']
326
David Patersonce781492014-09-18 01:07:01 -0400327
David Paterson35c8df02015-04-05 04:35:31 -0400328class VolumeQuotaService(BaseService):
329 def __init__(self, manager, **kwargs):
330 super(VolumeQuotaService, self).__init__(kwargs)
ghanshyam6c682ff2018-08-06 09:54:45 +0000331 self.client = manager.volume_quotas_client_latest
David Paterson35c8df02015-04-05 04:35:31 -0400332
333 def delete(self):
334 client = self.client
335 try:
Martin Kopecb37903c2019-01-20 21:39:58 +0000336 client.delete_quota_set(self.project_id)
David Patersone41ebca2015-04-09 05:40:12 -0400337 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000338 LOG.exception("Delete Volume Quotas exception for 'project %s'.",
339 self.project_id)
David Paterson35c8df02015-04-05 04:35:31 -0400340
341 def dry_run(self):
Ken'ichi Ohmichi3cf9eaf2016-07-29 11:05:21 -0700342 quotas = self.client.show_quota_set(
Martin Kopecb37903c2019-01-20 21:39:58 +0000343 self.project_id, params={'usage': True})['quota_set']
David Paterson35c8df02015-04-05 04:35:31 -0400344 self.data['volume_quotas'] = quotas
345
346
347class NovaQuotaService(BaseService):
348 def __init__(self, manager, **kwargs):
349 super(NovaQuotaService, self).__init__(kwargs)
350 self.client = manager.quotas_client
351 self.limits_client = manager.limits_client
352
353 def delete(self):
354 client = self.client
355 try:
Martin Kopecb37903c2019-01-20 21:39:58 +0000356 client.delete_quota_set(self.project_id)
David Patersone41ebca2015-04-09 05:40:12 -0400357 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000358 LOG.exception("Delete Quotas exception for 'project %s'.",
359 self.project_id)
David Paterson35c8df02015-04-05 04:35:31 -0400360
361 def dry_run(self):
362 client = self.limits_client
ghanshyam8a599492015-08-24 15:55:59 +0900363 quotas = client.show_limits()['limits']
Ken'ichi Ohmichib93e6762015-06-15 07:11:29 +0000364 self.data['compute_quotas'] = quotas['absolute']
David Paterson35c8df02015-04-05 04:35:31 -0400365
366
David Patersonce781492014-09-18 01:07:01 -0400367# Begin network service classes
Martin Kopec5a884bf2019-02-11 18:10:55 +0000368class BaseNetworkService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400369 def __init__(self, manager, **kwargs):
Martin Kopec5a884bf2019-02-11 18:10:55 +0000370 super(BaseNetworkService, self).__init__(kwargs)
John Warren94d8faf2015-09-15 12:22:24 -0400371 self.networks_client = manager.networks_client
John Warren3961acd2015-10-02 14:38:53 -0400372 self.subnets_client = manager.subnets_client
John Warren49c0fe52015-10-22 12:35:54 -0400373 self.ports_client = manager.ports_client
John Warrenfbf2a892015-11-17 12:36:14 -0500374 self.floating_ips_client = manager.floating_ips_client
John Warren6d0083a2015-11-30 18:12:30 -0500375 self.metering_labels_client = manager.metering_labels_client
John Warrendd20b3e2015-12-03 13:11:28 -0500376 self.metering_label_rules_client = manager.metering_label_rules_client
John Warrenf9606e92015-12-10 12:12:42 -0500377 self.security_groups_client = manager.security_groups_client
ghanshyama25c4192016-03-11 18:38:12 +0900378 self.routers_client = manager.routers_client
Martin Kopece6819982019-02-18 12:34:52 +0000379 self.subnetpools_client = manager.subnetpools_client
David Patersonce781492014-09-18 01:07:01 -0400380
David Patersond6babc52014-10-14 00:11:56 -0400381 def _filter_by_conf_networks(self, item_list):
382 if not item_list or not all(('network_id' in i for i in item_list)):
383 return item_list
384
385 return [item for item in item_list if item['network_id']
386 not in CONF_NETWORKS]
387
Martin Kopec5a884bf2019-02-11 18:10:55 +0000388
389class NetworkService(BaseNetworkService):
390
David Patersonce781492014-09-18 01:07:01 -0400391 def list(self):
John Warren94d8faf2015-09-15 12:22:24 -0400392 client = self.networks_client
David Paterson82234022015-04-12 14:07:40 -0400393 networks = client.list_networks(**self.tenant_filter)
394 networks = networks['networks']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000395
396 if not self.is_save_state:
397 # recreate list removing saved networks
398 networks = [network for network in networks if network['id']
399 not in self.saved_state_json['networks'].keys()]
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]
Jordan Pittier525ec712016-12-07 17:51:26 +0100404 LOG.debug("List count, %s Networks", networks)
David Patersonce781492014-09-18 01:07:01 -0400405 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:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000414 LOG.exception("Delete Network %s exception.", n['id'])
David Patersonce781492014-09-18 01:07:01 -0400415
416 def dry_run(self):
417 networks = self.list()
418 self.data['networks'] = networks
419
Martin Kopec5a884bf2019-02-11 18:10:55 +0000420 def save_state(self):
421 networks = self.list()
422 self.data['networks'] = {}
423 for network in networks:
424 self.data['networks'][network['id']] = network
David Patersonce781492014-09-18 01:07:01 -0400425
Martin Kopec5a884bf2019-02-11 18:10:55 +0000426
427class NetworkFloatingIpService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400428
429 def list(self):
John Warrenfbf2a892015-11-17 12:36:14 -0500430 client = self.floating_ips_client
David Paterson82234022015-04-12 14:07:40 -0400431 flips = client.list_floatingips(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400432 flips = flips['floatingips']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000433
434 if not self.is_save_state:
435 # recreate list removing saved flips
436 flips = [flip for flip in flips if flip['id']
437 not in self.saved_state_json['floatingips'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100438 LOG.debug("List count, %s Network Floating IPs", len(flips))
David Patersonce781492014-09-18 01:07:01 -0400439 return flips
440
441 def delete(self):
Martin Kopec5a884bf2019-02-11 18:10:55 +0000442 client = self.floating_ips_client
David Patersonce781492014-09-18 01:07:01 -0400443 flips = self.list()
444 for flip in flips:
445 try:
446 client.delete_floatingip(flip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400447 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000448 LOG.exception("Delete Network Floating IP %s exception.",
449 flip['id'])
David Patersonce781492014-09-18 01:07:01 -0400450
451 def dry_run(self):
452 flips = self.list()
Martin Kopec5a884bf2019-02-11 18:10:55 +0000453 self.data['floatingips'] = flips
454
455 def save_state(self):
456 flips = self.list()
457 self.data['floatingips'] = {}
458 for flip in flips:
459 self.data['floatingips'][flip['id']] = flip
David Patersonce781492014-09-18 01:07:01 -0400460
461
Martin Kopec5a884bf2019-02-11 18:10:55 +0000462class NetworkRouterService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400463
464 def list(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000465 client = self.routers_client
David Paterson82234022015-04-12 14:07:40 -0400466 routers = client.list_routers(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400467 routers = routers['routers']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000468
469 if not self.is_save_state:
470 # recreate list removing saved routers
471 routers = [router for router in routers if router['id']
472 not in self.saved_state_json['routers'].keys()]
David Patersonce781492014-09-18 01:07:01 -0400473 if self.is_preserve:
474 routers = [router for router in routers
475 if router['id'] != CONF_PUB_ROUTER]
476
Jordan Pittier525ec712016-12-07 17:51:26 +0100477 LOG.debug("List count, %s Routers", len(routers))
David Patersonce781492014-09-18 01:07:01 -0400478 return routers
479
480 def delete(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000481 client = self.routers_client
Ken'ichi Ohmichif3110f02016-03-21 12:29:03 -0700482 ports_client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400483 routers = self.list()
484 for router in routers:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000485 rid = router['id']
Martin Kopec598b1ae2019-04-01 14:41:53 +0000486 ports = [port for port
487 in ports_client.list_ports(device_id=rid)['ports']
488 if net_info.is_router_interface_port(port)]
489 for port in ports:
490 try:
piyush11078694aca952015-12-17 12:54:44 +0530491 client.remove_router_interface(rid, port_id=port['id'])
Martin Kopec598b1ae2019-04-01 14:41:53 +0000492 except Exception:
493 LOG.exception("Delete Router Interface exception for "
494 "'port %s' of 'router %s'.", port['id'], rid)
495 try:
David Patersond6babc52014-10-14 00:11:56 -0400496 client.delete_router(rid)
David Patersone41ebca2015-04-09 05:40:12 -0400497 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000498 LOG.exception("Delete Router %s exception.", rid)
David Patersonce781492014-09-18 01:07:01 -0400499
500 def dry_run(self):
501 routers = self.list()
502 self.data['routers'] = routers
503
Martin Kopec5a884bf2019-02-11 18:10:55 +0000504 def save_state(self):
505 routers = self.list()
506 self.data['routers'] = {}
507 for router in routers:
508 self.data['routers'][router['id']] = router['name']
509
David Patersonce781492014-09-18 01:07:01 -0400510
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300511class NetworkMeteringLabelRuleService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400512
513 def list(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500514 client = self.metering_label_rules_client
David Kranz34e88122014-12-11 15:24:05 -0500515 rules = client.list_metering_label_rules()
David Patersonce781492014-09-18 01:07:01 -0400516 rules = rules['metering_label_rules']
517 rules = self._filter_by_tenant_id(rules)
Martin Kopec5a884bf2019-02-11 18:10:55 +0000518
519 if not self.is_save_state:
520 saved_rules = self.saved_state_json['metering_label_rules'].keys()
521 # recreate list removing saved rules
522 rules = [rule for rule in rules if rule['id'] not in saved_rules]
Jordan Pittier525ec712016-12-07 17:51:26 +0100523 LOG.debug("List count, %s Metering Label Rules", len(rules))
David Patersonce781492014-09-18 01:07:01 -0400524 return rules
525
526 def delete(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500527 client = self.metering_label_rules_client
David Patersonce781492014-09-18 01:07:01 -0400528 rules = self.list()
529 for rule in rules:
530 try:
531 client.delete_metering_label_rule(rule['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400532 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000533 LOG.exception("Delete Metering Label Rule %s exception.",
534 rule['id'])
David Patersonce781492014-09-18 01:07:01 -0400535
536 def dry_run(self):
537 rules = self.list()
Martin Kopec5a884bf2019-02-11 18:10:55 +0000538 self.data['metering_label_rules'] = rules
539
540 def save_state(self):
541 rules = self.list()
542 self.data['metering_label_rules'] = {}
543 for rule in rules:
544 self.data['metering_label_rules'][rule['id']] = rule
David Patersonce781492014-09-18 01:07:01 -0400545
546
Martin Kopec5a884bf2019-02-11 18:10:55 +0000547class NetworkMeteringLabelService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400548
549 def list(self):
John Warren6d0083a2015-11-30 18:12:30 -0500550 client = self.metering_labels_client
David Kranz34e88122014-12-11 15:24:05 -0500551 labels = client.list_metering_labels()
David Patersonce781492014-09-18 01:07:01 -0400552 labels = labels['metering_labels']
553 labels = self._filter_by_tenant_id(labels)
Martin Kopec5a884bf2019-02-11 18:10:55 +0000554
555 if not self.is_save_state:
556 # recreate list removing saved labels
557 labels = [label for label in labels if label['id']
558 not in self.saved_state_json['metering_labels'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100559 LOG.debug("List count, %s Metering Labels", len(labels))
David Patersonce781492014-09-18 01:07:01 -0400560 return labels
561
562 def delete(self):
John Warren6d0083a2015-11-30 18:12:30 -0500563 client = self.metering_labels_client
David Patersonce781492014-09-18 01:07:01 -0400564 labels = self.list()
565 for label in labels:
566 try:
567 client.delete_metering_label(label['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400568 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000569 LOG.exception("Delete Metering Label %s exception.",
570 label['id'])
David Patersonce781492014-09-18 01:07:01 -0400571
572 def dry_run(self):
573 labels = self.list()
Martin Kopec5a884bf2019-02-11 18:10:55 +0000574 self.data['metering_labels'] = labels
575
576 def save_state(self):
577 labels = self.list()
578 self.data['metering_labels'] = {}
579 for label in labels:
580 self.data['metering_labels'][label['id']] = label['name']
David Patersonce781492014-09-18 01:07:01 -0400581
582
Martin Kopec5a884bf2019-02-11 18:10:55 +0000583class NetworkPortService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400584
585 def list(self):
John Warren49c0fe52015-10-22 12:35:54 -0400586 client = self.ports_client
David Paterson82234022015-04-12 14:07:40 -0400587 ports = [port for port in
588 client.list_ports(**self.tenant_filter)['ports']
589 if port["device_owner"] == "" or
590 port["device_owner"].startswith("compute:")]
591
Martin Kopec5a884bf2019-02-11 18:10:55 +0000592 if not self.is_save_state:
593 # recreate list removing saved ports
594 ports = [port for port in ports if port['id']
595 not in self.saved_state_json['ports'].keys()]
David Patersond6babc52014-10-14 00:11:56 -0400596 if self.is_preserve:
597 ports = self._filter_by_conf_networks(ports)
David Paterson82234022015-04-12 14:07:40 -0400598
Jordan Pittier525ec712016-12-07 17:51:26 +0100599 LOG.debug("List count, %s Ports", len(ports))
David Patersonce781492014-09-18 01:07:01 -0400600 return ports
601
602 def delete(self):
John Warren49c0fe52015-10-22 12:35:54 -0400603 client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400604 ports = self.list()
605 for port in ports:
606 try:
607 client.delete_port(port['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400608 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000609 LOG.exception("Delete Port %s exception.", port['id'])
David Patersonce781492014-09-18 01:07:01 -0400610
611 def dry_run(self):
612 ports = self.list()
613 self.data['ports'] = ports
614
Martin Kopec5a884bf2019-02-11 18:10:55 +0000615 def save_state(self):
616 ports = self.list()
617 self.data['ports'] = {}
618 for port in ports:
619 self.data['ports'][port['id']] = port['name']
David Patersonce781492014-09-18 01:07:01 -0400620
Martin Kopec5a884bf2019-02-11 18:10:55 +0000621
622class NetworkSecGroupService(BaseNetworkService):
David Paterson82234022015-04-12 14:07:40 -0400623 def list(self):
John Warrenf9606e92015-12-10 12:12:42 -0500624 client = self.security_groups_client
David Paterson82234022015-04-12 14:07:40 -0400625 filter = self.tenant_filter
626 # cannot delete default sec group so never show it.
627 secgroups = [secgroup for secgroup in
628 client.list_security_groups(**filter)['security_groups']
629 if secgroup['name'] != 'default']
630
Martin Kopec5a884bf2019-02-11 18:10:55 +0000631 if not self.is_save_state:
632 # recreate list removing saved security_groups
633 secgroups = [secgroup for secgroup in secgroups if secgroup['id']
634 not in self.saved_state_json['security_groups'].keys()
635 ]
David Paterson82234022015-04-12 14:07:40 -0400636 if self.is_preserve:
Martin Kopec5a884bf2019-02-11 18:10:55 +0000637 secgroups = [secgroup for secgroup in secgroups
638 if secgroup['security_group_rules'][0]['project_id']
639 not in CONF_PROJECTS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100640 LOG.debug("List count, %s security_groups", len(secgroups))
David Paterson82234022015-04-12 14:07:40 -0400641 return secgroups
642
643 def delete(self):
Martin Kopec5a884bf2019-02-11 18:10:55 +0000644 client = self.security_groups_client
David Paterson82234022015-04-12 14:07:40 -0400645 secgroups = self.list()
646 for secgroup in secgroups:
647 try:
Martin Kopec5a884bf2019-02-11 18:10:55 +0000648 client.delete_security_group(secgroup['id'])
David Paterson82234022015-04-12 14:07:40 -0400649 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000650 LOG.exception("Delete security_group %s exception.",
651 secgroup['id'])
David Paterson82234022015-04-12 14:07:40 -0400652
653 def dry_run(self):
654 secgroups = self.list()
Martin Kopec5a884bf2019-02-11 18:10:55 +0000655 self.data['security_groups'] = secgroups
656
657 def save_state(self):
658 secgroups = self.list()
659 self.data['security_groups'] = {}
660 for secgroup in secgroups:
661 self.data['security_groups'][secgroup['id']] = secgroup['name']
David Paterson82234022015-04-12 14:07:40 -0400662
663
Martin Kopec5a884bf2019-02-11 18:10:55 +0000664class NetworkSubnetService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400665
666 def list(self):
John Warren3961acd2015-10-02 14:38:53 -0400667 client = self.subnets_client
David Paterson82234022015-04-12 14:07:40 -0400668 subnets = client.list_subnets(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400669 subnets = subnets['subnets']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000670 if not self.is_save_state:
671 # recreate list removing saved subnets
672 subnets = [subnet for subnet in subnets if subnet['id']
673 not in self.saved_state_json['subnets'].keys()]
David Patersond6babc52014-10-14 00:11:56 -0400674 if self.is_preserve:
675 subnets = self._filter_by_conf_networks(subnets)
Jordan Pittier525ec712016-12-07 17:51:26 +0100676 LOG.debug("List count, %s Subnets", len(subnets))
David Patersonce781492014-09-18 01:07:01 -0400677 return subnets
678
679 def delete(self):
John Warren3961acd2015-10-02 14:38:53 -0400680 client = self.subnets_client
David Patersonce781492014-09-18 01:07:01 -0400681 subnets = self.list()
682 for subnet in subnets:
683 try:
684 client.delete_subnet(subnet['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400685 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000686 LOG.exception("Delete Subnet %s exception.", subnet['id'])
David Patersonce781492014-09-18 01:07:01 -0400687
688 def dry_run(self):
689 subnets = self.list()
690 self.data['subnets'] = subnets
691
Martin Kopec5a884bf2019-02-11 18:10:55 +0000692 def save_state(self):
693 subnets = self.list()
694 self.data['subnets'] = {}
695 for subnet in subnets:
696 self.data['subnets'][subnet['id']] = subnet['name']
697
David Patersonce781492014-09-18 01:07:01 -0400698
Martin Kopece6819982019-02-18 12:34:52 +0000699class NetworkSubnetPoolsService(BaseNetworkService):
700
701 def list(self):
702 client = self.subnetpools_client
703 pools = client.list_subnetpools(**self.tenant_filter)['subnetpools']
704 if not self.is_save_state:
705 # recreate list removing saved subnet pools
706 pools = [pool for pool in pools if pool['id']
707 not in self.saved_state_json['subnetpools'].keys()]
708 if self.is_preserve:
709 pools = [pool for pool in pools if pool['project_id']
710 not in CONF_PROJECTS]
711 LOG.debug("List count, %s Subnet Pools", len(pools))
712 return pools
713
714 def delete(self):
715 client = self.subnetpools_client
716 pools = self.list()
717 for pool in pools:
718 try:
719 client.delete_subnetpool(pool['id'])
720 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000721 LOG.exception("Delete Subnet Pool %s exception.", pool['id'])
Martin Kopece6819982019-02-18 12:34:52 +0000722
723 def dry_run(self):
724 pools = self.list()
725 self.data['subnetpools'] = pools
726
727 def save_state(self):
728 pools = self.list()
729 self.data['subnetpools'] = {}
730 for pool in pools:
731 self.data['subnetpools'][pool['id']] = pool['name']
732
733
David Patersonce781492014-09-18 01:07:01 -0400734# begin global services
735class FlavorService(BaseService):
736 def __init__(self, manager, **kwargs):
737 super(FlavorService, self).__init__(kwargs)
738 self.client = manager.flavors_client
739
740 def list(self):
741 client = self.client
ghanshyam19973be2015-08-18 15:46:42 +0900742 flavors = client.list_flavors({"is_public": None})['flavors']
David Patersonce781492014-09-18 01:07:01 -0400743 if not self.is_save_state:
744 # recreate list removing saved flavors
745 flavors = [flavor for flavor in flavors if flavor['id']
746 not in self.saved_state_json['flavors'].keys()]
747
748 if self.is_preserve:
749 flavors = [flavor for flavor in flavors
750 if flavor['id'] not in CONF_FLAVORS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100751 LOG.debug("List count, %s Flavors after reconcile", len(flavors))
David Patersonce781492014-09-18 01:07:01 -0400752 return flavors
753
754 def delete(self):
755 client = self.client
756 flavors = self.list()
757 for flavor in flavors:
758 try:
759 client.delete_flavor(flavor['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400760 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000761 LOG.exception("Delete Flavor %s exception.", flavor['id'])
David Patersonce781492014-09-18 01:07:01 -0400762
763 def dry_run(self):
764 flavors = self.list()
765 self.data['flavors'] = flavors
766
767 def save_state(self):
768 flavors = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500769 self.data['flavors'] = {}
David Patersonce781492014-09-18 01:07:01 -0400770 for flavor in flavors:
gordon chungc15f1bc2015-02-23 18:00:41 -0500771 self.data['flavors'][flavor['id']] = flavor['name']
David Patersonce781492014-09-18 01:07:01 -0400772
773
774class ImageService(BaseService):
775 def __init__(self, manager, **kwargs):
776 super(ImageService, self).__init__(kwargs)
zhufl66275c22018-03-28 15:32:14 +0800777 self.client = manager.image_client_v2
David Patersonce781492014-09-18 01:07:01 -0400778
779 def list(self):
780 client = self.client
zhufl66275c22018-03-28 15:32:14 +0800781 images = client.list_images(params={"all_tenants": True})['images']
David Patersonce781492014-09-18 01:07:01 -0400782 if not self.is_save_state:
783 images = [image for image in images if image['id']
784 not in self.saved_state_json['images'].keys()]
785 if self.is_preserve:
786 images = [image for image in images
787 if image['id'] not in CONF_IMAGES]
Jordan Pittier525ec712016-12-07 17:51:26 +0100788 LOG.debug("List count, %s Images after reconcile", len(images))
David Patersonce781492014-09-18 01:07:01 -0400789 return images
790
791 def delete(self):
792 client = self.client
793 images = self.list()
794 for image in images:
795 try:
796 client.delete_image(image['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400797 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000798 LOG.exception("Delete Image %s exception.", image['id'])
David Patersonce781492014-09-18 01:07:01 -0400799
800 def dry_run(self):
801 images = self.list()
802 self.data['images'] = images
803
804 def save_state(self):
gordon chungc15f1bc2015-02-23 18:00:41 -0500805 self.data['images'] = {}
David Paterson82234022015-04-12 14:07:40 -0400806 images = self.list()
David Patersonce781492014-09-18 01:07:01 -0400807 for image in images:
gordon chungc15f1bc2015-02-23 18:00:41 -0500808 self.data['images'][image['id']] = image['name']
David Patersonce781492014-09-18 01:07:01 -0400809
810
Daniel Mellado82c83a52015-12-09 15:16:49 +0000811class UserService(BaseService):
812
813 def __init__(self, manager, **kwargs):
814 super(UserService, self).__init__(kwargs)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200815 self.client = manager.users_v3_client
David Patersonce781492014-09-18 01:07:01 -0400816
817 def list(self):
Daniel Mellado82c83a52015-12-09 15:16:49 +0000818 users = self.client.list_users()['users']
David Patersonce781492014-09-18 01:07:01 -0400819
820 if not self.is_save_state:
821 users = [user for user in users if user['id']
822 not in self.saved_state_json['users'].keys()]
823
824 if self.is_preserve:
825 users = [user for user in users if user['name']
826 not in CONF_USERS]
827
828 elif not self.is_save_state: # Never delete admin user
829 users = [user for user in users if user['name'] !=
David Paterson07661de2015-10-29 20:15:04 -0700830 CONF.auth.admin_username]
David Patersonce781492014-09-18 01:07:01 -0400831
Jordan Pittier525ec712016-12-07 17:51:26 +0100832 LOG.debug("List count, %s Users after reconcile", len(users))
David Patersonce781492014-09-18 01:07:01 -0400833 return users
834
835 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400836 users = self.list()
837 for user in users:
838 try:
Daniel Mellado82c83a52015-12-09 15:16:49 +0000839 self.client.delete_user(user['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400840 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000841 LOG.exception("Delete User %s exception.", user['id'])
David Patersonce781492014-09-18 01:07:01 -0400842
843 def dry_run(self):
844 users = self.list()
845 self.data['users'] = users
846
847 def save_state(self):
848 users = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500849 self.data['users'] = {}
David Patersonce781492014-09-18 01:07:01 -0400850 for user in users:
gordon chungc15f1bc2015-02-23 18:00:41 -0500851 self.data['users'][user['id']] = user['name']
David Patersonce781492014-09-18 01:07:01 -0400852
853
Daniel Melladob83ea562015-12-18 09:12:49 +0000854class RoleService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400855
Daniel Mellado6b16b922015-12-07 12:43:08 +0000856 def __init__(self, manager, **kwargs):
857 super(RoleService, self).__init__(kwargs)
Martin Kopecbd5be762019-07-13 22:42:08 +0000858 self.client = manager.roles_v3_client
Daniel Mellado6b16b922015-12-07 12:43:08 +0000859
David Patersonce781492014-09-18 01:07:01 -0400860 def list(self):
David Patersonce781492014-09-18 01:07:01 -0400861 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000862 roles = self.client.list_roles()['roles']
David Patersonce781492014-09-18 01:07:01 -0400863 # reconcile roles with saved state and never list admin role
864 if not self.is_save_state:
865 roles = [role for role in roles if
866 (role['id'] not in
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200867 self.saved_state_json['roles'].keys() and
868 role['name'] != CONF.identity.admin_role)]
Jordan Pittier525ec712016-12-07 17:51:26 +0100869 LOG.debug("List count, %s Roles after reconcile", len(roles))
David Patersonce781492014-09-18 01:07:01 -0400870 return roles
David Patersone41ebca2015-04-09 05:40:12 -0400871 except Exception:
872 LOG.exception("Cannot retrieve Roles.")
David Patersonce781492014-09-18 01:07:01 -0400873 return []
874
875 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400876 roles = self.list()
877 for role in roles:
878 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000879 self.client.delete_role(role['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400880 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000881 LOG.exception("Delete Role %s exception.", role['id'])
David Patersonce781492014-09-18 01:07:01 -0400882
883 def dry_run(self):
884 roles = self.list()
885 self.data['roles'] = roles
886
887 def save_state(self):
888 roles = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500889 self.data['roles'] = {}
David Patersonce781492014-09-18 01:07:01 -0400890 for role in roles:
gordon chungc15f1bc2015-02-23 18:00:41 -0500891 self.data['roles'][role['id']] = role['name']
David Patersonce781492014-09-18 01:07:01 -0400892
893
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200894class ProjectService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400895
Daniel Melladob04da902015-11-20 17:43:12 +0100896 def __init__(self, manager, **kwargs):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200897 super(ProjectService, self).__init__(kwargs)
898 self.client = manager.projects_client
Daniel Melladob04da902015-11-20 17:43:12 +0100899
David Patersonce781492014-09-18 01:07:01 -0400900 def list(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200901 projects = self.client.list_projects()['projects']
David Patersonce781492014-09-18 01:07:01 -0400902 if not self.is_save_state:
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200903 project_ids = self.saved_state_json['projects']
904 projects = [project
905 for project in projects
906 if (project['id'] not in project_ids and
907 project['name'] != CONF.auth.admin_project_name)]
David Patersonce781492014-09-18 01:07:01 -0400908
909 if self.is_preserve:
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200910 projects = [project
911 for project in projects
912 if project['name'] not in CONF_PROJECTS]
David Patersonce781492014-09-18 01:07:01 -0400913
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200914 LOG.debug("List count, %s Projects after reconcile", len(projects))
915 return projects
David Patersonce781492014-09-18 01:07:01 -0400916
917 def delete(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200918 projects = self.list()
919 for project in projects:
David Patersonce781492014-09-18 01:07:01 -0400920 try:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200921 self.client.delete_project(project['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400922 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000923 LOG.exception("Delete project %s exception.", project['id'])
David Patersonce781492014-09-18 01:07:01 -0400924
925 def dry_run(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200926 projects = self.list()
927 self.data['projects'] = projects
David Patersonce781492014-09-18 01:07:01 -0400928
929 def save_state(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200930 projects = self.list()
931 self.data['projects'] = {}
932 for project in projects:
933 self.data['projects'][project['id']] = project['name']
David Patersonce781492014-09-18 01:07:01 -0400934
935
936class DomainService(BaseService):
937
938 def __init__(self, manager, **kwargs):
939 super(DomainService, self).__init__(kwargs)
Daniel Mellado91a26b62016-02-11 11:13:04 +0000940 self.client = manager.domains_client
David Patersonce781492014-09-18 01:07:01 -0400941
942 def list(self):
943 client = self.client
Thomas Bechtold48268a02015-08-30 19:37:46 +0200944 domains = client.list_domains()['domains']
David Patersonce781492014-09-18 01:07:01 -0400945 if not self.is_save_state:
946 domains = [domain for domain in domains if domain['id']
947 not in self.saved_state_json['domains'].keys()]
948
Jordan Pittier525ec712016-12-07 17:51:26 +0100949 LOG.debug("List count, %s Domains after reconcile", len(domains))
David Patersonce781492014-09-18 01:07:01 -0400950 return domains
951
952 def delete(self):
953 client = self.client
954 domains = self.list()
955 for domain in domains:
956 try:
957 client.update_domain(domain['id'], enabled=False)
958 client.delete_domain(domain['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400959 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000960 LOG.exception("Delete Domain %s exception.", domain['id'])
David Patersonce781492014-09-18 01:07:01 -0400961
962 def dry_run(self):
963 domains = self.list()
964 self.data['domains'] = domains
965
966 def save_state(self):
967 domains = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500968 self.data['domains'] = {}
David Patersonce781492014-09-18 01:07:01 -0400969 for domain in domains:
gordon chungc15f1bc2015-02-23 18:00:41 -0500970 self.data['domains'][domain['id']] = domain['name']
David Patersonce781492014-09-18 01:07:01 -0400971
972
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200973def get_project_cleanup_services():
974 project_services = []
ghanshyame4796f82016-04-13 15:49:22 +0900975 # TODO(gmann): Tempest should provide some plugin hook for cleanup
976 # script extension to plugin tests also.
David Patersonce781492014-09-18 01:07:01 -0400977 if IS_NOVA:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200978 project_services.append(ServerService)
979 project_services.append(KeyPairService)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200980 project_services.append(ServerGroupService)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200981 project_services.append(NovaQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400982 if IS_NEUTRON:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200983 project_services.append(NetworkFloatingIpService)
Andrea Frittolicd368412017-08-14 21:37:56 +0100984 if utils.is_extension_enabled('metering', 'network'):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200985 project_services.append(NetworkMeteringLabelRuleService)
986 project_services.append(NetworkMeteringLabelService)
987 project_services.append(NetworkRouterService)
988 project_services.append(NetworkPortService)
989 project_services.append(NetworkSubnetService)
990 project_services.append(NetworkService)
991 project_services.append(NetworkSecGroupService)
Martin Kopece6819982019-02-18 12:34:52 +0000992 project_services.append(NetworkSubnetPoolsService)
David Patersonce781492014-09-18 01:07:01 -0400993 if IS_CINDER:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200994 project_services.append(SnapshotService)
995 project_services.append(VolumeService)
996 project_services.append(VolumeQuotaService)
997 return project_services
David Patersonce781492014-09-18 01:07:01 -0400998
999
1000def get_global_cleanup_services():
1001 global_services = []
1002 if IS_NOVA:
1003 global_services.append(FlavorService)
1004 if IS_GLANCE:
1005 global_services.append(ImageService)
1006 global_services.append(UserService)
Arx Cruz05fe4bc2017-10-20 10:48:28 +02001007 global_services.append(ProjectService)
David Patersonce781492014-09-18 01:07:01 -04001008 global_services.append(DomainService)
1009 global_services.append(RoleService)
1010 return global_services