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:
Ricardo Carrillo Cruz 2016-10-17 15:18:49 +02:00 committed by Matt Clay
parent 88d7f0c692
commit 10d662ea1b

View file

@ -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: