ansible-collections-openstack/plugins/modules/server_group.py
Jakob Meng 1b38b7c500 Properly documented openstacksdk version requirements
With "extends_documentation_fragment: ['openstack.cloud.openstack']"
it is not necessary to list required Python libraries in section
'requirements' of DOCUMENTATION docstring in modules. Ansible will
merge requirements from doc fragments and DOCUMENTATION docstring
which previously resulted in duplicates such as in server module [0]:

* openstacksdk
* openstacksdk >= 0.36, < 0.99.0
* python >= 3.6

When removing the 'requirements' section from server module, then
Ansible will list openstacksdk once only:

* openstacksdk >= 0.36, < 0.99.0
* python >= 3.6

To see what documentation Ansible will produce for server module run:

  ansible-doc --type module openstack.cloud.server

[0] https://docs.ansible.com/ansible/latest/collections/openstack/\
    cloud/server_module.html

Change-Id: I727ed95ee480bb644b5a533f6a9526973677064c
2023-01-16 13:51:01 +01:00

172 lines
4.9 KiB
Python

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (c) 2016 Catalyst IT Limited
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
DOCUMENTATION = '''
---
module: server_group
short_description: Manage OpenStack server groups
author: OpenStack Ansible SIG
description:
- Add or remove server groups from OpenStack.
options:
state:
description:
- Indicate desired state of the resource. When I(state) is C(present),
then I(policy) is required.
choices: ['present', 'absent']
default: present
type: str
name:
description:
- Server group name.
required: true
type: str
policy:
description:
- Represents the current name of the policy.
choices: ['anti-affinity', 'affinity', 'soft-anti-affinity', 'soft-affinity']
type: str
rules:
description:
- Rules to be applied to the policy. Currently, only the
C(max_server_per_host) rule is supported for the C(anti-affinity)
policy.
type: dict
extends_documentation_fragment:
- openstack.cloud.openstack
'''
EXAMPLES = '''
- name: Create a server group with 'affinity' policy.
openstack.cloud.server_group:
cloud: "{{ cloud }}"
state: present
name: my_server_group
policy: affinity
- name: Delete 'my_server_group' server group.
openstack.cloud.server_group:
cloud: "{{ cloud }}"
state: absent
name: my_server_group
'''
RETURN = '''
server_group:
description: Object representing the server group
returned: On success when I(state) is present
type: dict
contains:
id:
description: Unique UUID.
returned: always
type: str
name:
description: The name of the server group.
returned: always
type: str
policies:
description: |
A list of exactly one policy name to associate with the group.
Available until microversion 2.63
returned: always
type: list
policy:
description: |
Represents the name of the policy. Available from version 2.64 on.
returned: always
type: str
member_ids:
description: The list of members in the server group
returned: always
type: list
metadata:
description: Metadata key and value pairs.
returned: always
type: dict
project_id:
description: The project ID who owns the server group.
returned: always
type: str
rules:
description: |
The rules field, applied to the policy. Currently, only the
C(max_server_per_host) rule is supported for the
C(anti-affinity) policy.
returned: always
type: dict
user_id:
description: The user ID who owns the server group.
returned: always
type: str
'''
from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule
class ServerGroupModule(OpenStackModule):
argument_spec = dict(
name=dict(required=True),
policy=dict(choices=['anti-affinity', 'affinity', 'soft-anti-affinity',
'soft-affinity']),
state=dict(default='present', choices=['absent', 'present']),
rules=dict(type='dict')
)
module_kwargs = dict(
supports_check_mode=True,
required_if=[
('state', 'present', ['policy'])
],
)
def _system_state_change(self, state, server_group):
if state == 'present' and not server_group:
return True
if state == 'absent' and server_group:
return True
return False
def run(self):
name = self.params['name']
state = self.params['state']
server_group = self.conn.compute.find_server_group(name)
if self.ansible.check_mode:
self.exit_json(
changed=self._system_state_change(state, server_group)
)
changed = False
if state == 'present':
if not server_group:
kwargs = {k: self.params[k]
for k in ['name', 'policy', 'rules']
if self.params[k] is not None}
server_group = self.conn.compute.create_server_group(**kwargs)
changed = True
self.exit_json(
changed=changed,
server_group=server_group.to_dict(computed=False)
)
if state == 'absent':
if server_group:
self.conn.compute.delete_server_group(server_group)
changed = True
self.exit_json(changed=changed)
def main():
module = ServerGroupModule()
module()
if __name__ == '__main__':
main()