diff --git a/.zuul.yaml b/.zuul.yaml index 8a5231475efdd4e11106d2ea85c3d12abaa65969..c29417b77175bf82e82775aedff241397b1b8089 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -71,11 +71,10 @@ dns_zone_info endpoint floating_ip_info - group host_aggregate identity_domain_info + identity_group identity_group_info - identity_role identity_user identity_user_info identity_role diff --git a/ci/roles/group/defaults/main.yml b/ci/roles/group/defaults/main.yml deleted file mode 100644 index 361c01190d4cae65637eb063a48d657bb7067e49..0000000000000000000000000000000000000000 --- a/ci/roles/group/defaults/main.yml +++ /dev/null @@ -1 +0,0 @@ -group_name: ansible_group diff --git a/ci/roles/group/tasks/main.yml b/ci/roles/group/tasks/main.yml deleted file mode 100644 index 77355736a85f6f105f8d3dcdfe8b243951da0541..0000000000000000000000000000000000000000 --- a/ci/roles/group/tasks/main.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -- name: Create group - openstack.cloud.identity_group: - cloud: "{{ cloud }}" - state: present - name: "{{ group_name }}" - -- name: Update group - openstack.cloud.identity_group: - cloud: "{{ cloud }}" - state: present - name: "{{ group_name }}" - description: "updated description" - -- name: Delete group - openstack.cloud.identity_group: - cloud: "{{ cloud }}" - state: absent - name: "{{ group_name }}" diff --git a/ci/roles/identity_group/defaults/main.yml b/ci/roles/identity_group/defaults/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..9b6ad245df6d86c3fbd4961f63ceb945e6041131 --- /dev/null +++ b/ci/roles/identity_group/defaults/main.yml @@ -0,0 +1,7 @@ +group_name: ansible_group +domain_name: ansible_domain +expected_fields: + - description + - domain_id + - id + - name diff --git a/ci/roles/identity_group/tasks/main.yml b/ci/roles/identity_group/tasks/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..0c19f438938a0836ae5697db87ffdc12b6af48e7 --- /dev/null +++ b/ci/roles/identity_group/tasks/main.yml @@ -0,0 +1,138 @@ +--- +- name: Create domain + openstack.cloud.identity_domain: + cloud: "{{ cloud }}" + state: present + name: "{{ domain_name }}" + register: domain + +- name: Create group + openstack.cloud.identity_group: + cloud: "{{ cloud }}" + state: present + name: "{{ group_name }}" + register: group_result + +- name: Assert changed + assert: + that: group_result is changed + +- name: Assert returned fields + assert: + that: item in group_result.group + loop: "{{ expected_fields }}" + +- name: Create group again + openstack.cloud.identity_group: + cloud: "{{ cloud }}" + state: present + name: "{{ group_name }}" + register: group_result + +- name: Assert not changed + assert: + that: group_result is not changed + +- name: Update group + openstack.cloud.identity_group: + cloud: "{{ cloud }}" + state: present + name: "{{ group_name }}" + description: "updated description" + register: group_result + +- name: Assert changed + assert: + that: + - group_result is changed + - group_result.group.description == "updated description" + +- name: Create group in specific domain + openstack.cloud.identity_group: + cloud: "{{ cloud }}" + state: present + name: "{{ group_name }}" + domain_id: "{{ domain.id }}" + register: group_result + +- name: Assert results + assert: + that: + - group_result is changed + - group_result.group.domain_id == domain.id + +- name: Create group in specific domain again + openstack.cloud.identity_group: + cloud: "{{ cloud }}" + state: present + name: "{{ group_name }}" + domain_id: "{{ domain.id }}" + register: group_result + +- name: Assert not changed + assert: + that: group_result is not changed + +- name: Delete ambiguous domain + openstack.cloud.identity_group: + cloud: "{{ cloud }}" + state: absent + name: "{{ group_name }}" + ignore_errors: true + register: group_result + +- name: Assert failed + assert: + that: group_result is failed + +- name: Delete group in specific domain + openstack.cloud.identity_group: + cloud: "{{ cloud }}" + state: absent + name: "{{ group_name }}" + domain_id: "{{ domain.id }}" + register: group_result + +- name: Assert changed + assert: + that: group_result is changed + +- name: Delete group in specific domain again + openstack.cloud.identity_group: + cloud: "{{ cloud }}" + state: absent + name: "{{ group_name }}" + domain_id: "{{ domain.id }}" + register: group_result + +- name: Assert not changed + assert: + that: group_result is not changed + +- name: Delete group + openstack.cloud.identity_group: + cloud: "{{ cloud }}" + state: absent + name: "{{ group_name }}" + register: group_result + +- name: Assert changed + assert: + that: group_result is changed + +- name: Delete group again + openstack.cloud.identity_group: + cloud: "{{ cloud }}" + state: absent + name: "{{ group_name }}" + register: group_result + +- name: Assert not changed + assert: + that: group_result is not changed + +- name: Delete domain + openstack.cloud.identity_domain: + cloud: "{{ cloud }}" + state: absent + name: "{{ domain_name }}" diff --git a/ci/run-collection.yml b/ci/run-collection.yml index 3d5246f18f31a5f5c951d5e962ec11c5844ff4c3..48edfbeec230484ac3b664dfc4da5ef273b9aee1 100644 --- a/ci/run-collection.yml +++ b/ci/run-collection.yml @@ -12,7 +12,6 @@ - role: object_container tags: object_container when: sdk_version is version(0.18, '>=') - - { role: group, tags: group } - role: dns tags: dns when: sdk_version is version(0.28, '>=') @@ -20,6 +19,7 @@ - { role: floating_ip_info, tags: floating_ip_info } - { role: host_aggregate, tags: host_aggregate } - { role: identity_domain_info, tags: identity_domain_info } + - { role: identity_group, tags: identity_group } - { role: identity_group_info, tags: identity_group_info } - { role: identity_user, tags: identity_user } - { role: identity_user_info, tags: identity_user_info } diff --git a/plugins/modules/identity_group.py b/plugins/modules/identity_group.py index 1242b8c771271379e505eca5991fad81caed5773..0e4cc6f4567bdd61c951b6a22809369ee4199ec1 100644 --- a/plugins/modules/identity_group.py +++ b/plugins/modules/identity_group.py @@ -13,11 +13,6 @@ description: - Manage OpenStack Identity Groups. Groups can be created, deleted or updated. Only the I(description) value can be updated. options: - name: - description: - - Group name - required: true - type: str description: description: - Group description @@ -26,6 +21,11 @@ options: description: - Domain id to create the group in if the cloud supports domains. type: str + name: + description: + - Group name + required: true + type: str state: description: - Should the resource be present or absent. @@ -68,16 +68,8 @@ RETURN = ''' group: description: Dictionary describing the group. returned: On success when I(state) is 'present'. - type: complex + type: dict contains: - id: - description: Unique group ID - type: str - sample: "ee6156ff04c645f481a6738311aea0b0" - name: - description: Group name - type: str - sample: "demo" description: description: Group description type: str @@ -86,6 +78,14 @@ group: description: Domain for the group type: str sample: "default" + id: + description: Unique group ID + type: str + sample: "ee6156ff04c645f481a6738311aea0b0" + name: + description: Group name + type: str + sample: "demo" ''' from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule @@ -103,51 +103,57 @@ class IdentityGroupModule(OpenStackModule): supports_check_mode=True ) - def _system_state_change(self, state, description, group): + def _system_state_change(self, state, group): if state == 'present' and not group: return True - if state == 'present' and description is not None and group.description != description: + if state == 'present' and self._build_update(group): return True if state == 'absent' and group: return True return False + def _build_update(self, group): + update = {} + desc = self.params['description'] + if desc is not None and desc != group.description: + update['description'] = desc + return update + def run(self): - name = self.params.get('name') - description = self.params.get('description') - state = self.params.get('state') + name = self.params['name'] + description = self.params['description'] + state = self.params['state'] + domain_id = self.params['domain_id'] - domain_id = self.params.pop('domain_id') + group_filters = {} + if domain_id is not None: + group_filters['domain_id'] = domain_id - if domain_id: - group = self.conn.get_group(name, filters={'domain_id': domain_id}) - else: - group = self.conn.get_group(name) + group = self.conn.identity.find_group(name, **group_filters) if self.ansible.check_mode: - self.exit_json(changed=self._system_state_change(state, description, group)) + self.exit_json(changed=self._system_state_change(state, group)) + changed = False if state == 'present': if group is None: - group = self.conn.create_group( - name=name, description=description, domain=domain_id) + kwargs = dict(description=description, domain_id=domain_id) + kwargs = {k: v for k, v in kwargs.items() if v is not None} + group = self.conn.identity.create_group( + name=name, **kwargs) changed = True else: - if description is not None and group.description != description: - group = self.conn.update_group( - group.id, description=description) + update = self._build_update(group) + if update: + group = self.conn.identity.update_group(group, **update) changed = True - else: - changed = False + group = group.to_dict(computed=False) self.exit_json(changed=changed, group=group) - elif state == 'absent': - if group is None: - changed = False - else: - self.conn.delete_group(group.id) - changed = True - self.exit_json(changed=changed) + elif state == 'absent' and group is not None: + self.conn.identity.delete_group(group) + changed = True + self.exit_json(changed=changed) def main():