Adds project and user api endpoints
Adds project and user api endpoints Closes Bug: 1606649 Closes Bug: 1610890 Change-Id: I89c19c69009f1b71ce737d2dfc5d1322e6a6b06f
This commit is contained in:
@@ -185,3 +185,57 @@ def hosts_data_update(context, host_id, data):
|
||||
def hosts_data_delete(context, host_id, data_key):
|
||||
"""Delete the existing key (variable) from region data."""
|
||||
return IMPL.hosts_data_delete(context, host_id, data_key)
|
||||
|
||||
|
||||
# Projects
|
||||
|
||||
def projects_get_all(context):
|
||||
"""Get all the projects."""
|
||||
return IMPL.projects_get_all(context)
|
||||
|
||||
|
||||
def projects_get_by_name(context, project_name):
|
||||
"""Get all projects that match the given name."""
|
||||
return IMPL.projects_get_by_name(context, project_name)
|
||||
|
||||
|
||||
def projects_get_by_id(context, project_id):
|
||||
"""Get project by its id."""
|
||||
return IMPL.projects_get_by_id(context, project_id)
|
||||
|
||||
|
||||
def projects_create(context, values):
|
||||
"""Create a new project with given values."""
|
||||
return IMPL.projects_create(context, values)
|
||||
|
||||
|
||||
def projects_delete(context, project_id):
|
||||
"""Delete an existing project given by its id."""
|
||||
return IMPL.projects_delete(context, project_id)
|
||||
|
||||
|
||||
# Users
|
||||
|
||||
def users_get_all(context):
|
||||
"""Get all the users."""
|
||||
return IMPL.users_get_all(context)
|
||||
|
||||
|
||||
def users_get_by_name(context, user_name):
|
||||
"""Get all users that match the given username."""
|
||||
return IMPL.users_get_by_name(context, user_name)
|
||||
|
||||
|
||||
def users_get_by_id(context, user_id):
|
||||
"""Get user by its id."""
|
||||
return IMPL.users_get_by_id(context, user_id)
|
||||
|
||||
|
||||
def users_create(context, values):
|
||||
"""Create a new user with given values."""
|
||||
return IMPL.users_create(context, values)
|
||||
|
||||
|
||||
def users_delete(context, user_id):
|
||||
"""Delete an existing user given by its id."""
|
||||
return IMPL.users_delete(context, user_id)
|
||||
|
||||
@@ -78,6 +78,7 @@ def upgrade():
|
||||
sa.Column('project_id', sa.Integer(), nullable=False),
|
||||
sa.Column('username', sa.String(length=255), nullable=True),
|
||||
sa.Column('api_key', sa.String(length=36), nullable=True),
|
||||
sa.Column('is_root', sa.Boolean(), nullable=True),
|
||||
sa.Column('is_admin', sa.Boolean(), nullable=True),
|
||||
sa.Column('roles', sqlalchemy_utils.types.json.JSONType(),
|
||||
nullable=True),
|
||||
|
||||
@@ -50,14 +50,21 @@ def get_backend():
|
||||
|
||||
|
||||
def is_admin_context(context):
|
||||
"""Check if this request had admin context."""
|
||||
# FIXME(sulo): fix after we have Users table
|
||||
return True
|
||||
"""Check if this request had admin project context."""
|
||||
if (context.is_admin and context.is_admin_project):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def is_project_admin_context(context):
|
||||
"""Check if this request has admin context with in the project."""
|
||||
if context.is_admin:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def require_admin_context(f):
|
||||
"""Decorator that ensures admin request context."""
|
||||
|
||||
def wrapper(*args, **kwargs):
|
||||
if not is_admin_context(args[0]):
|
||||
raise exceptions.AdminRequired()
|
||||
@@ -65,6 +72,18 @@ def require_admin_context(f):
|
||||
return wrapper
|
||||
|
||||
|
||||
def require_project_admin_context(f):
|
||||
"""Decorator that ensures admin or project_admin request context."""
|
||||
def wrapper(*args, **kwargs):
|
||||
if is_admin_context(args[0]):
|
||||
return f(*args, **kwargs)
|
||||
elif is_project_admin_context(args[0]):
|
||||
return f(*args, **kwargs)
|
||||
else:
|
||||
raise exceptions.AdminRequired()
|
||||
return wrapper
|
||||
|
||||
|
||||
def model_query(context, model, *args, **kwargs):
|
||||
"""Query helper that accounts for context's `read_deleted` field.
|
||||
:param context: context to query under
|
||||
@@ -433,3 +452,126 @@ def hosts_data_delete(context, host_id, data):
|
||||
pass
|
||||
|
||||
return host_ref
|
||||
|
||||
|
||||
@require_admin_context
|
||||
def projects_get_all(context):
|
||||
"""Get all the projects."""
|
||||
query = model_query(context, models.Project)
|
||||
try:
|
||||
return query.all()
|
||||
except sa_exc.NoResultFound:
|
||||
raise exceptions.NotFound()
|
||||
except Exception as err:
|
||||
raise exceptions.UnknownException(message=err)
|
||||
|
||||
|
||||
@require_admin_context
|
||||
def projects_get_by_name(context, project_name):
|
||||
"""Get all projects that match the given name."""
|
||||
query = model_query(context, models.Project)
|
||||
query = query.filter(models.Project.name.like(project_name))
|
||||
try:
|
||||
return query.all()
|
||||
except sa_exc.NoResultFound:
|
||||
raise exceptions.NotFound()
|
||||
except Exception as err:
|
||||
raise exceptions.UnknownException(message=err)
|
||||
|
||||
|
||||
@require_admin_context
|
||||
def projects_get_by_id(context, project_id):
|
||||
"""Get project by its id."""
|
||||
query = model_query(context, models.Project)
|
||||
query = query.filter_by(id=project_id)
|
||||
try:
|
||||
return query.one()
|
||||
except sa_exc.NoResultFound:
|
||||
raise exceptions.NotFound()
|
||||
except Exception as err:
|
||||
raise exceptions.UnknownException(message=err)
|
||||
|
||||
|
||||
@require_admin_context
|
||||
def projects_create(context, values):
|
||||
"""Create a new project with given values."""
|
||||
session = get_session()
|
||||
project = models.Project()
|
||||
with session.begin():
|
||||
project.update(values)
|
||||
project.save(session)
|
||||
return project
|
||||
|
||||
|
||||
@require_admin_context
|
||||
def projects_delete(context, project_id):
|
||||
"""Delete an existing project given by its id."""
|
||||
session = get_session()
|
||||
with session.begin():
|
||||
query = model_query(context, models.Project, session=session)
|
||||
query = query.filter_by(id=project_id)
|
||||
query.delete()
|
||||
|
||||
|
||||
@require_project_admin_context
|
||||
def users_get_all(context):
|
||||
"""Get all the users."""
|
||||
if is_admin_context(context):
|
||||
LOG.info("Getting all users as root user")
|
||||
query = model_query(context, models.User)
|
||||
else:
|
||||
LOG.info("Getting all users as project admin user")
|
||||
query = model_query(context, models.User, project_only=True)
|
||||
query = query.filter_by(project_id=context.tenant)
|
||||
|
||||
return query.all()
|
||||
|
||||
|
||||
@require_project_admin_context
|
||||
def users_get_by_name(context, user_name):
|
||||
"""Get all users that match the given username."""
|
||||
if is_admin_context(context):
|
||||
query = model_query(context, models.User)
|
||||
else:
|
||||
query = model_query(context, models.User, project_only=True)
|
||||
|
||||
query = query.filter_by(username=user_name)
|
||||
return query.all()
|
||||
|
||||
|
||||
@require_project_admin_context
|
||||
def users_get_by_id(context, user_id):
|
||||
"""Get user by its id."""
|
||||
if is_admin_context(context):
|
||||
query = model_query(context, models.User)
|
||||
else:
|
||||
query = model_query(context, models.User, project_only=True)
|
||||
|
||||
query = query.filter_by(id=user_id)
|
||||
try:
|
||||
return query.one()
|
||||
except sa_exc.NoResultFound:
|
||||
raise exceptions.NotFound()
|
||||
|
||||
|
||||
@require_project_admin_context
|
||||
def users_create(context, values):
|
||||
"""Create a new user with given values."""
|
||||
session = get_session()
|
||||
user = models.User()
|
||||
with session.begin():
|
||||
user.update(values)
|
||||
user.save(session)
|
||||
return user
|
||||
|
||||
|
||||
@require_project_admin_context
|
||||
def users_delete(context, user_id):
|
||||
"""Delete an existing user given by its id."""
|
||||
LOG.info("Deleting user with id %s" % user_id)
|
||||
session = get_session()
|
||||
with session.begin():
|
||||
query = model_query(context, models.User, session=session)
|
||||
query = query.filter_by(id=user_id)
|
||||
query.delete()
|
||||
return
|
||||
|
||||
@@ -127,6 +127,9 @@ class User(Base):
|
||||
Integer, ForeignKey('projects.id'), index=True, nullable=False)
|
||||
username = Column(String(255))
|
||||
api_key = Column(String(36))
|
||||
# root = craton admin that can create other pojects/usrs
|
||||
is_root = Column(Boolean, default=False)
|
||||
# admin = project context admin
|
||||
is_admin = Column(Boolean, default=False)
|
||||
roles = Column(JSONType)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user