|
31 | 31 | from caso import keystone_client
|
32 | 32 | from caso import loading
|
33 | 33 |
|
| 34 | +from keystoneauth1.exceptions.catalog import EmptyCatalog |
| 35 | +from keystoneauth1.exceptions.http import Forbidden |
| 36 | + |
34 | 37 | cli_opts = [
|
35 | 38 | cfg.ListOpt(
|
36 | 39 | "projects",
|
@@ -119,12 +122,20 @@ def __init__(self):
|
119 | 122 | def projects(self):
|
120 | 123 | """Get list of configured projects."""
|
121 | 124 | projects = CONF.projects
|
122 |
| - aux = [i.id for i in self.keystone.projects.list(tags=CONF.caso_tag)] |
| 125 | + aux = [] |
| 126 | + try: |
| 127 | + aux = [i.id for i in self.keystone.projects.list(tags=CONF.caso_tag)] |
| 128 | + except Forbidden as e: |
| 129 | + LOG.warning(f"Unable to get projects from Keystone, ignoring - {e}") |
123 | 130 | return set(projects + aux)
|
124 | 131 |
|
125 |
| - def _get_keystone_client(self): |
| 132 | + def _get_keystone_client(self, project=None, system_scope="all"): |
126 | 133 | """Get a Keystone Client to get the projects that we will use."""
|
127 |
| - client = keystone_client.get_client(CONF, system_scope="all") |
| 134 | + if project: |
| 135 | + system_scope = None |
| 136 | + client = keystone_client.get_client( |
| 137 | + CONF, project=project, system_scope=system_scope |
| 138 | + ) |
128 | 139 | return client
|
129 | 140 |
|
130 | 141 | def get_lastrun(self, project):
|
@@ -197,7 +208,16 @@ def voms_map(self):
|
197 | 208 |
|
198 | 209 | def get_project_vo(self, project_id):
|
199 | 210 | """Get the VO where the project should be mapped."""
|
200 |
| - project = self.keystone.projects.get(project_id) |
| 211 | + try: |
| 212 | + project = self.keystone.projects.get(project_id) |
| 213 | + except (EmptyCatalog, Forbidden): |
| 214 | + # we may need scoping here, retrying |
| 215 | + LOG.warning( |
| 216 | + f"Scoping the keystone client to the current project {project_id}" |
| 217 | + ) |
| 218 | + self.keystone = self._get_keystone_client(project_id) |
| 219 | + project = self.keystone.projects.get(project_id) |
| 220 | + |
201 | 221 | project.get()
|
202 | 222 | vo = project.to_dict().get(CONF.vo_property, None)
|
203 | 223 | if vo is None:
|
|
0 commit comments