
Replaces the policies argument with policy. The policies attribute is ancient and was superceded by policy a long time ago[0][1]. Since policy and policies differ in type, we can't simply alias these and had to drop policies to keep the implementation small. [0] https://docs.openstack.org/nova/latest/reference/api-microversion-history.html#id59 [1] https://docs.openstack.org/api-ref/compute/#create-server-group Change-Id: Icd658fb179ca0a96276b033130b9dddfedd84236
176 lines
4.9 KiB
Python
176 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
|
|
requirements:
|
|
- "python >= 3.6"
|
|
- "openstacksdk"
|
|
|
|
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()
|