# -*- coding: utf-8 -*-

# Copyright 2018 Whitestack, LLC
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# For those usages not covered by the Apache License, Version 2.0 please
# contact: esousa@whitestack.com or glavado@whitestack.com
##

"""
AuthconnKeystone implements implements the connector for
Openstack Keystone and leverages the RBAC model, to bring
it for OSM.
"""


__author__ = (
    "Eduardo Sousa <esousa@whitestack.com>, "
    "Pedro de la Cruz Ramos <pdelacruzramos@altran.com>"
)
__date__ = "$27-jul-2018 23:59:59$"

from osm_nbi.authconn import (
    Authconn,
    AuthException,
    AuthconnOperationException,
    AuthconnNotFoundException,
    AuthconnConflictException,
)

import logging
import requests
import time
from keystoneauth1 import session
from keystoneauth1.identity import v3
from keystoneauth1.exceptions.base import ClientException
from keystoneauth1.exceptions.http import Conflict
from keystoneclient.v3 import client
from http import HTTPStatus
from osm_nbi.validation import is_valid_uuid, validate_input, http_schema


class AuthconnKeystone(Authconn):
    def __init__(self, config, db, role_permissions):
        Authconn.__init__(self, config, db, role_permissions)

        self.logger = logging.getLogger("nbi.authenticator.keystone")
        self.domains_id2name = {}
        self.domains_name2id = {}

        self.auth_url = config.get("auth_url")
        if config.get("auth_url"):
            validate_input(self.auth_url, http_schema)
        else:
            self.auth_url = "http://{0}:{1}/v3".format(
                config.get("auth_host", "keystone"), config.get("auth_port", "5000")
            )
        self.user_domain_name_list = config.get("user_domain_name", "default")
        self.user_domain_name_list = self.user_domain_name_list.split(",")
        # read only domain list
        self.user_domain_ro_list = [
            x[:-3] for x in self.user_domain_name_list if x.endswith(":ro")
        ]
        # remove the ":ro"
        self.user_domain_name_list = [
            x if not x.endswith(":ro") else x[:-3] for x in self.user_domain_name_list
        ]

        self.admin_project = config.get("service_project", "service")
        self.admin_username = config.get("service_username", "nbi")
        self.admin_password = config.get("service_password", "nbi")
        self.project_domain_name_list = config.get("project_domain_name", "default")
        self.project_domain_name_list = self.project_domain_name_list.split(",")
        if len(self.user_domain_name_list) != len(self.project_domain_name_list):
            raise ValueError(
                "Invalid configuration parameter fo authenticate. 'project_domain_name' and "
                "'user_domain_name' must be a comma-separated list with the same size. Revise "
                "configuration or/and 'OSMNBI_AUTHENTICATION_PROJECT_DOMAIN_NAME', "
                "'OSMNBI_AUTHENTICATION_USER_DOMAIN_NAME'  Variables"
            )

        # Waiting for Keystone to be up
        available = None
        counter = 300
        while available is None:
            time.sleep(1)
            try:
                result = requests.get(self.auth_url)
                available = True if result.status_code == 200 else None
            except Exception:
                counter -= 1
                if counter == 0:
                    raise AuthException("Keystone not available after 300s timeout")

        self.auth = v3.Password(
            user_domain_name=self.user_domain_name_list[0],
            username=self.admin_username,
            password=self.admin_password,
            project_domain_name=self.project_domain_name_list[0],
            project_name=self.admin_project,
            auth_url=self.auth_url,
        )
        self.sess = session.Session(auth=self.auth)
        self.keystone = client.Client(
            session=self.sess, endpoint_override=self.auth_url
        )

    def authenticate(self, credentials, token_info=None):
        """
        Authenticate a user using username/password or token_info, plus project
        :param credentials: dictionary that contains:
            username: name, id or None
            password: password or None
            project_id: name, id, or None. If None first found project will be used to get an scope token
            project_domain_name: (Optional) To use a concrete domain for the project
            user_domain_name: (Optional) To use a concrete domain for the project
            other items are allowed and ignored
        :param token_info: previous token_info to obtain authorization
        :return: the scoped token info or raises an exception. The token is a dictionary with:
            _id:  token string id,
            username: username,
            project_id: scoped_token project_id,
            project_name: scoped_token project_name,
            expires: epoch time when it expires,

        """
        username = None
        user_id = None
        project_id = None
        project_name = None
        if credentials.get("project_domain_name"):
            project_domain_name_list = (credentials["project_domain_name"],)
        else:
            project_domain_name_list = self.project_domain_name_list
        if credentials.get("user_domain_name"):
            user_domain_name_list = (credentials["user_domain_name"],)
        else:
            user_domain_name_list = self.user_domain_name_list

        for index, project_domain_name in enumerate(project_domain_name_list):
            user_domain_name = user_domain_name_list[index]
            try:
                if credentials.get("username"):
                    if is_valid_uuid(credentials["username"]):
                        user_id = credentials["username"]
                    else:
                        username = credentials["username"]

                    # get an unscoped token firstly
                    unscoped_token = self.keystone.get_raw_token_from_identity_service(
                        auth_url=self.auth_url,
                        user_id=user_id,
                        username=username,
                        password=credentials.get("password"),
                        user_domain_name=user_domain_name,
                        project_domain_name=project_domain_name,
                    )
                elif token_info:
                    unscoped_token = self.keystone.tokens.validate(
                        token=token_info.get("_id")
                    )
                else:
                    raise AuthException(
                        "Provide credentials: username/password or Authorization Bearer token",
                        http_code=HTTPStatus.UNAUTHORIZED,
                    )

                if not credentials.get("project_id"):
                    # get first project for the user
                    project_list = self.keystone.projects.list(
                        user=unscoped_token["user"]["id"]
                    )
                    if not project_list:
                        raise AuthException(
                            "The user {} has not any project and cannot be used for authentication".format(
                                credentials.get("username")
                            ),
                            http_code=HTTPStatus.UNAUTHORIZED,
                        )
                    project_id = project_list[0].id
                else:
                    if is_valid_uuid(credentials["project_id"]):
                        project_id = credentials["project_id"]
                    else:
                        project_name = credentials["project_id"]

                scoped_token = self.keystone.get_raw_token_from_identity_service(
                    auth_url=self.auth_url,
                    project_name=project_name,
                    project_id=project_id,
                    user_domain_name=user_domain_name,
                    project_domain_name=project_domain_name,
                    token=unscoped_token["auth_token"],
                )

                auth_token = {
                    "_id": scoped_token.auth_token,
                    "id": scoped_token.auth_token,
                    "user_id": scoped_token.user_id,
                    "username": scoped_token.username,
                    "project_id": scoped_token.project_id,
                    "project_name": scoped_token.project_name,
                    "project_domain_name": scoped_token.project_domain_name,
                    "user_domain_name": scoped_token.user_domain_name,
                    "expires": scoped_token.expires.timestamp(),
                    "issued_at": scoped_token.issued.timestamp(),
                }

                return auth_token
            except ClientException as e:
                if (
                    index >= len(user_domain_name_list) - 1
                    or index >= len(project_domain_name_list) - 1
                ):
                    # if last try, launch exception
                    # self.logger.exception("Error during user authentication using keystone: {}".format(e))
                    raise AuthException(
                        "Error during user authentication using Keystone: {}".format(e),
                        http_code=HTTPStatus.UNAUTHORIZED,
                    )

    def validate_token(self, token):
        """
        Check if the token is valid.

        :param token: token id to be validated
        :return: dictionary with information associated with the token:
             "expires":
             "_id": token_id,
             "project_id": project_id,
             "username": ,
             "roles": list with dict containing {name, id}
         If the token is not valid an exception is raised.
        """
        if not token:
            return

        try:
            token_info = self.keystone.tokens.validate(token=token)
            ses = {
                "_id": token_info["auth_token"],
                "id": token_info["auth_token"],
                "project_id": token_info["project"]["id"],
                "project_name": token_info["project"]["name"],
                "user_id": token_info["user"]["id"],
                "username": token_info["user"]["name"],
                "roles": token_info["roles"],
                "expires": token_info.expires.timestamp(),
                "issued_at": token_info.issued.timestamp(),
            }

            return ses
        except ClientException as e:
            # self.logger.exception("Error during token validation using keystone: {}".format(e))
            raise AuthException(
                "Error during token validation using Keystone: {}".format(e),
                http_code=HTTPStatus.UNAUTHORIZED,
            )

    def revoke_token(self, token):
        """
        Invalidate a token.

        :param token: token to be revoked
        """
        try:
            self.logger.info("Revoking token: " + token)
            self.keystone.tokens.revoke_token(token=token)

            return True
        except ClientException as e:
            # self.logger.exception("Error during token revocation using keystone: {}".format(e))
            raise AuthException(
                "Error during token revocation using Keystone: {}".format(e),
                http_code=HTTPStatus.UNAUTHORIZED,
            )

    def _get_domain_id(self, domain_name, fail_if_not_found=True):
        """
        Get the domain id from  the domain_name
        :param domain_name: Can be the name or id
        :param fail_if_not_found: If False it returns None instead of raising an exception if not found
        :return: str or None/exception if domain is not found
        """
        domain_id = self.domains_name2id.get(domain_name)
        if not domain_id:
            self._get_domains()
            domain_id = self.domains_name2id.get(domain_name)
        if not domain_id and domain_name in self.domains_id2name:
            # domain_name is already an id
            return domain_name
        if not domain_id and fail_if_not_found:
            raise AuthconnNotFoundException(
                "Domain {} cannot be found".format(domain_name)
            )
        return domain_id

    def _get_domains(self):
        """
        Obtain a dictionary with domain_id to domain_name, stored at self.domains_id2name
        and from domain_name to domain_id, sored at self.domains_name2id
        :return: None. Exceptions are ignored
        """
        try:
            domains = self.keystone.domains.list()
            self.domains_id2name = {x.id: x.name for x in domains}
            self.domains_name2id = {x.name: x.id for x in domains}
        except Exception:
            pass

    def create_user(self, user_info):
        """
        Create a user.

        :param user_info: full user info.
        :raises AuthconnOperationException: if user creation failed.
        :return: returns the id of the user in keystone.
        """
        try:

            if (
                user_info.get("domain_name")
                and user_info["domain_name"] in self.user_domain_ro_list
            ):
                raise AuthconnConflictException(
                    "Cannot create a user in the read only domain {}".format(
                        user_info["domain_name"]
                    )
                )

            new_user = self.keystone.users.create(
                user_info["username"],
                password=user_info["password"],
                domain=self._get_domain_id(
                    user_info.get("domain_name", self.user_domain_name_list[0])
                ),
                _admin=user_info["_admin"],
            )
            if "project_role_mappings" in user_info.keys():
                for mapping in user_info["project_role_mappings"]:
                    self.assign_role_to_user(
                        new_user, mapping["project"], mapping["role"]
                    )
            return {"username": new_user.name, "_id": new_user.id}
        except Conflict as e:
            # self.logger.exception("Error during user creation using keystone: {}".format(e))
            raise AuthconnOperationException(e, http_code=HTTPStatus.CONFLICT)
        except ClientException as e:
            # self.logger.exception("Error during user creation using keystone: {}".format(e))
            raise AuthconnOperationException(
                "Error during user creation using Keystone: {}".format(e)
            )

    def update_user(self, user_info):
        """
        Change the user name and/or password.

        :param user_info: user info modifications
        :raises AuthconnOperationException: if change failed.
        """
        try:
            user = user_info.get("_id") or user_info.get("username")
            try:
                user_obj = self.keystone.users.get(user)
            except Exception:
                user_obj = None
            if not user_obj:
                for user_domain in self.user_domain_name_list:
                    domain_id = self._get_domain_id(
                        user_domain, fail_if_not_found=False
                    )
                    if not domain_id:
                        continue
                    user_obj_list = self.keystone.users.list(
                        name=user, domain=domain_id
                    )
                    if user_obj_list:
                        user_obj = user_obj_list[0]
                        break
                else:  # user not found
                    raise AuthconnNotFoundException("User '{}' not found".format(user))

            user_id = user_obj.id
            domain_id = user_obj.domain_id
            domain_name = self.domains_id2name.get(domain_id)

            if domain_name in self.user_domain_ro_list:
                if user_info.get("password") or user_info.get("username"):
                    raise AuthconnConflictException(
                        "Cannot update the user {} belonging to a read only domain {}".format(
                            user, domain_name
                        )
                    )

            elif (
                user_info.get("password")
                or user_info.get("username")
                or user_info.get("add_project_role_mappings")
                or user_info.get("remove_project_role_mappings")
            ):
                # if user_index>0, it is an external domain, that should not be updated
                ctime = (
                    user_obj._admin.get("created", 0)
                    if hasattr(user_obj, "_admin")
                    else 0
                )
                try:
                    self.keystone.users.update(
                        user_id,
                        password=user_info.get("password"),
                        name=user_info.get("username"),
                        _admin={"created": ctime, "modified": time.time()},
                    )
                except Exception as e:
                    if user_info.get("username") or user_info.get("password"):
                        raise AuthconnOperationException(
                            "Error during username/password change: {}".format(str(e))
                        )
                    self.logger.error(
                        "Error during updating user profile: {}".format(str(e))
                    )

            for mapping in user_info.get("remove_project_role_mappings", []):
                self.remove_role_from_user(
                    user_obj, mapping["project"], mapping["role"]
                )
            for mapping in user_info.get("add_project_role_mappings", []):
                self.assign_role_to_user(user_obj, mapping["project"], mapping["role"])
        except ClientException as e:
            # self.logger.exception("Error during user password/name update using keystone: {}".format(e))
            raise AuthconnOperationException(
                "Error during user update using Keystone: {}".format(e)
            )

    def delete_user(self, user_id):
        """
        Delete user.

        :param user_id: user identifier.
        :raises AuthconnOperationException: if user deletion failed.
        """
        try:
            user_obj = self.keystone.users.get(user_id)
            domain_id = user_obj.domain_id
            domain_name = self.domains_id2name.get(domain_id)
            if domain_name in self.user_domain_ro_list:
                raise AuthconnConflictException(
                    "Cannot delete user {} belonging to a read only domain {}".format(
                        user_id, domain_name
                    )
                )

            result, detail = self.keystone.users.delete(user_id)
            if result.status_code != 204:
                raise ClientException("error {} {}".format(result.status_code, detail))
            return True
        except ClientException as e:
            # self.logger.exception("Error during user deletion using keystone: {}".format(e))
            raise AuthconnOperationException(
                "Error during user deletion using Keystone: {}".format(e)
            )

    def get_user_list(self, filter_q=None):
        """
        Get user list.

        :param filter_q: dictionary to filter user list by one or several
            _id:
            name (username is also admitted).  If a user id is equal to the filter name, it is also provided
            domain_id, domain_name
        :return: returns a list of users.
        """
        try:
            self._get_domains()
            filter_name = filter_domain = None
            if filter_q:
                filter_name = filter_q.get("name") or filter_q.get("username")
                if filter_q.get("domain_name"):
                    filter_domain = self._get_domain_id(
                        filter_q["domain_name"], fail_if_not_found=False
                    )
                    # If domain is not found, use the same name to obtain an empty list
                    filter_domain = filter_domain or filter_q["domain_name"]
                if filter_q.get("domain_id"):
                    filter_domain = filter_q["domain_id"]

            users = self.keystone.users.list(name=filter_name, domain=filter_domain)
            # get users from user_domain_name_list[1:], because it will not be provided in case of LDAP
            if filter_domain is None and len(self.user_domain_name_list) > 1:
                for user_domain in self.user_domain_name_list[1:]:
                    domain_id = self._get_domain_id(
                        user_domain, fail_if_not_found=False
                    )
                    if not domain_id:
                        continue
                    # find if users of this domain are already provided. In this case ignore
                    for u in users:
                        if u.domain_id == domain_id:
                            break
                    else:
                        users += self.keystone.users.list(
                            name=filter_name, domain=domain_id
                        )

            # if filter name matches a user id, provide it also
            if filter_name:
                try:
                    user_obj = self.keystone.users.get(filter_name)
                    if user_obj not in users:
                        users.append(user_obj)
                except Exception:
                    pass

            users = [
                {
                    "username": user.name,
                    "_id": user.id,
                    "id": user.id,
                    "_admin": user.to_dict().get("_admin", {}),  # TODO: REVISE
                    "domain_name": self.domains_id2name.get(user.domain_id),
                }
                for user in users
                if user.name != self.admin_username
            ]

            if filter_q and filter_q.get("_id"):
                users = [user for user in users if filter_q["_id"] == user["_id"]]

            for user in users:
                user["project_role_mappings"] = []
                user["projects"] = []
                projects = self.keystone.projects.list(user=user["_id"])
                for project in projects:
                    user["projects"].append(project.name)

                    roles = self.keystone.roles.list(
                        user=user["_id"], project=project.id
                    )
                    for role in roles:
                        prm = {
                            "project": project.id,
                            "project_name": project.name,
                            "role_name": role.name,
                            "role": role.id,
                        }
                        user["project_role_mappings"].append(prm)

            return users
        except ClientException as e:
            # self.logger.exception("Error during user listing using keystone: {}".format(e))
            raise AuthconnOperationException(
                "Error during user listing using Keystone: {}".format(e)
            )

    def get_role_list(self, filter_q=None):
        """
        Get role list.

        :param filter_q: dictionary to filter role list by _id and/or name.
        :return: returns the list of roles.
        """
        try:
            filter_name = None
            if filter_q:
                filter_name = filter_q.get("name")
            roles_list = self.keystone.roles.list(name=filter_name)

            roles = [
                {
                    "name": role.name,
                    "_id": role.id,
                    "_admin": role.to_dict().get("_admin", {}),
                    "permissions": role.to_dict().get("permissions", {}),
                }
                for role in roles_list
                if role.name != "service"
            ]

            if filter_q and filter_q.get("_id"):
                roles = [role for role in roles if filter_q["_id"] == role["_id"]]

            return roles
        except ClientException as e:
            # self.logger.exception("Error during user role listing using keystone: {}".format(e))
            raise AuthException(
                "Error during user role listing using Keystone: {}".format(e),
                http_code=HTTPStatus.UNAUTHORIZED,
            )

    def create_role(self, role_info):
        """
        Create a role.

        :param role_info: full role info.
        :raises AuthconnOperationException: if role creation failed.
        """
        try:
            result = self.keystone.roles.create(
                role_info["name"],
                permissions=role_info.get("permissions"),
                _admin=role_info.get("_admin"),
            )
            return result.id
        except Conflict as ex:
            raise AuthconnConflictException(str(ex))
        except ClientException as e:
            # self.logger.exception("Error during role creation using keystone: {}".format(e))
            raise AuthconnOperationException(
                "Error during role creation using Keystone: {}".format(e)
            )

    def delete_role(self, role_id):
        """
        Delete a role.

        :param role_id: role identifier.
        :raises AuthconnOperationException: if role deletion failed.
        """
        try:
            result, detail = self.keystone.roles.delete(role_id)

            if result.status_code != 204:
                raise ClientException("error {} {}".format(result.status_code, detail))

            return True
        except ClientException as e:
            # self.logger.exception("Error during role deletion using keystone: {}".format(e))
            raise AuthconnOperationException(
                "Error during role deletion using Keystone: {}".format(e)
            )

    def update_role(self, role_info):
        """
        Change the name of a role
        :param role_info: full role info
        :return: None
        """
        try:
            rid = role_info["_id"]
            if not is_valid_uuid(rid):  # Is this required?
                role_obj_list = self.keystone.roles.list(name=rid)
                if not role_obj_list:
                    raise AuthconnNotFoundException("Role '{}' not found".format(rid))
                rid = role_obj_list[0].id
            self.keystone.roles.update(
                rid,
                name=role_info["name"],
                permissions=role_info.get("permissions"),
                _admin=role_info.get("_admin"),
            )
        except ClientException as e:
            # self.logger.exception("Error during role update using keystone: {}".format(e))
            raise AuthconnOperationException(
                "Error during role updating using Keystone: {}".format(e)
            )

    def get_project_list(self, filter_q=None):
        """
        Get all the projects.

        :param filter_q: dictionary to filter project list.
        :return: list of projects
        """
        try:
            self._get_domains()
            filter_name = filter_domain = None
            if filter_q:
                filter_name = filter_q.get("name")
                if filter_q.get("domain_name"):
                    filter_domain = self.domains_name2id.get(filter_q["domain_name"])
                if filter_q.get("domain_id"):
                    filter_domain = filter_q["domain_id"]

            projects = self.keystone.projects.list(
                name=filter_name, domain=filter_domain
            )

            projects = [
                {
                    "name": project.name,
                    "_id": project.id,
                    "_admin": project.to_dict().get("_admin", {}),  # TODO: REVISE
                    "quotas": project.to_dict().get("quotas", {}),  # TODO: REVISE
                    "domain_name": self.domains_id2name.get(project.domain_id),
                }
                for project in projects
            ]

            if filter_q and filter_q.get("_id"):
                projects = [
                    project for project in projects if filter_q["_id"] == project["_id"]
                ]

            return projects
        except ClientException as e:
            # self.logger.exception("Error during user project listing using keystone: {}".format(e))
            raise AuthException(
                "Error during user project listing using Keystone: {}".format(e),
                http_code=HTTPStatus.UNAUTHORIZED,
            )

    def create_project(self, project_info):
        """
        Create a project.

        :param project_info: full project info.
        :return: the internal id of the created project
        :raises AuthconnOperationException: if project creation failed.
        """
        try:
            result = self.keystone.projects.create(
                project_info["name"],
                domain=self._get_domain_id(
                    project_info.get("domain_name", self.project_domain_name_list[0])
                ),
                _admin=project_info["_admin"],
                quotas=project_info.get("quotas", {}),
            )
            return result.id
        except ClientException as e:
            # self.logger.exception("Error during project creation using keystone: {}".format(e))
            raise AuthconnOperationException(
                "Error during project creation using Keystone: {}".format(e)
            )

    def delete_project(self, project_id):
        """
        Delete a project.

        :param project_id: project identifier.
        :raises AuthconnOperationException: if project deletion failed.
        """
        try:
            # projects = self.keystone.projects.list()
            # project_obj = [project for project in projects if project.id == project_id][0]
            # result, _ = self.keystone.projects.delete(project_obj)

            result, detail = self.keystone.projects.delete(project_id)
            if result.status_code != 204:
                raise ClientException("error {} {}".format(result.status_code, detail))

            return True
        except ClientException as e:
            # self.logger.exception("Error during project deletion using keystone: {}".format(e))
            raise AuthconnOperationException(
                "Error during project deletion using Keystone: {}".format(e)
            )

    def update_project(self, project_id, project_info):
        """
        Change the name of a project
        :param project_id: project to be changed
        :param project_info: full project info
        :return: None
        """
        try:
            self.keystone.projects.update(
                project_id,
                name=project_info["name"],
                _admin=project_info["_admin"],
                quotas=project_info.get("quotas", {}),
            )
        except ClientException as e:
            # self.logger.exception("Error during project update using keystone: {}".format(e))
            raise AuthconnOperationException(
                "Error during project update using Keystone: {}".format(e)
            )

    def assign_role_to_user(self, user_obj, project, role):
        """
        Assigning a role to a user in a project.

        :param user_obj: user object, obtained with keystone.users.get or list.
        :param project: project name.
        :param role: role name.
        :raises AuthconnOperationException: if role assignment failed.
        """
        try:
            try:
                project_obj = self.keystone.projects.get(project)
            except Exception:
                project_obj_list = self.keystone.projects.list(name=project)
                if not project_obj_list:
                    raise AuthconnNotFoundException(
                        "Project '{}' not found".format(project)
                    )
                project_obj = project_obj_list[0]

            try:
                role_obj = self.keystone.roles.get(role)
            except Exception:
                role_obj_list = self.keystone.roles.list(name=role)
                if not role_obj_list:
                    raise AuthconnNotFoundException("Role '{}' not found".format(role))
                role_obj = role_obj_list[0]

            self.keystone.roles.grant(role_obj, user=user_obj, project=project_obj)
        except ClientException as e:
            # self.logger.exception("Error during user role assignment using keystone: {}".format(e))
            raise AuthconnOperationException(
                "Error during role '{}' assignment to user '{}' and project '{}' using "
                "Keystone: {}".format(role, user_obj.name, project, e)
            )

    def remove_role_from_user(self, user_obj, project, role):
        """
        Remove a role from a user in a project.

        :param user_obj: user object, obtained with keystone.users.get or list.
        :param project: project name or id.
        :param role: role name or id.

        :raises AuthconnOperationException: if role assignment revocation failed.
        """
        try:
            try:
                project_obj = self.keystone.projects.get(project)
            except Exception:
                project_obj_list = self.keystone.projects.list(name=project)
                if not project_obj_list:
                    raise AuthconnNotFoundException(
                        "Project '{}' not found".format(project)
                    )
                project_obj = project_obj_list[0]

            try:
                role_obj = self.keystone.roles.get(role)
            except Exception:
                role_obj_list = self.keystone.roles.list(name=role)
                if not role_obj_list:
                    raise AuthconnNotFoundException("Role '{}' not found".format(role))
                role_obj = role_obj_list[0]

            self.keystone.roles.revoke(role_obj, user=user_obj, project=project_obj)
        except ClientException as e:
            # self.logger.exception("Error during user role revocation using keystone: {}".format(e))
            raise AuthconnOperationException(
                "Error during role '{}' revocation to user '{}' and project '{}' using "
                "Keystone: {}".format(role, user_obj.name, project, e)
            )
