Added support for update group
Change-Id: Ib43895a0e46c340caddb124f78499f110a19d04f
This commit is contained in:
parent
0eb5de0fca
commit
7ad8645fc9
@ -91,21 +91,26 @@ class GroupController(rest.RestController):
|
|||||||
|
|
||||||
@wsexpose(GroupResultWrapper, str, body=Group, rest_content_types='json',
|
@wsexpose(GroupResultWrapper, str, body=Group, rest_content_types='json',
|
||||||
status_code=200)
|
status_code=200)
|
||||||
def put(self, group_id, group):
|
def put(self, group_uuid, group):
|
||||||
LOG.info("GroupController - UpdateGroup: " + str(group))
|
LOG.info("GroupController - UpdateGroup: " + str(group))
|
||||||
authentication.authorize(request, 'groups:update')
|
authentication.authorize(request, 'groups:update')
|
||||||
try:
|
try:
|
||||||
group_logic = GroupLogic()
|
group_logic = GroupLogic()
|
||||||
result = group_logic.update_group(group,
|
result = group_logic.update_group(group,
|
||||||
group_id,
|
group_uuid,
|
||||||
request.transaction_id)
|
request.transaction_id)
|
||||||
response.status = 200
|
response.status = 200
|
||||||
LOG.info(
|
LOG.info(
|
||||||
"GroupController - UpdateGroup finished well: " + str(group))
|
"GroupController - UpdateGroup finished well: " + str(group))
|
||||||
|
|
||||||
|
event_details = 'Group {} {} updated in regions: {}, ' \
|
||||||
|
'with users: {}'.format(group_uuid,
|
||||||
|
group.name,
|
||||||
|
[r.name for r in group.regions],
|
||||||
|
[u.id for u in group.users])
|
||||||
utils.audit_trail('update group', request.transaction_id,
|
utils.audit_trail('update group', request.transaction_id,
|
||||||
request.headers, group_id,
|
request.headers, group_uuid,
|
||||||
event_details='')
|
event_details=event_details)
|
||||||
|
|
||||||
except ErrorStatus as exception:
|
except ErrorStatus as exception:
|
||||||
LOG.log_exception("Failed in UpdateGroup", exception)
|
LOG.log_exception("Failed in UpdateGroup", exception)
|
||||||
@ -154,18 +159,18 @@ class GroupController(rest.RestController):
|
|||||||
error_details=exception.message)
|
error_details=exception.message)
|
||||||
|
|
||||||
@wsexpose(None, str, rest_content_types='json', status_code=204)
|
@wsexpose(None, str, rest_content_types='json', status_code=204)
|
||||||
def delete(self, group_id):
|
def delete(self, group_uuid):
|
||||||
authentication.authorize(request, 'groups:delete')
|
authentication.authorize(request, 'groups:delete')
|
||||||
group_logic = GroupLogic()
|
group_logic = GroupLogic()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
LOG.info("GroupController - DeleteGroup: uuid is " + group_id)
|
LOG.info("GroupController - DeleteGroup: uuid is " + group_uuid)
|
||||||
group_logic.delete_group_by_uuid(group_id)
|
group_logic.delete_group_by_uuid(group_uuid)
|
||||||
LOG.info("GroupController - DeleteGroup finished well")
|
LOG.info("GroupController - DeleteGroup finished well")
|
||||||
|
|
||||||
event_details = 'Group {} deleted'.format(group_id)
|
event_details = 'Group {} deleted'.format(group_uuid)
|
||||||
utils.audit_trail('delete group', request.transaction_id,
|
utils.audit_trail('delete group', request.transaction_id,
|
||||||
request.headers, group_id,
|
request.headers, group_uuid,
|
||||||
event_details=event_details)
|
event_details=event_details)
|
||||||
|
|
||||||
except ErrorStatus as exception:
|
except ErrorStatus as exception:
|
||||||
|
@ -125,8 +125,35 @@ class Groups(Base, CMSBaseModel):
|
|||||||
regions = [group_region.to_wsme() for group_region in
|
regions = [group_region.to_wsme() for group_region in
|
||||||
self.group_regions if group_region.region_id != -1]
|
self.group_regions if group_region.region_id != -1]
|
||||||
|
|
||||||
roles = [group_role.get_role_name() for group_role in
|
# Create a dict using customer uuid as key
|
||||||
self.groups_roles]
|
unique_customer_roles = {}
|
||||||
|
for customer in self.groups_customer_roles:
|
||||||
|
if customer.customer.uuid in unique_customer_roles:
|
||||||
|
unique_customer_roles[customer.customer.uuid].append(
|
||||||
|
customer.groups_role.role.name)
|
||||||
|
else:
|
||||||
|
unique_customer_roles[customer.customer.uuid] = [
|
||||||
|
customer.groups_role.role.name]
|
||||||
|
|
||||||
|
# Create a dict using domain name key
|
||||||
|
unique_domain_roles = {}
|
||||||
|
for domain in self.groups_domain_roles:
|
||||||
|
if domain.domain_name in unique_domain_roles:
|
||||||
|
unique_domain_roles[domain.domain_name].append(
|
||||||
|
domain.groups_role.role.name)
|
||||||
|
else:
|
||||||
|
unique_domain_roles[domain.domain_name] = [
|
||||||
|
domain.groups_role.role.name]
|
||||||
|
|
||||||
|
# Set up output using customer and domain dict
|
||||||
|
roles = []
|
||||||
|
for customer_uuid, customer_roles in unique_customer_roles.items():
|
||||||
|
roles.append(
|
||||||
|
GroupWsmeModels.RoleAssignment(roles=customer_roles,
|
||||||
|
customer=customer_uuid))
|
||||||
|
for domain_name, domain_roles in unique_domain_roles.items():
|
||||||
|
roles.append(GroupWsmeModels.RoleAssignment(roles=domain_roles,
|
||||||
|
domain=domain_name))
|
||||||
|
|
||||||
users = []
|
users = []
|
||||||
unique_domain = {}
|
unique_domain = {}
|
||||||
@ -145,7 +172,7 @@ class Groups(Base, CMSBaseModel):
|
|||||||
name=name,
|
name=name,
|
||||||
uuid=uuid,
|
uuid=uuid,
|
||||||
regions=regions,
|
regions=regions,
|
||||||
roles=sorted(roles),
|
roles=roles,
|
||||||
users=users,
|
users=users,
|
||||||
enabled=enabled,
|
enabled=enabled,
|
||||||
domain=domain_name)
|
domain=domain_name)
|
||||||
@ -271,9 +298,6 @@ class GroupsRole(Base, CMSBaseModel):
|
|||||||
"group_id": self.group_id
|
"group_id": self.group_id
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_role_name(self):
|
|
||||||
return self.role.name
|
|
||||||
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
' GroupsCustomerRole is a DataObject and contains all the fields defined in
|
' GroupsCustomerRole is a DataObject and contains all the fields defined in
|
||||||
|
@ -36,18 +36,18 @@ class GroupLogic(object):
|
|||||||
raise ErrorStatus(400, "Group Name can not be blank.")
|
raise ErrorStatus(400, "Group Name can not be blank.")
|
||||||
|
|
||||||
sql_group = datamanager.add_group(group, uuid)
|
sql_group = datamanager.add_group(group, uuid)
|
||||||
|
|
||||||
sql_group_id = sql_group.uuid
|
|
||||||
datamanager.add_group_region(sql_group.uuid, -1)
|
datamanager.add_group_region(sql_group.uuid, -1)
|
||||||
|
|
||||||
# add any region along with the users assigned to it to the group
|
# add any region along with the users assigned to it to the group
|
||||||
self.add_regions_to_db(group.regions, sql_group.uuid, datamanager)
|
self.add_regions_to_db(group.regions, sql_group.uuid, datamanager)
|
||||||
|
|
||||||
# add group default users
|
# add group default users
|
||||||
self.add_default_user_db(datamanager, group.users, [], sql_group_id)
|
self.add_default_user_db(datamanager, group.users, [], sql_group.uuid)
|
||||||
# add default user(s) to all regions where group is assigned to
|
# add default user(s) to all regions where group is assigned to
|
||||||
self.add_default_users_to_regions_db(datamanager, sql_group, group.users)
|
self.add_default_users_to_regions_db(datamanager, sql_group, group.users)
|
||||||
|
|
||||||
|
self.add_roles_to_db(group.roles, sql_group.uuid, datamanager)
|
||||||
|
|
||||||
return sql_group
|
return sql_group
|
||||||
|
|
||||||
def add_region_users_to_db(self, datamanager, group_uuid, region_id):
|
def add_region_users_to_db(self, datamanager, group_uuid, region_id):
|
||||||
@ -131,6 +131,45 @@ class GroupLogic(object):
|
|||||||
datamanager.add_groups_user(group_uuid, sql_user.id,
|
datamanager.add_groups_user(group_uuid, sql_user.id,
|
||||||
region_id, domain_value)
|
region_id, domain_value)
|
||||||
|
|
||||||
|
def add_roles_to_db(self, role_assignments, group_uuid, datamanager,
|
||||||
|
region=None):
|
||||||
|
if not role_assignments:
|
||||||
|
return
|
||||||
|
|
||||||
|
[assignment.validate_model() for assignment in role_assignments]
|
||||||
|
region_record = datamanager.get_record('groups_region')
|
||||||
|
|
||||||
|
# If region is not specified, then get all the regions already
|
||||||
|
# associated with the group for role assginement; otherwise,
|
||||||
|
# just assign roles for the passed in region only.
|
||||||
|
if region is None:
|
||||||
|
groups_regions = region_record.get_regions_for_group(group_uuid)
|
||||||
|
else:
|
||||||
|
groups_regions = [region_record.get_region_by_keys(group_uuid,
|
||||||
|
region)]
|
||||||
|
for role_assignment in role_assignments:
|
||||||
|
for role in role_assignment.roles:
|
||||||
|
role_id = datamanager.get_role_id_by_name(role)
|
||||||
|
|
||||||
|
for group_region in groups_regions:
|
||||||
|
region_id = group_region.region_id
|
||||||
|
|
||||||
|
if role_assignment.domain:
|
||||||
|
datamanager.add_groups_role_on_domain(
|
||||||
|
group_uuid,
|
||||||
|
role_id,
|
||||||
|
region_id,
|
||||||
|
role_assignment.domain)
|
||||||
|
elif role_assignment.customer:
|
||||||
|
customer_id = datamanager.get_customer_id_by_uuid(
|
||||||
|
role_assignment.customer)
|
||||||
|
datamanager.add_groups_role_on_customer(
|
||||||
|
group_uuid,
|
||||||
|
role_id,
|
||||||
|
region_id,
|
||||||
|
customer_id)
|
||||||
|
datamanager.flush()
|
||||||
|
|
||||||
def assign_roles(self,
|
def assign_roles(self,
|
||||||
group_uuid,
|
group_uuid,
|
||||||
role_assignments,
|
role_assignments,
|
||||||
@ -139,43 +178,10 @@ class GroupLogic(object):
|
|||||||
|
|
||||||
datamanager = DataManager()
|
datamanager = DataManager()
|
||||||
try:
|
try:
|
||||||
[assignment.validate_model() for assignment in role_assignments]
|
self.add_roles_to_db(
|
||||||
|
role_assignments, group_uuid, datamanager, region)
|
||||||
|
|
||||||
group_record = datamanager.get_record('group')
|
group_record = datamanager.get_record('group')
|
||||||
region_record = datamanager.get_record('groups_region')
|
|
||||||
|
|
||||||
# If region is not specified, then get all the regions already
|
|
||||||
# associated with the group for role assginement; otherwise,
|
|
||||||
# just assign roles for the passed in region only.
|
|
||||||
if region is None:
|
|
||||||
groups_regions = region_record.get_regions_for_group(
|
|
||||||
group_uuid)
|
|
||||||
else:
|
|
||||||
groups_regions = [region_record.get_region_by_keys(
|
|
||||||
group_uuid, region)]
|
|
||||||
for role_assignment in role_assignments:
|
|
||||||
for role in role_assignment.roles:
|
|
||||||
role_id = datamanager.get_role_id_by_name(role)
|
|
||||||
|
|
||||||
for group_region in groups_regions:
|
|
||||||
region_id = group_region.region_id
|
|
||||||
|
|
||||||
if role_assignment.domain:
|
|
||||||
datamanager.add_groups_role_on_domain(
|
|
||||||
group_uuid,
|
|
||||||
role_id,
|
|
||||||
region_id,
|
|
||||||
role_assignment.domain)
|
|
||||||
elif role_assignment.customer:
|
|
||||||
customer_id = datamanager.get_customer_id_by_uuid(
|
|
||||||
role_assignment.customer)
|
|
||||||
datamanager.add_groups_role_on_customer(
|
|
||||||
group_uuid,
|
|
||||||
role_id,
|
|
||||||
region_id,
|
|
||||||
customer_id)
|
|
||||||
|
|
||||||
datamanager.flush()
|
|
||||||
group = group_record.read_group_by_uuid(group_uuid)
|
group = group_record.read_group_by_uuid(group_uuid)
|
||||||
group_dict = group.get_proxy_dict()
|
group_dict = group.get_proxy_dict()
|
||||||
|
|
||||||
@ -537,6 +543,26 @@ class GroupLogic(object):
|
|||||||
|
|
||||||
return group_result_wrapper
|
return group_result_wrapper
|
||||||
|
|
||||||
|
def resolve_regions_actions(self, old_regions_dict, new_regions_dict):
|
||||||
|
for region in new_regions_dict:
|
||||||
|
old_region = next(
|
||||||
|
(r for r in old_regions_dict if r["name"] == region["name"]),
|
||||||
|
None)
|
||||||
|
if old_region:
|
||||||
|
region["action"] = "modify"
|
||||||
|
else:
|
||||||
|
region["action"] = "create"
|
||||||
|
|
||||||
|
for region in old_regions_dict:
|
||||||
|
new_region = next(
|
||||||
|
(r for r in new_regions_dict if r["name"] == region["name"]),
|
||||||
|
None)
|
||||||
|
if not new_region:
|
||||||
|
region["action"] = "delete"
|
||||||
|
new_regions_dict.append(region)
|
||||||
|
|
||||||
|
return new_regions_dict
|
||||||
|
|
||||||
def update_group(self, group, group_uuid, transaction_id):
|
def update_group(self, group, group_uuid, transaction_id):
|
||||||
datamanager = DataManager()
|
datamanager = DataManager()
|
||||||
try:
|
try:
|
||||||
@ -549,24 +575,33 @@ class GroupLogic(object):
|
|||||||
if not sql_group:
|
if not sql_group:
|
||||||
raise ErrorStatus(
|
raise ErrorStatus(
|
||||||
404, 'group {0} was not found'.format(group_uuid))
|
404, 'group {0} was not found'.format(group_uuid))
|
||||||
|
|
||||||
# old_group_dict = sql_group.get_proxy_dict()
|
# old_group_dict = sql_group.get_proxy_dict()
|
||||||
group_record.delete_by_primary_key(group_id)
|
group_record.delete_by_primary_key(group_id)
|
||||||
datamanager.flush()
|
datamanager.flush()
|
||||||
|
|
||||||
sql_group = self.build_full_group(group, group_uuid,
|
sql_group = self.build_full_group(group,
|
||||||
|
group_uuid,
|
||||||
datamanager)
|
datamanager)
|
||||||
|
|
||||||
# new_group_dict = sql_group.get_proxy_dict()
|
# new_group_dict = sql_group.get_proxy_dict()
|
||||||
|
# new_group_dict["regions"] = self.resolve_regions_actions(
|
||||||
|
# old_group_dict["regions"],
|
||||||
|
# new_group_dict["regions"])
|
||||||
|
|
||||||
|
datamanager.flush()
|
||||||
|
# if not len(new_group_dict['regions']) == 0:
|
||||||
|
# RdsProxy.send_group_dict(
|
||||||
|
# new_group_dict, transaction_id, "PUT")
|
||||||
|
|
||||||
group_result_wrapper = build_response(group_uuid,
|
group_result_wrapper = build_response(group_uuid,
|
||||||
transaction_id,
|
transaction_id,
|
||||||
'update_group')
|
'update_group')
|
||||||
datamanager.flush()
|
|
||||||
datamanager.commit()
|
datamanager.commit()
|
||||||
|
|
||||||
return group_result_wrapper
|
return group_result_wrapper
|
||||||
|
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
LOG.log_exception("GroupLogic - Failed to CreateGroup", exp)
|
LOG.log_exception("GroupLogic - Failed to UpdateGroup", exp)
|
||||||
datamanager.rollback()
|
datamanager.rollback()
|
||||||
raise
|
raise
|
||||||
|
|
||||||
@ -768,19 +803,24 @@ class GroupLogic(object):
|
|||||||
unique_customer = {}
|
unique_customer = {}
|
||||||
for customer in sql_customers_roles:
|
for customer in sql_customers_roles:
|
||||||
if customer.customer.uuid in unique_customer:
|
if customer.customer.uuid in unique_customer:
|
||||||
unique_customer[customer.customer.uuid].append(customer.groups_role.role.name)
|
unique_customer[customer.customer.uuid].append(
|
||||||
|
customer.groups_role.role.name)
|
||||||
else:
|
else:
|
||||||
unique_customer[customer.customer.uuid] = [customer.groups_role.role.name]
|
unique_customer[customer.customer.uuid] = [
|
||||||
|
customer.groups_role.role.name]
|
||||||
|
|
||||||
for customer, role_list in unique_customer.items():
|
for customer, role_list in unique_customer.items():
|
||||||
role_result.append(RoleResult(roles=role_list, customer=customer))
|
role_result.append(
|
||||||
|
RoleResult(roles=role_list, customer=customer))
|
||||||
|
|
||||||
unique_domain = {}
|
unique_domain = {}
|
||||||
for domain in sql_domains_roles:
|
for domain in sql_domains_roles:
|
||||||
if domain.domain_name in unique_domain:
|
if domain.domain_name in unique_domain:
|
||||||
unique_domain[domain.domain_name].append(domain.groups_role.role.name)
|
unique_domain[domain.domain_name].append(
|
||||||
|
domain.groups_role.role.name)
|
||||||
else:
|
else:
|
||||||
unique_domain[domain.domain_name] = [domain.groups_role.role.name]
|
unique_domain[domain.domain_name] = [
|
||||||
|
domain.groups_role.role.name]
|
||||||
|
|
||||||
for domain, role_list in unique_domain.items():
|
for domain, role_list in unique_domain.items():
|
||||||
role_result.append(RoleResult(roles=role_list, domain=domain))
|
role_result.append(RoleResult(roles=role_list, domain=domain))
|
||||||
|
@ -12,9 +12,11 @@ class RoleAssignment(Model):
|
|||||||
customer = wsme.wsattr(wsme.types.text, mandatory=False)
|
customer = wsme.wsattr(wsme.types.text, mandatory=False)
|
||||||
domain = wsme.wsattr(wsme.types.text, mandatory=False)
|
domain = wsme.wsattr(wsme.types.text, mandatory=False)
|
||||||
|
|
||||||
def __init__(self, domain="", customer="", roles=[]):
|
def __init__(self, domain=None, customer=None, roles=[]):
|
||||||
self.domain = domain
|
if domain is not None:
|
||||||
self.customer = customer
|
self.domain = domain
|
||||||
|
if customer is not None:
|
||||||
|
self.customer = customer
|
||||||
self.roles = roles
|
self.roles = roles
|
||||||
|
|
||||||
def validate_model(self):
|
def validate_model(self):
|
||||||
@ -29,7 +31,6 @@ class RoleAssignment(Model):
|
|||||||
|
|
||||||
|
|
||||||
class User(Model):
|
class User(Model):
|
||||||
# id = wsme.wsattr(wsme.types.text, mandatory=True)
|
|
||||||
id = wsme.wsattr([str])
|
id = wsme.wsattr([str])
|
||||||
domain = wsme.wsattr(wsme.types.text, mandatory=True)
|
domain = wsme.wsattr(wsme.types.text, mandatory=True)
|
||||||
|
|
||||||
@ -91,7 +92,7 @@ class Group(Model):
|
|||||||
enabled = wsme.wsattr(bool, mandatory=True)
|
enabled = wsme.wsattr(bool, mandatory=True)
|
||||||
regions = wsme.wsattr([Region], mandatory=False)
|
regions = wsme.wsattr([Region], mandatory=False)
|
||||||
users = wsme.wsattr([User], mandatory=False)
|
users = wsme.wsattr([User], mandatory=False)
|
||||||
roles = wsme.wsattr([str], mandatory=False)
|
roles = wsme.wsattr([RoleAssignment], mandatory=False)
|
||||||
|
|
||||||
def __init__(self, description="", name="", enabled=False, roles=[],
|
def __init__(self, description="", name="", enabled=False, roles=[],
|
||||||
regions=[], users=[], status="", domain='default', uuid=None):
|
regions=[], users=[], status="", domain='default', uuid=None):
|
||||||
|
@ -83,7 +83,7 @@ def yamlbuilder(alldata, region):
|
|||||||
resources["resources"][template_name] = {
|
resources["resources"][template_name] = {
|
||||||
'type': 'OS::Keystone::GroupRoleAssignment\n',
|
'type': 'OS::Keystone::GroupRoleAssignment\n',
|
||||||
'properties': {
|
'properties': {
|
||||||
'group': "%s" % group_name,
|
'group': "{get_resource: %s}" % group_name,
|
||||||
'group_domain': "%s" % jsondata['domain_name'],
|
'group_domain': "%s" % jsondata['domain_name'],
|
||||||
'roles': roles
|
'roles': roles
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user