Refactor domain/project handling on os_user module (#5212)
The keys returned by user objects for default domain and default project are respectively default_domain_id and default_project_id. We need to gather those IDs in case the user passed names, so we can then compare with the user object on the needs_update helper function.
This commit is contained in:
parent
88d7f0c692
commit
10d662ea1b
1 changed files with 39 additions and 26 deletions
|
@ -120,19 +120,40 @@ user:
|
||||||
sample: "demouser"
|
sample: "demouser"
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def _needs_update(module, user):
|
def _needs_update(params_dict, user):
|
||||||
keys = ('email', 'default_project', 'domain', 'enabled')
|
for k, v in params_dict.items():
|
||||||
for key in keys:
|
if k != 'password' and user[k] != v:
|
||||||
if module.params[key] is not None and module.params[key] != user.get(key):
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# We don't get password back in the user object, so assume any supplied
|
# We don't get password back in the user object, so assume any supplied
|
||||||
# password is a change.
|
# password is a change.
|
||||||
if module.params['password'] is not None:
|
if params_dict['password'] is not None:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def _get_domain_id(cloud, domain):
|
||||||
|
try:
|
||||||
|
# We assume admin is passing domain id
|
||||||
|
domain_id = cloud.get_domain(domain)['id']
|
||||||
|
except:
|
||||||
|
# If we fail, maybe admin is passing a domain name.
|
||||||
|
# Note that domains have unique names, just like id.
|
||||||
|
try:
|
||||||
|
domain_id = cloud.search_domains(filters={'name': domain})[0]['id']
|
||||||
|
except:
|
||||||
|
# Ok, let's hope the user is non-admin and passing a sane id
|
||||||
|
domain_id = domain
|
||||||
|
|
||||||
|
return domain_id
|
||||||
|
|
||||||
|
def _get_default_project_id(cloud, default_project):
|
||||||
|
project = cloud.get_project(default_project)
|
||||||
|
if not project:
|
||||||
|
module.fail_json(msg='Default project %s is not valid' % default_project)
|
||||||
|
|
||||||
|
return project['id']
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
||||||
argument_spec = openstack_full_argument_spec(
|
argument_spec = openstack_full_argument_spec(
|
||||||
|
@ -165,41 +186,33 @@ def main():
|
||||||
cloud = shade.openstack_cloud(**module.params)
|
cloud = shade.openstack_cloud(**module.params)
|
||||||
user = cloud.get_user(name)
|
user = cloud.get_user(name)
|
||||||
|
|
||||||
|
domain_id = None
|
||||||
if domain:
|
if domain:
|
||||||
opcloud = shade.operator_cloud(**module.params)
|
opcloud = shade.operator_cloud(**module.params)
|
||||||
try:
|
domain_id = _get_domain_id(opcloud, domain)
|
||||||
# We assume admin is passing domain id
|
|
||||||
dom = opcloud.get_domain(domain)['id']
|
|
||||||
domain = dom
|
|
||||||
except:
|
|
||||||
# If we fail, maybe admin is passing a domain name.
|
|
||||||
# Note that domains have unique names, just like id.
|
|
||||||
try:
|
|
||||||
dom = opcloud.search_domains(filters={'name': domain})[0]['id']
|
|
||||||
domain = dom
|
|
||||||
except:
|
|
||||||
# Ok, let's hope the user is non-admin and passing a sane id
|
|
||||||
pass
|
|
||||||
|
|
||||||
if state == 'present':
|
if state == 'present':
|
||||||
project_id = None
|
default_project_id = None
|
||||||
if default_project:
|
if default_project:
|
||||||
project = cloud.get_project(default_project)
|
default_project_id = _get_default_project_id(cloud, default_project)
|
||||||
if not project:
|
|
||||||
module.fail_json(msg='Default project %s is not valid' % default_project)
|
|
||||||
project_id = project['id']
|
|
||||||
|
|
||||||
if user is None:
|
if user is None:
|
||||||
user = cloud.create_user(
|
user = cloud.create_user(
|
||||||
name=name, password=password, email=email,
|
name=name, password=password, email=email,
|
||||||
default_project=default_project, domain_id=domain,
|
default_project=default_project_id, domain_id=domain_id,
|
||||||
enabled=enabled)
|
enabled=enabled)
|
||||||
changed = True
|
changed = True
|
||||||
else:
|
else:
|
||||||
if _needs_update(module, user):
|
params_dict = {'email': email, 'enabled': enabled, 'password': password}
|
||||||
|
if domain_id is not None:
|
||||||
|
params_dict['domain_id'] = domain_id
|
||||||
|
if default_project_id is not None:
|
||||||
|
params_dict['default_project_id'] = default_project_id
|
||||||
|
|
||||||
|
if _needs_update(params_dict, user):
|
||||||
user = cloud.update_user(
|
user = cloud.update_user(
|
||||||
user['id'], password=password, email=email,
|
user['id'], password=password, email=email,
|
||||||
default_project=project_id, domain_id=domain,
|
default_project=default_project_id, domain_id=domain_id,
|
||||||
enabled=enabled)
|
enabled=enabled)
|
||||||
changed = True
|
changed = True
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in a new issue