blob: 6dca3a35d0d240cccbc1a666eb33fd8df52a36cd [file] [log] [blame]
Matthew Treinishb86cda92013-07-29 11:22:23 -04001# Copyright 2013 IBM Corp.
2#
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#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
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.
14
Andrea Frittolic3280152015-02-26 12:42:34 +000015import abc
Miguel Lavalleb8fabc52013-08-23 11:19:57 -050016import netaddr
Doug Hellmann583ce2c2015-03-11 14:55:46 +000017from oslo_log import log as logging
Andrea Frittolic3280152015-02-26 12:42:34 +000018import six
Masayuki Igawabfa07602015-01-20 18:47:17 +090019from tempest_lib import exceptions as lib_exc
Miguel Lavalleb8fabc52013-08-23 11:19:57 -050020
Matthew Treinishb86cda92013-07-29 11:22:23 -040021from tempest import clients
Marc Kodererd2690fe2014-07-16 14:17:47 +020022from tempest.common import cred_provider
Andrea Frittoli (andreaf)8def7ca2015-05-13 14:24:19 +010023from tempest.common.utils import data_utils
Matthew Treinishb86cda92013-07-29 11:22:23 -040024from tempest import config
25from tempest import exceptions
Andrea Frittolic3280152015-02-26 12:42:34 +000026from tempest.services.identity.v2.json import identity_client as v2_identity
Matthew Treinishb86cda92013-07-29 11:22:23 -040027
Sean Dague86bd8422013-12-20 09:56:44 -050028CONF = config.CONF
Matthew Treinishb86cda92013-07-29 11:22:23 -040029LOG = logging.getLogger(__name__)
30
31
Andrea Frittolic3280152015-02-26 12:42:34 +000032@six.add_metaclass(abc.ABCMeta)
33class CredsClient(object):
34 """This class is a wrapper around the identity clients, to provide a
35 single interface for managing credentials in both v2 and v3 cases.
36 It's not bound to created credentials, only to a specific set of admin
37 credentials used for generating credentials.
38 """
39
40 def __init__(self, identity_client):
41 # The client implies version and credentials
42 self.identity_client = identity_client
43 self.credentials = self.identity_client.auth_provider.credentials
44
45 def create_user(self, username, password, project, email):
46 user = self.identity_client.create_user(
47 username, password, project['id'], email)
John Warren56317e02015-08-12 20:48:32 +000048 if 'user' in user:
49 user = user['user']
Andrea Frittolic3280152015-02-26 12:42:34 +000050 return user
51
52 @abc.abstractmethod
53 def create_project(self, name, description):
54 pass
55
Matthew Treinish32f98a42015-07-14 19:58:46 -040056 def _check_role_exists(self, role_name):
Andrea Frittolic3280152015-02-26 12:42:34 +000057 try:
58 roles = self._list_roles()
59 role = next(r for r in roles if r['name'] == role_name)
60 except StopIteration:
Matthew Treinish32f98a42015-07-14 19:58:46 -040061 return None
62 return role
63
64 def create_user_role(self, role_name):
65 if not self._check_role_exists(role_name):
66 self.identity_client.create_role(role_name)
67
68 def assign_user_role(self, user, project, role_name):
69 role = self._check_role_exists(role_name)
70 if not role:
Andrea Frittolic3280152015-02-26 12:42:34 +000071 msg = 'No "%s" role found' % role_name
72 raise lib_exc.NotFound(msg)
73 try:
74 self.identity_client.assign_user_role(project['id'], user['id'],
75 role['id'])
76 except lib_exc.Conflict:
77 LOG.debug("Role %s already assigned on project %s for user %s" % (
78 role['id'], project['id'], user['id']))
79
80 @abc.abstractmethod
81 def get_credentials(self, user, project, password):
82 pass
83
84 def delete_user(self, user_id):
85 self.identity_client.delete_user(user_id)
86
87 def _list_roles(self):
88 roles = self.identity_client.list_roles()
89 return roles
90
91
92class V2CredsClient(CredsClient):
93
94 def create_project(self, name, description):
95 tenant = self.identity_client.create_tenant(
96 name=name, description=description)
97 return tenant
98
99 def get_credentials(self, user, project, password):
100 return cred_provider.get_credentials(
101 identity_version='v2',
102 username=user['name'], user_id=user['id'],
103 tenant_name=project['name'], tenant_id=project['id'],
104 password=password)
105
106 def delete_project(self, project_id):
107 self.identity_client.delete_tenant(project_id)
108
109
110class V3CredsClient(CredsClient):
111
112 def __init__(self, identity_client, domain_name):
113 super(V3CredsClient, self).__init__(identity_client)
114 try:
115 # Domain names must be unique, in any case a list is returned,
116 # selecting the first (and only) element
117 self.creds_domain = self.identity_client.list_domains(
John Warren56317e02015-08-12 20:48:32 +0000118 params={'name': domain_name})['domains'][0]
Andrea Frittolic3280152015-02-26 12:42:34 +0000119 except lib_exc.NotFound:
120 # TODO(andrea) we could probably create the domain on the fly
121 msg = "Configured domain %s could not be found" % domain_name
122 raise exceptions.InvalidConfiguration(msg)
123
124 def create_project(self, name, description):
125 project = self.identity_client.create_project(
126 name=name, description=description,
John Warren56317e02015-08-12 20:48:32 +0000127 domain_id=self.creds_domain['id'])['project']
Andrea Frittolic3280152015-02-26 12:42:34 +0000128 return project
129
130 def get_credentials(self, user, project, password):
131 return cred_provider.get_credentials(
132 identity_version='v3',
133 username=user['name'], user_id=user['id'],
134 project_name=project['name'], project_id=project['id'],
135 password=password,
136 project_domain_name=self.creds_domain['name'])
137
138 def delete_project(self, project_id):
139 self.identity_client.delete_project(project_id)
140
John Warren56317e02015-08-12 20:48:32 +0000141 def _list_roles(self):
142 roles = self.identity_client.list_roles()['roles']
143 return roles
144
Andrea Frittolic3280152015-02-26 12:42:34 +0000145
146def get_creds_client(identity_client, project_domain_name=None):
Ken'ichi Ohmichia6287072015-07-02 02:43:15 +0000147 if isinstance(identity_client, v2_identity.IdentityClient):
Andrea Frittolic3280152015-02-26 12:42:34 +0000148 return V2CredsClient(identity_client)
149 else:
150 return V3CredsClient(identity_client, project_domain_name)
151
152
Marc Kodererd2690fe2014-07-16 14:17:47 +0200153class IsolatedCreds(cred_provider.CredentialProvider):
Matthew Treinishb86cda92013-07-29 11:22:23 -0400154
LingxianKong9c713d22015-06-09 15:19:55 +0800155 def __init__(self, identity_version=None, name=None,
Andrea Frittolic3280152015-02-26 12:42:34 +0000156 network_resources=None):
LingxianKong9c713d22015-06-09 15:19:55 +0800157 super(IsolatedCreds, self).__init__(identity_version, name,
Andrea Frittolic3280152015-02-26 12:42:34 +0000158 network_resources)
Matthew Treinish9f756a02014-01-15 10:26:07 -0500159 self.network_resources = network_resources
Matthew Treinishb86cda92013-07-29 11:22:23 -0400160 self.isolated_creds = {}
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500161 self.ports = []
Andrea Frittolic3280152015-02-26 12:42:34 +0000162 self.default_admin_creds = cred_provider.get_configured_credentials(
163 'identity_admin', fill_in=True,
164 identity_version=self.identity_version)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500165 self.identity_admin_client, self.network_admin_client = (
166 self._get_admin_clients())
Andrea Frittolic3280152015-02-26 12:42:34 +0000167 # Domain where isolated credentials are provisioned (v3 only).
168 # Use that of the admin account is None is configured.
169 self.creds_domain_name = None
170 if self.identity_version == 'v3':
171 self.creds_domain_name = (
David Kranz87fc7e92015-07-28 14:05:20 -0400172 self.default_admin_creds.project_domain_name or
173 CONF.auth.default_credentials_domain_name)
Andrea Frittolic3280152015-02-26 12:42:34 +0000174 self.creds_client = get_creds_client(
175 self.identity_admin_client, self.creds_domain_name)
Matthew Treinishb86cda92013-07-29 11:22:23 -0400176
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500177 def _get_admin_clients(self):
Matthew Treinishb86cda92013-07-29 11:22:23 -0400178 """
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500179 Returns a tuple with instances of the following admin clients (in this
180 order):
181 identity
182 network
Matthew Treinishb86cda92013-07-29 11:22:23 -0400183 """
Andrea Frittolic3280152015-02-26 12:42:34 +0000184 os = clients.Manager(self.default_admin_creds)
185 if self.identity_version == 'v2':
186 return os.identity_client, os.network_client
187 else:
188 return os.identity_v3_client, os.network_client
Matthew Treinishb86cda92013-07-29 11:22:23 -0400189
Matthew Treinish976e8df2014-12-19 14:21:54 -0500190 def _create_creds(self, suffix="", admin=False, roles=None):
Sean Dague6969b902014-01-28 06:48:37 -0500191 """Create random credentials under the following schema.
192
193 If the name contains a '.' is the full class path of something, and
194 we don't really care. If it isn't, it's probably a meaningful name,
195 so use it.
196
197 For logging purposes, -user and -tenant are long and redundant,
198 don't use them. The user# will be sufficient to figure it out.
199 """
200 if '.' in self.name:
201 root = ""
202 else:
203 root = self.name
204
Andrea Frittolic3280152015-02-26 12:42:34 +0000205 project_name = data_utils.rand_name(root) + suffix
206 project_desc = project_name + "-desc"
207 project = self.creds_client.create_project(
208 name=project_name, description=project_desc)
Sean Dague6969b902014-01-28 06:48:37 -0500209
210 username = data_utils.rand_name(root) + suffix
LingxianKong9c713d22015-06-09 15:19:55 +0800211 user_password = data_utils.rand_password()
Sean Dague6969b902014-01-28 06:48:37 -0500212 email = data_utils.rand_name(root) + suffix + "@example.com"
Andrea Frittolic3280152015-02-26 12:42:34 +0000213 user = self.creds_client.create_user(
LingxianKong9c713d22015-06-09 15:19:55 +0800214 username, user_password, project, email)
John Warren56317e02015-08-12 20:48:32 +0000215 if 'user' in user:
216 user = user['user']
Matthew Treinish32f98a42015-07-14 19:58:46 -0400217 role_assigned = False
Matthew Treinishb86cda92013-07-29 11:22:23 -0400218 if admin:
Andrea Frittolic3280152015-02-26 12:42:34 +0000219 self.creds_client.assign_user_role(user, project,
220 CONF.identity.admin_role)
Matthew Treinish32f98a42015-07-14 19:58:46 -0400221 role_assigned = True
Matthew Treinish976e8df2014-12-19 14:21:54 -0500222 # Add roles specified in config file
223 for conf_role in CONF.auth.tempest_roles:
Andrea Frittolic3280152015-02-26 12:42:34 +0000224 self.creds_client.assign_user_role(user, project, conf_role)
Matthew Treinish32f98a42015-07-14 19:58:46 -0400225 role_assigned = True
Matthew Treinish976e8df2014-12-19 14:21:54 -0500226 # Add roles requested by caller
227 if roles:
228 for role in roles:
Andrea Frittolic3280152015-02-26 12:42:34 +0000229 self.creds_client.assign_user_role(user, project, role)
Matthew Treinish32f98a42015-07-14 19:58:46 -0400230 role_assigned = True
231 # NOTE(mtreinish) For a user to have access to a project with v3 auth
232 # it must beassigned a role on the project. So we need to ensure that
233 # our newly created user has a role on the newly created project.
234 if self.identity_version == 'v3' and not role_assigned:
235 self.creds_client.create_user_role('Member')
236 self.creds_client.assign_user_role(user, project, 'Member')
237
LingxianKong9c713d22015-06-09 15:19:55 +0800238 creds = self.creds_client.get_credentials(user, project, user_password)
Andrea Frittoli (andreaf)9540dfd2015-03-25 17:06:50 -0400239 return cred_provider.TestResources(creds)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500240
241 def _create_network_resources(self, tenant_id):
242 network = None
243 subnet = None
244 router = None
Matthew Treinish9f756a02014-01-15 10:26:07 -0500245 # Make sure settings
246 if self.network_resources:
247 if self.network_resources['router']:
248 if (not self.network_resources['subnet'] or
249 not self.network_resources['network']):
250 raise exceptions.InvalidConfiguration(
251 'A router requires a subnet and network')
252 elif self.network_resources['subnet']:
253 if not self.network_resources['network']:
254 raise exceptions.InvalidConfiguration(
255 'A subnet requires a network')
256 elif self.network_resources['dhcp']:
257 raise exceptions.InvalidConfiguration('DHCP requires a subnet')
258
Masayuki Igawa259c1132013-10-31 17:48:44 +0900259 data_utils.rand_name_root = data_utils.rand_name(self.name)
Matthew Treinish9f756a02014-01-15 10:26:07 -0500260 if not self.network_resources or self.network_resources['network']:
261 network_name = data_utils.rand_name_root + "-network"
262 network = self._create_network(network_name, tenant_id)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500263 try:
Matthew Treinish9f756a02014-01-15 10:26:07 -0500264 if not self.network_resources or self.network_resources['subnet']:
265 subnet_name = data_utils.rand_name_root + "-subnet"
266 subnet = self._create_subnet(subnet_name, tenant_id,
267 network['id'])
268 if not self.network_resources or self.network_resources['router']:
269 router_name = data_utils.rand_name_root + "-router"
270 router = self._create_router(router_name, tenant_id)
271 self._add_router_interface(router['id'], subnet['id'])
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500272 except Exception:
273 if router:
274 self._clear_isolated_router(router['id'], router['name'])
275 if subnet:
276 self._clear_isolated_subnet(subnet['id'], subnet['name'])
277 if network:
278 self._clear_isolated_network(network['id'], network['name'])
279 raise
280 return network, subnet, router
281
282 def _create_network(self, name, tenant_id):
David Kranz34e88122014-12-11 15:24:05 -0500283 resp_body = self.network_admin_client.create_network(
Andrea Frittoliae9aca02014-09-25 11:43:11 +0100284 name=name, tenant_id=tenant_id)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500285 return resp_body['network']
286
287 def _create_subnet(self, subnet_name, tenant_id, network_id):
Sean Dague86bd8422013-12-20 09:56:44 -0500288 base_cidr = netaddr.IPNetwork(CONF.network.tenant_network_cidr)
289 mask_bits = CONF.network.tenant_network_mask_bits
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500290 for subnet_cidr in base_cidr.subnet(mask_bits):
291 try:
Andrea Frittoliae9aca02014-09-25 11:43:11 +0100292 if self.network_resources:
David Kranz34e88122014-12-11 15:24:05 -0500293 resp_body = self.network_admin_client.\
Andrea Frittoliae9aca02014-09-25 11:43:11 +0100294 create_subnet(
295 network_id=network_id, cidr=str(subnet_cidr),
296 name=subnet_name,
297 tenant_id=tenant_id,
298 enable_dhcp=self.network_resources['dhcp'],
299 ip_version=4)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500300 else:
David Kranz34e88122014-12-11 15:24:05 -0500301 resp_body = self.network_admin_client.\
Andrea Frittoliae9aca02014-09-25 11:43:11 +0100302 create_subnet(network_id=network_id,
303 cidr=str(subnet_cidr),
304 name=subnet_name,
305 tenant_id=tenant_id,
306 ip_version=4)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500307 break
Masayuki Igawa4b29e472015-02-16 10:41:54 +0900308 except lib_exc.BadRequest as e:
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500309 if 'overlaps with another subnet' not in str(e):
310 raise
311 else:
David Kranzd4210412014-11-21 08:37:45 -0500312 message = 'Available CIDR for subnet creation could not be found'
313 raise Exception(message)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500314 return resp_body['subnet']
315
316 def _create_router(self, router_name, tenant_id):
317 external_net_id = dict(
Sean Dague86bd8422013-12-20 09:56:44 -0500318 network_id=CONF.network.public_network_id)
David Kranz34e88122014-12-11 15:24:05 -0500319 resp_body = self.network_admin_client.create_router(
Andrea Frittoliae9aca02014-09-25 11:43:11 +0100320 router_name,
321 external_gateway_info=external_net_id,
322 tenant_id=tenant_id)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500323 return resp_body['router']
324
325 def _add_router_interface(self, router_id, subnet_id):
Andrea Frittoliae9aca02014-09-25 11:43:11 +0100326 self.network_admin_client.add_router_interface_with_subnet_id(
327 router_id, subnet_id)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500328
Andrea Frittoli9612e812014-03-13 10:57:26 +0000329 def get_credentials(self, credential_type):
Matthew Treinish976e8df2014-12-19 14:21:54 -0500330 if self.isolated_creds.get(str(credential_type)):
331 credentials = self.isolated_creds[str(credential_type)]
Matthew Treinishb86cda92013-07-29 11:22:23 -0400332 else:
Matthew Treinish976e8df2014-12-19 14:21:54 -0500333 if credential_type in ['primary', 'alt', 'admin']:
334 is_admin = (credential_type == 'admin')
335 credentials = self._create_creds(admin=is_admin)
336 else:
337 credentials = self._create_creds(roles=credential_type)
338 self.isolated_creds[str(credential_type)] = credentials
Andrea Frittolifc315902014-03-20 09:21:44 +0000339 # Maintained until tests are ported
Andrea Frittolifc315902014-03-20 09:21:44 +0000340 LOG.info("Acquired isolated creds:\n credentials: %s"
341 % credentials)
Adam Gandelman85395e72014-07-29 18:34:33 -0700342 if (CONF.service_available.neutron and
Matthew Treinish2219d382015-04-24 10:33:04 -0400343 not CONF.baremetal.driver_enabled and
344 CONF.auth.create_isolated_networks):
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500345 network, subnet, router = self._create_network_resources(
Andrea Frittolifc315902014-03-20 09:21:44 +0000346 credentials.tenant_id)
Andrea Frittoli (andreaf)9540dfd2015-03-25 17:06:50 -0400347 credentials.set_resources(network=network, subnet=subnet,
348 router=router)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500349 LOG.info("Created isolated network resources for : \n"
Andrea Frittolifc315902014-03-20 09:21:44 +0000350 + " credentials: %s" % credentials)
Andrea Frittoli9612e812014-03-13 10:57:26 +0000351 return credentials
Matthew Treinishb86cda92013-07-29 11:22:23 -0400352
Andrea Frittoli9612e812014-03-13 10:57:26 +0000353 def get_primary_creds(self):
354 return self.get_credentials('primary')
Matthew Treinishb86cda92013-07-29 11:22:23 -0400355
Andrea Frittoli9612e812014-03-13 10:57:26 +0000356 def get_admin_creds(self):
357 return self.get_credentials('admin')
Andrea Frittolifc315902014-03-20 09:21:44 +0000358
Andrea Frittoli9612e812014-03-13 10:57:26 +0000359 def get_alt_creds(self):
360 return self.get_credentials('alt')
Matthew Treinishb86cda92013-07-29 11:22:23 -0400361
Matthew Treinish976e8df2014-12-19 14:21:54 -0500362 def get_creds_by_roles(self, roles, force_new=False):
363 roles = list(set(roles))
364 # The roles list as a str will become the index as the dict key for
365 # the created credentials set in the isolated_creds dict.
366 exist_creds = self.isolated_creds.get(str(roles))
367 # If force_new flag is True 2 cred sets with the same roles are needed
368 # handle this by creating a separate index for old one to store it
369 # separately for cleanup
370 if exist_creds and force_new:
371 new_index = str(roles) + '-' + str(len(self.isolated_creds))
372 self.isolated_creds[new_index] = exist_creds
373 del self.isolated_creds[str(roles)]
Matthew Treinish976e8df2014-12-19 14:21:54 -0500374 return self.get_credentials(roles)
375
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500376 def _clear_isolated_router(self, router_id, router_name):
377 net_client = self.network_admin_client
378 try:
379 net_client.delete_router(router_id)
Masayuki Igawabfa07602015-01-20 18:47:17 +0900380 except lib_exc.NotFound:
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500381 LOG.warn('router with name: %s not found for delete' %
382 router_name)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500383
384 def _clear_isolated_subnet(self, subnet_id, subnet_name):
385 net_client = self.network_admin_client
386 try:
387 net_client.delete_subnet(subnet_id)
Masayuki Igawabfa07602015-01-20 18:47:17 +0900388 except lib_exc.NotFound:
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500389 LOG.warn('subnet with name: %s not found for delete' %
390 subnet_name)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500391
392 def _clear_isolated_network(self, network_id, network_name):
393 net_client = self.network_admin_client
394 try:
395 net_client.delete_network(network_id)
Masayuki Igawabfa07602015-01-20 18:47:17 +0900396 except lib_exc.NotFound:
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500397 LOG.warn('network with name: %s not found for delete' %
398 network_name)
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500399
Ala Rezmerita846eb7c2014-03-10 09:06:03 +0100400 def _cleanup_default_secgroup(self, tenant):
401 net_client = self.network_admin_client
David Kranz34e88122014-12-11 15:24:05 -0500402 resp_body = net_client.list_security_groups(tenant_id=tenant,
403 name="default")
Ala Rezmerita846eb7c2014-03-10 09:06:03 +0100404 secgroups_to_delete = resp_body['security_groups']
405 for secgroup in secgroups_to_delete:
406 try:
407 net_client.delete_security_group(secgroup['id'])
Masayuki Igawabfa07602015-01-20 18:47:17 +0900408 except lib_exc.NotFound:
Ala Rezmerita846eb7c2014-03-10 09:06:03 +0100409 LOG.warn('Security group %s, id %s not found for clean-up' %
410 (secgroup['name'], secgroup['id']))
411
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500412 def _clear_isolated_net_resources(self):
413 net_client = self.network_admin_client
Andrea Frittoli (andreaf)9540dfd2015-03-25 17:06:50 -0400414 for cred in self.isolated_creds:
415 creds = self.isolated_creds.get(cred)
416 if (not creds or not any([creds.router, creds.network,
417 creds.subnet])):
418 continue
Salvatore Orlandocf996c62014-01-30 09:15:18 -0800419 LOG.debug("Clearing network: %(network)s, "
Matthew Treinishfe094ea2014-12-09 01:19:27 +0000420 "subnet: %(subnet)s, router: %(router)s",
Andrea Frittoli (andreaf)9540dfd2015-03-25 17:06:50 -0400421 {'network': creds.network, 'subnet': creds.subnet,
422 'router': creds.router})
Salvatore Orlandocf996c62014-01-30 09:15:18 -0800423 if (not self.network_resources or
Andrea Frittoli (andreaf)9540dfd2015-03-25 17:06:50 -0400424 (self.network_resources.get('router') and creds.subnet)):
Matthew Treinish9f756a02014-01-15 10:26:07 -0500425 try:
Andrea Frittoliae9aca02014-09-25 11:43:11 +0100426 net_client.remove_router_interface_with_subnet_id(
Andrea Frittoli (andreaf)9540dfd2015-03-25 17:06:50 -0400427 creds.router['id'], creds.subnet['id'])
Masayuki Igawabfa07602015-01-20 18:47:17 +0900428 except lib_exc.NotFound:
Matthew Treinish9f756a02014-01-15 10:26:07 -0500429 LOG.warn('router with name: %s not found for delete' %
Andrea Frittoli (andreaf)9540dfd2015-03-25 17:06:50 -0400430 creds.router['name'])
431 self._clear_isolated_router(creds.router['id'],
432 creds.router['name'])
Salvatore Orlandocf996c62014-01-30 09:15:18 -0800433 if (not self.network_resources or
Salvatore Orlandocf996c62014-01-30 09:15:18 -0800434 self.network_resources.get('subnet')):
Andrea Frittoli (andreaf)9540dfd2015-03-25 17:06:50 -0400435 self._clear_isolated_subnet(creds.subnet['id'],
436 creds.subnet['name'])
Salvatore Orlandocf996c62014-01-30 09:15:18 -0800437 if (not self.network_resources or
438 self.network_resources.get('network')):
Andrea Frittoli (andreaf)9540dfd2015-03-25 17:06:50 -0400439 self._clear_isolated_network(creds.network['id'],
440 creds.network['name'])
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500441
Matthew Treinishb86cda92013-07-29 11:22:23 -0400442 def clear_isolated_creds(self):
443 if not self.isolated_creds:
444 return
Miguel Lavalleb8fabc52013-08-23 11:19:57 -0500445 self._clear_isolated_net_resources()
Matthew Treinishdc060d02015-04-23 14:20:26 -0400446 for creds in six.itervalues(self.isolated_creds):
Matthew Treinishb86cda92013-07-29 11:22:23 -0400447 try:
Andrea Frittolic3280152015-02-26 12:42:34 +0000448 self.creds_client.delete_user(creds.user_id)
Masayuki Igawabfa07602015-01-20 18:47:17 +0900449 except lib_exc.NotFound:
Andrea Frittolifc315902014-03-20 09:21:44 +0000450 LOG.warn("user with name: %s not found for delete" %
451 creds.username)
Matthew Treinishb86cda92013-07-29 11:22:23 -0400452 try:
Andrea Frittolic3280152015-02-26 12:42:34 +0000453 if CONF.service_available.neutron:
454 self._cleanup_default_secgroup(creds.tenant_id)
455 self.creds_client.delete_project(creds.tenant_id)
Masayuki Igawabfa07602015-01-20 18:47:17 +0900456 except lib_exc.NotFound:
Andrea Frittolifc315902014-03-20 09:21:44 +0000457 LOG.warn("tenant with name: %s not found for delete" %
458 creds.tenant_name)
ahmadfe72a402015-02-13 17:30:36 +0530459 self.isolated_creds = {}
Andrea Frittoli8283b4e2014-07-17 13:28:58 +0100460
461 def is_multi_user(self):
462 return True
Yair Fried76488d72014-10-21 10:13:19 +0300463
464 def is_multi_tenant(self):
465 return True
Matthew Treinish4a596932015-03-06 20:37:01 -0500466
467 def is_role_available(self, role):
468 return True