Skip to content

Commit

Permalink
Add tag support to ec2_placement_group
Browse files Browse the repository at this point in the history
Allows users to optionally create EC2 placement groups with tags.
Extend integration suite with additional test cases.
  • Loading branch information
Haris Okanovic committed Apr 23, 2024
1 parent 2e8289f commit 863b5fa
Show file tree
Hide file tree
Showing 3 changed files with 160 additions and 0 deletions.
9 changes: 9 additions & 0 deletions plugins/modules/ec2_placement_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@

from ansible_collections.amazon.aws.plugins.module_utils.botocore import is_boto3_error_code
from ansible_collections.amazon.aws.plugins.module_utils.retries import AWSRetry
from ansible_collections.amazon.aws.plugins.module_utils.tagging import boto3_tag_list_to_ansible_dict
from ansible_collections.amazon.aws.plugins.module_utils.tagging import boto3_tag_specifications

from ansible_collections.community.aws.plugins.module_utils.modules import AnsibleCommunityAWSModule as AnsibleAWSModule

Expand All @@ -127,6 +129,7 @@ def search_placement_group(connection, module):
"name": placement_group["GroupName"],
"state": placement_group["State"],
"strategy": placement_group["Strategy"],
"tags": boto3_tag_list_to_ansible_dict(placement_group.get("Tags")),
}


Expand All @@ -141,13 +144,15 @@ def get_placement_group_information(connection, name):
"name": placement_group["GroupName"],
"state": placement_group["State"],
"strategy": placement_group["Strategy"],
"tags": boto3_tag_list_to_ansible_dict(placement_group.get("Tags")),
}


@AWSRetry.exponential_backoff()
def create_placement_group(connection, module):
name = module.params.get("name")
strategy = module.params.get("strategy")
tags = module.params.get("tags")
partition_count = module.params.get("partition_count")

if strategy != "partition" and partition_count:
Expand All @@ -156,6 +161,8 @@ def create_placement_group(connection, module):
params = {}
params["GroupName"] = name
params["Strategy"] = strategy
if tags:
params["TagSpecifications"] = boto3_tag_specifications(tags, types=["placement-group"])
if partition_count:
params["PartitionCount"] = partition_count
params["DryRun"] = module.check_mode
Expand All @@ -169,6 +176,7 @@ def create_placement_group(connection, module):
"name": name,
"state": "DryRun",
"strategy": strategy,
"tags": tags,
},
)
except (
Expand Down Expand Up @@ -198,6 +206,7 @@ def main():
partition_count=dict(type="int"),
state=dict(default="present", choices=["present", "absent"]),
strategy=dict(default="cluster", choices=["cluster", "spread", "partition"]),
tags=dict(type="dict"),
)

module = AnsibleAWSModule(argument_spec=argument_spec, supports_check_mode=True)
Expand Down
2 changes: 2 additions & 0 deletions plugins/modules/ec2_placement_group_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
except ImportError:
pass # caught by AnsibleAWSModule

from ansible_collections.amazon.aws.plugins.module_utils.tagging import boto3_tag_list_to_ansible_dict
from ansible_collections.community.aws.plugins.module_utils.modules import AnsibleCommunityAWSModule as AnsibleAWSModule


Expand Down Expand Up @@ -102,6 +103,7 @@ def get_placement_groups_details(connection, module):
"name": placement_group["GroupName"],
"state": placement_group["State"],
"strategy": placement_group["Strategy"],
"tags": boto3_tag_list_to_ansible_dict(placement_group.get("Tags")),
}
)
return results
Expand Down
149 changes: 149 additions & 0 deletions tests/integration/targets/ec2_placement_group/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,105 @@
- pg_3_create_check_mode_idem.placement_group.state == "available"
- '"ec2:CreatePlacementGroup" not in pg_3_create_check_mode_idem.resource_actions'

- name: Create a placement group 4 with tags - check_mode
community.aws.ec2_placement_group:
name: '{{ resource_prefix }}-pg4'
state: present
strategy: cluster
tags:
foo: test1
bar: test2
check_mode: true
register: pg_4_create_check_mode

- assert:
that:
- pg_4_create_check_mode is changed
- pg_4_create_check_mode.placement_group.name == resource_prefix ~ '-pg4'
- pg_4_create_check_mode.placement_group.state == "DryRun"
- pg_4_create_check_mode.placement_group.tags.foo == "test1"
- pg_4_create_check_mode.placement_group.tags.bar == "test2"
- '"ec2:CreatePlacementGroup" in pg_4_create_check_mode.resource_actions'

- name: Create a placement group 4 with tags
community.aws.ec2_placement_group:
name: '{{ resource_prefix }}-pg4'
state: present
strategy: cluster
tags:
foo: test1
bar: test2
register: pg_4_create

- assert:
that:
- pg_4_create is changed
- pg_4_create.placement_group.name == resource_prefix ~ '-pg4'
- pg_4_create.placement_group.state == "available"
- pg_4_create.placement_group.tags.foo == "test1"
- pg_4_create.placement_group.tags.bar == "test2"
- '"ec2:CreatePlacementGroup" in pg_4_create.resource_actions'

- set_fact:
placement_group_names: "{{ placement_group_names + [pg_4_create.placement_group.name] }}"

- name: Gather information about placement group 4
community.aws.ec2_placement_group_info:
names:
- '{{ resource_prefix }}-pg4'
register: pg_4_info_result

- assert:
that:
- pg_4_info_result is not changed
- pg_4_info_result.placement_groups[0].name == resource_prefix ~ '-pg4'
- pg_4_info_result.placement_groups[0].state == "available"
- pg_4_info_result.placement_groups[0].strategy == "cluster"
- pg_4_info_result.placement_groups[0].tags.foo == "test1"
- pg_4_info_result.placement_groups[0].tags.bar == "test2"
- '"ec2:DescribePlacementGroups" in pg_4_info_result.resource_actions'

- name: Create a placement group 4 with tags - Idempotency
community.aws.ec2_placement_group:
name: '{{ resource_prefix }}-pg4'
state: present
strategy: cluster
tags:
foo: test1
bar: test2
register: pg_4_create

- assert:
that:
- pg_4_create is not changed
- pg_4_create.placement_group.name == resource_prefix ~ '-pg4'
- pg_4_create.placement_group.state == "available"
- pg_4_create.placement_group.strategy == "cluster"
- pg_4_create.placement_group.tags.foo == "test1"
- pg_4_create.placement_group.tags.bar == "test2"
- '"ec2:CreatePlacementGroup" not in pg_4_create.resource_actions'

- name: Create a placement group 4 with tags - check_mode Idempotency
community.aws.ec2_placement_group:
name: '{{ resource_prefix }}-pg4'
state: present
strategy: cluster
tags:
foo: test1
bar: test2
check_mode: true
register: pg_4_create_check_mode_idem

- assert:
that:
- pg_4_create_check_mode_idem is not changed
- pg_4_create_check_mode_idem.placement_group.name == resource_prefix ~ '-pg4'
- pg_4_create_check_mode_idem.placement_group.state == "available"
- pg_4_create_check_mode_idem.placement_group.strategy == "cluster"
- pg_4_create_check_mode_idem.placement_group.tags.foo == "test1"
- pg_4_create_check_mode_idem.placement_group.tags.bar == "test2"
- '"ec2:CreatePlacementGroup" not in pg_4_create_check_mode_idem.resource_actions'

- name: List all placement groups.
community.aws.ec2_placement_group_info:
register: all_ec2_placement_groups
Expand Down Expand Up @@ -397,6 +496,56 @@
- pg_3_delete_check_mode_idem is not changed
- '"ec2:DeletePlacementGroup" not in pg_3_delete_check_mode_idem.resource_actions'

- name: Delete a placement group 4 - check_mode
community.aws.ec2_placement_group:
name: '{{ resource_prefix }}-pg4'
state: absent
check_mode: true
register: pg_4_delete_check_mode
ignore_errors: true

- assert:
that:
- pg_4_delete_check_mode is not changed
- pg_4_delete_check_mode.error.code == 'DryRunOperation'
- '"ec2:DeletePlacementGroup" in pg_4_delete_check_mode.resource_actions'


- name: Delete a placement group 4
community.aws.ec2_placement_group:
name: '{{ resource_prefix }}-pg4'
state: absent
register: pg_4_delete

- assert:
that:
- pg_4_delete is changed
- '"ec2:DeletePlacementGroup" in pg_4_delete.resource_actions'

- name: Delete a placement group 4 - Idempotency
community.aws.ec2_placement_group:
name: '{{ resource_prefix }}-pg4'
state: absent
register: pg_4_delete

- assert:
that:
- pg_4_delete is not changed
- '"ec2:DeletePlacementGroup" not in pg_4_delete.resource_actions'

- name: Delete a placement group 4 - check_mode Idempotency
community.aws.ec2_placement_group:
name: '{{ resource_prefix }}-pg4'
state: absent
check_mode: true
register: pg_4_delete_check_mode_idem
ignore_errors: true

- assert:
that:
- pg_4_delete_check_mode_idem is not changed
- '"ec2:DeletePlacementGroup" not in pg_4_delete_check_mode_idem.resource_actions'

always:

- name: Make sure placement groups created during test are deleted
Expand Down

0 comments on commit 863b5fa

Please sign in to comment.