-
Notifications
You must be signed in to change notification settings - Fork 397
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Prepare ec2_placement_group* module for promotion #2167
Changes from 4 commits
f85b1c5
8a96512
736a31a
44896dc
5483030
026123d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
minor_changes: | ||
- ec2_placement_group - Refactor module to use shared code from ``amazon.aws.plugins.module_utils.ec2`` and update ``RETURN`` block (https://github.com/ansible-collections/community.aws/pull/2167). |
Original file line number | Diff line number | Diff line change | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -25,8 +25,8 @@ | |||||||||||||||||
partition_count: | ||||||||||||||||||
description: | ||||||||||||||||||
- The number of partitions. | ||||||||||||||||||
- Valid only when I(Strategy) is set to C(partition). | ||||||||||||||||||
- Must be a value between C(1) and C(7). | ||||||||||||||||||
- Valid only when O(strategy) is set to V(partition). | ||||||||||||||||||
- Must be a value between V(1) and V(7). | ||||||||||||||||||
type: int | ||||||||||||||||||
version_added: 3.1.0 | ||||||||||||||||||
state: | ||||||||||||||||||
|
@@ -86,7 +86,7 @@ | |||||||||||||||||
placement_group: | ||||||||||||||||||
description: Placement group attributes | ||||||||||||||||||
returned: when state != absent | ||||||||||||||||||
type: complex | ||||||||||||||||||
type: dict | ||||||||||||||||||
contains: | ||||||||||||||||||
name: | ||||||||||||||||||
description: PG name | ||||||||||||||||||
|
@@ -110,34 +110,28 @@ | |||||||||||||||||
other: value2 | ||||||||||||||||||
""" | ||||||||||||||||||
|
||||||||||||||||||
try: | ||||||||||||||||||
import botocore | ||||||||||||||||||
except ImportError: | ||||||||||||||||||
pass # caught by AnsibleAWSModule | ||||||||||||||||||
from typing import Any | ||||||||||||||||||
from typing import Dict | ||||||||||||||||||
|
||||||||||||||||||
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.ec2 import create_ec2_placement_group | ||||||||||||||||||
from ansible_collections.amazon.aws.plugins.module_utils.ec2 import delete_ec2_placement_group | ||||||||||||||||||
from ansible_collections.amazon.aws.plugins.module_utils.ec2 import describe_ec2_placement_groups | ||||||||||||||||||
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 | ||||||||||||||||||
|
||||||||||||||||||
|
||||||||||||||||||
@AWSRetry.exponential_backoff() | ||||||||||||||||||
def search_placement_group(connection, module): | ||||||||||||||||||
def search_placement_group(connection, name: str) -> Dict[str, Any]: | ||||||||||||||||||
""" | ||||||||||||||||||
Check if a placement group exists. | ||||||||||||||||||
""" | ||||||||||||||||||
name = module.params.get("name") | ||||||||||||||||||
try: | ||||||||||||||||||
response = connection.describe_placement_groups(Filters=[{"Name": "group-name", "Values": [name]}]) | ||||||||||||||||||
except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: | ||||||||||||||||||
module.fail_json_aws(e, msg=f"Couldn't find placement group named [{name}]") | ||||||||||||||||||
response = describe_ec2_placement_groups(connection, Filters=[{"Name": "group-name", "Values": [name]}]) | ||||||||||||||||||
|
||||||||||||||||||
if len(response["PlacementGroups"]) != 1: | ||||||||||||||||||
if len(response) != 1: | ||||||||||||||||||
return None | ||||||||||||||||||
else: | ||||||||||||||||||
placement_group = response["PlacementGroups"][0] | ||||||||||||||||||
placement_group = response[0] | ||||||||||||||||||
return { | ||||||||||||||||||
"name": placement_group["GroupName"], | ||||||||||||||||||
"state": placement_group["State"], | ||||||||||||||||||
|
@@ -146,13 +140,12 @@ def search_placement_group(connection, module): | |||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
|
||||||||||||||||||
@AWSRetry.exponential_backoff(catch_extra_error_codes=["InvalidPlacementGroup.Unknown"]) | ||||||||||||||||||
def get_placement_group_information(connection, name): | ||||||||||||||||||
def get_placement_group_information(connection, name: str) -> Dict[str, Any]: | ||||||||||||||||||
""" | ||||||||||||||||||
Retrieve information about a placement group. | ||||||||||||||||||
""" | ||||||||||||||||||
response = connection.describe_placement_groups(GroupNames=[name]) | ||||||||||||||||||
placement_group = response["PlacementGroups"][0] | ||||||||||||||||||
response = describe_ec2_placement_groups(connection, GroupNames=[name]) | ||||||||||||||||||
placement_group = response[0] | ||||||||||||||||||
return { | ||||||||||||||||||
"name": placement_group["GroupName"], | ||||||||||||||||||
"state": placement_group["State"], | ||||||||||||||||||
|
@@ -161,8 +154,7 @@ def get_placement_group_information(connection, name): | |||||||||||||||||
} | ||||||||||||||||||
|
||||||||||||||||||
|
||||||||||||||||||
@AWSRetry.exponential_backoff() | ||||||||||||||||||
def create_placement_group(connection, module): | ||||||||||||||||||
def create_placement_group(connection, module: AnsibleAWSModule) -> None: | ||||||||||||||||||
name = module.params.get("name") | ||||||||||||||||||
strategy = module.params.get("strategy") | ||||||||||||||||||
tags = module.params.get("tags") | ||||||||||||||||||
|
@@ -178,38 +170,26 @@ def create_placement_group(connection, module): | |||||||||||||||||
params["TagSpecifications"] = boto3_tag_specifications(tags, types=["placement-group"]) | ||||||||||||||||||
if partition_count: | ||||||||||||||||||
params["PartitionCount"] = partition_count | ||||||||||||||||||
params["DryRun"] = module.check_mode | ||||||||||||||||||
|
||||||||||||||||||
try: | ||||||||||||||||||
connection.create_placement_group(**params) | ||||||||||||||||||
except is_boto3_error_code("DryRunOperation"): | ||||||||||||||||||
if module.check_mode: | ||||||||||||||||||
module.exit_json( | ||||||||||||||||||
changed=True, | ||||||||||||||||||
placement_group={ | ||||||||||||||||||
"name": name, | ||||||||||||||||||
"state": "DryRun", | ||||||||||||||||||
"strategy": strategy, | ||||||||||||||||||
"tags": tags, | ||||||||||||||||||
}, | ||||||||||||||||||
msg="EC2 placement group would be created if not in check mode", | ||||||||||||||||||
) | ||||||||||||||||||
except ( | ||||||||||||||||||
botocore.exceptions.ClientError, | ||||||||||||||||||
botocore.exceptions.BotoCoreError, | ||||||||||||||||||
) as e: # pylint: disable=duplicate-except | ||||||||||||||||||
module.fail_json_aws(e, msg=f"Couldn't create placement group [{name}]") | ||||||||||||||||||
|
||||||||||||||||||
response = create_ec2_placement_group(connection, **params) | ||||||||||||||||||
module.exit_json(changed=True, placement_group=get_placement_group_information(connection, name)) | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
The call to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @GomathiselviS this change was not adressed There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||||||||||||||
|
||||||||||||||||||
|
||||||||||||||||||
@AWSRetry.exponential_backoff() | ||||||||||||||||||
def delete_placement_group(connection, module): | ||||||||||||||||||
def delete_placement_group(connection, module: AnsibleAWSModule) -> None: | ||||||||||||||||||
if module.check_mode: | ||||||||||||||||||
module.exit_json(changed=True, msg="VPC would be deleted if not in check mode") | ||||||||||||||||||
name = module.params.get("name") | ||||||||||||||||||
|
||||||||||||||||||
try: | ||||||||||||||||||
connection.delete_placement_group(GroupName=name, DryRun=module.check_mode) | ||||||||||||||||||
except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: | ||||||||||||||||||
module.fail_json_aws(e, msg=f"Couldn't delete placement group [{name}]") | ||||||||||||||||||
|
||||||||||||||||||
delete_ec2_placement_group(connection, name) | ||||||||||||||||||
abikouo marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||
module.exit_json(changed=True) | ||||||||||||||||||
|
||||||||||||||||||
|
||||||||||||||||||
|
@@ -227,9 +207,10 @@ def main(): | |||||||||||||||||
connection = module.client("ec2") | ||||||||||||||||||
|
||||||||||||||||||
state = module.params.get("state") | ||||||||||||||||||
name = module.params.get("name") | ||||||||||||||||||
placement_group = search_placement_group(connection, name) | ||||||||||||||||||
|
||||||||||||||||||
if state == "present": | ||||||||||||||||||
placement_group = search_placement_group(connection, module) | ||||||||||||||||||
if placement_group is None: | ||||||||||||||||||
create_placement_group(connection, module) | ||||||||||||||||||
else: | ||||||||||||||||||
|
@@ -243,7 +224,6 @@ def main(): | |||||||||||||||||
) | ||||||||||||||||||
|
||||||||||||||||||
elif state == "absent": | ||||||||||||||||||
placement_group = search_placement_group(connection, module) | ||||||||||||||||||
if placement_group is None: | ||||||||||||||||||
module.exit_json(changed=False) | ||||||||||||||||||
else: | ||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You should test that the response is not empty
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The search for an existing placement group is handled in the main logic. Therefore, this function is called only after successfully creating the placement group. As a result, the response will never be empty whenever this function is invoked.