rewrite to use lists

This commit is contained in:
sean-m-sullivan
2020-10-17 00:08:39 -05:00
parent 106b19a05d
commit 0393d537de

View File

@@ -42,31 +42,81 @@ options:
- Team that the role acts on. - Team that the role acts on.
- For example, make someone a member or an admin of a team. - For example, make someone a member or an admin of a team.
- Members of a team implicitly receive the permissions that the team has. - Members of a team implicitly receive the permissions that the team has.
- Deprecated, use 'target_teams'.
type: str type: str
target_teams:
description:
- Team that the role acts on.
- For example, make someone a member or an admin of a team.
- Members of a team implicitly receive the permissions that the team has.
type: list
elements: str
inventory: inventory:
description: description:
- Inventory the role acts on. - Inventory the role acts on.
- Deprecated, use 'inventories'.
type: str type: str
inventories:
description:
- Inventory the role acts on.
type: list
elements: str
job_template: job_template:
description: description:
- The job template the role acts on. - The job template the role acts on.
- Deprecated, use 'job_templates'.
type: str type: str
job_templates:
description:
- The job template the role acts on.
type: list
elements: str
workflow: workflow:
description: description:
- The workflow job template the role acts on. - The workflow job template the role acts on.
- Deprecated, use 'workflows'.
type: str type: str
workflows:
description:
- The workflow job template the role acts on.
type: list
elements: str
credential: credential:
description: description:
- Credential the role acts on. - Credential the role acts on.
- Deprecated, use 'credentials'.
type: str type: str
credentials:
description:
- Credential the role acts on.
type: list
elements: str
organization: organization:
description: description:
- Organization the role acts on. - Organization the role acts on.
- Deprecated, use 'organizations'.
type: str
organizations:
description:
- Organization the role acts on.
type: list
elements: str
lookup_organization:
description:
- Organization the inventories, job templates, projects, or workflows the items exists in.
- Used to help lookup the object, for organizaiton roles see organization.
- If not provided, will lookup by name only, which does not work with duplicates.
type: str type: str
project: project:
description: description:
- Project the role acts on. - Project the role acts on.
- Deprecated, use 'projects'.
type: str type: str
projects:
description:
- Project the role acts on.
type: list
elements: str
state: state:
description: description:
- Desired state. - Desired state.
@@ -101,11 +151,17 @@ def main():
"workflow_admin", "notification_admin", "job_template_admin"], required=True), "workflow_admin", "notification_admin", "job_template_admin"], required=True),
target_team=dict(), target_team=dict(),
inventory=dict(), inventory=dict(),
inventories=dict(type='list', elements='str'),
job_template=dict(), job_template=dict(),
job_templates=dict(type='list', elements='str'),
workflow=dict(), workflow=dict(),
workflows=dict(type='list', elements='str'),
credential=dict(), credential=dict(),
credentials=dict(type='list', elements='str'),
organization=dict(), organization=dict(),
lookup_organization=dict(),
project=dict(), project=dict(),
projects=dict(type='list', elements='str'),
state=dict(choices=['present', 'absent'], default='present'), state=dict(choices=['present', 'absent'], default='present'),
) )
@@ -117,41 +173,85 @@ def main():
module.json_output['role'] = role_type module.json_output['role'] = role_type
# Lookup data for all the objects specified in params # Deal with legacy parameters
params = module.params.copy() resource_list_param_keys = {
'credentials': 'credential',
'inventories': 'inventory',
'job_templates': 'job_template',
'target_teams': 'target_team',
'organizations': 'organization',
'projects': 'project',
'target_teams': 'target_team',
'workflows': 'workflow'
}
# Remove Project after testing
resource_param_keys = ( resource_param_keys = (
'user', 'team', 'user', 'team', 'lookup_organization'
'target_team', 'inventory', 'job_template', 'workflow', 'credential', 'organization', 'project'
) )
resource_data = {}
for param in resource_param_keys:
endpoint = module.param_to_endpoint(param)
resource_name = params.get(param) resources = {}
if resource_name: for resource_group in resource_list_param_keys:
resource = module.get_exactly_one(module.param_to_endpoint(param), resource_name) if module.params.get(resource_group) is not None:
resource_data[param] = resource resources.setdefault(resource_group, []).extend(module.params.get(resource_group))
if module.params.get(resource_list_param_keys[resource_group]) is not None:
resources.setdefault(resource_group, []).append(module.params.get(resource_list_param_keys[resource_group]))
for resource_group in resource_param_keys:
if module.params.get(resource_group) is not None:
resources[resource_group] = module.params.get(resource_group)
# Change workflows and target_teams key to its endpoint name.
if 'workflows' in resources:
resources['workflow_job_templates'] = resources.pop('workflows')
if 'target_teams' in resources:
resources['teams'] = resources.pop('target_teams')
# Set lookup data to use
lookup_data = {}
if 'lookup_organization' in resources:
lookup_data['organization'] = module.resolve_name_to_id('organizations', resources['lookup_organization'])
resources.pop('lookup_organization')
# Lookup actor data
# separate actors from resources # separate actors from resources
actor_data = {} actor_data = {}
for key in ('user', 'team'): for key in ('user', 'team'):
if key in resource_data: if key in resources:
actor_data[key] = resource_data.pop(key) if key == 'user':
lookup_data_populated = {}
else:
lookup_data_populated = lookup_data
# Attempt to look up project based on the provided name or ID and lookup data
actor_data[key] = module.get_one('{0}s'.format(key), name_or_id=resources[key], data=lookup_data_populated)
resources.pop(key)
# Lookup Resources
resource_data = {}
for key in resources:
for resource in resources[key]:
# Attempt to look up project based on the provided name or ID and lookup data
if key in resources:
if key == 'organizations':
lookup_data_populated = {}
else:
lookup_data_populated = lookup_data
resource_data.setdefault(key, []).append(module.get_one(key, name_or_id=resource, data=lookup_data_populated))
# build association agenda # build association agenda
associations = {} associations = {}
for actor_type, actor in actor_data.items(): for actor_type, actor in actor_data.items():
for resource_type, resource in resource_data.items(): for key in resource_data:
resource_roles = resource['summary_fields']['object_roles'] for resource in resource_data[key]:
if role_field not in resource_roles: resource_roles = resource['summary_fields']['object_roles']
available_roles = ', '.join(list(resource_roles.keys())) if role_field not in resource_roles:
module.fail_json(msg='Resource {0} has no role {1}, available roles: {2}'.format( available_roles = ', '.join(list(resource_roles.keys()))
resource['url'], role_field, available_roles module.fail_json(msg='Resource {0} has no role {1}, available roles: {2}'.format(
), changed=False) resource['url'], role_field, available_roles
role_data = resource_roles[role_field] ), changed=False)
endpoint = '/roles/{0}/{1}/'.format(role_data['id'], module.param_to_endpoint(actor_type)) role_data = resource_roles[role_field]
associations.setdefault(endpoint, []) endpoint = '/roles/{0}/{1}/'.format(role_data['id'], module.param_to_endpoint(actor_type))
associations[endpoint].append(actor['id']) associations.setdefault(endpoint, [])
associations[endpoint].append(actor['id'])
# Stopped improvements
# perform associations # perform associations
for association_endpoint, new_association_list in associations.items(): for association_endpoint, new_association_list in associations.items():