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:
parent
961bdb5bd5
commit
daf79de37e
@ -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
|
||||||
|
11
ci/roles/server_group/defaults/main.yml
Normal file
11
ci/roles/server_group/defaults/main.yml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
expected_fields:
|
||||||
|
- id
|
||||||
|
- name
|
||||||
|
- policy
|
||||||
|
- policies
|
||||||
|
- member_ids
|
||||||
|
- metadata
|
||||||
|
- project_id
|
||||||
|
- rules
|
||||||
|
- user_id
|
||||||
|
|
72
ci/roles/server_group/tasks/main.yml
Normal file
72
ci/roles/server_group/tasks/main.yml
Normal 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
|
@ -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 }
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user