Source code for hammers.osrest.keystone
"""
Keystone API shims. Requires v3 API. See `Keystone HTTP API
<https://developer.openstack.org/api-ref/identity/v3/>`_
"""
from requests import HTTPError
from hammers.osrest.base import BaseAPI
API = BaseAPI('identity')
[docs]def project(auth, id):
"""Retrieve project by ID"""
response = API.get(auth, '/projects/{}'.format(id))
return response.json()['project']
[docs]def projects(auth, **params):
"""
Retrieve multiple projects, optionally filtered by `params`. Keyed by ID.
Example params: ``name``, ``enabled``, or stuff from
https://developer.openstack.org/api-ref/identity/v3/?expanded=list-projects-detail#list-projects
"""
response = API.get(auth, '/projects'.format(id), params=params)
return {p['id']: p for p in response.json()['projects']}
[docs]def project_lookup(auth, name_or_id):
"""Tries to find a single project by name or ID. Raises an error if
none or multiple projects found."""
try:
return keystone_project(auth, name_or_id)
except HTTPError:
# failed lookup assuming it was an id, must be a name?
pass
projects = keystone_projects(auth, name=name_or_id)
if len(projects) < 1:
raise RuntimeError('no projects found')
elif len(projects) > 1:
raise RuntimeError('multiple projects matched provided name')
id, project = projects.popitem()
return project
[docs]def user(auth, id):
"""Retrieve information about a user by ID"""
response = API.get(auth, '/v3/users/{}'.format(id))
return response.json()['user']
[docs]def users(auth, enabled=None, name=None):
"""Retrieve multiple users, optionally filtered."""
params = {}
if name is not None:
params['name'] = name
if enabled is not None:
params['enabled'] = enabled
response = API.get(auth, '/v3/users', params=params)
return {u['id']: u for u in response.json()['users']}
[docs]def user_lookup(auth, name_or_id):
"""Tries to find a single user by name or ID. Raises an error if none
or multiple users are found."""
try:
return keystone_user(auth, name_or_id)
except HTTPError:
# failed lookup assuming it was an id, must be a name?
pass
users = keystone_users(auth, name=name_or_id)
if len(users) < 1:
raise RuntimeError('no users found')
elif len(users) > 1:
raise RuntimeError('multiple users matched provided name')
id, user = users.popitem()
return user
__all__ = [
'keystone_project',
'keystone_projects',
'keystone_project_lookup',
'keystone_user',
'keystone_users',
'keystone_user_lookup',
]
keystone_project = project
keystone_projects = projects
keystone_project_lookup = project_lookup
keystone_user = user
keystone_users = users
keystone_user_lookup = user_lookup