Skip to content

Commit 6daa0de

Browse files
enolfcalvarolopez
authored andcommitted
fix: do not assume admin privileges on keystone
Avoid issues when running cASO with a low privileges account that cannot list all projects and scope the tokens to the projects that are to be accounted. This allows to run cASO and generate records for non-admin users. Closes #124
1 parent 41c0821 commit 6daa0de

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

caso/extract/manager.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
from caso import keystone_client
3232
from caso import loading
3333

34+
from keystoneauth1.exceptions.catalog import EmptyCatalog
35+
from keystoneauth1.exceptions.http import Forbidden
36+
3437
cli_opts = [
3538
cfg.ListOpt(
3639
"projects",
@@ -119,12 +122,20 @@ def __init__(self):
119122
def projects(self):
120123
"""Get list of configured projects."""
121124
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}")
123130
return set(projects + aux)
124131

125-
def _get_keystone_client(self):
132+
def _get_keystone_client(self, project=None, system_scope="all"):
126133
"""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+
)
128139
return client
129140

130141
def get_lastrun(self, project):
@@ -197,7 +208,16 @@ def voms_map(self):
197208

198209
def get_project_vo(self, project_id):
199210
"""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+
201221
project.get()
202222
vo = project.to_dict().get(CONF.vo_property, None)
203223
if vo is None:

caso/extract/openstack/base.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ def _get_keystone_session(self):
9292

9393
def _get_keystone_client(self):
9494
"""Get a Keystone Client for the configured project in the object."""
95-
client = keystone_client.get_client(CONF, system_scope="all")
95+
client = keystone_client.get_client(
96+
CONF, project=self.project, system_scope="all"
97+
)
9698
return client
9799

98100
def _get_cinder_client(self):

0 commit comments

Comments
 (0)