blob: a0ed07f417e1e65bac36c73493cfd295ae650050 [file] [log] [blame]
David Patersond6babc52014-10-14 00:11:56 -04001#!/usr/bin/env python
2
David Patersone41ebca2015-04-09 05:40:12 -04003# Copyright 2015 Dell Inc.
David Patersonce781492014-09-18 01:07:01 -04004#
5# Licensed under the Apache License, Version 2.0 (the "License"); you may
6# not use this file except in compliance with the License. You may obtain
7# a copy of the License at
8#
David Patersone41ebca2015-04-09 05:40:12 -04009# http://www.apache.org/licenses/LICENSE-2.0
David Patersonce781492014-09-18 01:07:01 -040010#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14# License for the specific language governing permissions and limitations
15# under the License.
David Patersonce781492014-09-18 01:07:01 -040016
Doug Hellmann583ce2c2015-03-11 14:55:46 +000017from oslo_log import log as logging
18
ghanshyam009a1f62017-08-08 10:22:57 +030019from tempest import clients
Andrea Frittoli (andreaf)290b3e12015-10-08 10:25:02 +010020from tempest.common import credentials_factory as credentials
Ken'ichi Ohmichi6ea3f982015-11-09 12:41:13 +000021from tempest.common import identity
Andrea Frittolicd368412017-08-14 21:37:56 +010022from tempest.common import utils
Attila Fazekasd7e08a62016-10-07 13:05:05 +020023from tempest.common.utils import net_info
David Patersonce781492014-09-18 01:07:01 -040024from tempest import config
David Patersonce781492014-09-18 01:07:01 -040025
26LOG = logging.getLogger(__name__)
27CONF = config.CONF
28
David Patersonce781492014-09-18 01:07:01 -040029CONF_FLAVORS = None
30CONF_IMAGES = None
David Patersond6babc52014-10-14 00:11:56 -040031CONF_NETWORKS = []
32CONF_PRIV_NETWORK_NAME = None
33CONF_PUB_NETWORK = None
34CONF_PUB_ROUTER = None
Arx Cruz05fe4bc2017-10-20 10:48:28 +020035CONF_PROJECTS = None
David Patersond6babc52014-10-14 00:11:56 -040036CONF_USERS = None
David Patersonce781492014-09-18 01:07:01 -040037
David Patersonce781492014-09-18 01:07:01 -040038IS_CINDER = None
39IS_GLANCE = None
David Patersonce781492014-09-18 01:07:01 -040040IS_NEUTRON = None
41IS_NOVA = None
42
43
44def init_conf():
David Patersonce781492014-09-18 01:07:01 -040045 global CONF_FLAVORS
46 global CONF_IMAGES
David Patersond6babc52014-10-14 00:11:56 -040047 global CONF_NETWORKS
48 global CONF_PRIV_NETWORK
49 global CONF_PRIV_NETWORK_NAME
50 global CONF_PUB_NETWORK
51 global CONF_PUB_ROUTER
Arx Cruz05fe4bc2017-10-20 10:48:28 +020052 global CONF_PROJECTS
David Patersond6babc52014-10-14 00:11:56 -040053 global CONF_USERS
David Patersonce781492014-09-18 01:07:01 -040054 global IS_CINDER
55 global IS_GLANCE
56 global IS_HEAT
57 global IS_NEUTRON
58 global IS_NOVA
59
David Patersonce781492014-09-18 01:07:01 -040060 IS_CINDER = CONF.service_available.cinder
61 IS_GLANCE = CONF.service_available.glance
David Patersonce781492014-09-18 01:07:01 -040062 IS_NEUTRON = CONF.service_available.neutron
63 IS_NOVA = CONF.service_available.nova
64
David Patersond6babc52014-10-14 00:11:56 -040065 CONF_FLAVORS = [CONF.compute.flavor_ref, CONF.compute.flavor_ref_alt]
66 CONF_IMAGES = [CONF.compute.image_ref, CONF.compute.image_ref_alt]
67 CONF_PRIV_NETWORK_NAME = CONF.compute.fixed_network_name
68 CONF_PUB_NETWORK = CONF.network.public_network_id
69 CONF_PUB_ROUTER = CONF.network.public_router_id
Arx Cruz05fe4bc2017-10-20 10:48:28 +020070 CONF_PROJECTS = [CONF.auth.admin_project_name]
Jeffrey Zhangb5e23212016-07-06 14:18:53 +080071 CONF_USERS = [CONF.auth.admin_username]
David Patersond6babc52014-10-14 00:11:56 -040072
73 if IS_NEUTRON:
David Paterson82234022015-04-12 14:07:40 -040074 CONF_PRIV_NETWORK = _get_network_id(CONF.compute.fixed_network_name,
Daniel Melladod4d0b932016-04-08 08:57:29 +000075 CONF.auth.admin_project_name)
David Patersond6babc52014-10-14 00:11:56 -040076 CONF_NETWORKS = [CONF_PUB_NETWORK, CONF_PRIV_NETWORK]
77
78
Daniel Melladod4d0b932016-04-08 08:57:29 +000079def _get_network_id(net_name, project_name):
ghanshyam009a1f62017-08-08 10:22:57 +030080 am = clients.Manager(
81 credentials.get_configured_admin_credentials())
John Warren94d8faf2015-09-15 12:22:24 -040082 net_cl = am.networks_client
Arx Cruz05fe4bc2017-10-20 10:48:28 +020083 pr_cl = am.projects_client
David Patersond6babc52014-10-14 00:11:56 -040084
David Kranz34e88122014-12-11 15:24:05 -050085 networks = net_cl.list_networks()
Arx Cruz05fe4bc2017-10-20 10:48:28 +020086 project = identity.get_project_by_name(pr_cl, project_name)
87 p_id = project['id']
David Patersond6babc52014-10-14 00:11:56 -040088 n_id = None
89 for net in networks['networks']:
Arx Cruz05fe4bc2017-10-20 10:48:28 +020090 if (net['project_id'] == p_id and net['name'] == net_name):
David Patersond6babc52014-10-14 00:11:56 -040091 n_id = net['id']
92 break
93 return n_id
94
David Patersonce781492014-09-18 01:07:01 -040095
96class BaseService(object):
97 def __init__(self, kwargs):
98 self.client = None
99 for key, value in kwargs.items():
100 setattr(self, key, value)
101
David Paterson82234022015-04-12 14:07:40 -0400102 self.tenant_filter = {}
103 if hasattr(self, 'tenant_id'):
Martin Kopecb37903c2019-01-20 21:39:58 +0000104 self.tenant_filter['project_id'] = self.tenant_id
David Paterson82234022015-04-12 14:07:40 -0400105
David Patersonce781492014-09-18 01:07:01 -0400106 def _filter_by_tenant_id(self, item_list):
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200107 if (item_list is None or
108 not item_list or
109 not hasattr(self, 'tenant_id') or
110 self.tenant_id is None or
111 'tenant_id' not in item_list[0]):
David Patersonce781492014-09-18 01:07:01 -0400112 return item_list
113
David Patersond6babc52014-10-14 00:11:56 -0400114 return [item for item in item_list
115 if item['tenant_id'] == self.tenant_id]
David Patersonce781492014-09-18 01:07:01 -0400116
117 def list(self):
118 pass
119
120 def delete(self):
121 pass
122
123 def dry_run(self):
124 pass
125
126 def save_state(self):
127 pass
128
129 def run(self):
130 if self.is_dry_run:
131 self.dry_run()
132 elif self.is_save_state:
133 self.save_state()
134 else:
135 self.delete()
136
137
138class SnapshotService(BaseService):
139
140 def __init__(self, manager, **kwargs):
141 super(SnapshotService, self).__init__(kwargs)
ghanshyam59928952017-10-26 01:38:45 +0000142 self.client = manager.snapshots_client_latest
David Patersonce781492014-09-18 01:07:01 -0400143
144 def list(self):
145 client = self.client
David Paterson07661de2015-10-29 20:15:04 -0700146 snaps = client.list_snapshots()['snapshots']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000147 if not self.is_save_state:
148 # recreate list removing saved snapshots
149 snaps = [snap for snap in snaps if snap['id']
150 not in self.saved_state_json['snapshots'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100151 LOG.debug("List count, %s Snapshots", len(snaps))
David Patersonce781492014-09-18 01:07:01 -0400152 return snaps
153
154 def delete(self):
155 snaps = self.list()
156 client = self.client
157 for snap in snaps:
158 try:
159 client.delete_snapshot(snap['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400160 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000161 LOG.exception("Delete Snapshot %s exception.", snap['id'])
David Patersonce781492014-09-18 01:07:01 -0400162
163 def dry_run(self):
164 snaps = self.list()
165 self.data['snapshots'] = snaps
166
Martin Kopec5a884bf2019-02-11 18:10:55 +0000167 def save_state(self):
168 snaps = self.list()
169 self.data['snapshots'] = {}
170 for snap in snaps:
171 self.data['snapshots'][snap['id']] = snap['name']
172
David Patersonce781492014-09-18 01:07:01 -0400173
174class ServerService(BaseService):
175 def __init__(self, manager, **kwargs):
176 super(ServerService, self).__init__(kwargs)
177 self.client = manager.servers_client
David Paterson07661de2015-10-29 20:15:04 -0700178 self.server_groups_client = manager.server_groups_client
David Patersonce781492014-09-18 01:07:01 -0400179
180 def list(self):
181 client = self.client
David Kranzae99b9a2015-02-16 13:37:01 -0500182 servers_body = client.list_servers()
David Patersonce781492014-09-18 01:07:01 -0400183 servers = servers_body['servers']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000184 if not self.is_save_state:
185 # recreate list removing saved servers
186 servers = [server for server in servers if server['id']
187 not in self.saved_state_json['servers'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100188 LOG.debug("List count, %s Servers", len(servers))
David Patersonce781492014-09-18 01:07:01 -0400189 return servers
190
191 def delete(self):
192 client = self.client
193 servers = self.list()
194 for server in servers:
195 try:
196 client.delete_server(server['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400197 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000198 LOG.exception("Delete Server %s exception.", server['id'])
David Patersonce781492014-09-18 01:07:01 -0400199
200 def dry_run(self):
201 servers = self.list()
202 self.data['servers'] = servers
203
Martin Kopec5a884bf2019-02-11 18:10:55 +0000204 def save_state(self):
205 servers = self.list()
206 self.data['servers'] = {}
207 for server in servers:
208 self.data['servers'][server['id']] = server['name']
209
David Patersonce781492014-09-18 01:07:01 -0400210
211class ServerGroupService(ServerService):
212
213 def list(self):
David Paterson07661de2015-10-29 20:15:04 -0700214 client = self.server_groups_client
ghanshyam2dc13452015-08-24 17:39:25 +0900215 sgs = client.list_server_groups()['server_groups']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000216 if not self.is_save_state:
217 # recreate list removing saved server_groups
218 sgs = [sg for sg in sgs if sg['id']
219 not in self.saved_state_json['server_groups'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100220 LOG.debug("List count, %s Server Groups", len(sgs))
David Patersonce781492014-09-18 01:07:01 -0400221 return sgs
222
223 def delete(self):
Martin Kopec5a884bf2019-02-11 18:10:55 +0000224 client = self.server_groups_client
David Patersonce781492014-09-18 01:07:01 -0400225 sgs = self.list()
226 for sg in sgs:
227 try:
228 client.delete_server_group(sg['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400229 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000230 LOG.exception("Delete Server Group %s exception.", sg['id'])
David Patersonce781492014-09-18 01:07:01 -0400231
232 def dry_run(self):
233 sgs = self.list()
234 self.data['server_groups'] = sgs
235
Martin Kopec5a884bf2019-02-11 18:10:55 +0000236 def save_state(self):
237 sgs = self.list()
238 self.data['server_groups'] = {}
239 for sg in sgs:
240 self.data['server_groups'][sg['id']] = sg['name']
241
David Patersonce781492014-09-18 01:07:01 -0400242
David Patersonce781492014-09-18 01:07:01 -0400243class KeyPairService(BaseService):
244 def __init__(self, manager, **kwargs):
245 super(KeyPairService, self).__init__(kwargs)
246 self.client = manager.keypairs_client
247
248 def list(self):
249 client = self.client
ghanshyamdee01f22015-08-17 11:41:47 +0900250 keypairs = client.list_keypairs()['keypairs']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000251 if not self.is_save_state:
252 # recreate list removing saved keypairs
253 keypairs = [keypair for keypair in keypairs
254 if keypair['keypair']['name']
255 not in self.saved_state_json['keypairs'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100256 LOG.debug("List count, %s Keypairs", len(keypairs))
David Patersonce781492014-09-18 01:07:01 -0400257 return keypairs
258
259 def delete(self):
260 client = self.client
261 keypairs = self.list()
262 for k in keypairs:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000263 name = k['keypair']['name']
David Patersonce781492014-09-18 01:07:01 -0400264 try:
David Patersonce781492014-09-18 01:07:01 -0400265 client.delete_keypair(name)
David Patersone41ebca2015-04-09 05:40:12 -0400266 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000267 LOG.exception("Delete Keypair %s exception.", name)
David Patersonce781492014-09-18 01:07:01 -0400268
269 def dry_run(self):
270 keypairs = self.list()
271 self.data['keypairs'] = keypairs
272
Martin Kopec5a884bf2019-02-11 18:10:55 +0000273 def save_state(self):
274 keypairs = self.list()
275 self.data['keypairs'] = {}
276 for keypair in keypairs:
277 keypair = keypair['keypair']
278 self.data['keypairs'][keypair['name']] = keypair
279
David Patersonce781492014-09-18 01:07:01 -0400280
David Patersonce781492014-09-18 01:07:01 -0400281class VolumeService(BaseService):
282 def __init__(self, manager, **kwargs):
283 super(VolumeService, self).__init__(kwargs)
ghanshyam59928952017-10-26 01:38:45 +0000284 self.client = manager.volumes_client_latest
David Patersonce781492014-09-18 01:07:01 -0400285
286 def list(self):
287 client = self.client
John Warren6177c9e2015-08-19 20:00:17 +0000288 vols = client.list_volumes()['volumes']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000289 if not self.is_save_state:
290 # recreate list removing saved volumes
291 vols = [vol for vol in vols if vol['id']
292 not in self.saved_state_json['volumes'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100293 LOG.debug("List count, %s Volumes", len(vols))
David Patersonce781492014-09-18 01:07:01 -0400294 return vols
295
296 def delete(self):
297 client = self.client
298 vols = self.list()
299 for v in vols:
300 try:
301 client.delete_volume(v['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400302 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000303 LOG.exception("Delete Volume %s exception.", v['id'])
David Patersonce781492014-09-18 01:07:01 -0400304
305 def dry_run(self):
306 vols = self.list()
307 self.data['volumes'] = vols
308
Martin Kopec5a884bf2019-02-11 18:10:55 +0000309 def save_state(self):
310 vols = self.list()
311 self.data['volumes'] = {}
312 for vol in vols:
313 self.data['volumes'][vol['id']] = vol['name']
314
David Patersonce781492014-09-18 01:07:01 -0400315
David Paterson35c8df02015-04-05 04:35:31 -0400316class VolumeQuotaService(BaseService):
317 def __init__(self, manager, **kwargs):
318 super(VolumeQuotaService, self).__init__(kwargs)
ghanshyam6c682ff2018-08-06 09:54:45 +0000319 self.client = manager.volume_quotas_client_latest
David Paterson35c8df02015-04-05 04:35:31 -0400320
321 def delete(self):
322 client = self.client
323 try:
Martin Kopecb37903c2019-01-20 21:39:58 +0000324 client.delete_quota_set(self.project_id)
David Patersone41ebca2015-04-09 05:40:12 -0400325 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000326 LOG.exception("Delete Volume Quotas exception for 'project %s'.",
327 self.project_id)
David Paterson35c8df02015-04-05 04:35:31 -0400328
329 def dry_run(self):
Ken'ichi Ohmichi3cf9eaf2016-07-29 11:05:21 -0700330 quotas = self.client.show_quota_set(
Martin Kopecb37903c2019-01-20 21:39:58 +0000331 self.project_id, params={'usage': True})['quota_set']
David Paterson35c8df02015-04-05 04:35:31 -0400332 self.data['volume_quotas'] = quotas
333
334
335class NovaQuotaService(BaseService):
336 def __init__(self, manager, **kwargs):
337 super(NovaQuotaService, self).__init__(kwargs)
338 self.client = manager.quotas_client
339 self.limits_client = manager.limits_client
340
341 def delete(self):
342 client = self.client
343 try:
Martin Kopecb37903c2019-01-20 21:39:58 +0000344 client.delete_quota_set(self.project_id)
David Patersone41ebca2015-04-09 05:40:12 -0400345 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000346 LOG.exception("Delete Quotas exception for 'project %s'.",
347 self.project_id)
David Paterson35c8df02015-04-05 04:35:31 -0400348
349 def dry_run(self):
350 client = self.limits_client
ghanshyam8a599492015-08-24 15:55:59 +0900351 quotas = client.show_limits()['limits']
Ken'ichi Ohmichib93e6762015-06-15 07:11:29 +0000352 self.data['compute_quotas'] = quotas['absolute']
David Paterson35c8df02015-04-05 04:35:31 -0400353
354
David Patersonce781492014-09-18 01:07:01 -0400355# Begin network service classes
Martin Kopec5a884bf2019-02-11 18:10:55 +0000356class BaseNetworkService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400357 def __init__(self, manager, **kwargs):
Martin Kopec5a884bf2019-02-11 18:10:55 +0000358 super(BaseNetworkService, self).__init__(kwargs)
John Warren94d8faf2015-09-15 12:22:24 -0400359 self.networks_client = manager.networks_client
John Warren3961acd2015-10-02 14:38:53 -0400360 self.subnets_client = manager.subnets_client
John Warren49c0fe52015-10-22 12:35:54 -0400361 self.ports_client = manager.ports_client
John Warrenfbf2a892015-11-17 12:36:14 -0500362 self.floating_ips_client = manager.floating_ips_client
John Warren6d0083a2015-11-30 18:12:30 -0500363 self.metering_labels_client = manager.metering_labels_client
John Warrendd20b3e2015-12-03 13:11:28 -0500364 self.metering_label_rules_client = manager.metering_label_rules_client
John Warrenf9606e92015-12-10 12:12:42 -0500365 self.security_groups_client = manager.security_groups_client
ghanshyama25c4192016-03-11 18:38:12 +0900366 self.routers_client = manager.routers_client
Martin Kopece6819982019-02-18 12:34:52 +0000367 self.subnetpools_client = manager.subnetpools_client
David Patersonce781492014-09-18 01:07:01 -0400368
David Patersond6babc52014-10-14 00:11:56 -0400369 def _filter_by_conf_networks(self, item_list):
370 if not item_list or not all(('network_id' in i for i in item_list)):
371 return item_list
372
373 return [item for item in item_list if item['network_id']
374 not in CONF_NETWORKS]
375
Martin Kopec5a884bf2019-02-11 18:10:55 +0000376
377class NetworkService(BaseNetworkService):
378
David Patersonce781492014-09-18 01:07:01 -0400379 def list(self):
John Warren94d8faf2015-09-15 12:22:24 -0400380 client = self.networks_client
David Paterson82234022015-04-12 14:07:40 -0400381 networks = client.list_networks(**self.tenant_filter)
382 networks = networks['networks']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000383
384 if not self.is_save_state:
385 # recreate list removing saved networks
386 networks = [network for network in networks if network['id']
387 not in self.saved_state_json['networks'].keys()]
David Patersonce781492014-09-18 01:07:01 -0400388 # filter out networks declared in tempest.conf
389 if self.is_preserve:
390 networks = [network for network in networks
David Patersond6babc52014-10-14 00:11:56 -0400391 if network['id'] not in CONF_NETWORKS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100392 LOG.debug("List count, %s Networks", networks)
David Patersonce781492014-09-18 01:07:01 -0400393 return networks
394
395 def delete(self):
John Warren94d8faf2015-09-15 12:22:24 -0400396 client = self.networks_client
David Patersonce781492014-09-18 01:07:01 -0400397 networks = self.list()
398 for n in networks:
399 try:
400 client.delete_network(n['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400401 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000402 LOG.exception("Delete Network %s exception.", n['id'])
David Patersonce781492014-09-18 01:07:01 -0400403
404 def dry_run(self):
405 networks = self.list()
406 self.data['networks'] = networks
407
Martin Kopec5a884bf2019-02-11 18:10:55 +0000408 def save_state(self):
409 networks = self.list()
410 self.data['networks'] = {}
411 for network in networks:
412 self.data['networks'][network['id']] = network
David Patersonce781492014-09-18 01:07:01 -0400413
Martin Kopec5a884bf2019-02-11 18:10:55 +0000414
415class NetworkFloatingIpService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400416
417 def list(self):
John Warrenfbf2a892015-11-17 12:36:14 -0500418 client = self.floating_ips_client
David Paterson82234022015-04-12 14:07:40 -0400419 flips = client.list_floatingips(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400420 flips = flips['floatingips']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000421
422 if not self.is_save_state:
423 # recreate list removing saved flips
424 flips = [flip for flip in flips if flip['id']
425 not in self.saved_state_json['floatingips'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100426 LOG.debug("List count, %s Network Floating IPs", len(flips))
David Patersonce781492014-09-18 01:07:01 -0400427 return flips
428
429 def delete(self):
Martin Kopec5a884bf2019-02-11 18:10:55 +0000430 client = self.floating_ips_client
David Patersonce781492014-09-18 01:07:01 -0400431 flips = self.list()
432 for flip in flips:
433 try:
434 client.delete_floatingip(flip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400435 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000436 LOG.exception("Delete Network Floating IP %s exception.",
437 flip['id'])
David Patersonce781492014-09-18 01:07:01 -0400438
439 def dry_run(self):
440 flips = self.list()
Martin Kopec5a884bf2019-02-11 18:10:55 +0000441 self.data['floatingips'] = flips
442
443 def save_state(self):
444 flips = self.list()
445 self.data['floatingips'] = {}
446 for flip in flips:
447 self.data['floatingips'][flip['id']] = flip
David Patersonce781492014-09-18 01:07:01 -0400448
449
Martin Kopec5a884bf2019-02-11 18:10:55 +0000450class NetworkRouterService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400451
452 def list(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000453 client = self.routers_client
David Paterson82234022015-04-12 14:07:40 -0400454 routers = client.list_routers(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400455 routers = routers['routers']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000456
457 if not self.is_save_state:
458 # recreate list removing saved routers
459 routers = [router for router in routers if router['id']
460 not in self.saved_state_json['routers'].keys()]
David Patersonce781492014-09-18 01:07:01 -0400461 if self.is_preserve:
462 routers = [router for router in routers
463 if router['id'] != CONF_PUB_ROUTER]
464
Jordan Pittier525ec712016-12-07 17:51:26 +0100465 LOG.debug("List count, %s Routers", len(routers))
David Patersonce781492014-09-18 01:07:01 -0400466 return routers
467
468 def delete(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000469 client = self.routers_client
Ken'ichi Ohmichif3110f02016-03-21 12:29:03 -0700470 ports_client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400471 routers = self.list()
472 for router in routers:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000473 rid = router['id']
David Patersonce781492014-09-18 01:07:01 -0400474 try:
David Paterson82234022015-04-12 14:07:40 -0400475 ports = [port for port
Ken'ichi Ohmichif3110f02016-03-21 12:29:03 -0700476 in ports_client.list_ports(device_id=rid)['ports']
Attila Fazekasd7e08a62016-10-07 13:05:05 +0200477 if net_info.is_router_interface_port(port)]
David Patersonce781492014-09-18 01:07:01 -0400478 for port in ports:
piyush11078694aca952015-12-17 12:54:44 +0530479 client.remove_router_interface(rid, port_id=port['id'])
David Patersond6babc52014-10-14 00:11:56 -0400480 client.delete_router(rid)
David Patersone41ebca2015-04-09 05:40:12 -0400481 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000482 LOG.exception("Delete Router %s exception.", rid)
David Patersonce781492014-09-18 01:07:01 -0400483
484 def dry_run(self):
485 routers = self.list()
486 self.data['routers'] = routers
487
Martin Kopec5a884bf2019-02-11 18:10:55 +0000488 def save_state(self):
489 routers = self.list()
490 self.data['routers'] = {}
491 for router in routers:
492 self.data['routers'][router['id']] = router['name']
493
David Patersonce781492014-09-18 01:07:01 -0400494
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300495class NetworkMeteringLabelRuleService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400496
497 def list(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500498 client = self.metering_label_rules_client
David Kranz34e88122014-12-11 15:24:05 -0500499 rules = client.list_metering_label_rules()
David Patersonce781492014-09-18 01:07:01 -0400500 rules = rules['metering_label_rules']
501 rules = self._filter_by_tenant_id(rules)
Martin Kopec5a884bf2019-02-11 18:10:55 +0000502
503 if not self.is_save_state:
504 saved_rules = self.saved_state_json['metering_label_rules'].keys()
505 # recreate list removing saved rules
506 rules = [rule for rule in rules if rule['id'] not in saved_rules]
Jordan Pittier525ec712016-12-07 17:51:26 +0100507 LOG.debug("List count, %s Metering Label Rules", len(rules))
David Patersonce781492014-09-18 01:07:01 -0400508 return rules
509
510 def delete(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500511 client = self.metering_label_rules_client
David Patersonce781492014-09-18 01:07:01 -0400512 rules = self.list()
513 for rule in rules:
514 try:
515 client.delete_metering_label_rule(rule['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400516 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000517 LOG.exception("Delete Metering Label Rule %s exception.",
518 rule['id'])
David Patersonce781492014-09-18 01:07:01 -0400519
520 def dry_run(self):
521 rules = self.list()
Martin Kopec5a884bf2019-02-11 18:10:55 +0000522 self.data['metering_label_rules'] = rules
523
524 def save_state(self):
525 rules = self.list()
526 self.data['metering_label_rules'] = {}
527 for rule in rules:
528 self.data['metering_label_rules'][rule['id']] = rule
David Patersonce781492014-09-18 01:07:01 -0400529
530
Martin Kopec5a884bf2019-02-11 18:10:55 +0000531class NetworkMeteringLabelService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400532
533 def list(self):
John Warren6d0083a2015-11-30 18:12:30 -0500534 client = self.metering_labels_client
David Kranz34e88122014-12-11 15:24:05 -0500535 labels = client.list_metering_labels()
David Patersonce781492014-09-18 01:07:01 -0400536 labels = labels['metering_labels']
537 labels = self._filter_by_tenant_id(labels)
Martin Kopec5a884bf2019-02-11 18:10:55 +0000538
539 if not self.is_save_state:
540 # recreate list removing saved labels
541 labels = [label for label in labels if label['id']
542 not in self.saved_state_json['metering_labels'].keys()]
Jordan Pittier525ec712016-12-07 17:51:26 +0100543 LOG.debug("List count, %s Metering Labels", len(labels))
David Patersonce781492014-09-18 01:07:01 -0400544 return labels
545
546 def delete(self):
John Warren6d0083a2015-11-30 18:12:30 -0500547 client = self.metering_labels_client
David Patersonce781492014-09-18 01:07:01 -0400548 labels = self.list()
549 for label in labels:
550 try:
551 client.delete_metering_label(label['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400552 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000553 LOG.exception("Delete Metering Label %s exception.",
554 label['id'])
David Patersonce781492014-09-18 01:07:01 -0400555
556 def dry_run(self):
557 labels = self.list()
Martin Kopec5a884bf2019-02-11 18:10:55 +0000558 self.data['metering_labels'] = labels
559
560 def save_state(self):
561 labels = self.list()
562 self.data['metering_labels'] = {}
563 for label in labels:
564 self.data['metering_labels'][label['id']] = label['name']
David Patersonce781492014-09-18 01:07:01 -0400565
566
Martin Kopec5a884bf2019-02-11 18:10:55 +0000567class NetworkPortService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400568
569 def list(self):
John Warren49c0fe52015-10-22 12:35:54 -0400570 client = self.ports_client
David Paterson82234022015-04-12 14:07:40 -0400571 ports = [port for port in
572 client.list_ports(**self.tenant_filter)['ports']
573 if port["device_owner"] == "" or
574 port["device_owner"].startswith("compute:")]
575
Martin Kopec5a884bf2019-02-11 18:10:55 +0000576 if not self.is_save_state:
577 # recreate list removing saved ports
578 ports = [port for port in ports if port['id']
579 not in self.saved_state_json['ports'].keys()]
David Patersond6babc52014-10-14 00:11:56 -0400580 if self.is_preserve:
581 ports = self._filter_by_conf_networks(ports)
David Paterson82234022015-04-12 14:07:40 -0400582
Jordan Pittier525ec712016-12-07 17:51:26 +0100583 LOG.debug("List count, %s Ports", len(ports))
David Patersonce781492014-09-18 01:07:01 -0400584 return ports
585
586 def delete(self):
John Warren49c0fe52015-10-22 12:35:54 -0400587 client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400588 ports = self.list()
589 for port in ports:
590 try:
591 client.delete_port(port['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400592 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000593 LOG.exception("Delete Port %s exception.", port['id'])
David Patersonce781492014-09-18 01:07:01 -0400594
595 def dry_run(self):
596 ports = self.list()
597 self.data['ports'] = ports
598
Martin Kopec5a884bf2019-02-11 18:10:55 +0000599 def save_state(self):
600 ports = self.list()
601 self.data['ports'] = {}
602 for port in ports:
603 self.data['ports'][port['id']] = port['name']
David Patersonce781492014-09-18 01:07:01 -0400604
Martin Kopec5a884bf2019-02-11 18:10:55 +0000605
606class NetworkSecGroupService(BaseNetworkService):
David Paterson82234022015-04-12 14:07:40 -0400607 def list(self):
John Warrenf9606e92015-12-10 12:12:42 -0500608 client = self.security_groups_client
David Paterson82234022015-04-12 14:07:40 -0400609 filter = self.tenant_filter
610 # cannot delete default sec group so never show it.
611 secgroups = [secgroup for secgroup in
612 client.list_security_groups(**filter)['security_groups']
613 if secgroup['name'] != 'default']
614
Martin Kopec5a884bf2019-02-11 18:10:55 +0000615 if not self.is_save_state:
616 # recreate list removing saved security_groups
617 secgroups = [secgroup for secgroup in secgroups if secgroup['id']
618 not in self.saved_state_json['security_groups'].keys()
619 ]
David Paterson82234022015-04-12 14:07:40 -0400620 if self.is_preserve:
Martin Kopec5a884bf2019-02-11 18:10:55 +0000621 secgroups = [secgroup for secgroup in secgroups
622 if secgroup['security_group_rules'][0]['project_id']
623 not in CONF_PROJECTS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100624 LOG.debug("List count, %s security_groups", len(secgroups))
David Paterson82234022015-04-12 14:07:40 -0400625 return secgroups
626
627 def delete(self):
Martin Kopec5a884bf2019-02-11 18:10:55 +0000628 client = self.security_groups_client
David Paterson82234022015-04-12 14:07:40 -0400629 secgroups = self.list()
630 for secgroup in secgroups:
631 try:
Martin Kopec5a884bf2019-02-11 18:10:55 +0000632 client.delete_security_group(secgroup['id'])
David Paterson82234022015-04-12 14:07:40 -0400633 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000634 LOG.exception("Delete security_group %s exception.",
635 secgroup['id'])
David Paterson82234022015-04-12 14:07:40 -0400636
637 def dry_run(self):
638 secgroups = self.list()
Martin Kopec5a884bf2019-02-11 18:10:55 +0000639 self.data['security_groups'] = secgroups
640
641 def save_state(self):
642 secgroups = self.list()
643 self.data['security_groups'] = {}
644 for secgroup in secgroups:
645 self.data['security_groups'][secgroup['id']] = secgroup['name']
David Paterson82234022015-04-12 14:07:40 -0400646
647
Martin Kopec5a884bf2019-02-11 18:10:55 +0000648class NetworkSubnetService(BaseNetworkService):
David Patersonce781492014-09-18 01:07:01 -0400649
650 def list(self):
John Warren3961acd2015-10-02 14:38:53 -0400651 client = self.subnets_client
David Paterson82234022015-04-12 14:07:40 -0400652 subnets = client.list_subnets(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400653 subnets = subnets['subnets']
Martin Kopec5a884bf2019-02-11 18:10:55 +0000654 if not self.is_save_state:
655 # recreate list removing saved subnets
656 subnets = [subnet for subnet in subnets if subnet['id']
657 not in self.saved_state_json['subnets'].keys()]
David Patersond6babc52014-10-14 00:11:56 -0400658 if self.is_preserve:
659 subnets = self._filter_by_conf_networks(subnets)
Jordan Pittier525ec712016-12-07 17:51:26 +0100660 LOG.debug("List count, %s Subnets", len(subnets))
David Patersonce781492014-09-18 01:07:01 -0400661 return subnets
662
663 def delete(self):
John Warren3961acd2015-10-02 14:38:53 -0400664 client = self.subnets_client
David Patersonce781492014-09-18 01:07:01 -0400665 subnets = self.list()
666 for subnet in subnets:
667 try:
668 client.delete_subnet(subnet['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400669 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000670 LOG.exception("Delete Subnet %s exception.", subnet['id'])
David Patersonce781492014-09-18 01:07:01 -0400671
672 def dry_run(self):
673 subnets = self.list()
674 self.data['subnets'] = subnets
675
Martin Kopec5a884bf2019-02-11 18:10:55 +0000676 def save_state(self):
677 subnets = self.list()
678 self.data['subnets'] = {}
679 for subnet in subnets:
680 self.data['subnets'][subnet['id']] = subnet['name']
681
David Patersonce781492014-09-18 01:07:01 -0400682
Martin Kopece6819982019-02-18 12:34:52 +0000683class NetworkSubnetPoolsService(BaseNetworkService):
684
685 def list(self):
686 client = self.subnetpools_client
687 pools = client.list_subnetpools(**self.tenant_filter)['subnetpools']
688 if not self.is_save_state:
689 # recreate list removing saved subnet pools
690 pools = [pool for pool in pools if pool['id']
691 not in self.saved_state_json['subnetpools'].keys()]
692 if self.is_preserve:
693 pools = [pool for pool in pools if pool['project_id']
694 not in CONF_PROJECTS]
695 LOG.debug("List count, %s Subnet Pools", len(pools))
696 return pools
697
698 def delete(self):
699 client = self.subnetpools_client
700 pools = self.list()
701 for pool in pools:
702 try:
703 client.delete_subnetpool(pool['id'])
704 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000705 LOG.exception("Delete Subnet Pool %s exception.", pool['id'])
Martin Kopece6819982019-02-18 12:34:52 +0000706
707 def dry_run(self):
708 pools = self.list()
709 self.data['subnetpools'] = pools
710
711 def save_state(self):
712 pools = self.list()
713 self.data['subnetpools'] = {}
714 for pool in pools:
715 self.data['subnetpools'][pool['id']] = pool['name']
716
717
David Patersonce781492014-09-18 01:07:01 -0400718# begin global services
719class FlavorService(BaseService):
720 def __init__(self, manager, **kwargs):
721 super(FlavorService, self).__init__(kwargs)
722 self.client = manager.flavors_client
723
724 def list(self):
725 client = self.client
ghanshyam19973be2015-08-18 15:46:42 +0900726 flavors = client.list_flavors({"is_public": None})['flavors']
David Patersonce781492014-09-18 01:07:01 -0400727 if not self.is_save_state:
728 # recreate list removing saved flavors
729 flavors = [flavor for flavor in flavors if flavor['id']
730 not in self.saved_state_json['flavors'].keys()]
731
732 if self.is_preserve:
733 flavors = [flavor for flavor in flavors
734 if flavor['id'] not in CONF_FLAVORS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100735 LOG.debug("List count, %s Flavors after reconcile", len(flavors))
David Patersonce781492014-09-18 01:07:01 -0400736 return flavors
737
738 def delete(self):
739 client = self.client
740 flavors = self.list()
741 for flavor in flavors:
742 try:
743 client.delete_flavor(flavor['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400744 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000745 LOG.exception("Delete Flavor %s exception.", flavor['id'])
David Patersonce781492014-09-18 01:07:01 -0400746
747 def dry_run(self):
748 flavors = self.list()
749 self.data['flavors'] = flavors
750
751 def save_state(self):
752 flavors = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500753 self.data['flavors'] = {}
David Patersonce781492014-09-18 01:07:01 -0400754 for flavor in flavors:
gordon chungc15f1bc2015-02-23 18:00:41 -0500755 self.data['flavors'][flavor['id']] = flavor['name']
David Patersonce781492014-09-18 01:07:01 -0400756
757
758class ImageService(BaseService):
759 def __init__(self, manager, **kwargs):
760 super(ImageService, self).__init__(kwargs)
zhufl66275c22018-03-28 15:32:14 +0800761 self.client = manager.image_client_v2
David Patersonce781492014-09-18 01:07:01 -0400762
763 def list(self):
764 client = self.client
zhufl66275c22018-03-28 15:32:14 +0800765 images = client.list_images(params={"all_tenants": True})['images']
David Patersonce781492014-09-18 01:07:01 -0400766 if not self.is_save_state:
767 images = [image for image in images if image['id']
768 not in self.saved_state_json['images'].keys()]
769 if self.is_preserve:
770 images = [image for image in images
771 if image['id'] not in CONF_IMAGES]
Jordan Pittier525ec712016-12-07 17:51:26 +0100772 LOG.debug("List count, %s Images after reconcile", len(images))
David Patersonce781492014-09-18 01:07:01 -0400773 return images
774
775 def delete(self):
776 client = self.client
777 images = self.list()
778 for image in images:
779 try:
780 client.delete_image(image['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400781 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000782 LOG.exception("Delete Image %s exception.", image['id'])
David Patersonce781492014-09-18 01:07:01 -0400783
784 def dry_run(self):
785 images = self.list()
786 self.data['images'] = images
787
788 def save_state(self):
gordon chungc15f1bc2015-02-23 18:00:41 -0500789 self.data['images'] = {}
David Paterson82234022015-04-12 14:07:40 -0400790 images = self.list()
David Patersonce781492014-09-18 01:07:01 -0400791 for image in images:
gordon chungc15f1bc2015-02-23 18:00:41 -0500792 self.data['images'][image['id']] = image['name']
David Patersonce781492014-09-18 01:07:01 -0400793
794
Daniel Mellado82c83a52015-12-09 15:16:49 +0000795class UserService(BaseService):
796
797 def __init__(self, manager, **kwargs):
798 super(UserService, self).__init__(kwargs)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200799 self.client = manager.users_v3_client
David Patersonce781492014-09-18 01:07:01 -0400800
801 def list(self):
Daniel Mellado82c83a52015-12-09 15:16:49 +0000802 users = self.client.list_users()['users']
David Patersonce781492014-09-18 01:07:01 -0400803
804 if not self.is_save_state:
805 users = [user for user in users if user['id']
806 not in self.saved_state_json['users'].keys()]
807
808 if self.is_preserve:
809 users = [user for user in users if user['name']
810 not in CONF_USERS]
811
812 elif not self.is_save_state: # Never delete admin user
813 users = [user for user in users if user['name'] !=
David Paterson07661de2015-10-29 20:15:04 -0700814 CONF.auth.admin_username]
David Patersonce781492014-09-18 01:07:01 -0400815
Jordan Pittier525ec712016-12-07 17:51:26 +0100816 LOG.debug("List count, %s Users after reconcile", len(users))
David Patersonce781492014-09-18 01:07:01 -0400817 return users
818
819 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400820 users = self.list()
821 for user in users:
822 try:
Daniel Mellado82c83a52015-12-09 15:16:49 +0000823 self.client.delete_user(user['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400824 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000825 LOG.exception("Delete User %s exception.", user['id'])
David Patersonce781492014-09-18 01:07:01 -0400826
827 def dry_run(self):
828 users = self.list()
829 self.data['users'] = users
830
831 def save_state(self):
832 users = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500833 self.data['users'] = {}
David Patersonce781492014-09-18 01:07:01 -0400834 for user in users:
gordon chungc15f1bc2015-02-23 18:00:41 -0500835 self.data['users'][user['id']] = user['name']
David Patersonce781492014-09-18 01:07:01 -0400836
837
Daniel Melladob83ea562015-12-18 09:12:49 +0000838class RoleService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400839
Daniel Mellado6b16b922015-12-07 12:43:08 +0000840 def __init__(self, manager, **kwargs):
841 super(RoleService, self).__init__(kwargs)
842 self.client = manager.roles_client
843
David Patersonce781492014-09-18 01:07:01 -0400844 def list(self):
David Patersonce781492014-09-18 01:07:01 -0400845 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000846 roles = self.client.list_roles()['roles']
David Patersonce781492014-09-18 01:07:01 -0400847 # reconcile roles with saved state and never list admin role
848 if not self.is_save_state:
849 roles = [role for role in roles if
850 (role['id'] not in
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200851 self.saved_state_json['roles'].keys() and
852 role['name'] != CONF.identity.admin_role)]
Jordan Pittier525ec712016-12-07 17:51:26 +0100853 LOG.debug("List count, %s Roles after reconcile", len(roles))
David Patersonce781492014-09-18 01:07:01 -0400854 return roles
David Patersone41ebca2015-04-09 05:40:12 -0400855 except Exception:
856 LOG.exception("Cannot retrieve Roles.")
David Patersonce781492014-09-18 01:07:01 -0400857 return []
858
859 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400860 roles = self.list()
861 for role in roles:
862 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000863 self.client.delete_role(role['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400864 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000865 LOG.exception("Delete Role %s exception.", role['id'])
David Patersonce781492014-09-18 01:07:01 -0400866
867 def dry_run(self):
868 roles = self.list()
869 self.data['roles'] = roles
870
871 def save_state(self):
872 roles = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500873 self.data['roles'] = {}
David Patersonce781492014-09-18 01:07:01 -0400874 for role in roles:
gordon chungc15f1bc2015-02-23 18:00:41 -0500875 self.data['roles'][role['id']] = role['name']
David Patersonce781492014-09-18 01:07:01 -0400876
877
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200878class ProjectService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400879
Daniel Melladob04da902015-11-20 17:43:12 +0100880 def __init__(self, manager, **kwargs):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200881 super(ProjectService, self).__init__(kwargs)
882 self.client = manager.projects_client
Daniel Melladob04da902015-11-20 17:43:12 +0100883
David Patersonce781492014-09-18 01:07:01 -0400884 def list(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200885 projects = self.client.list_projects()['projects']
David Patersonce781492014-09-18 01:07:01 -0400886 if not self.is_save_state:
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200887 project_ids = self.saved_state_json['projects']
888 projects = [project
889 for project in projects
890 if (project['id'] not in project_ids and
891 project['name'] != CONF.auth.admin_project_name)]
David Patersonce781492014-09-18 01:07:01 -0400892
893 if self.is_preserve:
Federico Ressi2d6bcaa2018-04-11 12:37:36 +0200894 projects = [project
895 for project in projects
896 if project['name'] not in CONF_PROJECTS]
David Patersonce781492014-09-18 01:07:01 -0400897
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200898 LOG.debug("List count, %s Projects after reconcile", len(projects))
899 return projects
David Patersonce781492014-09-18 01:07:01 -0400900
901 def delete(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200902 projects = self.list()
903 for project in projects:
David Patersonce781492014-09-18 01:07:01 -0400904 try:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200905 self.client.delete_project(project['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400906 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000907 LOG.exception("Delete project %s exception.", project['id'])
David Patersonce781492014-09-18 01:07:01 -0400908
909 def dry_run(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200910 projects = self.list()
911 self.data['projects'] = projects
David Patersonce781492014-09-18 01:07:01 -0400912
913 def save_state(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200914 projects = self.list()
915 self.data['projects'] = {}
916 for project in projects:
917 self.data['projects'][project['id']] = project['name']
David Patersonce781492014-09-18 01:07:01 -0400918
919
920class DomainService(BaseService):
921
922 def __init__(self, manager, **kwargs):
923 super(DomainService, self).__init__(kwargs)
Daniel Mellado91a26b62016-02-11 11:13:04 +0000924 self.client = manager.domains_client
David Patersonce781492014-09-18 01:07:01 -0400925
926 def list(self):
927 client = self.client
Thomas Bechtold48268a02015-08-30 19:37:46 +0200928 domains = client.list_domains()['domains']
David Patersonce781492014-09-18 01:07:01 -0400929 if not self.is_save_state:
930 domains = [domain for domain in domains if domain['id']
931 not in self.saved_state_json['domains'].keys()]
932
Jordan Pittier525ec712016-12-07 17:51:26 +0100933 LOG.debug("List count, %s Domains after reconcile", len(domains))
David Patersonce781492014-09-18 01:07:01 -0400934 return domains
935
936 def delete(self):
937 client = self.client
938 domains = self.list()
939 for domain in domains:
940 try:
941 client.update_domain(domain['id'], enabled=False)
942 client.delete_domain(domain['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400943 except Exception:
Martin Kopecfd01fe92019-02-27 08:46:05 +0000944 LOG.exception("Delete Domain %s exception.", domain['id'])
David Patersonce781492014-09-18 01:07:01 -0400945
946 def dry_run(self):
947 domains = self.list()
948 self.data['domains'] = domains
949
950 def save_state(self):
951 domains = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500952 self.data['domains'] = {}
David Patersonce781492014-09-18 01:07:01 -0400953 for domain in domains:
gordon chungc15f1bc2015-02-23 18:00:41 -0500954 self.data['domains'][domain['id']] = domain['name']
David Patersonce781492014-09-18 01:07:01 -0400955
956
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200957def get_project_cleanup_services():
958 project_services = []
ghanshyame4796f82016-04-13 15:49:22 +0900959 # TODO(gmann): Tempest should provide some plugin hook for cleanup
960 # script extension to plugin tests also.
David Patersonce781492014-09-18 01:07:01 -0400961 if IS_NOVA:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200962 project_services.append(ServerService)
963 project_services.append(KeyPairService)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200964 project_services.append(ServerGroupService)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200965 project_services.append(NovaQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400966 if IS_NEUTRON:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200967 project_services.append(NetworkFloatingIpService)
Andrea Frittolicd368412017-08-14 21:37:56 +0100968 if utils.is_extension_enabled('metering', 'network'):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200969 project_services.append(NetworkMeteringLabelRuleService)
970 project_services.append(NetworkMeteringLabelService)
971 project_services.append(NetworkRouterService)
972 project_services.append(NetworkPortService)
973 project_services.append(NetworkSubnetService)
974 project_services.append(NetworkService)
975 project_services.append(NetworkSecGroupService)
Martin Kopece6819982019-02-18 12:34:52 +0000976 project_services.append(NetworkSubnetPoolsService)
David Patersonce781492014-09-18 01:07:01 -0400977 if IS_CINDER:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200978 project_services.append(SnapshotService)
979 project_services.append(VolumeService)
980 project_services.append(VolumeQuotaService)
981 return project_services
David Patersonce781492014-09-18 01:07:01 -0400982
983
984def get_global_cleanup_services():
985 global_services = []
986 if IS_NOVA:
987 global_services.append(FlavorService)
988 if IS_GLANCE:
989 global_services.append(ImageService)
990 global_services.append(UserService)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200991 global_services.append(ProjectService)
David Patersonce781492014-09-18 01:07:01 -0400992 global_services.append(DomainService)
993 global_services.append(RoleService)
994 return global_services