blob: d1e80f1d92341896ddc02ccae9eb60361d9f07cf [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
40IS_HEAT = None
41IS_NEUTRON = None
42IS_NOVA = None
43
44
45def init_conf():
David Patersonce781492014-09-18 01:07:01 -040046 global CONF_FLAVORS
47 global CONF_IMAGES
David Patersond6babc52014-10-14 00:11:56 -040048 global CONF_NETWORKS
49 global CONF_PRIV_NETWORK
50 global CONF_PRIV_NETWORK_NAME
51 global CONF_PUB_NETWORK
52 global CONF_PUB_ROUTER
Arx Cruz05fe4bc2017-10-20 10:48:28 +020053 global CONF_PROJECTS
David Patersond6babc52014-10-14 00:11:56 -040054 global CONF_USERS
David Patersonce781492014-09-18 01:07:01 -040055 global IS_CINDER
56 global IS_GLANCE
57 global IS_HEAT
58 global IS_NEUTRON
59 global IS_NOVA
60
David Patersonce781492014-09-18 01:07:01 -040061 IS_CINDER = CONF.service_available.cinder
62 IS_GLANCE = CONF.service_available.glance
63 IS_HEAT = CONF.service_available.heat
64 IS_NEUTRON = CONF.service_available.neutron
65 IS_NOVA = CONF.service_available.nova
66
David Patersond6babc52014-10-14 00:11:56 -040067 CONF_FLAVORS = [CONF.compute.flavor_ref, CONF.compute.flavor_ref_alt]
68 CONF_IMAGES = [CONF.compute.image_ref, CONF.compute.image_ref_alt]
69 CONF_PRIV_NETWORK_NAME = CONF.compute.fixed_network_name
70 CONF_PUB_NETWORK = CONF.network.public_network_id
71 CONF_PUB_ROUTER = CONF.network.public_router_id
Arx Cruz05fe4bc2017-10-20 10:48:28 +020072 CONF_PROJECTS = [CONF.auth.admin_project_name]
Jeffrey Zhangb5e23212016-07-06 14:18:53 +080073 CONF_USERS = [CONF.auth.admin_username]
David Patersond6babc52014-10-14 00:11:56 -040074
75 if IS_NEUTRON:
David Paterson82234022015-04-12 14:07:40 -040076 CONF_PRIV_NETWORK = _get_network_id(CONF.compute.fixed_network_name,
Daniel Melladod4d0b932016-04-08 08:57:29 +000077 CONF.auth.admin_project_name)
David Patersond6babc52014-10-14 00:11:56 -040078 CONF_NETWORKS = [CONF_PUB_NETWORK, CONF_PRIV_NETWORK]
79
80
Daniel Melladod4d0b932016-04-08 08:57:29 +000081def _get_network_id(net_name, project_name):
ghanshyam009a1f62017-08-08 10:22:57 +030082 am = clients.Manager(
83 credentials.get_configured_admin_credentials())
John Warren94d8faf2015-09-15 12:22:24 -040084 net_cl = am.networks_client
Arx Cruz05fe4bc2017-10-20 10:48:28 +020085 pr_cl = am.projects_client
David Patersond6babc52014-10-14 00:11:56 -040086
David Kranz34e88122014-12-11 15:24:05 -050087 networks = net_cl.list_networks()
Arx Cruz05fe4bc2017-10-20 10:48:28 +020088 project = identity.get_project_by_name(pr_cl, project_name)
89 p_id = project['id']
David Patersond6babc52014-10-14 00:11:56 -040090 n_id = None
91 for net in networks['networks']:
Arx Cruz05fe4bc2017-10-20 10:48:28 +020092 if (net['project_id'] == p_id and net['name'] == net_name):
David Patersond6babc52014-10-14 00:11:56 -040093 n_id = net['id']
94 break
95 return n_id
96
David Patersonce781492014-09-18 01:07:01 -040097
98class BaseService(object):
99 def __init__(self, kwargs):
100 self.client = None
101 for key, value in kwargs.items():
102 setattr(self, key, value)
103
David Paterson82234022015-04-12 14:07:40 -0400104 self.tenant_filter = {}
105 if hasattr(self, 'tenant_id'):
106 self.tenant_filter['tenant_id'] = self.tenant_id
107
David Patersonce781492014-09-18 01:07:01 -0400108 def _filter_by_tenant_id(self, item_list):
109 if (item_list is None
Masayuki Igawa0c0f0142017-04-10 17:22:02 +0900110 or not item_list
David Patersonce781492014-09-18 01:07:01 -0400111 or not hasattr(self, 'tenant_id')
112 or self.tenant_id is None
113 or 'tenant_id' not in item_list[0]):
114 return item_list
115
David Patersond6babc52014-10-14 00:11:56 -0400116 return [item for item in item_list
117 if item['tenant_id'] == self.tenant_id]
David Patersonce781492014-09-18 01:07:01 -0400118
119 def list(self):
120 pass
121
122 def delete(self):
123 pass
124
125 def dry_run(self):
126 pass
127
128 def save_state(self):
129 pass
130
131 def run(self):
132 if self.is_dry_run:
133 self.dry_run()
134 elif self.is_save_state:
135 self.save_state()
136 else:
137 self.delete()
138
139
140class SnapshotService(BaseService):
141
142 def __init__(self, manager, **kwargs):
143 super(SnapshotService, self).__init__(kwargs)
ghanshyam59928952017-10-26 01:38:45 +0000144 self.client = manager.snapshots_client_latest
David Patersonce781492014-09-18 01:07:01 -0400145
146 def list(self):
147 client = self.client
David Paterson07661de2015-10-29 20:15:04 -0700148 snaps = client.list_snapshots()['snapshots']
Jordan Pittier525ec712016-12-07 17:51:26 +0100149 LOG.debug("List count, %s Snapshots", len(snaps))
David Patersonce781492014-09-18 01:07:01 -0400150 return snaps
151
152 def delete(self):
153 snaps = self.list()
154 client = self.client
155 for snap in snaps:
156 try:
157 client.delete_snapshot(snap['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400158 except Exception:
159 LOG.exception("Delete Snapshot exception.")
David Patersonce781492014-09-18 01:07:01 -0400160
161 def dry_run(self):
162 snaps = self.list()
163 self.data['snapshots'] = snaps
164
165
166class ServerService(BaseService):
167 def __init__(self, manager, **kwargs):
168 super(ServerService, self).__init__(kwargs)
169 self.client = manager.servers_client
David Paterson07661de2015-10-29 20:15:04 -0700170 self.server_groups_client = manager.server_groups_client
David Patersonce781492014-09-18 01:07:01 -0400171
172 def list(self):
173 client = self.client
David Kranzae99b9a2015-02-16 13:37:01 -0500174 servers_body = client.list_servers()
David Patersonce781492014-09-18 01:07:01 -0400175 servers = servers_body['servers']
Jordan Pittier525ec712016-12-07 17:51:26 +0100176 LOG.debug("List count, %s Servers", len(servers))
David Patersonce781492014-09-18 01:07:01 -0400177 return servers
178
179 def delete(self):
180 client = self.client
181 servers = self.list()
182 for server in servers:
183 try:
184 client.delete_server(server['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400185 except Exception:
186 LOG.exception("Delete Server exception.")
David Patersonce781492014-09-18 01:07:01 -0400187
188 def dry_run(self):
189 servers = self.list()
190 self.data['servers'] = servers
191
192
193class ServerGroupService(ServerService):
194
195 def list(self):
David Paterson07661de2015-10-29 20:15:04 -0700196 client = self.server_groups_client
ghanshyam2dc13452015-08-24 17:39:25 +0900197 sgs = client.list_server_groups()['server_groups']
Jordan Pittier525ec712016-12-07 17:51:26 +0100198 LOG.debug("List count, %s Server Groups", len(sgs))
David Patersonce781492014-09-18 01:07:01 -0400199 return sgs
200
201 def delete(self):
202 client = self.client
203 sgs = self.list()
204 for sg in sgs:
205 try:
206 client.delete_server_group(sg['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400207 except Exception:
208 LOG.exception("Delete Server Group exception.")
David Patersonce781492014-09-18 01:07:01 -0400209
210 def dry_run(self):
211 sgs = self.list()
212 self.data['server_groups'] = sgs
213
214
215class StackService(BaseService):
216 def __init__(self, manager, **kwargs):
217 super(StackService, self).__init__(kwargs)
Andrea Frittolif3e247d2017-07-17 13:34:17 +0100218 params = config.service_client_config('orchestration')
219 self.client = manager.orchestration.OrchestrationClient(
220 manager.auth_provider, **params)
David Patersonce781492014-09-18 01:07:01 -0400221
222 def list(self):
223 client = self.client
Anusha Ramineniab6c3a32015-08-18 08:33:09 +0530224 stacks = client.list_stacks()['stacks']
Jordan Pittier525ec712016-12-07 17:51:26 +0100225 LOG.debug("List count, %s Stacks", len(stacks))
David Patersonce781492014-09-18 01:07:01 -0400226 return stacks
227
228 def delete(self):
229 client = self.client
230 stacks = self.list()
231 for stack in stacks:
232 try:
233 client.delete_stack(stack['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400234 except Exception:
235 LOG.exception("Delete Stack exception.")
David Patersonce781492014-09-18 01:07:01 -0400236
237 def dry_run(self):
238 stacks = self.list()
239 self.data['stacks'] = stacks
240
241
242class KeyPairService(BaseService):
243 def __init__(self, manager, **kwargs):
244 super(KeyPairService, self).__init__(kwargs)
245 self.client = manager.keypairs_client
246
247 def list(self):
248 client = self.client
ghanshyamdee01f22015-08-17 11:41:47 +0900249 keypairs = client.list_keypairs()['keypairs']
Jordan Pittier525ec712016-12-07 17:51:26 +0100250 LOG.debug("List count, %s Keypairs", len(keypairs))
David Patersonce781492014-09-18 01:07:01 -0400251 return keypairs
252
253 def delete(self):
254 client = self.client
255 keypairs = self.list()
256 for k in keypairs:
257 try:
258 name = k['keypair']['name']
259 client.delete_keypair(name)
David Patersone41ebca2015-04-09 05:40:12 -0400260 except Exception:
261 LOG.exception("Delete Keypairs exception.")
David Patersonce781492014-09-18 01:07:01 -0400262
263 def dry_run(self):
264 keypairs = self.list()
265 self.data['keypairs'] = keypairs
266
267
268class SecurityGroupService(BaseService):
269 def __init__(self, manager, **kwargs):
270 super(SecurityGroupService, self).__init__(kwargs)
John Warrenf2345512015-12-10 13:39:30 -0500271 self.client = manager.compute_security_groups_client
David Patersonce781492014-09-18 01:07:01 -0400272
273 def list(self):
274 client = self.client
ghanshyamb610b772015-08-24 17:29:38 +0900275 secgrps = client.list_security_groups()['security_groups']
David Patersonce781492014-09-18 01:07:01 -0400276 secgrp_del = [grp for grp in secgrps if grp['name'] != 'default']
Jordan Pittier525ec712016-12-07 17:51:26 +0100277 LOG.debug("List count, %s Security Groups", len(secgrp_del))
David Patersonce781492014-09-18 01:07:01 -0400278 return secgrp_del
279
280 def delete(self):
281 client = self.client
282 secgrp_del = self.list()
283 for g in secgrp_del:
284 try:
285 client.delete_security_group(g['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400286 except Exception:
287 LOG.exception("Delete Security Groups exception.")
David Patersonce781492014-09-18 01:07:01 -0400288
289 def dry_run(self):
290 secgrp_del = self.list()
291 self.data['security_groups'] = secgrp_del
292
293
294class FloatingIpService(BaseService):
295 def __init__(self, manager, **kwargs):
296 super(FloatingIpService, self).__init__(kwargs)
John Warrene74890a2015-11-11 15:18:01 -0500297 self.client = manager.compute_floating_ips_client
David Patersonce781492014-09-18 01:07:01 -0400298
299 def list(self):
300 client = self.client
ghanshyam9a3a9a22015-08-18 17:03:55 +0900301 floating_ips = client.list_floating_ips()['floating_ips']
Jordan Pittier525ec712016-12-07 17:51:26 +0100302 LOG.debug("List count, %s Floating IPs", len(floating_ips))
David Patersonce781492014-09-18 01:07:01 -0400303 return floating_ips
304
305 def delete(self):
306 client = self.client
307 floating_ips = self.list()
308 for f in floating_ips:
309 try:
310 client.delete_floating_ip(f['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400311 except Exception:
312 LOG.exception("Delete Floating IPs exception.")
David Patersonce781492014-09-18 01:07:01 -0400313
314 def dry_run(self):
315 floating_ips = self.list()
316 self.data['floating_ips'] = floating_ips
317
318
319class VolumeService(BaseService):
320 def __init__(self, manager, **kwargs):
321 super(VolumeService, self).__init__(kwargs)
ghanshyam59928952017-10-26 01:38:45 +0000322 self.client = manager.volumes_client_latest
David Patersonce781492014-09-18 01:07:01 -0400323
324 def list(self):
325 client = self.client
John Warren6177c9e2015-08-19 20:00:17 +0000326 vols = client.list_volumes()['volumes']
Jordan Pittier525ec712016-12-07 17:51:26 +0100327 LOG.debug("List count, %s Volumes", len(vols))
David Patersonce781492014-09-18 01:07:01 -0400328 return vols
329
330 def delete(self):
331 client = self.client
332 vols = self.list()
333 for v in vols:
334 try:
335 client.delete_volume(v['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400336 except Exception:
337 LOG.exception("Delete Volume exception.")
David Patersonce781492014-09-18 01:07:01 -0400338
339 def dry_run(self):
340 vols = self.list()
341 self.data['volumes'] = vols
342
343
David Paterson35c8df02015-04-05 04:35:31 -0400344class VolumeQuotaService(BaseService):
345 def __init__(self, manager, **kwargs):
346 super(VolumeQuotaService, self).__init__(kwargs)
ghanshyam59928952017-10-26 01:38:45 +0000347 self.client = manager.volume_quotas_v2_client
David Paterson35c8df02015-04-05 04:35:31 -0400348
349 def delete(self):
350 client = self.client
351 try:
352 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400353 except Exception:
354 LOG.exception("Delete Volume Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400355
356 def dry_run(self):
Ken'ichi Ohmichi3cf9eaf2016-07-29 11:05:21 -0700357 quotas = self.client.show_quota_set(
358 self.tenant_id, params={'usage': True})['quota_set']
David Paterson35c8df02015-04-05 04:35:31 -0400359 self.data['volume_quotas'] = quotas
360
361
362class NovaQuotaService(BaseService):
363 def __init__(self, manager, **kwargs):
364 super(NovaQuotaService, self).__init__(kwargs)
365 self.client = manager.quotas_client
366 self.limits_client = manager.limits_client
367
368 def delete(self):
369 client = self.client
370 try:
371 client.delete_quota_set(self.tenant_id)
David Patersone41ebca2015-04-09 05:40:12 -0400372 except Exception:
373 LOG.exception("Delete Quotas exception.")
David Paterson35c8df02015-04-05 04:35:31 -0400374
375 def dry_run(self):
376 client = self.limits_client
ghanshyam8a599492015-08-24 15:55:59 +0900377 quotas = client.show_limits()['limits']
Ken'ichi Ohmichib93e6762015-06-15 07:11:29 +0000378 self.data['compute_quotas'] = quotas['absolute']
David Paterson35c8df02015-04-05 04:35:31 -0400379
380
David Patersonce781492014-09-18 01:07:01 -0400381# Begin network service classes
382class NetworkService(BaseService):
383 def __init__(self, manager, **kwargs):
384 super(NetworkService, self).__init__(kwargs)
John Warren94d8faf2015-09-15 12:22:24 -0400385 self.networks_client = manager.networks_client
John Warren3961acd2015-10-02 14:38:53 -0400386 self.subnets_client = manager.subnets_client
John Warren49c0fe52015-10-22 12:35:54 -0400387 self.ports_client = manager.ports_client
John Warrenfbf2a892015-11-17 12:36:14 -0500388 self.floating_ips_client = manager.floating_ips_client
John Warren6d0083a2015-11-30 18:12:30 -0500389 self.metering_labels_client = manager.metering_labels_client
John Warrendd20b3e2015-12-03 13:11:28 -0500390 self.metering_label_rules_client = manager.metering_label_rules_client
John Warrenf9606e92015-12-10 12:12:42 -0500391 self.security_groups_client = manager.security_groups_client
ghanshyama25c4192016-03-11 18:38:12 +0900392 self.routers_client = manager.routers_client
David Patersonce781492014-09-18 01:07:01 -0400393
David Patersond6babc52014-10-14 00:11:56 -0400394 def _filter_by_conf_networks(self, item_list):
395 if not item_list or not all(('network_id' in i for i in item_list)):
396 return item_list
397
398 return [item for item in item_list if item['network_id']
399 not in CONF_NETWORKS]
400
David Patersonce781492014-09-18 01:07:01 -0400401 def list(self):
John Warren94d8faf2015-09-15 12:22:24 -0400402 client = self.networks_client
David Paterson82234022015-04-12 14:07:40 -0400403 networks = client.list_networks(**self.tenant_filter)
404 networks = networks['networks']
David Patersonce781492014-09-18 01:07:01 -0400405 # filter out networks declared in tempest.conf
406 if self.is_preserve:
407 networks = [network for network in networks
David Patersond6babc52014-10-14 00:11:56 -0400408 if network['id'] not in CONF_NETWORKS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100409 LOG.debug("List count, %s Networks", networks)
David Patersonce781492014-09-18 01:07:01 -0400410 return networks
411
412 def delete(self):
John Warren94d8faf2015-09-15 12:22:24 -0400413 client = self.networks_client
David Patersonce781492014-09-18 01:07:01 -0400414 networks = self.list()
415 for n in networks:
416 try:
417 client.delete_network(n['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400418 except Exception:
419 LOG.exception("Delete Network exception.")
David Patersonce781492014-09-18 01:07:01 -0400420
421 def dry_run(self):
422 networks = self.list()
423 self.data['networks'] = networks
424
425
David Patersonce781492014-09-18 01:07:01 -0400426class NetworkFloatingIpService(NetworkService):
427
428 def list(self):
John Warrenfbf2a892015-11-17 12:36:14 -0500429 client = self.floating_ips_client
David Paterson82234022015-04-12 14:07:40 -0400430 flips = client.list_floatingips(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400431 flips = flips['floatingips']
Jordan Pittier525ec712016-12-07 17:51:26 +0100432 LOG.debug("List count, %s Network Floating IPs", len(flips))
David Patersonce781492014-09-18 01:07:01 -0400433 return flips
434
435 def delete(self):
436 client = self.client
437 flips = self.list()
438 for flip in flips:
439 try:
440 client.delete_floatingip(flip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400441 except Exception:
442 LOG.exception("Delete Network Floating IP exception.")
David Patersonce781492014-09-18 01:07:01 -0400443
444 def dry_run(self):
445 flips = self.list()
446 self.data['floating_ips'] = flips
447
448
449class NetworkRouterService(NetworkService):
450
451 def list(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000452 client = self.routers_client
David Paterson82234022015-04-12 14:07:40 -0400453 routers = client.list_routers(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400454 routers = routers['routers']
David Patersonce781492014-09-18 01:07:01 -0400455 if self.is_preserve:
456 routers = [router for router in routers
457 if router['id'] != CONF_PUB_ROUTER]
458
Jordan Pittier525ec712016-12-07 17:51:26 +0100459 LOG.debug("List count, %s Routers", len(routers))
David Patersonce781492014-09-18 01:07:01 -0400460 return routers
461
462 def delete(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000463 client = self.routers_client
Ken'ichi Ohmichif3110f02016-03-21 12:29:03 -0700464 ports_client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400465 routers = self.list()
466 for router in routers:
467 try:
468 rid = router['id']
David Paterson82234022015-04-12 14:07:40 -0400469 ports = [port for port
Ken'ichi Ohmichif3110f02016-03-21 12:29:03 -0700470 in ports_client.list_ports(device_id=rid)['ports']
Attila Fazekasd7e08a62016-10-07 13:05:05 +0200471 if net_info.is_router_interface_port(port)]
David Patersonce781492014-09-18 01:07:01 -0400472 for port in ports:
piyush11078694aca952015-12-17 12:54:44 +0530473 client.remove_router_interface(rid, port_id=port['id'])
David Patersond6babc52014-10-14 00:11:56 -0400474 client.delete_router(rid)
David Patersone41ebca2015-04-09 05:40:12 -0400475 except Exception:
476 LOG.exception("Delete Router exception.")
David Patersonce781492014-09-18 01:07:01 -0400477
478 def dry_run(self):
479 routers = self.list()
480 self.data['routers'] = routers
481
482
483class NetworkHealthMonitorService(NetworkService):
484
485 def list(self):
486 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500487 hms = client.list_health_monitors()
David Patersonce781492014-09-18 01:07:01 -0400488 hms = hms['health_monitors']
489 hms = self._filter_by_tenant_id(hms)
Jordan Pittier525ec712016-12-07 17:51:26 +0100490 LOG.debug("List count, %s Health Monitors", len(hms))
David Patersonce781492014-09-18 01:07:01 -0400491 return hms
492
493 def delete(self):
494 client = self.client
495 hms = self.list()
496 for hm in hms:
497 try:
498 client.delete_health_monitor(hm['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400499 except Exception:
500 LOG.exception("Delete Health Monitor exception.")
David Patersonce781492014-09-18 01:07:01 -0400501
502 def dry_run(self):
503 hms = self.list()
504 self.data['health_monitors'] = hms
505
506
507class NetworkMemberService(NetworkService):
508
509 def list(self):
510 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500511 members = client.list_members()
David Patersonce781492014-09-18 01:07:01 -0400512 members = members['members']
513 members = self._filter_by_tenant_id(members)
Jordan Pittier525ec712016-12-07 17:51:26 +0100514 LOG.debug("List count, %s Members", len(members))
David Patersonce781492014-09-18 01:07:01 -0400515 return members
516
517 def delete(self):
518 client = self.client
519 members = self.list()
520 for member in members:
521 try:
522 client.delete_member(member['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400523 except Exception:
524 LOG.exception("Delete Member exception.")
David Patersonce781492014-09-18 01:07:01 -0400525
526 def dry_run(self):
527 members = self.list()
528 self.data['members'] = members
529
530
531class NetworkVipService(NetworkService):
532
533 def list(self):
534 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500535 vips = client.list_vips()
David Patersonce781492014-09-18 01:07:01 -0400536 vips = vips['vips']
537 vips = self._filter_by_tenant_id(vips)
Jordan Pittier525ec712016-12-07 17:51:26 +0100538 LOG.debug("List count, %s VIPs", len(vips))
David Patersonce781492014-09-18 01:07:01 -0400539 return vips
540
541 def delete(self):
542 client = self.client
543 vips = self.list()
544 for vip in vips:
545 try:
546 client.delete_vip(vip['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400547 except Exception:
548 LOG.exception("Delete VIP exception.")
David Patersonce781492014-09-18 01:07:01 -0400549
550 def dry_run(self):
551 vips = self.list()
552 self.data['vips'] = vips
553
554
555class NetworkPoolService(NetworkService):
556
557 def list(self):
558 client = self.client
David Kranz34e88122014-12-11 15:24:05 -0500559 pools = client.list_pools()
David Patersonce781492014-09-18 01:07:01 -0400560 pools = pools['pools']
561 pools = self._filter_by_tenant_id(pools)
Jordan Pittier525ec712016-12-07 17:51:26 +0100562 LOG.debug("List count, %s Pools", len(pools))
David Patersonce781492014-09-18 01:07:01 -0400563 return pools
564
565 def delete(self):
566 client = self.client
567 pools = self.list()
568 for pool in pools:
569 try:
570 client.delete_pool(pool['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400571 except Exception:
572 LOG.exception("Delete Pool exception.")
David Patersonce781492014-09-18 01:07:01 -0400573
574 def dry_run(self):
575 pools = self.list()
576 self.data['pools'] = pools
577
578
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300579class NetworkMeteringLabelRuleService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400580
581 def list(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500582 client = self.metering_label_rules_client
David Kranz34e88122014-12-11 15:24:05 -0500583 rules = client.list_metering_label_rules()
David Patersonce781492014-09-18 01:07:01 -0400584 rules = rules['metering_label_rules']
585 rules = self._filter_by_tenant_id(rules)
Jordan Pittier525ec712016-12-07 17:51:26 +0100586 LOG.debug("List count, %s Metering Label Rules", len(rules))
David Patersonce781492014-09-18 01:07:01 -0400587 return rules
588
589 def delete(self):
John Warrendd20b3e2015-12-03 13:11:28 -0500590 client = self.metering_label_rules_client
David Patersonce781492014-09-18 01:07:01 -0400591 rules = self.list()
592 for rule in rules:
593 try:
594 client.delete_metering_label_rule(rule['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400595 except Exception:
596 LOG.exception("Delete Metering Label Rule exception.")
David Patersonce781492014-09-18 01:07:01 -0400597
598 def dry_run(self):
599 rules = self.list()
600 self.data['rules'] = rules
601
602
Alexander Gubanov13379bb2015-05-19 18:57:32 +0300603class NetworkMeteringLabelService(NetworkService):
David Patersonce781492014-09-18 01:07:01 -0400604
605 def list(self):
John Warren6d0083a2015-11-30 18:12:30 -0500606 client = self.metering_labels_client
David Kranz34e88122014-12-11 15:24:05 -0500607 labels = client.list_metering_labels()
David Patersonce781492014-09-18 01:07:01 -0400608 labels = labels['metering_labels']
609 labels = self._filter_by_tenant_id(labels)
Jordan Pittier525ec712016-12-07 17:51:26 +0100610 LOG.debug("List count, %s Metering Labels", len(labels))
David Patersonce781492014-09-18 01:07:01 -0400611 return labels
612
613 def delete(self):
John Warren6d0083a2015-11-30 18:12:30 -0500614 client = self.metering_labels_client
David Patersonce781492014-09-18 01:07:01 -0400615 labels = self.list()
616 for label in labels:
617 try:
618 client.delete_metering_label(label['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400619 except Exception:
620 LOG.exception("Delete Metering Label exception.")
David Patersonce781492014-09-18 01:07:01 -0400621
622 def dry_run(self):
623 labels = self.list()
624 self.data['labels'] = labels
625
626
627class NetworkPortService(NetworkService):
628
629 def list(self):
John Warren49c0fe52015-10-22 12:35:54 -0400630 client = self.ports_client
David Paterson82234022015-04-12 14:07:40 -0400631 ports = [port for port in
632 client.list_ports(**self.tenant_filter)['ports']
633 if port["device_owner"] == "" or
634 port["device_owner"].startswith("compute:")]
635
David Patersond6babc52014-10-14 00:11:56 -0400636 if self.is_preserve:
637 ports = self._filter_by_conf_networks(ports)
David Paterson82234022015-04-12 14:07:40 -0400638
Jordan Pittier525ec712016-12-07 17:51:26 +0100639 LOG.debug("List count, %s Ports", len(ports))
David Patersonce781492014-09-18 01:07:01 -0400640 return ports
641
642 def delete(self):
John Warren49c0fe52015-10-22 12:35:54 -0400643 client = self.ports_client
David Patersonce781492014-09-18 01:07:01 -0400644 ports = self.list()
645 for port in ports:
646 try:
647 client.delete_port(port['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400648 except Exception:
649 LOG.exception("Delete Port exception.")
David Patersonce781492014-09-18 01:07:01 -0400650
651 def dry_run(self):
652 ports = self.list()
653 self.data['ports'] = ports
654
655
David Paterson82234022015-04-12 14:07:40 -0400656class NetworkSecGroupService(NetworkService):
657 def list(self):
John Warrenf9606e92015-12-10 12:12:42 -0500658 client = self.security_groups_client
David Paterson82234022015-04-12 14:07:40 -0400659 filter = self.tenant_filter
660 # cannot delete default sec group so never show it.
661 secgroups = [secgroup for secgroup in
662 client.list_security_groups(**filter)['security_groups']
663 if secgroup['name'] != 'default']
664
665 if self.is_preserve:
666 secgroups = self._filter_by_conf_networks(secgroups)
Jordan Pittier525ec712016-12-07 17:51:26 +0100667 LOG.debug("List count, %s security_groups", len(secgroups))
David Paterson82234022015-04-12 14:07:40 -0400668 return secgroups
669
670 def delete(self):
671 client = self.client
672 secgroups = self.list()
673 for secgroup in secgroups:
674 try:
675 client.delete_secgroup(secgroup['id'])
676 except Exception:
677 LOG.exception("Delete security_group exception.")
678
679 def dry_run(self):
680 secgroups = self.list()
681 self.data['secgroups'] = secgroups
682
683
David Patersonce781492014-09-18 01:07:01 -0400684class NetworkSubnetService(NetworkService):
685
686 def list(self):
John Warren3961acd2015-10-02 14:38:53 -0400687 client = self.subnets_client
David Paterson82234022015-04-12 14:07:40 -0400688 subnets = client.list_subnets(**self.tenant_filter)
David Patersonce781492014-09-18 01:07:01 -0400689 subnets = subnets['subnets']
David Patersond6babc52014-10-14 00:11:56 -0400690 if self.is_preserve:
691 subnets = self._filter_by_conf_networks(subnets)
Jordan Pittier525ec712016-12-07 17:51:26 +0100692 LOG.debug("List count, %s Subnets", len(subnets))
David Patersonce781492014-09-18 01:07:01 -0400693 return subnets
694
695 def delete(self):
John Warren3961acd2015-10-02 14:38:53 -0400696 client = self.subnets_client
David Patersonce781492014-09-18 01:07:01 -0400697 subnets = self.list()
698 for subnet in subnets:
699 try:
700 client.delete_subnet(subnet['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400701 except Exception:
702 LOG.exception("Delete Subnet exception.")
David Patersonce781492014-09-18 01:07:01 -0400703
704 def dry_run(self):
705 subnets = self.list()
706 self.data['subnets'] = subnets
707
708
David Patersonce781492014-09-18 01:07:01 -0400709# begin global services
710class FlavorService(BaseService):
711 def __init__(self, manager, **kwargs):
712 super(FlavorService, self).__init__(kwargs)
713 self.client = manager.flavors_client
714
715 def list(self):
716 client = self.client
ghanshyam19973be2015-08-18 15:46:42 +0900717 flavors = client.list_flavors({"is_public": None})['flavors']
David Patersonce781492014-09-18 01:07:01 -0400718 if not self.is_save_state:
719 # recreate list removing saved flavors
720 flavors = [flavor for flavor in flavors if flavor['id']
721 not in self.saved_state_json['flavors'].keys()]
722
723 if self.is_preserve:
724 flavors = [flavor for flavor in flavors
725 if flavor['id'] not in CONF_FLAVORS]
Jordan Pittier525ec712016-12-07 17:51:26 +0100726 LOG.debug("List count, %s Flavors after reconcile", len(flavors))
David Patersonce781492014-09-18 01:07:01 -0400727 return flavors
728
729 def delete(self):
730 client = self.client
731 flavors = self.list()
732 for flavor in flavors:
733 try:
734 client.delete_flavor(flavor['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400735 except Exception:
736 LOG.exception("Delete Flavor exception.")
David Patersonce781492014-09-18 01:07:01 -0400737
738 def dry_run(self):
739 flavors = self.list()
740 self.data['flavors'] = flavors
741
742 def save_state(self):
743 flavors = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500744 self.data['flavors'] = {}
David Patersonce781492014-09-18 01:07:01 -0400745 for flavor in flavors:
gordon chungc15f1bc2015-02-23 18:00:41 -0500746 self.data['flavors'][flavor['id']] = flavor['name']
David Patersonce781492014-09-18 01:07:01 -0400747
748
749class ImageService(BaseService):
750 def __init__(self, manager, **kwargs):
751 super(ImageService, self).__init__(kwargs)
Ghanshyamae76c122015-12-22 13:41:35 +0900752 self.client = manager.compute_images_client
David Patersonce781492014-09-18 01:07:01 -0400753
754 def list(self):
755 client = self.client
ghanshyam1756e0b2015-08-18 19:19:05 +0900756 images = client.list_images({"all_tenants": True})['images']
David Patersonce781492014-09-18 01:07:01 -0400757 if not self.is_save_state:
758 images = [image for image in images if image['id']
759 not in self.saved_state_json['images'].keys()]
760 if self.is_preserve:
761 images = [image for image in images
762 if image['id'] not in CONF_IMAGES]
Jordan Pittier525ec712016-12-07 17:51:26 +0100763 LOG.debug("List count, %s Images after reconcile", len(images))
David Patersonce781492014-09-18 01:07:01 -0400764 return images
765
766 def delete(self):
767 client = self.client
768 images = self.list()
769 for image in images:
770 try:
771 client.delete_image(image['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400772 except Exception:
773 LOG.exception("Delete Image exception.")
David Patersonce781492014-09-18 01:07:01 -0400774
775 def dry_run(self):
776 images = self.list()
777 self.data['images'] = images
778
779 def save_state(self):
gordon chungc15f1bc2015-02-23 18:00:41 -0500780 self.data['images'] = {}
David Paterson82234022015-04-12 14:07:40 -0400781 images = self.list()
David Patersonce781492014-09-18 01:07:01 -0400782 for image in images:
gordon chungc15f1bc2015-02-23 18:00:41 -0500783 self.data['images'][image['id']] = image['name']
David Patersonce781492014-09-18 01:07:01 -0400784
785
786class IdentityService(BaseService):
787 def __init__(self, manager, **kwargs):
788 super(IdentityService, self).__init__(kwargs)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200789 self.client = manager.identity_v3_client
David Patersonce781492014-09-18 01:07:01 -0400790
791
Daniel Mellado82c83a52015-12-09 15:16:49 +0000792class UserService(BaseService):
793
794 def __init__(self, manager, **kwargs):
795 super(UserService, self).__init__(kwargs)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200796 self.client = manager.users_v3_client
David Patersonce781492014-09-18 01:07:01 -0400797
798 def list(self):
Daniel Mellado82c83a52015-12-09 15:16:49 +0000799 users = self.client.list_users()['users']
David Patersonce781492014-09-18 01:07:01 -0400800
801 if not self.is_save_state:
802 users = [user for user in users if user['id']
803 not in self.saved_state_json['users'].keys()]
804
805 if self.is_preserve:
806 users = [user for user in users if user['name']
807 not in CONF_USERS]
808
809 elif not self.is_save_state: # Never delete admin user
810 users = [user for user in users if user['name'] !=
David Paterson07661de2015-10-29 20:15:04 -0700811 CONF.auth.admin_username]
David Patersonce781492014-09-18 01:07:01 -0400812
Jordan Pittier525ec712016-12-07 17:51:26 +0100813 LOG.debug("List count, %s Users after reconcile", len(users))
David Patersonce781492014-09-18 01:07:01 -0400814 return users
815
816 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400817 users = self.list()
818 for user in users:
819 try:
Daniel Mellado82c83a52015-12-09 15:16:49 +0000820 self.client.delete_user(user['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400821 except Exception:
822 LOG.exception("Delete User exception.")
David Patersonce781492014-09-18 01:07:01 -0400823
824 def dry_run(self):
825 users = self.list()
826 self.data['users'] = users
827
828 def save_state(self):
829 users = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500830 self.data['users'] = {}
David Patersonce781492014-09-18 01:07:01 -0400831 for user in users:
gordon chungc15f1bc2015-02-23 18:00:41 -0500832 self.data['users'][user['id']] = user['name']
David Patersonce781492014-09-18 01:07:01 -0400833
834
Daniel Melladob83ea562015-12-18 09:12:49 +0000835class RoleService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400836
Daniel Mellado6b16b922015-12-07 12:43:08 +0000837 def __init__(self, manager, **kwargs):
838 super(RoleService, self).__init__(kwargs)
839 self.client = manager.roles_client
840
David Patersonce781492014-09-18 01:07:01 -0400841 def list(self):
David Patersonce781492014-09-18 01:07:01 -0400842 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000843 roles = self.client.list_roles()['roles']
David Patersonce781492014-09-18 01:07:01 -0400844 # reconcile roles with saved state and never list admin role
845 if not self.is_save_state:
846 roles = [role for role in roles if
847 (role['id'] not in
848 self.saved_state_json['roles'].keys()
849 and role['name'] != CONF.identity.admin_role)]
Jordan Pittier525ec712016-12-07 17:51:26 +0100850 LOG.debug("List count, %s Roles after reconcile", len(roles))
David Patersonce781492014-09-18 01:07:01 -0400851 return roles
David Patersone41ebca2015-04-09 05:40:12 -0400852 except Exception:
853 LOG.exception("Cannot retrieve Roles.")
David Patersonce781492014-09-18 01:07:01 -0400854 return []
855
856 def delete(self):
David Patersonce781492014-09-18 01:07:01 -0400857 roles = self.list()
858 for role in roles:
859 try:
Daniel Mellado6b16b922015-12-07 12:43:08 +0000860 self.client.delete_role(role['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400861 except Exception:
862 LOG.exception("Delete Role exception.")
David Patersonce781492014-09-18 01:07:01 -0400863
864 def dry_run(self):
865 roles = self.list()
866 self.data['roles'] = roles
867
868 def save_state(self):
869 roles = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500870 self.data['roles'] = {}
David Patersonce781492014-09-18 01:07:01 -0400871 for role in roles:
gordon chungc15f1bc2015-02-23 18:00:41 -0500872 self.data['roles'][role['id']] = role['name']
David Patersonce781492014-09-18 01:07:01 -0400873
874
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200875class ProjectService(BaseService):
David Patersonce781492014-09-18 01:07:01 -0400876
Daniel Melladob04da902015-11-20 17:43:12 +0100877 def __init__(self, manager, **kwargs):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200878 super(ProjectService, self).__init__(kwargs)
879 self.client = manager.projects_client
Daniel Melladob04da902015-11-20 17:43:12 +0100880
David Patersonce781492014-09-18 01:07:01 -0400881 def list(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200882 projects = self.client.list_projects()['projects']
David Patersonce781492014-09-18 01:07:01 -0400883 if not self.is_save_state:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200884 projects = [project for project in projects if (project['id']
885 not in self.saved_state_json['projects'].keys()
886 and project['name'] != CONF.auth.admin_project_name)]
David Patersonce781492014-09-18 01:07:01 -0400887
888 if self.is_preserve:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200889 projects = [project for project in projects if project['name']
890 not in CONF_PROJECTS]
David Patersonce781492014-09-18 01:07:01 -0400891
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200892 LOG.debug("List count, %s Projects after reconcile", len(projects))
893 return projects
David Patersonce781492014-09-18 01:07:01 -0400894
895 def delete(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200896 projects = self.list()
897 for project in projects:
David Patersonce781492014-09-18 01:07:01 -0400898 try:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200899 self.client.delete_project(project['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400900 except Exception:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200901 LOG.exception("Delete project exception.")
David Patersonce781492014-09-18 01:07:01 -0400902
903 def dry_run(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200904 projects = self.list()
905 self.data['projects'] = projects
David Patersonce781492014-09-18 01:07:01 -0400906
907 def save_state(self):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200908 projects = self.list()
909 self.data['projects'] = {}
910 for project in projects:
911 self.data['projects'][project['id']] = project['name']
David Patersonce781492014-09-18 01:07:01 -0400912
913
914class DomainService(BaseService):
915
916 def __init__(self, manager, **kwargs):
917 super(DomainService, self).__init__(kwargs)
Daniel Mellado91a26b62016-02-11 11:13:04 +0000918 self.client = manager.domains_client
David Patersonce781492014-09-18 01:07:01 -0400919
920 def list(self):
921 client = self.client
Thomas Bechtold48268a02015-08-30 19:37:46 +0200922 domains = client.list_domains()['domains']
David Patersonce781492014-09-18 01:07:01 -0400923 if not self.is_save_state:
924 domains = [domain for domain in domains if domain['id']
925 not in self.saved_state_json['domains'].keys()]
926
Jordan Pittier525ec712016-12-07 17:51:26 +0100927 LOG.debug("List count, %s Domains after reconcile", len(domains))
David Patersonce781492014-09-18 01:07:01 -0400928 return domains
929
930 def delete(self):
931 client = self.client
932 domains = self.list()
933 for domain in domains:
934 try:
935 client.update_domain(domain['id'], enabled=False)
936 client.delete_domain(domain['id'])
David Patersone41ebca2015-04-09 05:40:12 -0400937 except Exception:
938 LOG.exception("Delete Domain exception.")
David Patersonce781492014-09-18 01:07:01 -0400939
940 def dry_run(self):
941 domains = self.list()
942 self.data['domains'] = domains
943
944 def save_state(self):
945 domains = self.list()
gordon chungc15f1bc2015-02-23 18:00:41 -0500946 self.data['domains'] = {}
David Patersonce781492014-09-18 01:07:01 -0400947 for domain in domains:
gordon chungc15f1bc2015-02-23 18:00:41 -0500948 self.data['domains'][domain['id']] = domain['name']
David Patersonce781492014-09-18 01:07:01 -0400949
950
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200951def get_project_cleanup_services():
952 project_services = []
ghanshyame4796f82016-04-13 15:49:22 +0900953 # TODO(gmann): Tempest should provide some plugin hook for cleanup
954 # script extension to plugin tests also.
David Patersonce781492014-09-18 01:07:01 -0400955 if IS_NOVA:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200956 project_services.append(ServerService)
957 project_services.append(KeyPairService)
958 project_services.append(SecurityGroupService)
959 project_services.append(ServerGroupService)
David Patersonce781492014-09-18 01:07:01 -0400960 if not IS_NEUTRON:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200961 project_services.append(FloatingIpService)
962 project_services.append(NovaQuotaService)
David Patersonce781492014-09-18 01:07:01 -0400963 if IS_HEAT:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200964 project_services.append(StackService)
David Patersonce781492014-09-18 01:07:01 -0400965 if IS_NEUTRON:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200966 project_services.append(NetworkFloatingIpService)
Andrea Frittolicd368412017-08-14 21:37:56 +0100967 if utils.is_extension_enabled('metering', 'network'):
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200968 project_services.append(NetworkMeteringLabelRuleService)
969 project_services.append(NetworkMeteringLabelService)
970 project_services.append(NetworkRouterService)
971 project_services.append(NetworkPortService)
972 project_services.append(NetworkSubnetService)
973 project_services.append(NetworkService)
974 project_services.append(NetworkSecGroupService)
David Patersonce781492014-09-18 01:07:01 -0400975 if IS_CINDER:
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200976 project_services.append(SnapshotService)
977 project_services.append(VolumeService)
978 project_services.append(VolumeQuotaService)
979 return project_services
David Patersonce781492014-09-18 01:07:01 -0400980
981
982def get_global_cleanup_services():
983 global_services = []
984 if IS_NOVA:
985 global_services.append(FlavorService)
986 if IS_GLANCE:
987 global_services.append(ImageService)
988 global_services.append(UserService)
Arx Cruz05fe4bc2017-10-20 10:48:28 +0200989 global_services.append(ProjectService)
David Patersonce781492014-09-18 01:07:01 -0400990 global_services.append(DomainService)
991 global_services.append(RoleService)
992 return global_services