From df164f55cd01f7d6e425a7b313d019097c884c62 Mon Sep 17 00:00:00 2001 From: GomathiselviS Date: Fri, 4 Oct 2024 11:04:08 -0400 Subject: [PATCH 1/9] Add utils for ec2_placement_group --- .../add_utils_ec2_placement_group.yml | 2 ++ plugins/module_utils/ec2.py | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 changelogs/fragments/add_utils_ec2_placement_group.yml diff --git a/changelogs/fragments/add_utils_ec2_placement_group.yml b/changelogs/fragments/add_utils_ec2_placement_group.yml new file mode 100644 index 00000000000..59c2f935637 --- /dev/null +++ b/changelogs/fragments/add_utils_ec2_placement_group.yml @@ -0,0 +1,2 @@ +minor_changes: + - module_utils/ec2 - add utils for the ec2_placement_group* modules. diff --git a/plugins/module_utils/ec2.py b/plugins/module_utils/ec2.py index 9690e0d5cc8..ace952a24fc 100644 --- a/plugins/module_utils/ec2.py +++ b/plugins/module_utils/ec2.py @@ -1286,6 +1286,39 @@ def replace_network_acl_association(client, network_acl_id: str, association_id: ] +# EC2 Placement Group +class EC2PlacementGroupErrorHandler(AWSErrorHandler): + _CUSTOM_EXCEPTION = AnsibleEC2Error + + @classmethod + def _is_missing(cls): + return is_boto3_error_code("InvalidGroup.NotFound") + + +@EC2PlacementGroupErrorHandler.list_error_handler("describe placement group", []) +@AWSRetry.jittered_backoff() +def describe_placement_groups( + client, **params: Dict[str, Union[List[str], int, List[Dict[str, Union[str, List[str]]]]]] +) -> List[Dict[str, Any]]: + return client.describe_placement_groups(**params)["PlacementGroups"] + + +@EC2PlacementGroupErrorHandler.deletion_error_handler("delete placement group") +@AWSRetry.jittered_backoff() +def delete_security_group(client, group_name: Optional[str] = None) -> bool: + params = {} + if group_name: + params["GroupName"] = group_name + client.delete_placement_group(**params) + return True + + +@EC2PlacementGroupErrorHandler.common_error_handler("create placement group") +@AWSRetry.jittered_backoff() +def create_placement_group(client, **params: Dict[str, Union[str, EC2TagSpecifications]]) -> Dict[str, Any]: + return client.create_placement_group(**params) + + def get_ec2_security_group_ids_from_names(sec_group_list, ec2_connection, vpc_id=None, boto3=None): """Return list of security group IDs from security group names. Note that security group names are not unique across VPCs. If a name exists across multiple VPCs and no VPC ID is supplied, all matching IDs will be returned. This From 59953e9c1cc3ceb707ef20f82a0b4180d1628b6d Mon Sep 17 00:00:00 2001 From: GomathiselviS Date: Fri, 4 Oct 2024 11:11:19 -0400 Subject: [PATCH 2/9] Fix typo --- plugins/module_utils/ec2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/module_utils/ec2.py b/plugins/module_utils/ec2.py index ace952a24fc..2545c385628 100644 --- a/plugins/module_utils/ec2.py +++ b/plugins/module_utils/ec2.py @@ -1305,7 +1305,7 @@ def describe_placement_groups( @EC2PlacementGroupErrorHandler.deletion_error_handler("delete placement group") @AWSRetry.jittered_backoff() -def delete_security_group(client, group_name: Optional[str] = None) -> bool: +def delete_placement_group(client, group_name: Optional[str] = None) -> bool: params = {} if group_name: params["GroupName"] = group_name From b4cb42c8c7e0f7b14aab2702ee059229494c50b2 Mon Sep 17 00:00:00 2001 From: GomathiselviS Date: Fri, 4 Oct 2024 11:28:22 -0400 Subject: [PATCH 3/9] Changed error --- plugins/module_utils/ec2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/module_utils/ec2.py b/plugins/module_utils/ec2.py index 2545c385628..d073f7cd9b1 100644 --- a/plugins/module_utils/ec2.py +++ b/plugins/module_utils/ec2.py @@ -1292,7 +1292,7 @@ class EC2PlacementGroupErrorHandler(AWSErrorHandler): @classmethod def _is_missing(cls): - return is_boto3_error_code("InvalidGroup.NotFound") + return is_boto3_error_code("InvalidPlacementGroup.Unknown") @EC2PlacementGroupErrorHandler.list_error_handler("describe placement group", []) @@ -1316,7 +1316,7 @@ def delete_placement_group(client, group_name: Optional[str] = None) -> bool: @EC2PlacementGroupErrorHandler.common_error_handler("create placement group") @AWSRetry.jittered_backoff() def create_placement_group(client, **params: Dict[str, Union[str, EC2TagSpecifications]]) -> Dict[str, Any]: - return client.create_placement_group(**params) + return client.create_placement_group(**params)["PlacementGroups"] def get_ec2_security_group_ids_from_names(sec_group_list, ec2_connection, vpc_id=None, boto3=None): From 5d22f04875731465a00f03b8b8eedea4b3c608a2 Mon Sep 17 00:00:00 2001 From: GomathiselviS Date: Fri, 4 Oct 2024 13:17:03 -0400 Subject: [PATCH 4/9] Add dry run option --- plugins/module_utils/ec2.py | 16 ++++++++-------- plugins/module_utils/errors.py | 2 ++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/plugins/module_utils/ec2.py b/plugins/module_utils/ec2.py index d073f7cd9b1..440ffeb1953 100644 --- a/plugins/module_utils/ec2.py +++ b/plugins/module_utils/ec2.py @@ -1294,10 +1294,13 @@ class EC2PlacementGroupErrorHandler(AWSErrorHandler): def _is_missing(cls): return is_boto3_error_code("InvalidPlacementGroup.Unknown") + @classmethod + def _is_dry_run(cls): + return is_boto3_error_code("DryRunOperation") @EC2PlacementGroupErrorHandler.list_error_handler("describe placement group", []) @AWSRetry.jittered_backoff() -def describe_placement_groups( +def describe_ec2_placement_groups( client, **params: Dict[str, Union[List[str], int, List[Dict[str, Union[str, List[str]]]]]] ) -> List[Dict[str, Any]]: return client.describe_placement_groups(**params)["PlacementGroups"] @@ -1305,18 +1308,15 @@ def describe_placement_groups( @EC2PlacementGroupErrorHandler.deletion_error_handler("delete placement group") @AWSRetry.jittered_backoff() -def delete_placement_group(client, group_name: Optional[str] = None) -> bool: - params = {} - if group_name: - params["GroupName"] = group_name - client.delete_placement_group(**params) +def delete_ec2_placement_group(client, group_name: Optional[str] = None, dry_run: Optional[bool] = False) -> bool: + client.delete_placement_group(GroupName=group_name, DryRun=dry_run) return True @EC2PlacementGroupErrorHandler.common_error_handler("create placement group") @AWSRetry.jittered_backoff() -def create_placement_group(client, **params: Dict[str, Union[str, EC2TagSpecifications]]) -> Dict[str, Any]: - return client.create_placement_group(**params)["PlacementGroups"] +def create_ec2_placement_group(client, **params: Dict[str, Union[str, EC2TagSpecifications]]) -> Dict[str, Any]: + return client.create_placement_group(**params)["PlacementGroup"] def get_ec2_security_group_ids_from_names(sec_group_list, ec2_connection, vpc_id=None, boto3=None): diff --git a/plugins/module_utils/errors.py b/plugins/module_utils/errors.py index 38e9b380072..b99b0ecaa45 100644 --- a/plugins/module_utils/errors.py +++ b/plugins/module_utils/errors.py @@ -40,6 +40,8 @@ def wrapper(func): def handler(*args, **kwargs): try: return func(*args, **kwargs) + except cls._is_dry_run(): + return {"boto3_error_code": "DryRunOperation"} except botocore.exceptions.WaiterError as e: raise cls._CUSTOM_EXCEPTION(message=f"Timeout trying to {description}", exception=e) from e except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: From 46fc40603dee1c6a7c7df4e18037cc90cef09ee2 Mon Sep 17 00:00:00 2001 From: GomathiselviS Date: Fri, 4 Oct 2024 13:17:54 -0400 Subject: [PATCH 5/9] Addressed review comments --- plugins/module_utils/ec2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/module_utils/ec2.py b/plugins/module_utils/ec2.py index 440ffeb1953..c56b7c46caf 100644 --- a/plugins/module_utils/ec2.py +++ b/plugins/module_utils/ec2.py @@ -1308,7 +1308,7 @@ def describe_ec2_placement_groups( @EC2PlacementGroupErrorHandler.deletion_error_handler("delete placement group") @AWSRetry.jittered_backoff() -def delete_ec2_placement_group(client, group_name: Optional[str] = None, dry_run: Optional[bool] = False) -> bool: +def delete_ec2_placement_group(client, group_name: str, dry_run: Optional[bool] = False) -> bool: client.delete_placement_group(GroupName=group_name, DryRun=dry_run) return True From 5948589f64941fd9cdc7714d47f476e3cacd0836 Mon Sep 17 00:00:00 2001 From: GomathiselviS Date: Fri, 4 Oct 2024 15:18:12 -0400 Subject: [PATCH 6/9] Update changelogs/fragments/add_utils_ec2_placement_group.yml Co-authored-by: Bikouo Aubin <79859644+abikouo@users.noreply.github.com> --- changelogs/fragments/add_utils_ec2_placement_group.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/fragments/add_utils_ec2_placement_group.yml b/changelogs/fragments/add_utils_ec2_placement_group.yml index 59c2f935637..73c20b40f6c 100644 --- a/changelogs/fragments/add_utils_ec2_placement_group.yml +++ b/changelogs/fragments/add_utils_ec2_placement_group.yml @@ -1,2 +1,2 @@ minor_changes: - - module_utils/ec2 - add utils for the ec2_placement_group* modules. + - module_utils/ec2 - add utils for the ec2_placement_group* modules (https://github.com/ansible-collections/amazon.aws/pull/2322). From cab0f46e45b9989e73b25d9d64b828847fee6496 Mon Sep 17 00:00:00 2001 From: GomathiselviS Date: Tue, 8 Oct 2024 10:43:02 -0400 Subject: [PATCH 7/9] Linters fix --- plugins/module_utils/ec2.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/module_utils/ec2.py b/plugins/module_utils/ec2.py index c56b7c46caf..289e106005e 100644 --- a/plugins/module_utils/ec2.py +++ b/plugins/module_utils/ec2.py @@ -1298,6 +1298,7 @@ def _is_missing(cls): def _is_dry_run(cls): return is_boto3_error_code("DryRunOperation") + @EC2PlacementGroupErrorHandler.list_error_handler("describe placement group", []) @AWSRetry.jittered_backoff() def describe_ec2_placement_groups( From b599b6ee2f3a415bad5e7b4500004c772ca5fe54 Mon Sep 17 00:00:00 2001 From: GomathiselviS Date: Wed, 9 Oct 2024 13:14:54 -0400 Subject: [PATCH 8/9] remove dry_run --- plugins/module_utils/ec2.py | 8 ++------ plugins/module_utils/errors.py | 2 -- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/plugins/module_utils/ec2.py b/plugins/module_utils/ec2.py index 289e106005e..26b15ea6ea1 100644 --- a/plugins/module_utils/ec2.py +++ b/plugins/module_utils/ec2.py @@ -1294,10 +1294,6 @@ class EC2PlacementGroupErrorHandler(AWSErrorHandler): def _is_missing(cls): return is_boto3_error_code("InvalidPlacementGroup.Unknown") - @classmethod - def _is_dry_run(cls): - return is_boto3_error_code("DryRunOperation") - @EC2PlacementGroupErrorHandler.list_error_handler("describe placement group", []) @AWSRetry.jittered_backoff() @@ -1309,8 +1305,8 @@ def describe_ec2_placement_groups( @EC2PlacementGroupErrorHandler.deletion_error_handler("delete placement group") @AWSRetry.jittered_backoff() -def delete_ec2_placement_group(client, group_name: str, dry_run: Optional[bool] = False) -> bool: - client.delete_placement_group(GroupName=group_name, DryRun=dry_run) +def delete_ec2_placement_group(client, group_name: str) -> bool: + client.delete_placement_group(GroupName=group_name) return True diff --git a/plugins/module_utils/errors.py b/plugins/module_utils/errors.py index b99b0ecaa45..38e9b380072 100644 --- a/plugins/module_utils/errors.py +++ b/plugins/module_utils/errors.py @@ -40,8 +40,6 @@ def wrapper(func): def handler(*args, **kwargs): try: return func(*args, **kwargs) - except cls._is_dry_run(): - return {"boto3_error_code": "DryRunOperation"} except botocore.exceptions.WaiterError as e: raise cls._CUSTOM_EXCEPTION(message=f"Timeout trying to {description}", exception=e) from e except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: From dfee0c667be5319a59dc4b858da147f72514e9fc Mon Sep 17 00:00:00 2001 From: GomathiselviS Date: Fri, 11 Oct 2024 14:36:08 -0400 Subject: [PATCH 9/9] Disable a.aws placemnet_options integration test --- .../integration/targets/ec2_instance_placement_options/aliases | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/integration/targets/ec2_instance_placement_options/aliases b/tests/integration/targets/ec2_instance_placement_options/aliases index 7497e801170..5c09dfb96ab 100644 --- a/tests/integration/targets/ec2_instance_placement_options/aliases +++ b/tests/integration/targets/ec2_instance_placement_options/aliases @@ -1,6 +1,8 @@ time=10m cloud/aws +# This test will be replaced by the target in community.aws after migration +disabled ec2_instance_info ec2_instance