blob: 8b625d0603c6feb6f798ad24d9dcd1b1d3b7dee8 [file] [log] [blame]
David Patersone41ebca2015-04-09 05:40:12 -04001# Copyright 2015 Dell Inc.
David Patersonce781492014-09-18 01:07:01 -04002#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
David Patersone41ebca2015-04-09 05:40:12 -04007# http://www.apache.org/licenses/LICENSE-2.0
David Patersonce781492014-09-18 01:07:01 -04008#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
David Patersonce781492014-09-18 01:07:01 -040014
Doug Hellmann583ce2c2015-03-11 14:55:46 +000015from oslo_log import log as logging
16
ghanshyam009a1f62017-08-08 10:22:57 +030017from tempest import clients
Andrea Frittoli (andreaf)290b3e12015-10-08 10:25:02 +010018from tempest.common import credentials_factory as credentials
Ken'ichi Ohmichi6ea3f982015-11-09 12:41:13 +000019from tempest.common import identity
Andrea Frittolicd368412017-08-14 21:37:56 +010020from tempest.common import utils
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
Martin Kopec97857942019-06-12 15:23:21 +000023from tempest.lib import exceptions
David Patersonce781492014-09-18 01:07:01 -040024
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
Arx Cruz05fe4bc2017-10-20 10:48:28 +020034CONF_PROJECTS = None
David Patersond6babc52014-10-14 00:11:56 -040035CONF_USERS = None
David Patersonce781492014-09-18 01:07:01 -040036
David Patersonce781492014-09-18 01:07:01 -040037IS_CINDER = None
38IS_GLANCE = None
David Patersonce781492014-09-18 01:07:01 -040039IS_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
Arx Cruz05fe4bc2017-10-20 10:48:28 +020051 global CONF_PROJECTS
David Patersond6babc52014-10-14 00:11:56 -040052 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
David Patersonce781492014-09-18 01:07:01 -040061 IS_NEUTRON = CONF.service_available.neutron
62 IS_NOVA = CONF.service_available.nova
63
David Patersond6babc52014-10-14 00:11:56 -040064 CONF_FLAVORS = [CONF.compute.flavor_ref, CONF.compute.flavor_ref_alt]
65 CONF_IMAGES = [CONF.compute.image_ref, CONF.compute.image_ref_alt]
66 CONF_PRIV_NETWORK_NAME = CONF.compute.fixed_network_name
67 CONF_PUB_NETWORK = CONF.network.public_network_id
68 CONF_PUB_ROUTER = CONF.network.public_router_id
Arx Cruz05fe4bc2017-10-20 10:48:28 +020069 CONF_PROJECTS = [CONF.auth.admin_project_name]
Jeffrey Zhangb5e23212016-07-06 14:18:53 +080070 CONF_USERS = [CONF.auth.admin_username]
David Patersond6babc52014-10-14 00:11:56 -040071
72 if IS_NEUTRON:
David Paterson82234022015-04-12 14:07:40 -040073 CONF_PRIV_NETWORK = _get_network_id(CONF.compute.fixed_network_name,
Daniel Melladod4d0b932016-04-08 08:57:29 +000074 CONF.auth.admin_project_name)
David Patersond6babc52014-10-14 00:11:56 -040075 CONF_NETWORKS = [CONF_PUB_NETWORK, CONF_PRIV_NETWORK]
76
77
Daniel Melladod4d0b932016-04-08 08:57:29 +000078def _get_network_id(net_name, project_name):
ghanshyam009a1f62017-08-08 10:22:57 +030079 am = clients.Manager(
80 credentials.get_configured_admin_credentials())
John Warren94d8faf2015-09-15 12:22:24 -040081 net_cl = am.networks_client
Arx Cruz05fe4bc2017-10-20 10:48:28 +020082 pr_cl = am.projects_client
David Patersond6babc52014-10-14 00:11:56 -040083
David Kranz34e88122014-12-11 15:24:05 -050084 networks = net_cl.list_networks()
Arx Cruz05fe4bc2017-10-20 10:48:28 +020085 project = identity.get_project_by_name(pr_cl, project_name)
86 p_id = project['id']
David Patersond6babc52014-10-14 00:11:56 -040087 n_id = None
88 for net in networks['networks']:
Arx Cruz05fe4bc2017-10-20 10:48:28 +020089 if (net['project_id'] == p_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'):
Martin Kopecb37903c2019-01-20 21:39:58 +0000103 self.tenant_filter['project_id'] = self.tenant_id
David Paterson82234022015-04-12 14:07:40 -0400104
David Patersonce781492014-09-18 01:07:01 -0400105 def _filter_by_tenant_id(self, item_list):
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200106 if (item_list is None or
107 not item_list or
108 not hasattr(self, 'tenant_id') or
109 self.tenant_id is None or
110 'tenant_id' not in item_list[0]):
David Patersonce781492014-09-18 01:07:01 -0400111 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):
Martin Kopec97857942019-06-12 15:23:21 +0000129 try:
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 except exceptions.NotImplemented as exc:
137 # Many OpenStack services use extensions logic to implement the
138 # features or resources. Tempest cleanup tries to clean up the test
139 # resources without having much logic of extensions checks etc.
140 # If any of the extension is missing then, service will return
141 # NotImplemented error.
142 msg = ("Got NotImplemented error in %s, full exception: %s" %
143 (str(self.__class__), str(exc)))
144 LOG.exception(msg)
Martin Kopec219e3222019-08-05 20:02:20 +0000145 self.got_exceptions.append(exc)
David Patersonce781492014-09-18 01:07:01 -0400146
147
148class SnapshotService(BaseService):
149
150 def __init__(self, manager, **kwargs):
151 super(SnapshotService, self).__init__(kwargs)
ghanshyam59928952017-10-26 01:38:45 +0000152 self.client = manager.snapshots_client_latest
David Patersonce781492014-09-18 01:07:01 -0400153
154 def list(self):
155 client = self.client
David Paterson07661de2015-10-29 20:15:04 -0700156 snaps = client.list_snapshots()['snapshots']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000157 if not self.is_save_state:
158 # recreate list removing saved snapshots
159 snaps = [snap for snap in snaps if snap['id']
160 not in self.saved_state_json['snapshots'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100161 LOG.debug("List count, %s Snapshots", len(snaps))
David Patersonce781492014-09-18 01:07:01 -0400162 return snaps
163
164 def delete(self):
165 snaps = self.list()
166 client = self.client
167 for snap in snaps:
168 try:
169 client.delete_snapshot(snap['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400170 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000171 LOG.exception("Delete Snapshot %s exception.", snap['id'])
David Patersonce781492014-09-18 01:07:01 -0400172
173 def dry_run(self):
174 snaps = self.list()
175 self.data['snapshots'] = snaps
176
Martin Kopec5a884bf2019-02-11 18:10:55 +0000177 def save_state(self):
178 snaps = self.list()
179 self.data['snapshots'] = {}
180 for snap in snaps:
181 self.data['snapshots'][snap['id']] = snap['name']
182
David Patersonce781492014-09-18 01:07:01 -0400183
184class ServerService(BaseService):
185 def __init__(self, manager, **kwargs):
186 super(ServerService, self).__init__(kwargs)
187 self.client = manager.servers_client
David Paterson07661de2015-10-29 20:15:04 -0700188 self.server_groups_client = manager.server_groups_client
David Patersonce781492014-09-18 01:07:01 -0400189
190 def list(self):
191 client = self.client
David Kranzae99b9a2015-02-16 13:37:01 -0500192 servers_body = client.list_servers()
David Patersonce781492014-09-18 01:07:01 -0400193 servers = servers_body['servers']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000194 if not self.is_save_state:
195 # recreate list removing saved servers
196 servers = [server for server in servers if server['id']
197 not in self.saved_state_json['servers'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100198 LOG.debug("List count, %s Servers", len(servers))
David Patersonce781492014-09-18 01:07:01 -0400199 return servers
200
201 def delete(self):
202 client = self.client
203 servers = self.list()
204 for server in servers:
205 try:
206 client.delete_server(server['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400207 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000208 LOG.exception("Delete Server %s exception.", server['id'])
David Patersonce781492014-09-18 01:07:01 -0400209
210 def dry_run(self):
211 servers = self.list()
212 self.data['servers'] = servers
213
Martin Kopec5a884bf2019-02-11 18:10:55 +0000214 def save_state(self):
215 servers = self.list()
216 self.data['servers'] = {}
217 for server in servers:
218 self.data['servers'][server['id']] = server['name']
219
David Patersonce781492014-09-18 01:07:01 -0400220
221class ServerGroupService(ServerService):
222
223 def list(self):
David Paterson07661de2015-10-29 20:15:04 -0700224 client = self.server_groups_client
ghanshyam2dc13452015-08-24 17:39:25 +0900225 sgs = client.list_server_groups()['server_groups']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000226 if not self.is_save_state:
227 # recreate list removing saved server_groups
228 sgs = [sg for sg in sgs if sg['id']
229 not in self.saved_state_json['server_groups'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100230 LOG.debug("List count, %s Server Groups", len(sgs))
David Patersonce781492014-09-18 01:07:01 -0400231 return sgs
232
233 def delete(self):
Martin Kopec5a884bf2019-02-11 18:10:55 +0000234 client = self.server_groups_client
David Patersonce781492014-09-18 01:07:01 -0400235 sgs = self.list()
236 for sg in sgs:
237 try:
238 client.delete_server_group(sg['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400239 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000240 LOG.exception("Delete Server Group %s exception.", sg['id'])
David Patersonce781492014-09-18 01:07:01 -0400241
242 def dry_run(self):
243 sgs = self.list()
244 self.data['server_groups'] = sgs
245
Martin Kopec5a884bf2019-02-11 18:10:55 +0000246 def save_state(self):
247 sgs = self.list()
248 self.data['server_groups'] = {}
249 for sg in sgs:
250 self.data['server_groups'][sg['id']] = sg['name']
251
David Patersonce781492014-09-18 01:07:01 -0400252
David Patersonce781492014-09-18 01:07:01 -0400253class KeyPairService(BaseService):
254 def __init__(self, manager, **kwargs):
255 super(KeyPairService, self).__init__(kwargs)
256 self.client = manager.keypairs_client
257
258 def list(self):
259 client = self.client
ghanshyamdee01f22015-08-17 11:41:47 +0900260 keypairs = client.list_keypairs()['keypairs']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000261 if not self.is_save_state:
262 # recreate list removing saved keypairs
263 keypairs = [keypair for keypair in keypairs
264 if keypair['keypair']['name']
265 not in self.saved_state_json['keypairs'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100266 LOG.debug("List count, %s Keypairs", len(keypairs))
David Patersonce781492014-09-18 01:07:01 -0400267 return keypairs
268
269 def delete(self):
270 client = self.client
271 keypairs = self.list()
272 for k in keypairs:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000273 name = k['keypair']['name']
David Patersonce781492014-09-18 01:07:01 -0400274 try:
David Patersonce781492014-09-18 01:07:01 -0400275 client.delete_keypair(name)
David Patersone41ebca2015-04-09 05:40:12 -0400276 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000277 LOG.exception("Delete Keypair %s exception.", name)
David Patersonce781492014-09-18 01:07:01 -0400278
279 def dry_run(self):
280 keypairs = self.list()
281 self.data['keypairs'] = keypairs
282
Martin Kopec5a884bf2019-02-11 18:10:55 +0000283 def save_state(self):
284 keypairs = self.list()
285 self.data['keypairs'] = {}
286 for keypair in keypairs:
287 keypair = keypair['keypair']
288 self.data['keypairs'][keypair['name']] = keypair
289
David Patersonce781492014-09-18 01:07:01 -0400290
David Patersonce781492014-09-18 01:07:01 -0400291class VolumeService(BaseService):
292 def __init__(self, manager, **kwargs):
293 super(VolumeService, self).__init__(kwargs)
ghanshyam59928952017-10-26 01:38:45 +0000294 self.client = manager.volumes_client_latest
David Patersonce781492014-09-18 01:07:01 -0400295
296 def list(self):
297 client = self.client
John Warren6177c9e2015-08-19 20:00:17 +0000298 vols = client.list_volumes()['volumes']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000299 if not self.is_save_state:
300 # recreate list removing saved volumes
301 vols = [vol for vol in vols if vol['id']
302 not in self.saved_state_json['volumes'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100303 LOG.debug("List count, %s Volumes", len(vols))
David Patersonce781492014-09-18 01:07:01 -0400304 return vols
305
306 def delete(self):
307 client = self.client
308 vols = self.list()
309 for v in vols:
310 try:
311 client.delete_volume(v['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400312 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000313 LOG.exception("Delete Volume %s exception.", v['id'])
David Patersonce781492014-09-18 01:07:01 -0400314
315 def dry_run(self):
316 vols = self.list()
317 self.data['volumes'] = vols
318
Martin Kopec5a884bf2019-02-11 18:10:55 +0000319 def save_state(self):
320 vols = self.list()
321 self.data['volumes'] = {}
322 for vol in vols:
323 self.data['volumes'][vol['id']] = vol['name']
324
David Patersonce781492014-09-18 01:07:01 -0400325
David Paterson35c8df02015-04-05 04:35:31 -0400326class VolumeQuotaService(BaseService):
327 def __init__(self, manager, **kwargs):
328 super(VolumeQuotaService, self).__init__(kwargs)
ghanshyam6c682ff2018-08-06 09:54:45 +0000329 self.client = manager.volume_quotas_client_latest
David Paterson35c8df02015-04-05 04:35:31 -0400330
331 def delete(self):
332 client = self.client
333 try:
Martin Kopecb37903c2019-01-20 21:39:58 +0000334 client.delete_quota_set(self.project_id)
David Patersone41ebca2015-04-09 05:40:12 -0400335 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000336 LOG.exception("Delete Volume Quotas exception for 'project %s'.",
337 self.project_id)
David Paterson35c8df02015-04-05 04:35:31 -0400338
339 def dry_run(self):
Ken'ichi Ohmichi3cf9eaf2016-07-29 11:05:21 -0700340 quotas = self.client.show_quota_set(
Martin Kopecb37903c2019-01-20 21:39:58 +0000341 self.project_id, params={'usage': True})['quota_set']
David Paterson35c8df02015-04-05 04:35:31 -0400342 self.data['volume_quotas'] = quotas
343
344
345class NovaQuotaService(BaseService):
346 def __init__(self, manager, **kwargs):
347 super(NovaQuotaService, self).__init__(kwargs)
348 self.client = manager.quotas_client
349 self.limits_client = manager.limits_client
350
351 def delete(self):
352 client = self.client
353 try:
Martin Kopecb37903c2019-01-20 21:39:58 +0000354 client.delete_quota_set(self.project_id)
David Patersone41ebca2015-04-09 05:40:12 -0400355 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000356 LOG.exception("Delete Quotas exception for 'project %s'.",
357 self.project_id)
David Paterson35c8df02015-04-05 04:35:31 -0400358
359 def dry_run(self):
360 client = self.limits_client
ghanshyam8a599492015-08-24 15:55:59 +0900361 quotas = client.show_limits()['limits']
Ken'ichi Ohmichib93e6762015-06-15 07:11:29 +0000362 self.data['compute_quotas'] = quotas['absolute']
David Paterson35c8df02015-04-05 04:35:31 -0400363
364
David Patersonce781492014-09-18 01:07:01 -0400365# Begin network service classes
Martin Kopec5a884bf2019-02-11 18:10:55 +0000366class BaseNetworkService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400367 def __init__(self, manager, **kwargs):
Martin Kopec5a884bf2019-02-11 18:10:55 +0000368 super(BaseNetworkService, self).__init__(kwargs)
John Warren94d8faf2015-09-15 12:22:24 -0400369 self.networks_client = manager.networks_client
John Warren3961acd2015-10-02 14:38:53 -0400370 self.subnets_client = manager.subnets_client
John Warren49c0fe52015-10-22 12:35:54 -0400371 self.ports_client = manager.ports_client
John Warrenfbf2a892015-11-17 12:36:14 -0500372 self.floating_ips_client = manager.floating_ips_client
John Warren6d0083a2015-11-30 18:12:30 -0500373 self.metering_labels_client = manager.metering_labels_client
John Warrendd20b3e2015-12-03 13:11:28 -0500374 self.metering_label_rules_client = manager.metering_label_rules_client
John Warrenf9606e92015-12-10 12:12:42 -0500375 self.security_groups_client = manager.security_groups_client
ghanshyama25c4192016-03-11 18:38:12 +0900376 self.routers_client = manager.routers_client
Martin Kopece6819982019-02-18 12:34:52 +0000377 self.subnetpools_client = manager.subnetpools_client
David Patersonce781492014-09-18 01:07:01 -0400378
David Patersond6babc52014-10-14 00:11:56 -0400379 def _filter_by_conf_networks(self, item_list):
380 if not item_list or not all(('network_id' in i for i in item_list)):
381 return item_list
382
383 return [item for item in item_list if item['network_id']
384 not in CONF_NETWORKS]
385
Martin Kopec5a884bf2019-02-11 18:10:55 +0000386
387class NetworkService(BaseNetworkService):
388
David Patersonce781492014-09-18 01:07:01 -0400389 def list(self):
John Warren94d8faf2015-09-15 12:22:24 -0400390 client = self.networks_client
David Paterson82234022015-04-12 14:07:40 -0400391 networks = client.list_networks(**self.tenant_filter)
392 networks = networks['networks']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000393
394 if not self.is_save_state:
395 # recreate list removing saved networks
396 networks = [network for network in networks if network['id']
397 not in self.saved_state_json['networks'].keys()]
David Patersonce781492014-09-18 01:07:01 -0400398 # filter out networks declared in tempest.conf
399 if self.is_preserve:
400 networks = [network for network in networks
David Patersond6babc52014-10-14 00:11:56 -0400401 if network['id'] not in CONF_NETWORKS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100402 LOG.debug("List count, %s Networks", networks)
David Patersonce781492014-09-18 01:07:01 -0400403 return networks
404
405 def delete(self):
John Warren94d8faf2015-09-15 12:22:24 -0400406 client = self.networks_client
David Patersonce781492014-09-18 01:07:01 -0400407 networks = self.list()
408 for n in networks:
409 try:
410 client.delete_network(n['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400411 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000412 LOG.exception("Delete Network %s exception.", n['id'])
David Patersonce781492014-09-18 01:07:01 -0400413
414 def dry_run(self):
415 networks = self.list()
416 self.data['networks'] = networks
417
Martin Kopec5a884bf2019-02-11 18:10:55 +0000418 def save_state(self):
419 networks = self.list()
420 self.data['networks'] = {}
421 for network in networks:
422 self.data['networks'][network['id']] = network
David Patersonce781492014-09-18 01:07:01 -0400423
Martin Kopec5a884bf2019-02-11 18:10:55 +0000424
425class NetworkFloatingIpService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400426
427 def list(self):
John Warrenfbf2a892015-11-17 12:36:14 -0500428 client = self.floating_ips_client
David Paterson82234022015-04-12 14:07:40 -0400429 flips = client.list_floatingips(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400430 flips = flips['floatingips']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000431
432 if not self.is_save_state:
433 # recreate list removing saved flips
434 flips = [flip for flip in flips if flip['id']
435 not in self.saved_state_json['floatingips'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100436 LOG.debug("List count, %s Network Floating IPs", len(flips))
David Patersonce781492014-09-18 01:07:01 -0400437 return flips
438
439 def delete(self):
Martin Kopec5a884bf2019-02-11 18:10:55 +0000440 client = self.floating_ips_client
David Patersonce781492014-09-18 01:07:01 -0400441 flips = self.list()
442 for flip in flips:
443 try:
444 client.delete_floatingip(flip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400445 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000446 LOG.exception("Delete Network Floating IP %s exception.",
447 flip['id'])
David Patersonce781492014-09-18 01:07:01 -0400448
449 def dry_run(self):
450 flips = self.list()
Martin Kopec5a884bf2019-02-11 18:10:55 +0000451 self.data['floatingips'] = flips
452
453 def save_state(self):
454 flips = self.list()
455 self.data['floatingips'] = {}
456 for flip in flips:
457 self.data['floatingips'][flip['id']] = flip
David Patersonce781492014-09-18 01:07:01 -0400458
459
Martin Kopec5a884bf2019-02-11 18:10:55 +0000460class NetworkRouterService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400461
462 def list(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000463 client = self.routers_client
David Paterson82234022015-04-12 14:07:40 -0400464 routers = client.list_routers(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400465 routers = routers['routers']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000466
467 if not self.is_save_state:
468 # recreate list removing saved routers
469 routers = [router for router in routers if router['id']
470 not in self.saved_state_json['routers'].keys()]
David Patersonce781492014-09-18 01:07:01 -0400471 if self.is_preserve:
472 routers = [router for router in routers
473 if router['id'] != CONF_PUB_ROUTER]
474
Jordan Pittier525ec712016-12-07 17:51:26 +0100475 LOG.debug("List count, %s Routers", len(routers))
David Patersonce781492014-09-18 01:07:01 -0400476 return routers
477
478 def delete(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000479 client = self.routers_client
Ken'ichi Ohmichif3110f02016-03-21 12:29:03 -0700480 ports_client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400481 routers = self.list()
482 for router in routers:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000483 rid = router['id']
Martin Kopec598b1ae2019-04-01 14:41:53 +0000484 ports = [port for port
485 in ports_client.list_ports(device_id=rid)['ports']
486 if net_info.is_router_interface_port(port)]
487 for port in ports:
488 try:
piyush11078694aca952015-12-17 12:54:44 +0530489 client.remove_router_interface(rid, port_id=port['id'])
Martin Kopec598b1ae2019-04-01 14:41:53 +0000490 except Exception:
491 LOG.exception("Delete Router Interface exception for "
492 "'port %s' of 'router %s'.", port['id'], rid)
493 try:
David Patersond6babc52014-10-14 00:11:56 -0400494 client.delete_router(rid)
David Patersone41ebca2015-04-09 05:40:12 -0400495 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000496 LOG.exception("Delete Router %s exception.", rid)
David Patersonce781492014-09-18 01:07:01 -0400497
498 def dry_run(self):
499 routers = self.list()
500 self.data['routers'] = routers
501
Martin Kopec5a884bf2019-02-11 18:10:55 +0000502 def save_state(self):
503 routers = self.list()
504 self.data['routers'] = {}
505 for router in routers:
506 self.data['routers'][router['id']] = router['name']
507
David Patersonce781492014-09-18 01:07:01 -0400508
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300509class NetworkMeteringLabelRuleService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400510
511 def list(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500512 client = self.metering_label_rules_client
David Kranz34e88122014-12-11 15:24:05 -0500513 rules = client.list_metering_label_rules()
David Patersonce781492014-09-18 01:07:01 -0400514 rules = rules['metering_label_rules']
515 rules = self._filter_by_tenant_id(rules)
Martin Kopec5a884bf2019-02-11 18:10:55 +0000516
517 if not self.is_save_state:
518 saved_rules = self.saved_state_json['metering_label_rules'].keys()
519 # recreate list removing saved rules
520 rules = [rule for rule in rules if rule['id'] not in saved_rules]
Jordan Pittier525ec712016-12-07 17:51:26 +0100521 LOG.debug("List count, %s Metering Label Rules", len(rules))
David Patersonce781492014-09-18 01:07:01 -0400522 return rules
523
524 def delete(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500525 client = self.metering_label_rules_client
David Patersonce781492014-09-18 01:07:01 -0400526 rules = self.list()
527 for rule in rules:
528 try:
529 client.delete_metering_label_rule(rule['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400530 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000531 LOG.exception("Delete Metering Label Rule %s exception.",
532 rule['id'])
David Patersonce781492014-09-18 01:07:01 -0400533
534 def dry_run(self):
535 rules = self.list()
Martin Kopec5a884bf2019-02-11 18:10:55 +0000536 self.data['metering_label_rules'] = rules
537
538 def save_state(self):
539 rules = self.list()
540 self.data['metering_label_rules'] = {}
541 for rule in rules:
542 self.data['metering_label_rules'][rule['id']] = rule
David Patersonce781492014-09-18 01:07:01 -0400543
544
Martin Kopec5a884bf2019-02-11 18:10:55 +0000545class NetworkMeteringLabelService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400546
547 def list(self):
John Warren6d0083a2015-11-30 18:12:30 -0500548 client = self.metering_labels_client
David Kranz34e88122014-12-11 15:24:05 -0500549 labels = client.list_metering_labels()
David Patersonce781492014-09-18 01:07:01 -0400550 labels = labels['metering_labels']
551 labels = self._filter_by_tenant_id(labels)
Martin Kopec5a884bf2019-02-11 18:10:55 +0000552
553 if not self.is_save_state:
554 # recreate list removing saved labels
555 labels = [label for label in labels if label['id']
556 not in self.saved_state_json['metering_labels'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100557 LOG.debug("List count, %s Metering Labels", len(labels))
David Patersonce781492014-09-18 01:07:01 -0400558 return labels
559
560 def delete(self):
John Warren6d0083a2015-11-30 18:12:30 -0500561 client = self.metering_labels_client
David Patersonce781492014-09-18 01:07:01 -0400562 labels = self.list()
563 for label in labels:
564 try:
565 client.delete_metering_label(label['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400566 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000567 LOG.exception("Delete Metering Label %s exception.",
568 label['id'])
David Patersonce781492014-09-18 01:07:01 -0400569
570 def dry_run(self):
571 labels = self.list()
Martin Kopec5a884bf2019-02-11 18:10:55 +0000572 self.data['metering_labels'] = labels
573
574 def save_state(self):
575 labels = self.list()
576 self.data['metering_labels'] = {}
577 for label in labels:
578 self.data['metering_labels'][label['id']] = label['name']
David Patersonce781492014-09-18 01:07:01 -0400579
580
Martin Kopec5a884bf2019-02-11 18:10:55 +0000581class NetworkPortService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400582
583 def list(self):
John Warren49c0fe52015-10-22 12:35:54 -0400584 client = self.ports_client
David Paterson82234022015-04-12 14:07:40 -0400585 ports = [port for port in
586 client.list_ports(**self.tenant_filter)['ports']
587 if port["device_owner"] == "" or
588 port["device_owner"].startswith("compute:")]
589
Martin Kopec5a884bf2019-02-11 18:10:55 +0000590 if not self.is_save_state:
591 # recreate list removing saved ports
592 ports = [port for port in ports if port['id']
593 not in self.saved_state_json['ports'].keys()]
David Patersond6babc52014-10-14 00:11:56 -0400594 if self.is_preserve:
595 ports = self._filter_by_conf_networks(ports)
David Paterson82234022015-04-12 14:07:40 -0400596
Jordan Pittier525ec712016-12-07 17:51:26 +0100597 LOG.debug("List count, %s Ports", len(ports))
David Patersonce781492014-09-18 01:07:01 -0400598 return ports
599
600 def delete(self):
John Warren49c0fe52015-10-22 12:35:54 -0400601 client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400602 ports = self.list()
603 for port in ports:
604 try:
605 client.delete_port(port['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400606 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000607 LOG.exception("Delete Port %s exception.", port['id'])
David Patersonce781492014-09-18 01:07:01 -0400608
609 def dry_run(self):
610 ports = self.list()
611 self.data['ports'] = ports
612
Martin Kopec5a884bf2019-02-11 18:10:55 +0000613 def save_state(self):
614 ports = self.list()
615 self.data['ports'] = {}
616 for port in ports:
617 self.data['ports'][port['id']] = port['name']
David Patersonce781492014-09-18 01:07:01 -0400618
Martin Kopec5a884bf2019-02-11 18:10:55 +0000619
620class NetworkSecGroupService(BaseNetworkService):
David Paterson82234022015-04-12 14:07:40 -0400621 def list(self):
John Warrenf9606e92015-12-10 12:12:42 -0500622 client = self.security_groups_client
David Paterson82234022015-04-12 14:07:40 -0400623 filter = self.tenant_filter
624 # cannot delete default sec group so never show it.
625 secgroups = [secgroup for secgroup in
626 client.list_security_groups(**filter)['security_groups']
627 if secgroup['name'] != 'default']
628
Martin Kopec5a884bf2019-02-11 18:10:55 +0000629 if not self.is_save_state:
630 # recreate list removing saved security_groups
631 secgroups = [secgroup for secgroup in secgroups if secgroup['id']
632 not in self.saved_state_json['security_groups'].keys()
633 ]
David Paterson82234022015-04-12 14:07:40 -0400634 if self.is_preserve:
Martin Kopec5a884bf2019-02-11 18:10:55 +0000635 secgroups = [secgroup for secgroup in secgroups
636 if secgroup['security_group_rules'][0]['project_id']
637 not in CONF_PROJECTS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100638 LOG.debug("List count, %s security_groups", len(secgroups))
David Paterson82234022015-04-12 14:07:40 -0400639 return secgroups
640
641 def delete(self):
Martin Kopec5a884bf2019-02-11 18:10:55 +0000642 client = self.security_groups_client
David Paterson82234022015-04-12 14:07:40 -0400643 secgroups = self.list()
644 for secgroup in secgroups:
645 try:
Martin Kopec5a884bf2019-02-11 18:10:55 +0000646 client.delete_security_group(secgroup['id'])
David Paterson82234022015-04-12 14:07:40 -0400647 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000648 LOG.exception("Delete security_group %s exception.",
649 secgroup['id'])
David Paterson82234022015-04-12 14:07:40 -0400650
651 def dry_run(self):
652 secgroups = self.list()
Martin Kopec5a884bf2019-02-11 18:10:55 +0000653 self.data['security_groups'] = secgroups
654
655 def save_state(self):
656 secgroups = self.list()
657 self.data['security_groups'] = {}
658 for secgroup in secgroups:
659 self.data['security_groups'][secgroup['id']] = secgroup['name']
David Paterson82234022015-04-12 14:07:40 -0400660
661
Martin Kopec5a884bf2019-02-11 18:10:55 +0000662class NetworkSubnetService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400663
664 def list(self):
John Warren3961acd2015-10-02 14:38:53 -0400665 client = self.subnets_client
David Paterson82234022015-04-12 14:07:40 -0400666 subnets = client.list_subnets(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400667 subnets = subnets['subnets']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000668 if not self.is_save_state:
669 # recreate list removing saved subnets
670 subnets = [subnet for subnet in subnets if subnet['id']
671 not in self.saved_state_json['subnets'].keys()]
David Patersond6babc52014-10-14 00:11:56 -0400672 if self.is_preserve:
673 subnets = self._filter_by_conf_networks(subnets)
Jordan Pittier525ec712016-12-07 17:51:26 +0100674 LOG.debug("List count, %s Subnets", len(subnets))
David Patersonce781492014-09-18 01:07:01 -0400675 return subnets
676
677 def delete(self):
John Warren3961acd2015-10-02 14:38:53 -0400678 client = self.subnets_client
David Patersonce781492014-09-18 01:07:01 -0400679 subnets = self.list()
680 for subnet in subnets:
681 try:
682 client.delete_subnet(subnet['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400683 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000684 LOG.exception("Delete Subnet %s exception.", subnet['id'])
David Patersonce781492014-09-18 01:07:01 -0400685
686 def dry_run(self):
687 subnets = self.list()
688 self.data['subnets'] = subnets
689
Martin Kopec5a884bf2019-02-11 18:10:55 +0000690 def save_state(self):
691 subnets = self.list()
692 self.data['subnets'] = {}
693 for subnet in subnets:
694 self.data['subnets'][subnet['id']] = subnet['name']
695
David Patersonce781492014-09-18 01:07:01 -0400696
Martin Kopece6819982019-02-18 12:34:52 +0000697class NetworkSubnetPoolsService(BaseNetworkService):
698
699 def list(self):
700 client = self.subnetpools_client
701 pools = client.list_subnetpools(**self.tenant_filter)['subnetpools']
702 if not self.is_save_state:
703 # recreate list removing saved subnet pools
704 pools = [pool for pool in pools if pool['id']
705 not in self.saved_state_json['subnetpools'].keys()]
706 if self.is_preserve:
707 pools = [pool for pool in pools if pool['project_id']
708 not in CONF_PROJECTS]
709 LOG.debug("List count, %s Subnet Pools", len(pools))
710 return pools
711
712 def delete(self):
713 client = self.subnetpools_client
714 pools = self.list()
715 for pool in pools:
716 try:
717 client.delete_subnetpool(pool['id'])
718 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000719 LOG.exception("Delete Subnet Pool %s exception.", pool['id'])
Martin Kopece6819982019-02-18 12:34:52 +0000720
721 def dry_run(self):
722 pools = self.list()
723 self.data['subnetpools'] = pools
724
725 def save_state(self):
726 pools = self.list()
727 self.data['subnetpools'] = {}
728 for pool in pools:
729 self.data['subnetpools'][pool['id']] = pool['name']
730
731
David Patersonce781492014-09-18 01:07:01 -0400732# begin global services
733class FlavorService(BaseService):
734 def __init__(self, manager, **kwargs):
735 super(FlavorService, self).__init__(kwargs)
736 self.client = manager.flavors_client
737
738 def list(self):
739 client = self.client
ghanshyam19973be2015-08-18 15:46:42 +0900740 flavors = client.list_flavors({"is_public": None})['flavors']
David Patersonce781492014-09-18 01:07:01 -0400741 if not self.is_save_state:
742 # recreate list removing saved flavors
743 flavors = [flavor for flavor in flavors if flavor['id']
744 not in self.saved_state_json['flavors'].keys()]
745
746 if self.is_preserve:
747 flavors = [flavor for flavor in flavors
748 if flavor['id'] not in CONF_FLAVORS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100749 LOG.debug("List count, %s Flavors after reconcile", len(flavors))
David Patersonce781492014-09-18 01:07:01 -0400750 return flavors
751
752 def delete(self):
753 client = self.client
754 flavors = self.list()
755 for flavor in flavors:
756 try:
757 client.delete_flavor(flavor['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400758 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000759 LOG.exception("Delete Flavor %s exception.", flavor['id'])
David Patersonce781492014-09-18 01:07:01 -0400760
761 def dry_run(self):
762 flavors = self.list()
763 self.data['flavors'] = flavors
764
765 def save_state(self):
766 flavors = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500767 self.data['flavors'] = {}
David Patersonce781492014-09-18 01:07:01 -0400768 for flavor in flavors:
gordon chungc15f1bc2015-02-23 18:00:41 -0500769 self.data['flavors'][flavor['id']] = flavor['name']
David Patersonce781492014-09-18 01:07:01 -0400770
771
772class ImageService(BaseService):
773 def __init__(self, manager, **kwargs):
774 super(ImageService, self).__init__(kwargs)
zhufl66275c22018-03-28 15:32:14 +0800775 self.client = manager.image_client_v2
David Patersonce781492014-09-18 01:07:01 -0400776
777 def list(self):
778 client = self.client
zhufl66275c22018-03-28 15:32:14 +0800779 images = client.list_images(params={"all_tenants": True})['images']
David Patersonce781492014-09-18 01:07:01 -0400780 if not self.is_save_state:
781 images = [image for image in images if image['id']
782 not in self.saved_state_json['images'].keys()]
783 if self.is_preserve:
784 images = [image for image in images
785 if image['id'] not in CONF_IMAGES]
Jordan Pittier525ec712016-12-07 17:51:26 +0100786 LOG.debug("List count, %s Images after reconcile", len(images))
David Patersonce781492014-09-18 01:07:01 -0400787 return images
788
789 def delete(self):
790 client = self.client
791 images = self.list()
792 for image in images:
793 try:
794 client.delete_image(image['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400795 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000796 LOG.exception("Delete Image %s exception.", image['id'])
David Patersonce781492014-09-18 01:07:01 -0400797
798 def dry_run(self):
799 images = self.list()
800 self.data['images'] = images
801
802 def save_state(self):
gordon chungc15f1bc2015-02-23 18:00:41 -0500803 self.data['images'] = {}
David Paterson82234022015-04-12 14:07:40 -0400804 images = self.list()
David Patersonce781492014-09-18 01:07:01 -0400805 for image in images:
gordon chungc15f1bc2015-02-23 18:00:41 -0500806 self.data['images'][image['id']] = image['name']
David Patersonce781492014-09-18 01:07:01 -0400807
808
Daniel Mellado82c83a52015-12-09 15:16:49 +0000809class UserService(BaseService):
810
811 def __init__(self, manager, **kwargs):
812 super(UserService, self).__init__(kwargs)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200813 self.client = manager.users_v3_client
David Patersonce781492014-09-18 01:07:01 -0400814
815 def list(self):
Daniel Mellado82c83a52015-12-09 15:16:49 +0000816 users = self.client.list_users()['users']
David Patersonce781492014-09-18 01:07:01 -0400817
818 if not self.is_save_state:
819 users = [user for user in users if user['id']
820 not in self.saved_state_json['users'].keys()]
821
822 if self.is_preserve:
823 users = [user for user in users if user['name']
824 not in CONF_USERS]
825
826 elif not self.is_save_state: # Never delete admin user
827 users = [user for user in users if user['name'] !=
David Paterson07661de2015-10-29 20:15:04 -0700828 CONF.auth.admin_username]
David Patersonce781492014-09-18 01:07:01 -0400829
Jordan Pittier525ec712016-12-07 17:51:26 +0100830 LOG.debug("List count, %s Users after reconcile", len(users))
David Patersonce781492014-09-18 01:07:01 -0400831 return users
832
833 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400834 users = self.list()
835 for user in users:
836 try:
Daniel Mellado82c83a52015-12-09 15:16:49 +0000837 self.client.delete_user(user['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400838 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000839 LOG.exception("Delete User %s exception.", user['id'])
David Patersonce781492014-09-18 01:07:01 -0400840
841 def dry_run(self):
842 users = self.list()
843 self.data['users'] = users
844
845 def save_state(self):
846 users = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500847 self.data['users'] = {}
David Patersonce781492014-09-18 01:07:01 -0400848 for user in users:
gordon chungc15f1bc2015-02-23 18:00:41 -0500849 self.data['users'][user['id']] = user['name']
David Patersonce781492014-09-18 01:07:01 -0400850
851
Daniel Melladob83ea562015-12-18 09:12:49 +0000852class RoleService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400853
Daniel Mellado6b16b922015-12-07 12:43:08 +0000854 def __init__(self, manager, **kwargs):
855 super(RoleService, self).__init__(kwargs)
Martin Kopecbd5be762019-07-13 22:42:08 +0000856 self.client = manager.roles_v3_client
Daniel Mellado6b16b922015-12-07 12:43:08 +0000857
David Patersonce781492014-09-18 01:07:01 -0400858 def list(self):
David Patersonce781492014-09-18 01:07:01 -0400859 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000860 roles = self.client.list_roles()['roles']
David Patersonce781492014-09-18 01:07:01 -0400861 # reconcile roles with saved state and never list admin role
862 if not self.is_save_state:
863 roles = [role for role in roles if
864 (role['id'] not in
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200865 self.saved_state_json['roles'].keys() and
866 role['name'] != CONF.identity.admin_role)]
Jordan Pittier525ec712016-12-07 17:51:26 +0100867 LOG.debug("List count, %s Roles after reconcile", len(roles))
David Patersonce781492014-09-18 01:07:01 -0400868 return roles
David Patersone41ebca2015-04-09 05:40:12 -0400869 except Exception:
870 LOG.exception("Cannot retrieve Roles.")
David Patersonce781492014-09-18 01:07:01 -0400871 return []
872
873 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400874 roles = self.list()
875 for role in roles:
876 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000877 self.client.delete_role(role['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400878 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000879 LOG.exception("Delete Role %s exception.", role['id'])
David Patersonce781492014-09-18 01:07:01 -0400880
881 def dry_run(self):
882 roles = self.list()
883 self.data['roles'] = roles
884
885 def save_state(self):
886 roles = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500887 self.data['roles'] = {}
David Patersonce781492014-09-18 01:07:01 -0400888 for role in roles:
gordon chungc15f1bc2015-02-23 18:00:41 -0500889 self.data['roles'][role['id']] = role['name']
David Patersonce781492014-09-18 01:07:01 -0400890
891
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200892class ProjectService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400893
Daniel Melladob04da902015-11-20 17:43:12 +0100894 def __init__(self, manager, **kwargs):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200895 super(ProjectService, self).__init__(kwargs)
896 self.client = manager.projects_client
Daniel Melladob04da902015-11-20 17:43:12 +0100897
David Patersonce781492014-09-18 01:07:01 -0400898 def list(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200899 projects = self.client.list_projects()['projects']
David Patersonce781492014-09-18 01:07:01 -0400900 if not self.is_save_state:
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200901 project_ids = self.saved_state_json['projects']
902 projects = [project
903 for project in projects
904 if (project['id'] not in project_ids and
905 project['name'] != CONF.auth.admin_project_name)]
David Patersonce781492014-09-18 01:07:01 -0400906
907 if self.is_preserve:
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200908 projects = [project
909 for project in projects
910 if project['name'] not in CONF_PROJECTS]
David Patersonce781492014-09-18 01:07:01 -0400911
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200912 LOG.debug("List count, %s Projects after reconcile", len(projects))
913 return projects
David Patersonce781492014-09-18 01:07:01 -0400914
915 def delete(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200916 projects = self.list()
917 for project in projects:
David Patersonce781492014-09-18 01:07:01 -0400918 try:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200919 self.client.delete_project(project['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400920 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000921 LOG.exception("Delete project %s exception.", project['id'])
David Patersonce781492014-09-18 01:07:01 -0400922
923 def dry_run(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200924 projects = self.list()
925 self.data['projects'] = projects
David Patersonce781492014-09-18 01:07:01 -0400926
927 def save_state(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200928 projects = self.list()
929 self.data['projects'] = {}
930 for project in projects:
931 self.data['projects'][project['id']] = project['name']
David Patersonce781492014-09-18 01:07:01 -0400932
933
934class DomainService(BaseService):
935
936 def __init__(self, manager, **kwargs):
937 super(DomainService, self).__init__(kwargs)
Daniel Mellado91a26b62016-02-11 11:13:04 +0000938 self.client = manager.domains_client
David Patersonce781492014-09-18 01:07:01 -0400939
940 def list(self):
941 client = self.client
Thomas Bechtold48268a02015-08-30 19:37:46 +0200942 domains = client.list_domains()['domains']
David Patersonce781492014-09-18 01:07:01 -0400943 if not self.is_save_state:
944 domains = [domain for domain in domains if domain['id']
945 not in self.saved_state_json['domains'].keys()]
946
Jordan Pittier525ec712016-12-07 17:51:26 +0100947 LOG.debug("List count, %s Domains after reconcile", len(domains))
David Patersonce781492014-09-18 01:07:01 -0400948 return domains
949
950 def delete(self):
951 client = self.client
952 domains = self.list()
953 for domain in domains:
954 try:
955 client.update_domain(domain['id'], enabled=False)
956 client.delete_domain(domain['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400957 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000958 LOG.exception("Delete Domain %s exception.", domain['id'])
David Patersonce781492014-09-18 01:07:01 -0400959
960 def dry_run(self):
961 domains = self.list()
962 self.data['domains'] = domains
963
964 def save_state(self):
965 domains = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500966 self.data['domains'] = {}
David Patersonce781492014-09-18 01:07:01 -0400967 for domain in domains:
gordon chungc15f1bc2015-02-23 18:00:41 -0500968 self.data['domains'][domain['id']] = domain['name']
David Patersonce781492014-09-18 01:07:01 -0400969
970
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200971def get_project_cleanup_services():
972 project_services = []
ghanshyame4796f82016-04-13 15:49:22 +0900973 # TODO(gmann): Tempest should provide some plugin hook for cleanup
974 # script extension to plugin tests also.
David Patersonce781492014-09-18 01:07:01 -0400975 if IS_NOVA:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200976 project_services.append(ServerService)
977 project_services.append(KeyPairService)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200978 project_services.append(ServerGroupService)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200979 project_services.append(NovaQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400980 if IS_NEUTRON:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200981 project_services.append(NetworkFloatingIpService)
Andrea Frittolicd368412017-08-14 21:37:56 +0100982 if utils.is_extension_enabled('metering', 'network'):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200983 project_services.append(NetworkMeteringLabelRuleService)
984 project_services.append(NetworkMeteringLabelService)
985 project_services.append(NetworkRouterService)
986 project_services.append(NetworkPortService)
987 project_services.append(NetworkSubnetService)
988 project_services.append(NetworkService)
989 project_services.append(NetworkSecGroupService)
Martin Kopece6819982019-02-18 12:34:52 +0000990 project_services.append(NetworkSubnetPoolsService)
David Patersonce781492014-09-18 01:07:01 -0400991 if IS_CINDER:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200992 project_services.append(SnapshotService)
993 project_services.append(VolumeService)
994 project_services.append(VolumeQuotaService)
995 return project_services
David Patersonce781492014-09-18 01:07:01 -0400996
997
998def get_global_cleanup_services():
999 global_services = []
1000 if IS_NOVA:
1001 global_services.append(FlavorService)
1002 if IS_GLANCE:
1003 global_services.append(ImageService)
1004 global_services.append(UserService)
Arx Cruz05fe4bc2017-10-20 10:48:28 +02001005 global_services.append(ProjectService)
David Patersonce781492014-09-18 01:07:01 -04001006 global_services.append(DomainService)
1007 global_services.append(RoleService)
1008 return global_services