Updates server_group for 2.0.0

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
This commit is contained in:
Rafael Castillo 2022-11-10 21:30:33 -07:00
parent 961bdb5bd5
commit daf79de37e
5 changed files with 163 additions and 66 deletions

View File

@ -104,6 +104,7 @@
security_group security_group
security_group_rule security_group_rule
server server
server_group
server_metadata server_metadata
server_volume server_volume
stack stack

View File

@ -0,0 +1,11 @@
expected_fields:
- id
- name
- policy
- policies
- member_ids
- metadata
- project_id
- rules
- user_id

View File

@ -0,0 +1,72 @@
- name: Create server group
openstack.cloud.server_group:
cloud: "{{ cloud }}"
name: ansible_group
policy: affinity
register: server_group
- name: Assert changed
assert:
that: server_group is changed
- name: Assert return values
assert:
that: item in server_group.server_group
loop: "{{ expected_fields }}"
- name: Create server group again
openstack.cloud.server_group:
cloud: "{{ cloud }}"
name: ansible_group
policy: affinity
register: server_group
- name: Assert not changed
assert:
that: server_group is not changed
- name: Delete server group
openstack.cloud.server_group:
cloud: "{{ cloud }}"
name: ansible_group
state: absent
register: server_group
- name: Assert changed
assert:
that: server_group is changed
- name: Delete server group again
openstack.cloud.server_group:
cloud: "{{ cloud }}"
name: ansible_group
state: absent
register: server_group
- name: Assert not changed
assert:
that: server_group is not changed
- name: Create server group with rules
openstack.cloud.server_group:
cloud: "{{ cloud }}"
name: ansible_group
policy: anti-affinity
rules:
max_server_per_host: 2
register: server_group
- name: Assert changed
assert:
that: server_group is changed
- name: Assert return values
assert:
that: item in server_group.server_group
loop: "{{ expected_fields }}"
- name: Delete server group
openstack.cloud.server_group:
cloud: "{{ cloud }}"
name: ansible_group
state: absent

View File

@ -57,6 +57,7 @@
- { role: security_group, tags: security_group } - { role: security_group, tags: security_group }
- { role: security_group_rule, tags: security_group_rule } - { role: security_group_rule, tags: security_group_rule }
- { role: server, tags: server } - { role: server, tags: server }
- { role: server_group, tags: server_group }
- { role: server_metadata, tags: server_metadata } - { role: server_metadata, tags: server_metadata }
- { role: server_volume, tags: server_volume } - { role: server_volume, tags: server_volume }
- { role: stack, tags: stack } - { role: stack, tags: stack }

View File

@ -14,10 +14,9 @@ description:
options: options:
state: state:
description: description:
- Indicate desired state of the resource. When I(state) is 'present', - Indicate desired state of the resource. When I(state) is C(present),
then I(policies) is required. then I(policy) is required.
choices: ['present', 'absent'] choices: ['present', 'absent']
required: false
default: present default: present
type: str type: str
name: name:
@ -25,15 +24,17 @@ options:
- Server group name. - Server group name.
required: true required: true
type: str type: str
policies: policy:
description: description:
- A list of one or more policy names to associate with the server - Represents the current name of the policy.
group. The list must contain at least one policy name. The current choices: ['anti-affinity', 'affinity', 'soft-anti-affinity', 'soft-affinity']
valid policy names are anti-affinity, affinity, soft-anti-affinity type: str
and soft-affinity. rules:
required: false description:
type: list - Rules to be applied to the policy. Currently, only the
elements: str C(max_server_per_host) rule is supported for the C(anti-affinity)
policy.
type: dict
requirements: requirements:
- "python >= 3.6" - "python >= 3.6"
- "openstacksdk" - "openstacksdk"
@ -43,58 +44,68 @@ extends_documentation_fragment:
''' '''
EXAMPLES = ''' EXAMPLES = '''
# Create a server group with 'affinity' policy. - name: Create a server group with 'affinity' policy.
- openstack.cloud.server_group: openstack.cloud.server_group:
cloud: "{{ cloud }}"
state: present state: present
auth:
auth_url: https://identity.example.com
username: admin
password: admin
project_name: admin
name: my_server_group name: my_server_group
policies: policy: affinity
- affinity
# Delete 'my_server_group' server group. - name: Delete 'my_server_group' server group.
- openstack.cloud.server_group: openstack.cloud.server_group:
cloud: "{{ cloud }}"
state: absent state: absent
auth:
auth_url: https://identity.example.com
username: admin
password: admin
project_name: admin
name: my_server_group name: my_server_group
''' '''
RETURN = ''' RETURN = '''
id: server_group:
description: Unique UUID. description: Object representing the server group
returned: success returned: On success when I(state) is present
type: str
name:
description: The name of the server group.
returned: success
type: str
policies:
description: A list of one or more policy names of the server group.
returned: success
type: list
members:
description: A list of members in the server group.
returned: success
type: list
metadata:
description: Metadata key and value pairs.
returned: success
type: dict type: dict
project_id: contains:
description: The project ID who owns the server group. id:
returned: success description: Unique UUID.
type: str returned: always
user_id: type: str
description: The user ID who owns the server group. name:
returned: success description: The name of the server group.
type: str 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 from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule
@ -103,12 +114,17 @@ from ansible_collections.openstack.cloud.plugins.module_utils.openstack import O
class ServerGroupModule(OpenStackModule): class ServerGroupModule(OpenStackModule):
argument_spec = dict( argument_spec = dict(
name=dict(required=True), name=dict(required=True),
policies=dict(type='list', elements='str'), policy=dict(choices=['anti-affinity', 'affinity', 'soft-anti-affinity',
'soft-affinity']),
state=dict(default='present', choices=['absent', 'present']), state=dict(default='present', choices=['absent', 'present']),
rules=dict(type='dict')
) )
module_kwargs = dict( module_kwargs = dict(
supports_check_mode=True, supports_check_mode=True,
required_if=[
('state', 'present', ['policy'])
],
) )
def _system_state_change(self, state, server_group): def _system_state_change(self, state, server_group):
@ -121,10 +137,9 @@ class ServerGroupModule(OpenStackModule):
def run(self): def run(self):
name = self.params['name'] name = self.params['name']
policies = self.params['policies']
state = self.params['state'] state = self.params['state']
server_group = self.conn.get_server_group(name) server_group = self.conn.compute.find_server_group(name)
if self.ansible.check_mode: if self.ansible.check_mode:
self.exit_json( self.exit_json(
@ -134,22 +149,19 @@ class ServerGroupModule(OpenStackModule):
changed = False changed = False
if state == 'present': if state == 'present':
if not server_group: if not server_group:
if not policies: kwargs = {k: self.params[k]
self.fail_json( for k in ['name', 'policy', 'rules']
msg="Parameter 'policies' is required in Server Group " if self.params[k] is not None}
"Create" server_group = self.conn.compute.create_server_group(**kwargs)
)
server_group = self.conn.create_server_group(name, policies)
changed = True changed = True
self.exit_json( self.exit_json(
changed=changed, changed=changed,
id=server_group['id'], server_group=server_group.to_dict(computed=False)
server_group=server_group
) )
if state == 'absent': if state == 'absent':
if server_group: if server_group:
self.conn.delete_server_group(server_group['id']) self.conn.compute.delete_server_group(server_group)
changed = True changed = True
self.exit_json(changed=changed) self.exit_json(changed=changed)