|
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