Merge "Switch project and project_info module to OpenStackModule"

This commit is contained in:
Zuul 2021-05-12 21:31:19 +00:00 committed by Gerrit Code Review
commit daaa6bf561
2 changed files with 95 additions and 109 deletions

View File

@ -38,7 +38,7 @@ options:
- Additional properties to be associated with this project. Requires - Additional properties to be associated with this project. Requires
openstacksdk>0.45. openstacksdk>0.45.
type: dict type: dict
default: {} required: false
state: state:
description: description:
- Should the resource be present or absent. - Should the resource be present or absent.
@ -99,133 +99,121 @@ project:
sample: True sample: True
''' '''
from ansible.module_utils.basic import AnsibleModule from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule
from ansible_collections.openstack.cloud.plugins.module_utils.openstack import (openstack_full_argument_spec,
openstack_module_kwargs,
openstack_cloud_from_module)
def _needs_update(module, project): class IdentityProjectModule(OpenStackModule):
keys = ('description', 'enabled') argument_spec = dict(
for key in keys:
if module.params[key] is not None and module.params[key] != project.get(key):
return True
properties = module.params['properties']
if properties:
project_properties = project.get('properties')
for k, v in properties.items():
if v is not None and (k not in project_properties or v != project_properties[k]):
return True
return False
def _system_state_change(module, project):
state = module.params['state']
if state == 'present':
if project is None:
changed = True
else:
if _needs_update(module, project):
changed = True
else:
changed = False
elif state == 'absent':
if project is None:
changed = False
else:
changed = True
return changed
def main():
argument_spec = openstack_full_argument_spec(
name=dict(required=True), name=dict(required=True),
description=dict(required=False, default=None), description=dict(required=False),
domain_id=dict(required=False, default=None, aliases=['domain']), domain_id=dict(required=False, aliases=['domain']),
properties=dict(type='dict', default={}), properties=dict(required=False, type='dict', min_ver='0.45.1'),
enabled=dict(default=True, type='bool'), enabled=dict(default=True, type='bool'),
state=dict(default='present', choices=['absent', 'present']) state=dict(default='present', choices=['absent', 'present'])
) )
module_kwargs = dict(
module_kwargs = openstack_module_kwargs() supports_check_mode=True
module = AnsibleModule(
argument_spec,
supports_check_mode=True,
**module_kwargs
) )
name = module.params['name'] def _needs_update(self, project):
description = module.params['description'] keys = ('description', 'enabled')
domain = module.params.get('domain_id') for key in keys:
enabled = module.params['enabled'] if self.params[key] is not None and self.params[key] != project.get(key):
properties = module.params['properties'] return True
state = module.params['state']
min_version = None properties = self.params['properties']
if properties:
project_properties = project.get('properties')
for k, v in properties.items():
if v is not None and (k not in project_properties or v != project_properties[k]):
return True
if properties: return False
min_version = '0.45.1'
def _system_state_change(self, project):
state = self.params['state']
if state == 'present':
if project is None:
changed = True
else:
if self._needs_update(project):
changed = True
else:
changed = False
elif state == 'absent':
changed = project is not None
return changed
def run(self):
name = self.params['name']
description = self.params['description']
domain = self.params['domain_id']
enabled = self.params['enabled']
properties = self.params['properties'] or {}
state = self.params['state']
sdk, cloud = openstack_cloud_from_module(module, min_version)
try:
if domain: if domain:
try: try:
# We assume admin is passing domain id # We assume admin is passing domain id
dom = cloud.get_domain(domain)['id'] dom = self.conn.get_domain(domain)['id']
domain = dom domain = dom
except Exception: except Exception:
# If we fail, maybe admin is passing a domain name. # If we fail, maybe admin is passing a domain name.
# Note that domains have unique names, just like id. # Note that domains have unique names, just like id.
try: try:
dom = cloud.search_domains(filters={'name': domain})[0]['id'] dom = self.conn.search_domains(filters={'name': domain})[0]['id']
domain = dom domain = dom
except Exception: except Exception:
# Ok, let's hope the user is non-admin and passing a sane id # Ok, let's hope the user is non-admin and passing a sane id
pass pass
if domain: if domain:
project = cloud.get_project(name, domain_id=domain) project = self.conn.get_project(name, domain_id=domain)
else: else:
project = cloud.get_project(name) project = self.conn.get_project(name)
if module.check_mode: if self.ansible.check_mode:
module.exit_json(changed=_system_state_change(module, project)) self.exit_json(changed=self._system_state_change(project))
if state == 'present': if state == 'present':
if project is None: if project is None:
project = cloud.create_project( project = self.conn.create_project(
name=name, description=description, name=name, description=description,
domain_id=domain, domain_id=domain,
enabled=enabled) enabled=enabled)
changed = True changed = True
project = cloud.update_project( project = self.conn.update_project(
project['id'], description=description, project['id'],
enabled=enabled, **properties) description=description,
enabled=enabled,
**properties)
else: else:
if _needs_update(module, project): if self._needs_update(project):
project = cloud.update_project( project = self.conn.update_project(
project['id'], description=description, project['id'],
enabled=enabled, **properties) description=description,
enabled=enabled,
**properties)
changed = True changed = True
else: else:
changed = False changed = False
module.exit_json(changed=changed, project=project) self.exit_json(changed=changed, project=project)
elif state == 'absent': elif state == 'absent':
if project is None: if project is None:
changed = False changed = False
else: else:
cloud.delete_project(project['id']) self.conn.delete_project(project['id'])
changed = True changed = True
module.exit_json(changed=changed) self.exit_json(changed=changed)
except sdk.exceptions.OpenStackCloudException as e:
module.fail_json(msg=e.message, extra_data=e.extra_data) def main():
module = IdentityProjectModule()
module()
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -99,59 +99,57 @@ openstack_projects:
type: bool type: bool
''' '''
from ansible.module_utils.basic import AnsibleModule from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule
from ansible_collections.openstack.cloud.plugins.module_utils.openstack import openstack_full_argument_spec, openstack_cloud_from_module
def main(): class IdentityProjectInfoModule(OpenStackModule):
deprecated_names = ('project_facts', 'openstack.cloud.project_facts')
argument_spec = openstack_full_argument_spec( argument_spec = dict(
name=dict(required=False, default=None), name=dict(required=False),
domain=dict(required=False, default=None), domain=dict(required=False),
filters=dict(required=False, type='dict', default=None), filters=dict(required=False, type='dict'),
)
module_kwargs = dict(
supports_check_mode=True
) )
module = AnsibleModule(argument_spec) def run(self):
is_old_facts = module._name == 'openstack.cloud.project_facts' name = self.params['name']
if is_old_facts: domain = self.params['domain']
module.deprecate("The 'openstack.cloud.project_facts' module has been renamed to 'openstack.cloud.project_info', " filters = self.params['filters']
"and the renamed one no longer returns ansible_facts", version='2.0.0', is_old_facts = self.module_name == 'openstack.cloud.project_facts'
collection_name='openstack.cloud')
sdk, opcloud = openstack_cloud_from_module(module)
try:
name = module.params['name']
domain = module.params['domain']
filters = module.params['filters']
if domain: if domain:
try: try:
# We assume admin is passing domain id # We assume admin is passing domain id
dom = opcloud.get_domain(domain)['id'] dom = self.conn.get_domain(domain)['id']
domain = dom domain = dom
except Exception: except Exception:
# If we fail, maybe admin is passing a domain name. # If we fail, maybe admin is passing a domain name.
# Note that domains have unique names, just like id. # Note that domains have unique names, just like id.
dom = opcloud.search_domains(filters={'name': domain}) dom = self.conn.search_domains(filters={'name': domain})
if dom: if dom:
domain = dom[0]['id'] domain = dom[0]['id']
else: else:
module.fail_json(msg='Domain name or ID does not exist') self.fail_json(msg='Domain name or ID does not exist')
if not filters: if not filters:
filters = {} filters = {}
filters['domain_id'] = domain filters['domain_id'] = domain
projects = opcloud.search_projects(name, filters) projects = self.conn.search_projects(name, filters)
if is_old_facts: if is_old_facts:
module.exit_json(changed=False, ansible_facts=dict( self.exit_json(changed=False, ansible_facts=dict(
openstack_projects=projects)) openstack_projects=projects))
else: else:
module.exit_json(changed=False, openstack_projects=projects) self.exit_json(changed=False, openstack_projects=projects)
except sdk.exceptions.OpenStackCloudException as e:
module.fail_json(msg=str(e)) def main():
module = IdentityProjectInfoModule()
module()
if __name__ == '__main__': if __name__ == '__main__':