From c1a2496e0ff3e8b3d9b70cb8058834adb9b35099 Mon Sep 17 00:00:00 2001 From: Duc Truong Date: Thu, 26 Mar 2020 09:38:36 -0700 Subject: [PATCH] Add properties for os_project Keystone supports setting custom properties for projects. This changes add properties to os_project to enable setting of custom properties. Depends-On: https://review.opendev.org/715255 Change-Id: I23e2834d6b9d40ce86db4b32a0ed8bf76b3d9879 --- ci/roles/project/tasks/main.yml | 28 ++++ ci/roles/project_properties/defaults/main.yml | 2 + ci/roles/project_properties/tasks/main.yml | 142 ++++++++++++++++++ ci/run-collection.yml | 4 + plugins/modules/os_project.py | 30 +++- 5 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 ci/roles/project/tasks/main.yml create mode 100644 ci/roles/project_properties/defaults/main.yml create mode 100644 ci/roles/project_properties/tasks/main.yml diff --git a/ci/roles/project/tasks/main.yml b/ci/roles/project/tasks/main.yml new file mode 100644 index 00000000..f2d26563 --- /dev/null +++ b/ci/roles/project/tasks/main.yml @@ -0,0 +1,28 @@ +--- +- name: Create project + openstack.cloud.os_project: + cloud: "{{ cloud }}" + state: present + name: ansible_project + description: dummy description + domain_id: default + enabled: True + register: project + +- debug: var=project + +- name: Update project + openstack.cloud.os_project: + cloud: "{{ cloud }}" + state: present + name: ansible_project + description: new description + register: updatedproject + +- debug: var=updatedproject + +- name: Delete project + openstack.cloud.os_project: + cloud: "{{ cloud }}" + state: absent + name: ansible_project diff --git a/ci/roles/project_properties/defaults/main.yml b/ci/roles/project_properties/defaults/main.yml new file mode 100644 index 00000000..d5cf84db --- /dev/null +++ b/ci/roles/project_properties/defaults/main.yml @@ -0,0 +1,2 @@ +dummy_value: 'test-value' +dummy_value_updated: 'test-value-updated' diff --git a/ci/roles/project_properties/tasks/main.yml b/ci/roles/project_properties/tasks/main.yml new file mode 100644 index 00000000..e06e3385 --- /dev/null +++ b/ci/roles/project_properties/tasks/main.yml @@ -0,0 +1,142 @@ +--- +- name: 'Create project with properties - CHECK_MODE' + check_mode: yes + openstack.cloud.os_project: + cloud: "{{ cloud }}" + state: present + name: ansible_project + description: dummy description + domain_id: default + enabled: True + properties: + dummy_key: '{{ dummy_value }}' + register: create_project_cm +- assert: + that: + - create_project_cm is successful + - create_project_cm is changed + +- name: 'Create project with properties' + openstack.cloud.os_project: + cloud: "{{ cloud }}" + state: present + name: ansible_project + description: dummy description + domain_id: default + enabled: True + properties: + dummy_key: '{{ dummy_value }}' + register: create_project +- assert: + that: + - create_project is successful + - create_project is changed + - '"project" in create_project' + - '"dummy_key" in create_project["project"]' + - create_project["project"].dummy_key == dummy_value + +- name: 'Create project with properties (retry - no change) - CHECK_MODE' + check_mode: yes + openstack.cloud.os_project: + cloud: "{{ cloud }}" + state: present + name: ansible_project + description: dummy description + domain_id: default + enabled: True + properties: + dummy_key: '{{ dummy_value }}' + register: create_project_retry_cm +- assert: + that: + - create_project_retry_cm is successful + - create_project_retry_cm is not changed + +- name: 'Create project with properties (retry - no change)' + openstack.cloud.os_project: + cloud: "{{ cloud }}" + state: present + name: ansible_project + description: dummy description + domain_id: default + enabled: True + properties: + dummy_key: '{{ dummy_value }}' + register: create_project_retry +- assert: + that: + - create_project_retry is successful + - create_project_retry is not changed + - '"project" in create_project_retry' + - '"dummy_key" in create_project_retry["project"]' + - create_project_retry["project"].dummy_key == dummy_value + +- name: 'Update project with properties - CHECK_MODE' + check_mode: yes + openstack.cloud.os_project: + cloud: "{{ cloud }}" + state: present + name: ansible_project + description: new description + properties: + dummy_key: '{{ dummy_value_updated }}' + register: updated_project_cm +- assert: + that: + - updated_project_cm is successful + - updated_project_cm is changed + +- name: 'Update project with properties' + openstack.cloud.os_project: + cloud: "{{ cloud }}" + state: present + name: ansible_project + description: new description + properties: + dummy_key: '{{ dummy_value_updated }}' + register: updated_project +- assert: + that: + - updated_project is successful + - updated_project is changed + - '"project" in updated_project' + - '"dummy_key" in updated_project["project"]' + - updated_project["project"].dummy_key == dummy_value_updated + +- name: 'Update project with properties (retry - no change) - CHECK_MODE' + check_mode: yes + openstack.cloud.os_project: + cloud: "{{ cloud }}" + state: present + name: ansible_project + description: new description + properties: + dummy_key: '{{ dummy_value_updated }}' + register: updated_project_retry_cm +- assert: + that: + - updated_project_retry_cm is successful + - updated_project_retry_cm is not changed + +- name: 'Update project with properties (retry - no change)' + openstack.cloud.os_project: + cloud: "{{ cloud }}" + state: present + name: ansible_project + description: new description + properties: + dummy_key: '{{ dummy_value_updated }}' + register: updated_project_retry +- assert: + that: + - updated_project_retry is successful + - updated_project_retry is not changed + - '"project" in updated_project_retry' + - '"dummy_key" in updated_project_retry["project"]' + - updated_project_retry["project"].dummy_key == dummy_value_updated + +- name: Delete project with properties + openstack.cloud.os_project: + cloud: "{{ cloud }}" + state: absent + name: ansible_project diff --git a/ci/run-collection.yml b/ci/run-collection.yml index fabca7be..62409826 100644 --- a/ci/run-collection.yml +++ b/ci/run-collection.yml @@ -23,6 +23,10 @@ - { role: nova_flavor, tags: nova_flavor } - { role: object, tags: object } - { role: port, tags: port } + - { role: project, tags: project } + - role: project_properties + tags: project_properties + when: sdk_version is version("0.45.01", '>') - { role: router, tags: router } - { role: security_group, tags: security_group } - { role: server, tags: server } diff --git a/plugins/modules/os_project.py b/plugins/modules/os_project.py index f1bffb3e..fe946e16 100644 --- a/plugins/modules/os_project.py +++ b/plugins/modules/os_project.py @@ -39,6 +39,12 @@ options: - Is the project enabled type: bool default: 'yes' + properties: + description: + - Additional properties to be associated with this project. Requires + openstacksdk>0.45. + type: dict + default: {} state: description: - Should the resource be present or absent. @@ -63,6 +69,8 @@ EXAMPLES = ''' description: demodescription domain_id: demoid enabled: True + properties: + internal_alias: demo_project # Delete a project - os_project: @@ -109,6 +117,13 @@ def _needs_update(module, project): 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 v != project_properties[k]: + return True + return False @@ -137,6 +152,7 @@ def main(): name=dict(required=True), description=dict(required=False, default=None), domain_id=dict(required=False, default=None, aliases=['domain']), + properties=dict(type='dict', default={}), enabled=dict(default=True, type='bool'), state=dict(default='present', choices=['absent', 'present']) ) @@ -152,9 +168,15 @@ def main(): description = module.params['description'] domain = module.params.get('domain_id') enabled = module.params['enabled'] + properties = module.params['properties'] state = module.params['state'] - sdk, cloud = openstack_cloud_from_module(module) + min_version = None + + if properties: + min_version = '0.45.1' + + sdk, cloud = openstack_cloud_from_module(module, min_version) try: if domain: try: @@ -186,11 +208,15 @@ def main(): domain_id=domain, enabled=enabled) changed = True + + project = cloud.update_project( + project['id'], description=description, + enabled=enabled, **properties) else: if _needs_update(module, project): project = cloud.update_project( project['id'], description=description, - enabled=enabled) + enabled=enabled, **properties) changed = True else: changed = False