From afe1611e511f6d9e0f9607c8adb38c94f7b401ae Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Mon, 19 Oct 2020 12:14:22 +0200 Subject: [PATCH 01/11] Reorder imports --- plugins/modules/aws_glue_connection.py | 3 ++- plugins/modules/aws_glue_job.py | 8 +++--- plugins/modules/aws_ssm_parameter_store.py | 4 +-- plugins/modules/aws_waf_condition.py | 11 +++++--- plugins/modules/cloudfront_invalidation.py | 9 ++++--- plugins/modules/ec2_instance.py | 1 + plugins/modules/ec2_placement_group.py | 5 ++-- plugins/modules/ec2_transit_gateway_info.py | 10 +++---- plugins/modules/ec2_vpc_egress_igw.py | 7 +++-- plugins/modules/ec2_vpc_nacl_info.py | 9 +++---- plugins/modules/ec2_vpc_route_table.py | 17 +++++++----- plugins/modules/efs.py | 9 +++---- plugins/modules/elb_target_group.py | 4 +-- plugins/modules/iam_group.py | 8 +++--- plugins/modules/iam_policy_info.py | 2 ++ plugins/modules/iam_role.py | 16 +++++------ plugins/modules/iam_role_info.py | 4 ++- plugins/modules/lambda_facts.py | 7 +++-- plugins/modules/lambda_info.py | 7 +++-- plugins/modules/rds_instance.py | 30 +++++++++++---------- plugins/modules/sqs_queue.py | 14 +++++----- 21 files changed, 98 insertions(+), 87 deletions(-) diff --git a/plugins/modules/aws_glue_connection.py b/plugins/modules/aws_glue_connection.py index 0df4ab915d1..49011f9cb66 100644 --- a/plugins/modules/aws_glue_connection.py +++ b/plugins/modules/aws_glue_connection.py @@ -131,7 +131,8 @@ ''' from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict, get_ec2_security_group_ids_from_names +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import get_ec2_security_group_ids_from_names # Non-ansible imports import copy diff --git a/plugins/modules/aws_glue_job.py b/plugins/modules/aws_glue_job.py index 1d991f52f41..192969415e6 100644 --- a/plugins/modules/aws_glue_job.py +++ b/plugins/modules/aws_glue_job.py @@ -185,15 +185,15 @@ sample: 300 ''' -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict - # Non-ansible imports import copy try: from botocore.exceptions import BotoCoreError, ClientError except ImportError: - pass + pass # Handled by AnsibleAWSModule + +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict def _get_glue_job(connection, module, glue_job_name): diff --git a/plugins/modules/aws_ssm_parameter_store.py b/plugins/modules/aws_ssm_parameter_store.py index 32c1df62536..00ffe046046 100644 --- a/plugins/modules/aws_ssm_parameter_store.py +++ b/plugins/modules/aws_ssm_parameter_store.py @@ -127,13 +127,13 @@ type: dict ''' -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule - try: from botocore.exceptions import ClientError except ImportError: pass # Handled by AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule + def update_parameter(client, module, args): changed = False diff --git a/plugins/modules/aws_waf_condition.py b/plugins/modules/aws_waf_condition.py index 006caaad7cd..3a3083dcd23 100644 --- a/plugins/modules/aws_waf_condition.py +++ b/plugins/modules/aws_waf_condition.py @@ -403,9 +403,14 @@ pass # handled by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict, AWSRetry, compare_policies -from ansible_collections.amazon.aws.plugins.module_utils.waf import run_func_with_change_token_backoff, MATCH_LOOKUP -from ansible_collections.amazon.aws.plugins.module_utils.waf import get_rule_with_backoff, list_rules_with_backoff, list_regional_rules_with_backoff +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_policies +from ansible_collections.amazon.aws.plugins.module_utils.waf import MATCH_LOOKUP +from ansible_collections.amazon.aws.plugins.module_utils.waf import run_func_with_change_token_backoff +from ansible_collections.amazon.aws.plugins.module_utils.waf import get_rule_with_backoff +from ansible_collections.amazon.aws.plugins.module_utils.waf import list_regional_rules_with_backoff +from ansible_collections.amazon.aws.plugins.module_utils.waf import list_rules_with_backoff class Condition(object): diff --git a/plugins/modules/cloudfront_invalidation.py b/plugins/modules/cloudfront_invalidation.py index 52e3aea1873..3bed7fff920 100644 --- a/plugins/modules/cloudfront_invalidation.py +++ b/plugins/modules/cloudfront_invalidation.py @@ -136,10 +136,6 @@ sample: https://cloudfront.amazonaws.com/2017-03-25/distribution/E1ZID6KZJECZY7/invalidation/I2G9MOWJZFV622 ''' -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import snake_dict_to_camel_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.cloudfront_facts import CloudFrontFactsServiceManager import datetime try: @@ -147,6 +143,11 @@ except ImportError: pass # caught by imported AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import snake_dict_to_camel_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict +from ansible_collections.amazon.aws.plugins.module_utils.cloudfront_facts import CloudFrontFactsServiceManager + class CloudFrontInvalidationServiceManager(object): """ diff --git a/plugins/modules/ec2_instance.py b/plugins/modules/ec2_instance.py index a13b00c680b..96f5cf29d44 100644 --- a/plugins/modules/ec2_instance.py +++ b/plugins/modules/ec2_instance.py @@ -813,6 +813,7 @@ from ansible.module_utils.six import string_types from ansible.module_utils.six.moves.urllib import parse as urlparse +import ansible_collections.amazon.aws.plugins.module_utils.ec2 as ec2_utils from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list diff --git a/plugins/modules/ec2_placement_group.py b/plugins/modules/ec2_placement_group.py index 7d9a8004544..17a701de016 100644 --- a/plugins/modules/ec2_placement_group.py +++ b/plugins/modules/ec2_placement_group.py @@ -87,13 +87,14 @@ ''' -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry try: from botocore.exceptions import (BotoCoreError, ClientError) except ImportError: pass # caught by AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry + @AWSRetry.exponential_backoff() def get_placement_group_details(connection, module): diff --git a/plugins/modules/ec2_transit_gateway_info.py b/plugins/modules/ec2_transit_gateway_info.py index 2eacf01cd96..fb820ce62b6 100644 --- a/plugins/modules/ec2_transit_gateway_info.py +++ b/plugins/modules/ec2_transit_gateway_info.py @@ -170,12 +170,10 @@ pass # handled by imported AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ( - AWSRetry, - boto3_tag_list_to_ansible_dict, - camel_dict_to_snake_dict, - ansible_dict_to_boto3_filter_list -) +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict class AnsibleEc2TgwInfo(object): diff --git a/plugins/modules/ec2_vpc_egress_igw.py b/plugins/modules/ec2_vpc_egress_igw.py index d462696d0af..df1826e0219 100644 --- a/plugins/modules/ec2_vpc_egress_igw.py +++ b/plugins/modules/ec2_vpc_egress_igw.py @@ -57,15 +57,14 @@ sample: vpc-012345678 ''' - -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict - try: import botocore except ImportError: pass # caught by AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict + def delete_eigw(module, conn, eigw_id): """ diff --git a/plugins/modules/ec2_vpc_nacl_info.py b/plugins/modules/ec2_vpc_nacl_info.py index 1e42e486cea..52729451ff7 100644 --- a/plugins/modules/ec2_vpc_nacl_info.py +++ b/plugins/modules/ec2_vpc_nacl_info.py @@ -110,11 +110,10 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import (AWSRetry, - ansible_dict_to_boto3_filter_list, - camel_dict_to_snake_dict, - boto3_tag_list_to_ansible_dict, - ) +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict # VPC-supported IANA protocol numbers diff --git a/plugins/modules/ec2_vpc_route_table.py b/plugins/modules/ec2_vpc_route_table.py index ca5d586b2e7..ea5b3ddda35 100644 --- a/plugins/modules/ec2_vpc_route_table.py +++ b/plugins/modules/ec2_vpc_route_table.py @@ -226,19 +226,22 @@ import re from time import sleep -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.waiters import get_waiter -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict, snake_dict_to_camel_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list, boto3_tag_list_to_ansible_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags, AWSRetry - try: import botocore except ImportError: pass # caught by AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import snake_dict_to_camel_dict +from ansible_collections.amazon.aws.plugins.module_utils.waiters import get_waiter + CIDR_RE = re.compile(r'^(\d{1,3}\.){3}\d{1,3}/\d{1,2}$') SUBNET_RE = re.compile(r'^subnet-[A-z0-9]+$') diff --git a/plugins/modules/efs.py b/plugins/modules/efs.py index 56ec6980e56..d1d2d14a8a2 100644 --- a/plugins/modules/efs.py +++ b/plugins/modules/efs.py @@ -235,11 +235,10 @@ pass # Handled by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import (compare_aws_tags, - camel_dict_to_snake_dict, - ansible_dict_to_boto3_tag_list, - boto3_tag_list_to_ansible_dict, - ) +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags def _index_by_key(key, items): diff --git a/plugins/modules/elb_target_group.py b/plugins/modules/elb_target_group.py index e6c94f06286..241b722b5e0 100644 --- a/plugins/modules/elb_target_group.py +++ b/plugins/modules/elb_target_group.py @@ -381,11 +381,11 @@ from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list def get_tg_attributes(connection, module, tg_arn): diff --git a/plugins/modules/iam_group.py b/plugins/modules/iam_group.py index b55e32218a2..45b6eb1d5ed 100644 --- a/plugins/modules/iam_group.py +++ b/plugins/modules/iam_group.py @@ -177,15 +177,15 @@ sample: / ''' -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry - try: from botocore.exceptions import BotoCoreError, ClientError except ImportError: pass # caught by AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry + def compare_attached_group_policies(current_attached_policies, new_attached_policies): diff --git a/plugins/modules/iam_policy_info.py b/plugins/modules/iam_policy_info.py index e934e09a621..1e670054a43 100644 --- a/plugins/modules/iam_policy_info.py +++ b/plugins/modules/iam_policy_info.py @@ -82,6 +82,8 @@ except ImportError: pass +from ansible.module_utils.six import string_types + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry diff --git a/plugins/modules/iam_role.py b/plugins/modules/iam_role.py index 9a2eaca8cfe..089d6168e8e 100644 --- a/plugins/modules/iam_role.py +++ b/plugins/modules/iam_role.py @@ -194,19 +194,19 @@ import json -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict, compare_policies -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import (AWSRetry, - ansible_dict_to_boto3_tag_list, - boto3_tag_list_to_ansible_dict, - compare_aws_tags, - ) - try: from botocore.exceptions import ClientError, BotoCoreError except ImportError: pass # caught by AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_policies + def compare_assume_role_policy_doc(current_policy_doc, new_policy_doc): if not compare_policies(current_policy_doc, json.loads(new_policy_doc)): diff --git a/plugins/modules/iam_role_info.py b/plugins/modules/iam_role_info.py index 95eabdb95ab..197ef9149f5 100644 --- a/plugins/modules/iam_role_info.py +++ b/plugins/modules/iam_role_info.py @@ -153,7 +153,9 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict, camel_dict_to_snake_dict, AWSRetry +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @AWSRetry.exponential_backoff() diff --git a/plugins/modules/lambda_facts.py b/plugins/modules/lambda_facts.py index 4c02947c998..599611531ff 100644 --- a/plugins/modules/lambda_facts.py +++ b/plugins/modules/lambda_facts.py @@ -88,20 +88,19 @@ returned: success type: dict ''' - -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict import json import datetime import sys import re - try: from botocore.exceptions import ClientError except ImportError: pass # caught by AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict + def fix_return(node): """ diff --git a/plugins/modules/lambda_info.py b/plugins/modules/lambda_info.py index 1e40aec4ca1..59f3e98c0cc 100644 --- a/plugins/modules/lambda_info.py +++ b/plugins/modules/lambda_info.py @@ -78,19 +78,18 @@ returned: success type: dict ''' - -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict import json import datetime import re - try: from botocore.exceptions import ClientError except ImportError: pass # caught by AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict + def fix_return(node): """ diff --git a/plugins/modules/rds_instance.py b/plugins/modules/rds_instance.py index 169ace0e2fa..5c91638e8a8 100644 --- a/plugins/modules/rds_instance.py +++ b/plugins/modules/rds_instance.py @@ -745,20 +745,6 @@ sample: sg-12345678 ''' -from ansible.module_utils._text import to_text -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule, is_boto3_error_code, get_boto3_client_method_parameters -from ansible_collections.amazon.aws.plugins.module_utils.rds import ( - arg_spec_to_rds_params, - call_method, - ensure_tags, - get_final_identifier, - get_rds_method_attribute, - get_tags, -) -from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list, AWSRetry -from ansible.module_utils.six import string_types - from time import sleep try: @@ -766,6 +752,22 @@ except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils._text import to_text +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict +from ansible.module_utils.six import string_types + +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code +from ansible_collections.amazon.aws.plugins.module_utils.core import get_boto3_client_method_parameters +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry +from ansible_collections.amazon.aws.plugins.module_utils.rds import arg_spec_to_rds_params +from ansible_collections.amazon.aws.plugins.module_utils.rds import call_method +from ansible_collections.amazon.aws.plugins.module_utils.rds import ensure_tags +from ansible_collections.amazon.aws.plugins.module_utils.rds import get_final_identifier +from ansible_collections.amazon.aws.plugins.module_utils.rds import get_rds_method_attribute +from ansible_collections.amazon.aws.plugins.module_utils.rds import get_tags + def get_rds_method_attribute_name(instance, state, creation_source, read_replica): method_name = None diff --git a/plugins/modules/sqs_queue.py b/plugins/modules/sqs_queue.py index 5d65967974a..d64192dfc54 100644 --- a/plugins/modules/sqs_queue.py +++ b/plugins/modules/sqs_queue.py @@ -220,19 +220,19 @@ ''' import json -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import (AWSRetry, - camel_dict_to_snake_dict, - compare_aws_tags, - snake_dict_to_camel_dict, - compare_policies, - ) try: from botocore.exceptions import BotoCoreError, ClientError, ParamValidationError except ImportError: pass # handled by AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_policies +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import snake_dict_to_camel_dict + def get_queue_name(module, is_fifo=False): name = module.params.get('name') From fca1e54ea3b96d5976a9df167c37731a3ce2bb6a Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Mon, 19 Oct 2020 12:16:18 +0200 Subject: [PATCH 02/11] Make use of is_boto3_error_message --- plugins/modules/aws_elasticbeanstalk_app.py | 10 ++++------ plugins/modules/cloudfront_invalidation.py | 16 +++++++--------- plugins/modules/ec2_instance.py | 16 +++++++--------- plugins/modules/rds_instance.py | 8 +++----- 4 files changed, 21 insertions(+), 29 deletions(-) diff --git a/plugins/modules/aws_elasticbeanstalk_app.py b/plugins/modules/aws_elasticbeanstalk_app.py index bab889f0b07..c625fcd810f 100644 --- a/plugins/modules/aws_elasticbeanstalk_app.py +++ b/plugins/modules/aws_elasticbeanstalk_app.py @@ -90,6 +90,7 @@ pass # handled by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_message def describe_app(ebs, app_name, module): @@ -208,13 +209,10 @@ def main(): else: ebs.delete_application(ApplicationName=app_name) changed = True - except BotoCoreError as e: + except is_boto3_error_message('It is currently pending deletion'): + changed = False + except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Cannot terminate app") - except ClientError as e: - if 'It is currently pending deletion.' not in e.response['Error']['Message']: - module.fail_json_aws(e, msg="Cannot terminate app") - else: - changed = False result = dict(changed=changed, app=app) diff --git a/plugins/modules/cloudfront_invalidation.py b/plugins/modules/cloudfront_invalidation.py index 3bed7fff920..99d1436da49 100644 --- a/plugins/modules/cloudfront_invalidation.py +++ b/plugins/modules/cloudfront_invalidation.py @@ -144,6 +144,7 @@ pass # caught by imported AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_message from ansible_collections.amazon.aws.plugins.module_utils.ec2 import snake_dict_to_camel_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.cloudfront_facts import CloudFrontFactsServiceManager @@ -167,16 +168,13 @@ def create_invalidation(self, distribution_id, invalidation_batch): return response, False else: return response, True - except BotoCoreError as e: + except is_boto3_error_message('Your request contains a caller reference that was used for a previous invalidation ' + 'batch for the same distribution.'): + self.module.warn("InvalidationBatch target paths are not modifiable. " + "To make a new invalidation please update caller_reference.") + return current_invalidation_response, False + except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except self.module.fail_json_aws(e, msg="Error creating CloudFront invalidations.") - except ClientError as e: - if ('Your request contains a caller reference that was used for a previous invalidation batch ' - 'for the same distribution.' in e.response['Error']['Message']): - self.module.warn("InvalidationBatch target paths are not modifiable. " - "To make a new invalidation please update caller_reference.") - return current_invalidation_response, False - else: - self.module.fail_json_aws(e, msg="Error creating CloudFront invalidations.") def get_invalidation(self, distribution_id, caller_reference): current_invalidation = {} diff --git a/plugins/modules/ec2_instance.py b/plugins/modules/ec2_instance.py index 96f5cf29d44..c16b6b6437a 100644 --- a/plugins/modules/ec2_instance.py +++ b/plugins/modules/ec2_instance.py @@ -815,6 +815,7 @@ import ansible_collections.amazon.aws.plugins.module_utils.ec2 as ec2_utils from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_message from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list @@ -1698,15 +1699,12 @@ def ensure_present(existing_matches, changed, ec2, state): def run_instances(ec2, **instance_spec): try: - return ec2.run_instances(aws_retry=True, **instance_spec) - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'InvalidParameterValue' and "Invalid IAM Instance Profile ARN" in e.response['Error']['Message']: - # If the instance profile has just been created, it takes some time to be visible by ec2 - # So we wait 10 second and retry the run_instances - time.sleep(10) - return ec2.run_instances(**instance_spec) - else: - raise e + return ec2.run_instances(**instance_spec) + except is_boto3_error_message('Invalid IAM Instance Profile ARN'): + # If the instance profile has just been created, it takes some time to be visible by ec2 + # So we wait 10 second and retry the run_instances + time.sleep(10) + return ec2.run_instances(**instance_spec) def main(): diff --git a/plugins/modules/rds_instance.py b/plugins/modules/rds_instance.py index 5c91638e8a8..0dd763c369f 100644 --- a/plugins/modules/rds_instance.py +++ b/plugins/modules/rds_instance.py @@ -758,6 +758,7 @@ from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_message from ansible_collections.amazon.aws.plugins.module_utils.core import get_boto3_client_method_parameters from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry @@ -1036,11 +1037,8 @@ def promote_replication_instance(client, module, instance, read_replica): try: call_method(client, module, method_name='promote_read_replica', parameters={'DBInstanceIdentifier': instance['DBInstanceIdentifier']}) changed = True - except is_boto3_error_code('InvalidDBInstanceState') as e: - if 'DB Instance is not a read replica' in e.response['Error']['Message']: - pass - else: - raise e + except is_boto3_error_message('DB Instance is not a read replica'): + pass return changed From 2c9f3d05703a7f177906e636e7dd38a9b187464a Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Mon, 19 Oct 2020 17:05:22 +0200 Subject: [PATCH 03/11] Mass-migration over to is_boto3_error_code --- plugins/modules/aws_glue_connection.py | 8 +-- plugins/modules/aws_glue_job.py | 10 ++-- plugins/modules/aws_kms_info.py | 20 +++---- plugins/modules/aws_ssm_parameter_store.py | 7 ++- ..._step_functions_state_machine_execution.py | 9 +-- plugins/modules/aws_waf_condition.py | 7 ++- plugins/modules/cloudwatchevent_rule.py | 19 +++---- plugins/modules/data_pipeline.py | 6 +- plugins/modules/ec2_asg.py | 19 +++---- plugins/modules/ec2_asg_info.py | 10 ++-- plugins/modules/ec2_instance.py | 21 ++++--- plugins/modules/ec2_placement_group.py | 15 ++--- plugins/modules/ec2_transit_gateway_info.py | 9 ++- plugins/modules/ec2_vpc_egress_igw.py | 25 +++------ plugins/modules/ec2_vpc_nacl_info.py | 9 ++- plugins/modules/ec2_vpc_route_table.py | 8 +-- plugins/modules/ecs_ecr.py | 22 +++----- plugins/modules/ecs_service_info.py | 8 +-- plugins/modules/efs.py | 5 +- plugins/modules/elasticache.py | 14 ++--- plugins/modules/elasticache_info.py | 9 +-- plugins/modules/elasticache_snapshot.py | 29 +++++----- plugins/modules/execute_lambda.py | 13 +++-- plugins/modules/iam_group.py | 15 ++--- plugins/modules/iam_managed_policy.py | 19 +++---- plugins/modules/iam_password_policy.py | 10 ++-- plugins/modules/iam_policy_info.py | 7 ++- plugins/modules/iam_role.py | 19 +++---- plugins/modules/iam_role_info.py | 10 ++-- plugins/modules/iam_user.py | 29 +++++----- plugins/modules/lambda_alias.py | 21 ++++--- plugins/modules/lambda_facts.py | 55 +++++++++---------- plugins/modules/lambda_info.py | 55 +++++++++---------- plugins/modules/lambda_policy.py | 23 ++++---- plugins/modules/lightsail.py | 9 ++- plugins/modules/rds_param_group.py | 19 +++---- plugins/modules/s3_lifecycle.py | 19 +++---- plugins/modules/sqs_queue.py | 7 +-- 38 files changed, 275 insertions(+), 344 deletions(-) diff --git a/plugins/modules/aws_glue_connection.py b/plugins/modules/aws_glue_connection.py index 49011f9cb66..b0ad6c17fd4 100644 --- a/plugins/modules/aws_glue_connection.py +++ b/plugins/modules/aws_glue_connection.py @@ -131,6 +131,7 @@ ''' from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import get_ec2_security_group_ids_from_names @@ -161,11 +162,8 @@ def _get_glue_connection(connection, module): try: return connection.get_connection(**params)['Connection'] - except (BotoCoreError, ClientError) as e: - if e.response['Error']['Code'] == 'EntityNotFoundException': - return None - else: - raise e + except is_boto3_error_code('EntityNotFoundException'): + return None def _compare_glue_connection_params(user_params, current_params): diff --git a/plugins/modules/aws_glue_job.py b/plugins/modules/aws_glue_job.py index 192969415e6..50336de29a1 100644 --- a/plugins/modules/aws_glue_job.py +++ b/plugins/modules/aws_glue_job.py @@ -193,6 +193,7 @@ pass # Handled by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @@ -208,11 +209,10 @@ def _get_glue_job(connection, module, glue_job_name): try: return connection.get_job(JobName=glue_job_name)['Job'] - except (BotoCoreError, ClientError) as e: - if e.response['Error']['Code'] == 'EntityNotFoundException': - return None - else: - module.fail_json_aws(e) + except is_boto3_error_code('EntityNotFoundException'): + return None + except (BotoCoreError, ClientError) as e: # pylint: disable=duplicate-except + module.fail_json_aws(e) def _compare_glue_job_params(user_params, current_params): diff --git a/plugins/modules/aws_kms_info.py b/plugins/modules/aws_kms_info.py index 978ed804ec2..2366c5d0f45 100644 --- a/plugins/modules/aws_kms_info.py +++ b/plugins/modules/aws_kms_info.py @@ -290,7 +290,7 @@ def get_key_policy_with_backoff(connection, key_id, policy_name): def get_enable_key_rotation_with_backoff(connection, key_id): try: current_rotation_status = connection.get_key_rotation_status(KeyId=key_id) - except is_boto3_error_code('AccessDeniedException') as e: + except is_boto3_error_code('AccessDeniedException'): return None return current_rotation_status.get('KeyRotationEnabled') @@ -306,11 +306,10 @@ def get_kms_tags(connection, module, key_id): try: tag_response = get_kms_tags_with_backoff(connection, key_id, **kwargs) tags.extend(tag_response['Tags']) - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] != 'AccessDeniedException': - module.fail_json_aws(e, msg="Failed to obtain key tags") - else: - tag_response = {} + except is_boto3_error_code('AccessDeniedException'): + tag_response = {} + except botocore.exceptions.ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Failed to obtain key tags") if tag_response.get('NextMarker'): kwargs['Marker'] = tag_response['NextMarker'] else: @@ -323,11 +322,10 @@ def get_kms_policies(connection, module, key_id): policies = list_key_policies_with_backoff(connection, key_id)['PolicyNames'] return [get_key_policy_with_backoff(connection, key_id, policy)['Policy'] for policy in policies] - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] != 'AccessDeniedException': - module.fail_json_aws(e, msg="Failed to obtain key policies") - else: - return [] + except is_boto3_error_code('AccessDeniedException'): + return [] + except botocore.exceptions.ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Failed to obtain key policies") def key_matches_filter(key, filtr): diff --git a/plugins/modules/aws_ssm_parameter_store.py b/plugins/modules/aws_ssm_parameter_store.py index 00ffe046046..0598cacf637 100644 --- a/plugins/modules/aws_ssm_parameter_store.py +++ b/plugins/modules/aws_ssm_parameter_store.py @@ -133,6 +133,7 @@ pass # Handled by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code def update_parameter(client, module, args): @@ -213,9 +214,9 @@ def delete_parameter(client, module): response = client.delete_parameter( Name=module.params.get('name') ) - except ClientError as e: - if e.response['Error']['Code'] == 'ParameterNotFound': - return False, {} + except is_boto3_error_code('ParameterNotFound'): + return False, {} + except ClientError as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="deleting parameter") return True, response diff --git a/plugins/modules/aws_step_functions_state_machine_execution.py b/plugins/modules/aws_step_functions_state_machine_execution.py index f9e1d3fa44c..4e1a7743ac9 100644 --- a/plugins/modules/aws_step_functions_state_machine_execution.py +++ b/plugins/modules/aws_step_functions_state_machine_execution.py @@ -90,6 +90,7 @@ from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict try: @@ -123,10 +124,10 @@ def start_execution(module, sfn_client): name=name, input=execution_input ) - except (ClientError, BotoCoreError) as e: - if e.response['Error']['Code'] == 'ExecutionAlreadyExists': - # this will never be executed anymore - module.exit_json(changed=False) + except is_boto3_error_code('ExecutionAlreadyExists'): + # this will never be executed anymore + module.exit_json(changed=False) + except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Failed to start execution.") module.exit_json(changed=True, **camel_dict_to_snake_dict(res_execution)) diff --git a/plugins/modules/aws_waf_condition.py b/plugins/modules/aws_waf_condition.py index 3a3083dcd23..2de23cf12ff 100644 --- a/plugins/modules/aws_waf_condition.py +++ b/plugins/modules/aws_waf_condition.py @@ -403,6 +403,7 @@ pass # handled by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_policies @@ -545,9 +546,9 @@ def delete_unused_regex_pattern(self, regex_pattern_set_id): run_func_with_change_token_backoff(self.client, self.module, {'RegexPatternSetId': regex_pattern_set_id}, self.client.delete_regex_pattern_set, wait=True) - except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: - if e.response['Error']['Code'] == 'WAFNonexistentItemException': - return + except is_boto3_error_code('WAFNonexistentItemException'): + return + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except self.module.fail_json_aws(e, msg='Could not delete regex pattern') def get_condition_by_name(self, name): diff --git a/plugins/modules/cloudwatchevent_rule.py b/plugins/modules/cloudwatchevent_rule.py index 0ba66909d25..7f4564ec1c0 100644 --- a/plugins/modules/cloudwatchevent_rule.py +++ b/plugins/modules/cloudwatchevent_rule.py @@ -155,6 +155,7 @@ pass # handled by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @@ -174,12 +175,9 @@ def describe(self): """Returns the existing details of the rule in AWS""" try: rule_info = self.client.describe_rule(Name=self.name) - except botocore.exceptions.ClientError as e: - error_code = e.response.get('Error', {}).get('Code') - if error_code == 'ResourceNotFoundException': - return {} - self.module.fail_json_aws(e, msg="Could not describe rule %s" % self.name) - except botocore.exceptions.BotoCoreError as e: + except is_boto3_error_code('ResourceNotFoundException'): + return {} + except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: # pylint: disable=duplicate-except self.module.fail_json_aws(e, msg="Could not describe rule %s" % self.name) return self._snakify(rule_info) @@ -237,12 +235,9 @@ def list_targets(self): """Lists the existing targets for the rule in AWS""" try: targets = self.client.list_targets_by_rule(Rule=self.name) - except botocore.exceptions.ClientError as e: - error_code = e.response.get('Error', {}).get('Code') - if error_code == 'ResourceNotFoundException': - return [] - self.module.fail_json_aws(e, msg="Could not find target for rule %s" % self.name) - except botocore.exceptions.BotoCoreError as e: + except is_boto3_error_code('ResourceNotFoundException'): + return [] + except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: # pylint: disable=duplicate-except self.module.fail_json_aws(e, msg="Could not find target for rule %s" % self.name) return self._snakify(targets)['targets'] diff --git a/plugins/modules/data_pipeline.py b/plugins/modules/data_pipeline.py index 54a4cd6f39a..36e40bb144f 100644 --- a/plugins/modules/data_pipeline.py +++ b/plugins/modules/data_pipeline.py @@ -211,6 +211,7 @@ from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code DP_ACTIVE_STATES = ['ACTIVE', 'SCHEDULED'] @@ -361,9 +362,8 @@ def activate_pipeline(client, module): else: try: client.activate_pipeline(pipelineId=dp_id) - except ClientError as e: - if e.response["Error"]["Code"] == "InvalidRequestException": - module.fail_json(msg="You need to populate your pipeline before activation.") + except is_boto3_error_code('InvalidRequestException'): + module.fail_json(msg="You need to populate your pipeline before activation.") try: pipeline_status_timeout(client, dp_id, status=DP_ACTIVE_STATES, timeout=timeout) diff --git a/plugins/modules/ec2_asg.py b/plugins/modules/ec2_asg.py index ee07b68f516..1300b1e785c 100644 --- a/plugins/modules/ec2_asg.py +++ b/plugins/modules/ec2_asg.py @@ -535,6 +535,7 @@ from ansible.module_utils._text import to_native from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry ASG_ATTRIBUTES = ('AvailabilityZones', 'DefaultCooldown', 'DesiredCapacity', @@ -851,12 +852,9 @@ def elb_healthy(asg_connection, elb_connection, group_name): # but has not yet show up in the ELB try: lb_instances = describe_instance_health(elb_connection, lb, instances) - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'InvalidInstance': - return None - - module.fail_json_aws(e, msg="Failed to get load balancer.") - except botocore.exceptions.BotoCoreError as e: + except is_boto3_error_code('InvalidInstance'): + return None + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Failed to get load balancer.") for i in lb_instances.get('InstanceStates'): @@ -883,12 +881,9 @@ def tg_healthy(asg_connection, elbv2_connection, group_name): # but has not yet show up in the ELB try: tg_instances = describe_target_health(elbv2_connection, tg, instances) - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'InvalidInstance': - return None - - module.fail_json_aws(e, msg="Failed to get target group.") - except botocore.exceptions.BotoCoreError as e: + except is_boto3_error_code('InvalidInstance'): + return None + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Failed to get target group.") for i in tg_instances.get('TargetHealthDescriptions'): diff --git a/plugins/modules/ec2_asg_info.py b/plugins/modules/ec2_asg_info.py index 07df498968a..15f6886c902 100644 --- a/plugins/modules/ec2_asg_info.py +++ b/plugins/modules/ec2_asg_info.py @@ -224,6 +224,7 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @@ -373,12 +374,9 @@ def find_asgs(conn, module, name=None, tags=None): tg_paginator = elbv2.get_paginator('describe_target_groups') tg_result = tg_paginator.paginate(TargetGroupArns=asg['target_group_arns']).build_full_result() asg['target_group_names'] = [tg['TargetGroupName'] for tg in tg_result['TargetGroups']] - except ClientError as e: - if e.response['Error']['Code'] == 'TargetGroupNotFound': - asg['target_group_names'] = [] - else: - module.fail_json_aws(e, msg="Failed to describe Target Groups") - except BotoCoreError as e: + except is_boto3_error_code('TargetGroupNotFound'): + asg['target_group_names'] = [] + except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Failed to describe Target Groups") else: asg['target_group_names'] = [] diff --git a/plugins/modules/ec2_instance.py b/plugins/modules/ec2_instance.py index c16b6b6437a..7153e215396 100644 --- a/plugins/modules/ec2_instance.py +++ b/plugins/modules/ec2_instance.py @@ -815,6 +815,7 @@ import ansible_collections.amazon.aws.plugins.module_utils.ec2 as ec2_utils from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_message from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list @@ -1121,15 +1122,13 @@ def discover_security_groups(group, groups, parent_vpc_id=None, subnet_id=None, if subnet_id is not None: try: sub = ec2.describe_subnets(aws_retry=True, SubnetIds=[subnet_id]) - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'InvalidGroup.NotFound': - module.fail_json( - "Could not find subnet {0} to associate security groups. Please check the vpc_subnet_id and security_groups parameters.".format( - subnet_id - ) + except is_boto3_error_code('InvalidGroup.NotFound'): + module.fail_json( + "Could not find subnet {0} to associate security groups. Please check the vpc_subnet_id and security_groups parameters.".format( + subnet_id ) - module.fail_json_aws(e, msg="Error while searching for subnet {0} parent VPC.".format(subnet_id)) - except botocore.exceptions.BotoCoreError as e: + ) + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Error while searching for subnet {0} parent VPC.".format(subnet_id)) parent_vpc_id = sub['Subnets'][0]['VpcId'] @@ -1617,9 +1616,9 @@ def determine_iam_role(name_or_arn): try: role = iam.get_instance_profile(InstanceProfileName=name_or_arn, aws_retry=True) return role['InstanceProfile']['Arn'] - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'NoSuchEntity': - module.fail_json_aws(e, msg="Could not find instance_role {0}".format(name_or_arn)) + except is_boto3_error_code('NoSuchEntity'): + module.fail_json_aws(e, msg="Could not find instance_role {0}".format(name_or_arn)) + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="An error occurred while searching for instance_role {0}. Please try supplying the full ARN.".format(name_or_arn)) diff --git a/plugins/modules/ec2_placement_group.py b/plugins/modules/ec2_placement_group.py index 17a701de016..b50e0ddbb08 100644 --- a/plugins/modules/ec2_placement_group.py +++ b/plugins/modules/ec2_placement_group.py @@ -93,6 +93,7 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry @@ -129,13 +130,13 @@ def create_placement_group(connection, module): try: connection.create_placement_group( GroupName=name, Strategy=strategy, DryRun=module.check_mode) - except (BotoCoreError, ClientError) as e: - if e.response['Error']['Code'] == "DryRunOperation": - module.exit_json(changed=True, placement_group={ - "name": name, - "state": 'DryRun', - "strategy": strategy, - }) + except is_boto3_error_code('DryRunOperation'): + module.exit_json(changed=True, placement_group={ + "name": name, + "state": 'DryRun', + "strategy": strategy, + }) + except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws( e, msg="Couldn't create placement group [%s]" % name) diff --git a/plugins/modules/ec2_transit_gateway_info.py b/plugins/modules/ec2_transit_gateway_info.py index fb820ce62b6..d5ee359de8f 100644 --- a/plugins/modules/ec2_transit_gateway_info.py +++ b/plugins/modules/ec2_transit_gateway_info.py @@ -170,6 +170,7 @@ pass # handled by imported AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict @@ -206,11 +207,9 @@ def describe_transit_gateways(self): try: response = self._connection.describe_transit_gateways( TransitGatewayIds=transit_gateway_ids, Filters=filters) - except ClientError as e: - if e.response['Error']['Code'] == 'InvalidTransitGatewayID.NotFound': - self._results['transit_gateways'] = [] - return - raise + except is_boto3_error_code('InvalidTransitGatewayID.NotFound'): + self._results['transit_gateways'] = [] + return for transit_gateway in response['TransitGateways']: transit_gateway_info.append(camel_dict_to_snake_dict(transit_gateway, ignore_list=['Tags'])) diff --git a/plugins/modules/ec2_vpc_egress_igw.py b/plugins/modules/ec2_vpc_egress_igw.py index df1826e0219..a48b9b4744a 100644 --- a/plugins/modules/ec2_vpc_egress_igw.py +++ b/plugins/modules/ec2_vpc_egress_igw.py @@ -63,6 +63,7 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @@ -78,14 +79,9 @@ def delete_eigw(module, conn, eigw_id): try: response = conn.delete_egress_only_internet_gateway(DryRun=module.check_mode, EgressOnlyInternetGatewayId=eigw_id) - except botocore.exceptions.ClientError as e: - # When boto3 method is run with DryRun=True it returns an error on success - # We need to catch the error and return something valid - if e.response.get('Error', {}).get('Code') == "DryRunOperation": - changed = True - else: - module.fail_json_aws(e, msg="Could not delete Egress-Only Internet Gateway {0} from VPC {1}".format(eigw_id, module.vpc_id)) - except botocore.exceptions.BotoCoreError as e: + except is_boto3_error_code('DryRunOperation'): + changed = True + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Could not delete Egress-Only Internet Gateway {0} from VPC {1}".format(eigw_id, module.vpc_id)) if not module.check_mode: @@ -107,16 +103,13 @@ def create_eigw(module, conn, vpc_id): try: response = conn.create_egress_only_internet_gateway(DryRun=module.check_mode, VpcId=vpc_id) - except botocore.exceptions.ClientError as e: + except is_boto3_error_code('DryRunOperation'): # When boto3 method is run with DryRun=True it returns an error on success # We need to catch the error and return something valid - if e.response.get('Error', {}).get('Code') == "DryRunOperation": - changed = True - elif e.response.get('Error', {}).get('Code') == "InvalidVpcID.NotFound": - module.fail_json_aws(e, msg="invalid vpc ID '{0}' provided".format(vpc_id)) - else: - module.fail_json_aws(e, msg="Could not create Egress-Only Internet Gateway for vpc ID {0}".format(vpc_id)) - except botocore.exceptions.BotoCoreError as e: + changed = True + except is_boto3_error_code('InvalidVpcID.NotFound') as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="invalid vpc ID '{0}' provided".format(vpc_id)) + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Could not create Egress-Only Internet Gateway for vpc ID {0}".format(vpc_id)) if not module.check_mode: diff --git a/plugins/modules/ec2_vpc_nacl_info.py b/plugins/modules/ec2_vpc_nacl_info.py index 52729451ff7..1fde4da3edc 100644 --- a/plugins/modules/ec2_vpc_nacl_info.py +++ b/plugins/modules/ec2_vpc_nacl_info.py @@ -110,6 +110,7 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @@ -131,11 +132,9 @@ def list_ec2_vpc_nacls(connection, module): try: nacls = connection.describe_network_acls(aws_retry=True, NetworkAclIds=nacl_ids, Filters=filters) - except ClientError as e: - if e.response['Error']['Code'] == 'InvalidNetworkAclID.NotFound': - module.fail_json(msg='Unable to describe ACL. NetworkAcl does not exist') - module.fail_json_aws(e, msg="Unable to describe network ACLs {0}".format(nacl_ids)) - except BotoCoreError as e: + except is_boto3_error_code('InvalidNetworkAclID.NotFound'): + module.fail_json(msg='Unable to describe ACL. NetworkAcl does not exist') + except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Unable to describe network ACLs {0}".format(nacl_ids)) # Turn the boto3 result in to ansible_friendly_snaked_names diff --git a/plugins/modules/ec2_vpc_route_table.py b/plugins/modules/ec2_vpc_route_table.py index ea5b3ddda35..8ed6fb4657f 100644 --- a/plugins/modules/ec2_vpc_route_table.py +++ b/plugins/modules/ec2_vpc_route_table.py @@ -233,6 +233,7 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry @@ -373,11 +374,8 @@ def ensure_tags(connection=None, module=None, resource_id=None, tags=None, purge def describe_route_tables_with_backoff(connection, **params): try: return connection.describe_route_tables(**params)['RouteTables'] - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'InvalidRouteTableID.NotFound': - return None - else: - raise + except is_boto3_error_code('InvalidRouteTableID.NotFound'): + return None def get_route_table_by_id(connection, module, route_table_id): diff --git a/plugins/modules/ecs_ecr.py b/plugins/modules/ecs_ecr.py index 5b7ddd261f4..cbd6686810d 100644 --- a/plugins/modules/ecs_ecr.py +++ b/plugins/modules/ecs_ecr.py @@ -195,6 +195,7 @@ from ansible.module_utils.six import string_types from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto_exception from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_policies from ansible_collections.amazon.aws.plugins.module_utils.ec2 import sort_json_policy_dict @@ -227,11 +228,8 @@ def get_repository(self, registry_id, name): repositoryNames=[name], **build_kwargs(registry_id)) repos = res.get('repositories') return repos and repos[0] - except ClientError as err: - code = err.response['Error'].get('Code', 'Unknown') - if code == 'RepositoryNotFoundException': - return None - raise + except is_boto3_error_code('RepositoryNotFoundException'): + return None def get_repository_policy(self, registry_id, name): try: @@ -239,11 +237,8 @@ def get_repository_policy(self, registry_id, name): repositoryName=name, **build_kwargs(registry_id)) text = res.get('policyText') return text and json.loads(text) - except ClientError as err: - code = err.response['Error'].get('Code', 'Unknown') - if code == 'RepositoryPolicyNotFoundException': - return None - raise + except is_boto3_error_code('RepositoryPolicyNotFoundException'): + return None def create_repository(self, registry_id, name, image_tag_mutability): if registry_id: @@ -330,11 +325,8 @@ def get_lifecycle_policy(self, registry_id, name): repositoryName=name, **build_kwargs(registry_id)) text = res.get('lifecyclePolicyText') return text and json.loads(text) - except ClientError as err: - code = err.response['Error'].get('Code', 'Unknown') - if code == 'LifecyclePolicyNotFoundException': - return None - raise + except is_boto3_error_code('LifecyclePolicyNotFoundException'): + return None def put_lifecycle_policy(self, registry_id, name, policy_text): if not self.check_mode: diff --git a/plugins/modules/ecs_service_info.py b/plugins/modules/ecs_service_info.py index d428dde8835..2d64a89e6dd 100644 --- a/plugins/modules/ecs_service_info.py +++ b/plugins/modules/ecs_service_info.py @@ -138,6 +138,7 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry @@ -153,11 +154,8 @@ def list_services_with_backoff(self, **kwargs): paginator = self.ecs.get_paginator('list_services') try: return paginator.paginate(**kwargs).build_full_result() - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'ClusterNotFoundException': - self.module.fail_json_aws(e, "Could not find cluster to list services") - else: - raise + except is_boto3_error_code('ClusterNotFoundException') as e: + self.module.fail_json_aws(e, "Could not find cluster to list services") @AWSRetry.backoff(tries=5, delay=5, backoff=2.0) def describe_services_with_backoff(self, **kwargs): diff --git a/plugins/modules/efs.py b/plugins/modules/efs.py index d1d2d14a8a2..be992b3f148 100644 --- a/plugins/modules/efs.py +++ b/plugins/modules/efs.py @@ -235,6 +235,7 @@ pass # Handled by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @@ -623,8 +624,8 @@ def iterate_all(attr, map_method, **kwargs): args['Marker'] = data['Nextmarker'] continue break - except ClientError as e: - if e.response['Error']['Code'] == "ThrottlingException" and wait < 600: + except is_boto3_error_code('ThrottlingException'): + if wait < 600: sleep(wait) wait = wait * 2 continue diff --git a/plugins/modules/elasticache.py b/plugins/modules/elasticache.py index 5fb45a8883b..93804562f2e 100644 --- a/plugins/modules/elasticache.py +++ b/plugins/modules/elasticache.py @@ -134,6 +134,7 @@ pass # Handled by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import get_aws_connection_info @@ -439,13 +440,12 @@ def _refresh_data(self, cache_cluster_data=None): if cache_cluster_data is None: try: response = self.conn.describe_cache_clusters(CacheClusterId=self.name, ShowCacheNodeInfo=True) - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'CacheClusterNotFound': - self.data = None - self.status = 'gone' - return - else: - self.module.fail_json_aws(e, msg="Failed to describe cache clusters") + except is_boto3_error_code('CacheClusterNotFound'): + self.data = None + self.status = 'gone' + return + except botocore.exceptions.ClientError as e: # pylint: disable=duplicate-except + self.module.fail_json_aws(e, msg="Failed to describe cache clusters") cache_cluster_data = response['CacheClusters'][0] self.data = cache_cluster_data self.status = self.data['CacheClusterStatus'] diff --git a/plugins/modules/elasticache_info.py b/plugins/modules/elasticache_info.py index 5b22c5cec1c..026337e3350 100644 --- a/plugins/modules/elasticache_info.py +++ b/plugins/modules/elasticache_info.py @@ -225,6 +225,7 @@ from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict @@ -243,12 +244,8 @@ def describe_cache_clusters_with_backoff(client, cluster_id=None): params['CacheClusterId'] = cluster_id try: response = paginator.paginate(**params).build_full_result() - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'CacheClusterNotFound': - return [] - raise - except botocore.exceptions.BotoCoreError: - raise + except is_boto3_error_code('CacheClusterNotFound'): + return [] return response['CacheClusters'] diff --git a/plugins/modules/elasticache_snapshot.py b/plugins/modules/elasticache_snapshot.py index d07125023bd..42920a3c2c4 100644 --- a/plugins/modules/elasticache_snapshot.py +++ b/plugins/modules/elasticache_snapshot.py @@ -119,6 +119,7 @@ from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code def create(module, connection, replication_id, cluster_id, name): @@ -128,12 +129,11 @@ def create(module, connection, replication_id, cluster_id, name): CacheClusterId=cluster_id, SnapshotName=name) changed = True - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == "SnapshotAlreadyExistsFault": - response = {} - changed = False - else: - module.fail_json_aws(e, msg="Unable to create the snapshot.") + except is_boto3_error_code('SnapshotAlreadyExistsFault'): + response = {} + changed = False + except botocore.exceptions.ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Unable to create the snapshot.") return response, changed @@ -154,15 +154,14 @@ def delete(module, connection, name): try: response = connection.delete_snapshot(SnapshotName=name) changed = True - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == "SnapshotNotFoundFault": - response = {} - changed = False - elif e.response['Error']['Code'] == "InvalidSnapshotState": - module.fail_json(msg="Error: InvalidSnapshotState. The snapshot is not in an available state or failed state to allow deletion." - "You may need to wait a few minutes.") - else: - module.fail_json_aws(e, msg="Unable to delete the snapshot.") + except is_boto3_error_code('SnapshotNotFoundFault'): + response = {} + changed = False + except is_boto3_error_code('InvalidSnapshotState'): # pylint: disable=duplicate-except + module.fail_json(msg="Error: InvalidSnapshotState. The snapshot is not in an available state or failed state to allow deletion." + "You may need to wait a few minutes.") + except botocore.exceptions.ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Unable to delete the snapshot.") return response, changed diff --git a/plugins/modules/execute_lambda.py b/plugins/modules/execute_lambda.py index 199a50fd0a7..e5e21eacb61 100644 --- a/plugins/modules/execute_lambda.py +++ b/plugins/modules/execute_lambda.py @@ -136,6 +136,7 @@ pass # Handled by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code def main(): @@ -206,13 +207,13 @@ def main(): try: response = client.invoke(**invoke_params) - except botocore.exceptions.ClientError as ce: - if ce.response['Error']['Code'] == 'ResourceNotFoundException': - module.fail_json_aws(ce, msg="Could not find Lambda to execute. Make sure " - "the ARN is correct and your profile has " - "permissions to execute this function.") + except is_boto3_error_code('ResourceNotFoundException') as nfe: + module.fail_json_aws(nfe, msg="Could not find Lambda to execute. Make sure " + "the ARN is correct and your profile has " + "permissions to execute this function.") + except botocore.exceptions.ClientError as ce: # pylint: disable=duplicate-except module.fail_json_aws(ce, msg="Client-side error when invoking Lambda, check inputs and specific error") - except botocore.exceptions.ParamValidationError as ve: + except botocore.exceptions.ParamValidationError as ve: # pylint: disable=duplicate-except module.fail_json_aws(ve, msg="Parameters to `invoke` failed to validate") except Exception as e: module.fail_json_aws(e, msg="Unexpected failure while invoking Lambda function") diff --git a/plugins/modules/iam_group.py b/plugins/modules/iam_group.py index 45b6eb1d5ed..ec4af5f8cfb 100644 --- a/plugins/modules/iam_group.py +++ b/plugins/modules/iam_group.py @@ -183,6 +183,7 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry @@ -386,11 +387,8 @@ def get_group(connection, module, name): try: paginator = connection.get_paginator('get_group') return paginator.paginate(GroupName=name).build_full_result() - except ClientError as e: - if e.response['Error']['Code'] == 'NoSuchEntity': - return None - else: - raise + except is_boto3_error_code('NoSuchEntity'): + return None @AWSRetry.exponential_backoff() @@ -399,11 +397,8 @@ def get_attached_policy_list(connection, module, name): try: paginator = connection.get_paginator('list_attached_group_policies') return paginator.paginate(GroupName=name).build_full_result()['AttachedPolicies'] - except ClientError as e: - if e.response['Error']['Code'] == 'NoSuchEntity': - return None - else: - raise + except is_boto3_error_code('NoSuchEntity'): + return None def main(): diff --git a/plugins/modules/iam_managed_policy.py b/plugins/modules/iam_managed_policy.py index aa668498ad1..f0fa588c44e 100644 --- a/plugins/modules/iam_managed_policy.py +++ b/plugins/modules/iam_managed_policy.py @@ -140,6 +140,7 @@ from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_policies @@ -200,16 +201,14 @@ def get_or_create_policy_version(module, iam, policy, policy_document): try: version = iam.create_policy_version(PolicyArn=policy['Arn'], PolicyDocument=policy_document)['PolicyVersion'] return version, True - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'LimitExceeded': - delete_oldest_non_default_version(module, iam, policy) - try: - version = iam.create_policy_version(PolicyArn=policy['Arn'], PolicyDocument=policy_document)['PolicyVersion'] - return version, True - except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as second_e: - e = second_e - # Handle both when the exception isn't LimitExceeded or - # the second attempt still failed + except is_boto3_error_code('LimitExceeded'): + delete_oldest_non_default_version(module, iam, policy) + try: + version = iam.create_policy_version(PolicyArn=policy['Arn'], PolicyDocument=policy_document)['PolicyVersion'] + return version, True + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as second_e: + module.fail_json_aws(second_e, msg="Couldn't create policy version") + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Couldn't create policy version") diff --git a/plugins/modules/iam_password_policy.py b/plugins/modules/iam_password_policy.py index d654a846cfd..24b85768e8e 100644 --- a/plugins/modules/iam_password_policy.py +++ b/plugins/modules/iam_password_policy.py @@ -104,6 +104,7 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @@ -169,11 +170,10 @@ def update_password_policy(self, module, policy): def delete_password_policy(self, policy): try: results = policy.delete() - except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: - if e.response['Error']['Code'] == 'NoSuchEntity': - self.module.exit_json(changed=False, task_status={'IAM': "Couldn't find IAM Password Policy"}) - else: - self.module.fail_json_aws(e, msg="Couldn't delete IAM Password Policy") + except is_boto3_error_code('NoSuchEntity'): + self.module.exit_json(changed=False, task_status={'IAM': "Couldn't find IAM Password Policy"}) + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except + self.module.fail_json_aws(e, msg="Couldn't delete IAM Password Policy") return camel_dict_to_snake_dict(results) diff --git a/plugins/modules/iam_policy_info.py b/plugins/modules/iam_policy_info.py index 1e670054a43..cbcbfc42abe 100644 --- a/plugins/modules/iam_policy_info.py +++ b/plugins/modules/iam_policy_info.py @@ -85,6 +85,7 @@ from ansible.module_utils.six import string_types from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry @@ -204,9 +205,9 @@ def main(): policy = GroupPolicy(**args) module.exit_json(**(policy.run())) - except (BotoCoreError, ClientError) as e: - if e.response['Error']['Code'] == 'NoSuchEntity': - module.exit_json(changed=False, msg=e.response['Error']['Message']) + except is_boto3_error_code('NoSuchEntity') as e: + module.exit_json(changed=False, msg=e.response['Error']['Message']) + except (BotoCoreError, ClientError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e) except PolicyError as e: module.fail_json(msg=str(e)) diff --git a/plugins/modules/iam_role.py b/plugins/modules/iam_role.py index 089d6168e8e..b5e80ceac43 100644 --- a/plugins/modules/iam_role.py +++ b/plugins/modules/iam_role.py @@ -200,6 +200,7 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict @@ -470,14 +471,11 @@ def create_instance_profiles(connection, module, params, role): # Make sure an instance profile is created try: connection.create_instance_profile(InstanceProfileName=params['RoleName'], Path=params['Path'], aws_retry=True) - except ClientError as e: + except is_boto3_error_code('EntityAlreadyExists'): # If the profile already exists, no problem, move on. # Implies someone's changing things at the same time... - if e.response['Error']['Code'] == 'EntityAlreadyExists': - return False - else: - module.fail_json_aws(e, msg="Unable to create instance profile for role {0}".format(params['RoleName'])) - except BotoCoreError as e: + return False + except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Unable to create instance profile for role {0}".format(params['RoleName'])) # And attach the role to the profile @@ -553,12 +551,9 @@ def get_role_with_backoff(connection, module, name): def get_role(connection, module, name): try: return connection.get_role(RoleName=name, aws_retry=True)['Role'] - except ClientError as e: - if e.response['Error']['Code'] == 'NoSuchEntity': - return None - else: - module.fail_json_aws(e, msg="Unable to get role {0}".format(name)) - except BotoCoreError as e: + except is_boto3_error_code('NoSuchEntity'): + return None + except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Unable to get role {0}".format(name)) diff --git a/plugins/modules/iam_role_info.py b/plugins/modules/iam_role_info.py index 197ef9149f5..a050204b6b1 100644 --- a/plugins/modules/iam_role_info.py +++ b/plugins/modules/iam_role_info.py @@ -153,6 +153,7 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @@ -210,12 +211,9 @@ def describe_iam_roles(module, client): if name: try: roles = [client.get_role(RoleName=name)['Role']] - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'NoSuchEntity': - return [] - else: - module.fail_json_aws(e, msg="Couldn't get IAM role %s" % name) - except botocore.exceptions.BotoCoreError as e: + except is_boto3_error_code('NoSuchEntity'): + return [] + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Couldn't get IAM role %s" % name) else: params = dict() diff --git a/plugins/modules/iam_user.py b/plugins/modules/iam_user.py index 7bd8ebda423..56519e94c03 100644 --- a/plugins/modules/iam_user.py +++ b/plugins/modules/iam_user.py @@ -115,6 +115,7 @@ from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code def compare_attached_policies(current_attached_policies, new_attached_policies): @@ -297,34 +298,30 @@ def get_user(connection, module, name): try: return connection.get_user(**params) - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'NoSuchEntity': - return None - else: - module.fail_json(msg="Unable to get user {0}: {1}".format(name, to_native(e)), - **camel_dict_to_snake_dict(e.response)) + except is_boto3_error_code('NoSuchEntity'): + return None + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Unable to get user {0}".format(name)) def get_attached_policy_list(connection, module, name): try: return connection.list_attached_user_policies(UserName=name)['AttachedPolicies'] - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'NoSuchEntity': - return None - else: - module.fail_json_aws(e, msg="Unable to get policies for user {0}".format(name)) + except is_boto3_error_code('NoSuchEntity'): + return None + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Unable to get policies for user {0}".format(name)) def delete_user_login_profile(connection, module, user_name): try: return connection.delete_login_profile(UserName=user_name) - except botocore.exceptions.ClientError as e: - if e.response["Error"]["Code"] == "NoSuchEntity": - return None - else: - module.fail_json_aws(e, msg="Unable to delete login profile for user {0}".format(user_name)) + except is_boto3_error_code('NoSuchEntity'): + return None + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Unable to delete login profile for user {0}".format(user_name)) def main(): diff --git a/plugins/modules/lambda_alias.py b/plugins/modules/lambda_alias.py index 8cd8a891289..619a8b9b72f 100644 --- a/plugins/modules/lambda_alias.py +++ b/plugins/modules/lambda_alias.py @@ -144,11 +144,12 @@ import re try: - from botocore.exceptions import ClientError, ParamValidationError, MissingParametersError + from botocore.exceptions import ClientError, BotoCoreError except ImportError: pass # Handled by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_conn from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import get_aws_connection_info @@ -182,7 +183,7 @@ def __init__(self, ansible_obj, resources, boto3_=True): if not self.region: self.region = self.resource_client['lambda'].meta.region_name - except (ClientError, ParamValidationError, MissingParametersError) as e: + except (ClientError, BotoCoreError) as e: ansible_obj.fail_json(msg="Unable to connect, authorize or access resource: {0}".format(e)) try: @@ -269,12 +270,10 @@ def get_lambda_alias(module, aws): # check if alias exists and get facts try: results = client.get_alias(**api_params) - - except (ClientError, ParamValidationError, MissingParametersError) as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - results = None - else: - module.fail_json(msg='Error retrieving function alias: {0}'.format(e)) + except is_boto3_error_code('ResourceNotFoundException'): + results = None + except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg='Error retrieving function alias') return results @@ -314,7 +313,7 @@ def lambda_alias(module, aws): if not module.check_mode: try: results = client.update_alias(**api_params) - except (ClientError, ParamValidationError, MissingParametersError) as e: + except (ClientError, BotoCoreError) as e: module.fail_json(msg='Error updating function alias: {0}'.format(e)) else: @@ -325,7 +324,7 @@ def lambda_alias(module, aws): if not module.check_mode: results = client.create_alias(**api_params) changed = True - except (ClientError, ParamValidationError, MissingParametersError) as e: + except (ClientError, BotoCoreError) as e: module.fail_json(msg='Error creating function alias: {0}'.format(e)) else: # state = 'absent' @@ -337,7 +336,7 @@ def lambda_alias(module, aws): if not module.check_mode: results = client.delete_alias(**api_params) changed = True - except (ClientError, ParamValidationError, MissingParametersError) as e: + except (ClientError, BotoCoreError) as e: module.fail_json(msg='Error deleting function alias: {0}'.format(e)) return dict(changed=changed, **dict(results or facts)) diff --git a/plugins/modules/lambda_facts.py b/plugins/modules/lambda_facts.py index 599611531ff..4b591073a85 100644 --- a/plugins/modules/lambda_facts.py +++ b/plugins/modules/lambda_facts.py @@ -99,6 +99,7 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @@ -146,11 +147,10 @@ def alias_details(client, module): params['Marker'] = module.params.get('next_marker') try: lambda_facts.update(aliases=client.list_aliases(FunctionName=function_name, **params)['Aliases']) - except ClientError as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - lambda_facts.update(aliases=[]) - else: - module.fail_json_aws(e, msg="Trying to get aliases") + except is_boto3_error_code('ResourceNotFoundException'): + lambda_facts.update(aliases=[]) + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Trying to get aliases") else: module.fail_json(msg='Parameter function_name required for query=aliases.') @@ -200,11 +200,10 @@ def config_details(client, module): if function_name: try: lambda_facts.update(client.get_function_configuration(FunctionName=function_name)) - except ClientError as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - lambda_facts.update(function={}) - else: - module.fail_json_aws(e, msg="Trying to get {0} configuration".format(function_name)) + except is_boto3_error_code('ResourceNotFoundException'): + lambda_facts.update(function={}) + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Trying to get {0} configuration".format(function_name)) else: params = dict() if module.params.get('max_items'): @@ -215,11 +214,10 @@ def config_details(client, module): try: lambda_facts.update(function_list=client.list_functions(**params)['Functions']) - except ClientError as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - lambda_facts.update(function_list=[]) - else: - module.fail_json_aws(e, msg="Trying to get function list") + except is_boto3_error_code('ResourceNotFoundException'): + lambda_facts.update(function_list=[]) + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Trying to get function list") functions = dict() for func in lambda_facts.pop('function_list', []): @@ -256,11 +254,10 @@ def mapping_details(client, module): try: lambda_facts.update(mappings=client.list_event_source_mappings(**params)['EventSourceMappings']) - except ClientError as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - lambda_facts.update(mappings=[]) - else: - module.fail_json_aws(e, msg="Trying to get source event mappings") + except is_boto3_error_code('ResourceNotFoundException'): + lambda_facts.update(mappings=[]) + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Trying to get source event mappings") if function_name: return {function_name: camel_dict_to_snake_dict(lambda_facts)} @@ -287,11 +284,10 @@ def policy_details(client, module): try: # get_policy returns a JSON string so must convert to dict before reassigning to its key lambda_facts.update(policy=json.loads(client.get_policy(FunctionName=function_name)['Policy'])) - except ClientError as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - lambda_facts.update(policy={}) - else: - module.fail_json_aws(e, msg="Trying to get {0} policy".format(function_name)) + except is_boto3_error_code('ResourceNotFoundException'): + lambda_facts.update(policy={}) + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Trying to get {0} policy".format(function_name)) else: module.fail_json(msg='Parameter function_name required for query=policy.') @@ -320,11 +316,10 @@ def version_details(client, module): try: lambda_facts.update(versions=client.list_versions_by_function(FunctionName=function_name, **params)['Versions']) - except ClientError as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - lambda_facts.update(versions=[]) - else: - module.fail_json_aws(e, msg="Trying to get {0} versions".format(function_name)) + except is_boto3_error_code('ResourceNotFoundException'): + lambda_facts.update(versions=[]) + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Trying to get {0} versions".format(function_name)) else: module.fail_json(msg='Parameter function_name required for query=versions.') diff --git a/plugins/modules/lambda_info.py b/plugins/modules/lambda_info.py index 59f3e98c0cc..9b39863d663 100644 --- a/plugins/modules/lambda_info.py +++ b/plugins/modules/lambda_info.py @@ -88,6 +88,7 @@ pass # caught by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @@ -135,11 +136,10 @@ def alias_details(client, module): params['Marker'] = module.params.get('next_marker') try: lambda_info.update(aliases=client.list_aliases(FunctionName=function_name, **params)['Aliases']) - except ClientError as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - lambda_info.update(aliases=[]) - else: - module.fail_json_aws(e, msg="Trying to get aliases") + except is_boto3_error_code('ResourceNotFoundException'): + lambda_info.update(aliases=[]) + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Trying to get aliases") else: module.fail_json(msg='Parameter function_name required for query=aliases.') @@ -189,11 +189,10 @@ def config_details(client, module): if function_name: try: lambda_info.update(client.get_function_configuration(FunctionName=function_name)) - except ClientError as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - lambda_info.update(function={}) - else: - module.fail_json_aws(e, msg="Trying to get {0} configuration".format(function_name)) + except is_boto3_error_code('ResourceNotFoundException'): + lambda_info.update(function={}) + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Trying to get {0} configuration".format(function_name)) else: params = dict() if module.params.get('max_items'): @@ -204,11 +203,10 @@ def config_details(client, module): try: lambda_info.update(function_list=client.list_functions(**params)['Functions']) - except ClientError as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - lambda_info.update(function_list=[]) - else: - module.fail_json_aws(e, msg="Trying to get function list") + except is_boto3_error_code('ResourceNotFoundException'): + lambda_info.update(function_list=[]) + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Trying to get function list") functions = dict() for func in lambda_info.pop('function_list', []): @@ -245,11 +243,10 @@ def mapping_details(client, module): try: lambda_info.update(mappings=client.list_event_source_mappings(**params)['EventSourceMappings']) - except ClientError as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - lambda_info.update(mappings=[]) - else: - module.fail_json_aws(e, msg="Trying to get source event mappings") + except is_boto3_error_code('ResourceNotFoundException'): + lambda_info.update(mappings=[]) + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Trying to get source event mappings") if function_name: return {function_name: camel_dict_to_snake_dict(lambda_info)} @@ -276,11 +273,10 @@ def policy_details(client, module): try: # get_policy returns a JSON string so must convert to dict before reassigning to its key lambda_info.update(policy=json.loads(client.get_policy(FunctionName=function_name)['Policy'])) - except ClientError as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - lambda_info.update(policy={}) - else: - module.fail_json_aws(e, msg="Trying to get {0} policy".format(function_name)) + except is_boto3_error_code('ResourceNotFoundException'): + lambda_info.update(policy={}) + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Trying to get {0} policy".format(function_name)) else: module.fail_json(msg='Parameter function_name required for query=policy.') @@ -309,11 +305,10 @@ def version_details(client, module): try: lambda_info.update(versions=client.list_versions_by_function(FunctionName=function_name, **params)['Versions']) - except ClientError as e: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - lambda_info.update(versions=[]) - else: - module.fail_json_aws(e, msg="Trying to get {0} versions".format(function_name)) + except is_boto3_error_code('ResourceNotFoundException'): + lambda_info.update(versions=[]) + except ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Trying to get {0} versions".format(function_name)) else: module.fail_json(msg='Parameter function_name required for query=versions.') diff --git a/plugins/modules/lambda_policy.py b/plugins/modules/lambda_policy.py index 2fb4b4ddead..6f17ce34519 100644 --- a/plugins/modules/lambda_policy.py +++ b/plugins/modules/lambda_policy.py @@ -134,14 +134,16 @@ import json import re -from ansible.module_utils._text import to_native -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule try: - from botocore.exceptions import ClientError + from botocore.exceptions import ClientError, BotoCoreError except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils._text import to_native +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code + def pc(key): """ @@ -285,14 +287,9 @@ def get_policy_statement(module, client): # check if function policy exists try: policy_results = client.get_policy(**api_params) - except ClientError as e: - try: - if e.response['Error']['Code'] == 'ResourceNotFoundException': - return {} - except AttributeError: # catches ClientErrors without response, e.g. fail before connect - pass - module.fail_json_aws(e, msg="retrieving function policy") - except Exception as e: + except is_boto3_error_code('ResourceNotFoundException'): + return {} + except (BotoCoreError, ClientError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="retrieving function policy") # get_policy returns a JSON string so must convert to dict before reassigning to its key @@ -328,7 +325,7 @@ def add_policy_permission(module, client): if not module.check_mode: try: client.add_permission(**api_params) - except Exception as e: + except (ClientError, BotoCoreError) as e: module.fail_json_aws(e, msg="adding permission to policy") changed = True @@ -356,7 +353,7 @@ def remove_policy_permission(module, client): if not module.check_mode: client.remove_permission(**api_params) changed = True - except Exception as e: + except (ClientError, BotoCoreError) as e: module.fail_json_aws(e, msg="removing permission from policy") return changed diff --git a/plugins/modules/lightsail.py b/plugins/modules/lightsail.py index 4be2fc3f458..699582b857d 100644 --- a/plugins/modules/lightsail.py +++ b/plugins/modules/lightsail.py @@ -161,6 +161,7 @@ pass from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @@ -168,9 +169,11 @@ def find_instance_info(module, client, instance_name, fail_if_not_found=False): try: res = client.get_instance(instanceName=instance_name) - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'NotFoundException' and not fail_if_not_found: - return None + except is_boto3_error_code('NotFoundException') as e: + if fail_if_not_found: + module.fail_json_aws(e) + return None + except botocore.exceptions.ClientError as e: # pylint: disable=duplicate-except module.fail_json_aws(e) return res['instance'] diff --git a/plugins/modules/rds_param_group.py b/plugins/modules/rds_param_group.py index ff18fc98300..30aa814de67 100644 --- a/plugins/modules/rds_param_group.py +++ b/plugins/modules/rds_param_group.py @@ -124,6 +124,7 @@ from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags @@ -230,11 +231,10 @@ def ensure_present(module, connection): errors = [] try: response = connection.describe_db_parameter_groups(DBParameterGroupName=groupname) - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'DBParameterGroupNotFound': - response = None - else: - module.fail_json_aws(e, msg="Couldn't access parameter group information") + except is_boto3_error_code('DBParameterGroupNotFound'): + response = None + except botocore.exceptions.ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Couldn't access parameter group information") if not response: params = dict(DBParameterGroupName=groupname, DBParameterGroupFamily=module.params['engine'], @@ -273,11 +273,10 @@ def ensure_absent(module, connection): group = module.params['name'] try: response = connection.describe_db_parameter_groups(DBParameterGroupName=group) - except botocore.exceptions.ClientError as e: - if e.response['Error']['Code'] == 'DBParameterGroupNotFound': - module.exit_json(changed=False) - else: - module.fail_json_aws(e, msg="Couldn't access parameter group information") + except is_boto3_error_code('DBParameterGroupNotFound'): + module.exit_json(changed=False) + except botocore.exceptions.ClientError as e: # pylint: disable=duplicate-except + module.fail_json_aws(e, msg="Couldn't access parameter group information") try: response = connection.delete_db_parameter_group(DBParameterGroupName=group) module.exit_json(changed=True) diff --git a/plugins/modules/s3_lifecycle.py b/plugins/modules/s3_lifecycle.py index 967be374219..534ccd716f6 100644 --- a/plugins/modules/s3_lifecycle.py +++ b/plugins/modules/s3_lifecycle.py @@ -201,6 +201,7 @@ pass # handled by AnsibleAwsModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code def create_lifecycle_rule(client, module): @@ -226,12 +227,9 @@ def create_lifecycle_rule(client, module): try: current_lifecycle = client.get_bucket_lifecycle_configuration(Bucket=name) current_lifecycle_rules = current_lifecycle['Rules'] - except ClientError as e: - if e.response['Error']['Code'] == 'NoSuchLifecycleConfiguration': - current_lifecycle_rules = [] - else: - module.fail_json_aws(e) - except BotoCoreError as e: + except is_boto3_error_code('NoSuchLifecycleConfiguration'): + current_lifecycle_rules = [] + except (BotoCoreError, ClientError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e) rule = dict(Filter=dict(Prefix=prefix), Status=status.title()) @@ -390,12 +388,9 @@ def destroy_lifecycle_rule(client, module): # Get the bucket's current lifecycle rules try: current_lifecycle_rules = client.get_bucket_lifecycle_configuration(Bucket=name)['Rules'] - except ClientError as e: - if e.response['Error']['Code'] == 'NoSuchLifecycleConfiguration': - current_lifecycle_rules = [] - else: - module.fail_json_aws(e) - except BotoCoreError as e: + except is_boto3_error_code('NoSuchLifecycleConfiguration'): + current_lifecycle_rules = [] + except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e) # Create lifecycle diff --git a/plugins/modules/sqs_queue.py b/plugins/modules/sqs_queue.py index d64192dfc54..4988b0454b5 100644 --- a/plugins/modules/sqs_queue.py +++ b/plugins/modules/sqs_queue.py @@ -227,6 +227,7 @@ pass # handled by AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags @@ -246,10 +247,8 @@ def get_queue_name(module, is_fifo=False): def get_queue_url(client, name): try: return client.get_queue_url(QueueName=name)['QueueUrl'] - except ClientError as e: - if e.response['Error']['Code'] == 'AWS.SimpleQueueService.NonExistentQueue': - return None - raise + except is_boto3_error_code('AWS.SimpleQueueService.NonExistentQueue'): + return None def describe_queue(client, queue_url): From d3128cfabfae2f9adf4a9142d9d1f2efe3ddf420 Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Tue, 20 Oct 2020 12:30:47 +0200 Subject: [PATCH 04/11] Remove unused imports --- plugins/modules/iam_policy_info.py | 2 -- plugins/modules/s3_lifecycle.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/plugins/modules/iam_policy_info.py b/plugins/modules/iam_policy_info.py index cbcbfc42abe..53ef0b97fb3 100644 --- a/plugins/modules/iam_policy_info.py +++ b/plugins/modules/iam_policy_info.py @@ -82,8 +82,6 @@ except ImportError: pass -from ansible.module_utils.six import string_types - from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry diff --git a/plugins/modules/s3_lifecycle.py b/plugins/modules/s3_lifecycle.py index 534ccd716f6..45ba6ad121b 100644 --- a/plugins/modules/s3_lifecycle.py +++ b/plugins/modules/s3_lifecycle.py @@ -17,8 +17,6 @@ notes: - If specifying expiration time as days then transition time must also be specified in days - If specifying expiration time as a date then transition time must also be specified as a date -requirements: - - python-dateutil options: name: description: From 253a532fef3d6b604445cc31118cda0cdca4e227 Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Tue, 20 Oct 2020 12:43:02 +0200 Subject: [PATCH 05/11] unused vars in exception --- plugins/modules/data_pipeline.py | 2 +- plugins/modules/s3_lifecycle.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/modules/data_pipeline.py b/plugins/modules/data_pipeline.py index 36e40bb144f..980fb62f23e 100644 --- a/plugins/modules/data_pipeline.py +++ b/plugins/modules/data_pipeline.py @@ -255,7 +255,7 @@ def pipeline_description(client, dp_id): """ try: return client.describe_pipelines(pipelineIds=[dp_id]) - except ClientError as e: + except ClientError: raise DataPipelineNotFound diff --git a/plugins/modules/s3_lifecycle.py b/plugins/modules/s3_lifecycle.py index 45ba6ad121b..8b97a9e85d1 100644 --- a/plugins/modules/s3_lifecycle.py +++ b/plugins/modules/s3_lifecycle.py @@ -478,13 +478,13 @@ def main(): if expiration_date is not None: try: datetime.datetime.strptime(expiration_date, "%Y-%m-%dT%H:%M:%S.000Z") - except ValueError as e: + except ValueError: module.fail_json(msg="expiration_date is not a valid ISO-8601 format. The time must be midnight and a timezone of GMT must be included") if transition_date is not None: try: datetime.datetime.strptime(transition_date, "%Y-%m-%dT%H:%M:%S.000Z") - except ValueError as e: + except ValueError: module.fail_json(msg="expiration_date is not a valid ISO-8601 format. The time must be midnight and a timezone of GMT must be included") if state == 'present': From 87e241031ff13a803ac30aebdcb0b167f773aa10 Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Wed, 27 Jan 2021 10:37:38 +0100 Subject: [PATCH 06/11] Improve consistency around catching BotoCoreError and ClientError --- plugins/modules/aws_elasticbeanstalk_app.py | 10 ++--- plugins/modules/aws_glue_connection.py | 8 ++-- plugins/modules/aws_glue_job.py | 10 ++--- plugins/modules/aws_ssm_parameter_store.py | 8 ++-- ..._step_functions_state_machine_execution.py | 6 +-- plugins/modules/cloudfront_invalidation.py | 12 ++--- plugins/modules/ec2_asg_info.py | 8 ++-- plugins/modules/ec2_placement_group.py | 8 ++-- plugins/modules/ec2_transit_gateway_info.py | 4 +- plugins/modules/ec2_vpc_nacl_info.py | 4 +- plugins/modules/ecs_ecr.py | 4 +- plugins/modules/efs.py | 10 ++--- plugins/modules/iam_group.py | 28 ++++++------ plugins/modules/iam_policy_info.py | 4 +- plugins/modules/iam_role.py | 44 +++++++++---------- plugins/modules/iam_user.py | 6 +-- plugins/modules/lambda_alias.py | 14 +++--- plugins/modules/lambda_facts.py | 14 +++--- plugins/modules/lambda_info.py | 14 +++--- plugins/modules/lambda_policy.py | 8 ++-- plugins/modules/s3_lifecycle.py | 10 ++--- plugins/modules/sqs_queue.py | 6 +-- 22 files changed, 120 insertions(+), 120 deletions(-) diff --git a/plugins/modules/aws_elasticbeanstalk_app.py b/plugins/modules/aws_elasticbeanstalk_app.py index c625fcd810f..19110282d0e 100644 --- a/plugins/modules/aws_elasticbeanstalk_app.py +++ b/plugins/modules/aws_elasticbeanstalk_app.py @@ -85,7 +85,7 @@ ''' try: - from botocore.exceptions import BotoCoreError, ClientError + import botocore except ImportError: pass # handled by AnsibleAWSModule @@ -105,7 +105,7 @@ def list_apps(ebs, app_name, module): apps = ebs.describe_applications(ApplicationNames=[app_name]) else: apps = ebs.describe_applications() - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Could not describe application") return apps.get("Applications", []) @@ -176,7 +176,7 @@ def main(): try: create_app = ebs.create_application(**filter_empty(ApplicationName=app_name, Description=description)) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Could not create application") app = describe_app(ebs, app_name, module) @@ -189,7 +189,7 @@ def main(): ebs.update_application(ApplicationName=app_name) else: ebs.update_application(ApplicationName=app_name, Description=description) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Could not update application") app = describe_app(ebs, app_name, module) @@ -211,7 +211,7 @@ def main(): changed = True except is_boto3_error_message('It is currently pending deletion'): changed = False - except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Cannot terminate app") result = dict(changed=changed, app=app) diff --git a/plugins/modules/aws_glue_connection.py b/plugins/modules/aws_glue_connection.py index b0ad6c17fd4..91210671514 100644 --- a/plugins/modules/aws_glue_connection.py +++ b/plugins/modules/aws_glue_connection.py @@ -139,7 +139,7 @@ import copy import time try: - from botocore.exceptions import BotoCoreError, ClientError + import botocore except ImportError: pass @@ -250,13 +250,13 @@ def create_or_update_glue_connection(connection, connection_ec2, module, glue_co update_params['Name'] = update_params['ConnectionInput']['Name'] connection.update_connection(**update_params) changed = True - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e) else: try: connection.create_connection(**params) changed = True - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e) # If changed, get the Glue connection again @@ -291,7 +291,7 @@ def delete_glue_connection(connection, module, glue_connection): try: connection.delete_connection(**params) changed = True - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e) module.exit_json(changed=changed) diff --git a/plugins/modules/aws_glue_job.py b/plugins/modules/aws_glue_job.py index 50336de29a1..3e0f17c73da 100644 --- a/plugins/modules/aws_glue_job.py +++ b/plugins/modules/aws_glue_job.py @@ -188,7 +188,7 @@ # Non-ansible imports import copy try: - from botocore.exceptions import BotoCoreError, ClientError + import botocore except ImportError: pass # Handled by AnsibleAWSModule @@ -211,7 +211,7 @@ def _get_glue_job(connection, module, glue_job_name): return connection.get_job(JobName=glue_job_name)['Job'] except is_boto3_error_code('EntityNotFoundException'): return None - except (BotoCoreError, ClientError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e) @@ -292,13 +292,13 @@ def create_or_update_glue_job(connection, module, glue_job): del update_params['JobUpdate']['Name'] connection.update_job(**update_params) changed = True - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e) else: try: connection.create_job(**params) changed = True - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e) # If changed, get the Glue job again @@ -324,7 +324,7 @@ def delete_glue_job(connection, module, glue_job): try: connection.delete_job(JobName=glue_job['Name']) changed = True - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e) module.exit_json(changed=changed) diff --git a/plugins/modules/aws_ssm_parameter_store.py b/plugins/modules/aws_ssm_parameter_store.py index 0598cacf637..d31a79b2bef 100644 --- a/plugins/modules/aws_ssm_parameter_store.py +++ b/plugins/modules/aws_ssm_parameter_store.py @@ -128,7 +128,7 @@ ''' try: - from botocore.exceptions import ClientError + import botocore except ImportError: pass # Handled by AnsibleAWSModule @@ -143,7 +143,7 @@ def update_parameter(client, module, args): try: response = client.put_parameter(**args) changed = True - except ClientError as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="setting parameter") return changed, response @@ -196,7 +196,7 @@ def create_update_parameter(client, module): describe_existing_parameter = describe_existing_parameter_paginator.paginate( Filters=[{"Key": "Name", "Values": [args['Name']]}]).build_full_result() - except ClientError as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="getting description value") if describe_existing_parameter['Parameters'][0]['Description'] != args['Description']: @@ -216,7 +216,7 @@ def delete_parameter(client, module): ) except is_boto3_error_code('ParameterNotFound'): return False, {} - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="deleting parameter") return True, response diff --git a/plugins/modules/aws_step_functions_state_machine_execution.py b/plugins/modules/aws_step_functions_state_machine_execution.py index 4e1a7743ac9..c500af53b4e 100644 --- a/plugins/modules/aws_step_functions_state_machine_execution.py +++ b/plugins/modules/aws_step_functions_state_machine_execution.py @@ -94,7 +94,7 @@ from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict try: - from botocore.exceptions import ClientError, BotoCoreError + import botocore except ImportError: pass # caught by AnsibleAWSModule @@ -127,7 +127,7 @@ def start_execution(module, sfn_client): except is_boto3_error_code('ExecutionAlreadyExists'): # this will never be executed anymore module.exit_json(changed=False) - except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Failed to start execution.") module.exit_json(changed=True, **camel_dict_to_snake_dict(res_execution)) @@ -152,7 +152,7 @@ def stop_execution(module, sfn_client): cause=cause, error=error ) - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Failed to stop execution.") module.exit_json(changed=True, **camel_dict_to_snake_dict(res)) diff --git a/plugins/modules/cloudfront_invalidation.py b/plugins/modules/cloudfront_invalidation.py index 99d1436da49..d3c7502b4eb 100644 --- a/plugins/modules/cloudfront_invalidation.py +++ b/plugins/modules/cloudfront_invalidation.py @@ -139,7 +139,7 @@ import datetime try: - from botocore.exceptions import ClientError, BotoCoreError + import botocore except ImportError: pass # caught by imported AnsibleAWSModule @@ -173,7 +173,7 @@ def create_invalidation(self, distribution_id, invalidation_batch): self.module.warn("InvalidationBatch target paths are not modifiable. " "To make a new invalidation please update caller_reference.") return current_invalidation_response, False - except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except self.module.fail_json_aws(e, msg="Error creating CloudFront invalidations.") def get_invalidation(self, distribution_id, caller_reference): @@ -183,7 +183,7 @@ def get_invalidation(self, distribution_id, caller_reference): paginator = self.client.get_paginator('list_invalidations') invalidations = paginator.paginate(DistributionId=distribution_id).build_full_result().get('InvalidationList', {}).get('Items', []) invalidation_ids = [inv['Id'] for inv in invalidations] - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: self.module.fail_json_aws(e, msg="Error listing CloudFront invalidations.") # check if there is an invalidation with the same caller reference @@ -191,7 +191,7 @@ def get_invalidation(self, distribution_id, caller_reference): try: invalidation = self.client.get_invalidation(DistributionId=distribution_id, Id=inv_id)['Invalidation'] caller_ref = invalidation.get('InvalidationBatch', {}).get('CallerReference') - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: self.module.fail_json_aws(e, msg="Error getting CloudFront invalidation {0}".format(inv_id)) if caller_ref == caller_reference: current_invalidation = invalidation @@ -217,7 +217,7 @@ def validate_distribution_id(self, distribution_id, alias): if distribution_id is None: distribution_id = self.__cloudfront_facts_mgr.get_distribution_id_from_domain_name(alias) return distribution_id - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: self.module.fail_json_aws(e, msg="Error validating parameters.") def create_aws_list(self, invalidation_batch): @@ -237,7 +237,7 @@ def validate_invalidation_batch(self, invalidation_batch, caller_reference): 'caller_reference': valid_caller_reference } return valid_invalidation_batch - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: self.module.fail_json_aws(e, msg="Error validating invalidation batch.") diff --git a/plugins/modules/ec2_asg_info.py b/plugins/modules/ec2_asg_info.py index 15f6886c902..fa0ce72b6e7 100644 --- a/plugins/modules/ec2_asg_info.py +++ b/plugins/modules/ec2_asg_info.py @@ -219,7 +219,7 @@ import re try: - from botocore.exceptions import BotoCoreError, ClientError + import botocore except ImportError: pass # caught by AnsibleAWSModule @@ -331,7 +331,7 @@ def find_asgs(conn, module, name=None, tags=None): try: asgs_paginator = conn.get_paginator('describe_auto_scaling_groups') asgs = asgs_paginator.paginate().build_full_result() - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg='Failed to describe AutoScalingGroups') if not asgs: @@ -339,7 +339,7 @@ def find_asgs(conn, module, name=None, tags=None): try: elbv2 = module.client('elbv2') - except ClientError as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # This is nice to have, not essential elbv2 = None matched_asgs = [] @@ -376,7 +376,7 @@ def find_asgs(conn, module, name=None, tags=None): asg['target_group_names'] = [tg['TargetGroupName'] for tg in tg_result['TargetGroups']] except is_boto3_error_code('TargetGroupNotFound'): asg['target_group_names'] = [] - except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Failed to describe Target Groups") else: asg['target_group_names'] = [] diff --git a/plugins/modules/ec2_placement_group.py b/plugins/modules/ec2_placement_group.py index b50e0ddbb08..3ccb2c00802 100644 --- a/plugins/modules/ec2_placement_group.py +++ b/plugins/modules/ec2_placement_group.py @@ -88,7 +88,7 @@ ''' try: - from botocore.exceptions import (BotoCoreError, ClientError) + import botocore except ImportError: pass # caught by AnsibleAWSModule @@ -106,7 +106,7 @@ def get_placement_group_details(connection, module): "Name": "group-name", "Values": [name] }]) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws( e, msg="Couldn't find placement group named [%s]" % name) @@ -136,7 +136,7 @@ def create_placement_group(connection, module): "state": 'DryRun', "strategy": strategy, }) - except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws( e, msg="Couldn't create placement group [%s]" % name) @@ -154,7 +154,7 @@ def delete_placement_group(connection, module): try: connection.delete_placement_group( GroupName=name, DryRun=module.check_mode) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws( e, msg="Couldn't delete placement group [%s]" % name) diff --git a/plugins/modules/ec2_transit_gateway_info.py b/plugins/modules/ec2_transit_gateway_info.py index d5ee359de8f..ec9783663fd 100644 --- a/plugins/modules/ec2_transit_gateway_info.py +++ b/plugins/modules/ec2_transit_gateway_info.py @@ -165,7 +165,7 @@ ''' try: - from botocore.exceptions import BotoCoreError, ClientError + import botocore except ImportError: pass # handled by imported AnsibleAWSModule @@ -250,7 +250,7 @@ def main(): tgwf_manager = AnsibleEc2TgwInfo(module=module, results=results) try: tgwf_manager.describe_transit_gateways() - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e) module.exit_json(**results) diff --git a/plugins/modules/ec2_vpc_nacl_info.py b/plugins/modules/ec2_vpc_nacl_info.py index 1fde4da3edc..a9300f8df55 100644 --- a/plugins/modules/ec2_vpc_nacl_info.py +++ b/plugins/modules/ec2_vpc_nacl_info.py @@ -105,7 +105,7 @@ ''' try: - from botocore.exceptions import ClientError, BotoCoreError + import botocore except ImportError: pass # caught by AnsibleAWSModule @@ -134,7 +134,7 @@ def list_ec2_vpc_nacls(connection, module): nacls = connection.describe_network_acls(aws_retry=True, NetworkAclIds=nacl_ids, Filters=filters) except is_boto3_error_code('InvalidNetworkAclID.NotFound'): module.fail_json(msg='Unable to describe ACL. NetworkAcl does not exist') - except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Unable to describe network ACLs {0}".format(nacl_ids)) # Turn the boto3 result in to ansible_friendly_snaked_names diff --git a/plugins/modules/ecs_ecr.py b/plugins/modules/ecs_ecr.py index cbd6686810d..768589dbdff 100644 --- a/plugins/modules/ecs_ecr.py +++ b/plugins/modules/ecs_ecr.py @@ -188,7 +188,7 @@ import traceback try: - from botocore.exceptions import ClientError + import botocore except ImportError: pass # Handled by AnsibleAWSModule @@ -513,7 +513,7 @@ def run(ecr, params): except Exception as err: msg = str(err) - if isinstance(err, ClientError): + if isinstance(err, botocore.exceptions.ClientError): msg = boto_exception(err) result['msg'] = msg result['exception'] = traceback.format_exc() diff --git a/plugins/modules/efs.py b/plugins/modules/efs.py index be992b3f148..efc7268cca5 100644 --- a/plugins/modules/efs.py +++ b/plugins/modules/efs.py @@ -230,7 +230,7 @@ from time import time as timestamp try: - from botocore.exceptions import ClientError, BotoCoreError + import botocore except ImportError as e: pass # Handled by AnsibleAWSModule @@ -431,7 +431,7 @@ def create_file_system(self, name, performance_mode, encrypt, kms_key_id, throug try: self.connection.create_file_system(**params) changed = True - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: self.module.fail_json_aws(e, msg="Unable to create file system.") # we always wait for the state to be available when creating. @@ -469,7 +469,7 @@ def update_file_system(self, name, throughput_mode, provisioned_throughput_in_mi try: self.connection.update_file_system(FileSystemId=fs_id, **params) changed = True - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: self.module.fail_json_aws(e, msg="Unable to update file system.") return changed @@ -489,7 +489,7 @@ def converge_file_system(self, name, tags, purge_tags, targets, throughput_mode, FileSystemId=fs_id, TagKeys=tags_to_delete ) - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: self.module.fail_json_aws(e, msg="Unable to delete tags.") result = True @@ -500,7 +500,7 @@ def converge_file_system(self, name, tags, purge_tags, targets, throughput_mode, FileSystemId=fs_id, Tags=ansible_dict_to_boto3_tag_list(tags_need_modify) ) - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: self.module.fail_json_aws(e, msg="Unable to create tags.") result = True diff --git a/plugins/modules/iam_group.py b/plugins/modules/iam_group.py index ec4af5f8cfb..cdf75bec08c 100644 --- a/plugins/modules/iam_group.py +++ b/plugins/modules/iam_group.py @@ -178,7 +178,7 @@ ''' try: - from botocore.exceptions import BotoCoreError, ClientError + import botocore except ImportError: pass # caught by AnsibleAWSModule @@ -247,7 +247,7 @@ def create_or_update_group(connection, module): # Get group try: group = get_group(connection, module, params['GroupName']) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Couldn't get group") # If group is None, create it @@ -259,7 +259,7 @@ def create_or_update_group(connection, module): try: group = connection.create_group(**params) changed = True - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Couldn't create group") # Manage managed policies @@ -277,7 +277,7 @@ def create_or_update_group(connection, module): if not module.check_mode: try: connection.detach_group_policy(GroupName=params['GroupName'], PolicyArn=policy_arn) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Couldn't detach policy from group %s" % params['GroupName']) # If there are policies to adjust that aren't in the current list, then things have changed # Otherwise the only changes were in purging above @@ -288,13 +288,13 @@ def create_or_update_group(connection, module): for policy_arn in managed_policies: try: connection.attach_group_policy(GroupName=params['GroupName'], PolicyArn=policy_arn) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Couldn't attach policy to group %s" % params['GroupName']) # Manage group memberships try: current_group_members = get_group(connection, module, params['GroupName'])['Users'] - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, "Couldn't get group %s" % params['GroupName']) current_group_members_list = [] @@ -311,7 +311,7 @@ def create_or_update_group(connection, module): if not module.check_mode: try: connection.remove_user_from_group(GroupName=params['GroupName'], UserName=user) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Couldn't remove user %s from group %s" % (user, params['GroupName'])) # If there are users to adjust that aren't in the current list, then things have changed # Otherwise the only changes were in purging above @@ -322,7 +322,7 @@ def create_or_update_group(connection, module): for user in users: try: connection.add_user_to_group(GroupName=params['GroupName'], UserName=user) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Couldn't add user %s to group %s" % (user, params['GroupName'])) if module.check_mode: module.exit_json(changed=changed) @@ -330,7 +330,7 @@ def create_or_update_group(connection, module): # Get the group again try: group = get_group(connection, module, params['GroupName']) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, "Couldn't get group %s" % params['GroupName']) module.exit_json(changed=changed, iam_group=camel_dict_to_snake_dict(group)) @@ -343,7 +343,7 @@ def destroy_group(connection, module): try: group = get_group(connection, module, params['GroupName']) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, "Couldn't get group %s" % params['GroupName']) if group: # Check mode means we would remove this group @@ -354,26 +354,26 @@ def destroy_group(connection, module): try: for policy in get_attached_policy_list(connection, module, params['GroupName']): connection.detach_group_policy(GroupName=params['GroupName'], PolicyArn=policy['PolicyArn']) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Couldn't remove policy from group %s" % params['GroupName']) # Remove any users in the group otherwise deletion fails current_group_members_list = [] try: current_group_members = get_group(connection, module, params['GroupName'])['Users'] - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, "Couldn't get group %s" % params['GroupName']) for member in current_group_members: current_group_members_list.append(member['UserName']) for user in current_group_members_list: try: connection.remove_user_from_group(GroupName=params['GroupName'], UserName=user) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, "Couldn't remove user %s from group %s" % (user, params['GroupName'])) try: connection.delete_group(**params) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, "Couldn't delete group %s" % params['GroupName']) else: diff --git a/plugins/modules/iam_policy_info.py b/plugins/modules/iam_policy_info.py index 53ef0b97fb3..0aa57d1099c 100644 --- a/plugins/modules/iam_policy_info.py +++ b/plugins/modules/iam_policy_info.py @@ -78,7 +78,7 @@ ''' try: - from botocore.exceptions import BotoCoreError, ClientError + import botocore except ImportError: pass @@ -205,7 +205,7 @@ def main(): module.exit_json(**(policy.run())) except is_boto3_error_code('NoSuchEntity') as e: module.exit_json(changed=False, msg=e.response['Error']['Message']) - except (BotoCoreError, ClientError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e) except PolicyError as e: module.fail_json(msg=str(e)) diff --git a/plugins/modules/iam_role.py b/plugins/modules/iam_role.py index b5e80ceac43..18f6a10a898 100644 --- a/plugins/modules/iam_role.py +++ b/plugins/modules/iam_role.py @@ -195,7 +195,7 @@ import json try: - from botocore.exceptions import ClientError, BotoCoreError + import botocore except ImportError: pass # caught by AnsibleAWSModule @@ -243,7 +243,7 @@ def attach_policies(connection, module, policies_to_attach, params): try: if not module.check_mode: connection.attach_role_policy(RoleName=params['RoleName'], PolicyArn=policy_arn, aws_retry=True) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to attach policy {0} to role {1}".format(policy_arn, params['RoleName'])) changed = True return changed @@ -255,7 +255,7 @@ def remove_policies(connection, module, policies_to_remove, params): try: if not module.check_mode: connection.detach_role_policy(RoleName=params['RoleName'], PolicyArn=policy, aws_retry=True) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to detach policy {0} from {1}".format(policy, params['RoleName'])) changed = True return changed @@ -294,7 +294,7 @@ def create_basic_role(connection, module, params): else: role = {'MadeInCheckMode': True} role['AssumeRolePolicyDocument'] = json.loads(params['AssumeRolePolicyDocument']) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to create role") return role @@ -313,7 +313,7 @@ def update_role_assumed_policy(connection, module, params, role): RoleName=params['RoleName'], PolicyDocument=json.dumps(json.loads(params['AssumeRolePolicyDocument'])), aws_retry=True) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to update assume role policy for role {0}".format(params['RoleName'])) return True @@ -330,7 +330,7 @@ def update_role_description(connection, module, params, role): try: connection.update_role_description(RoleName=params['RoleName'], Description=params['Description'], aws_retry=True) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to update description for role {0}".format(params['RoleName'])) return True @@ -347,7 +347,7 @@ def update_role_max_session_duration(connection, module, params, role): try: connection.update_role(RoleName=params['RoleName'], MaxSessionDuration=params['MaxSessionDuration'], aws_retry=True) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to update maximum session duration for role {0}".format(params['RoleName'])) return True @@ -365,12 +365,12 @@ def update_role_permissions_boundary(connection, module, params, role): if params.get('PermissionsBoundary') == '': try: connection.delete_role_permissions_boundary(RoleName=params['RoleName'], aws_retry=True) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to remove permission boundary for role {0}".format(params['RoleName'])) else: try: connection.put_role_permissions_boundary(RoleName=params['RoleName'], PermissionsBoundary=params['PermissionsBoundary'], aws_retry=True) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to update permission boundary for role {0}".format(params['RoleName'])) return True @@ -458,7 +458,7 @@ def create_instance_profiles(connection, module, params, role): # Fetch existing Profiles try: instance_profiles = connection.list_instance_profiles_for_role(RoleName=params['RoleName'], aws_retry=True)['InstanceProfiles'] - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to list instance profiles for role {0}".format(params['RoleName'])) # Profile already exists @@ -475,13 +475,13 @@ def create_instance_profiles(connection, module, params, role): # If the profile already exists, no problem, move on. # Implies someone's changing things at the same time... return False - except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Unable to create instance profile for role {0}".format(params['RoleName'])) # And attach the role to the profile try: connection.add_role_to_instance_profile(InstanceProfileName=params['RoleName'], RoleName=params['RoleName'], aws_retry=True) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to attach role {0} to instance profile {0}".format(params['RoleName'])) return True @@ -493,7 +493,7 @@ def remove_instance_profiles(connection, module, role_params, role): try: instance_profiles = connection.list_instance_profiles_for_role(aws_retry=True, **role_params)['InstanceProfiles'] - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to list instance profiles for role {0}".format(role_name)) # Remove the role from the instance profile(s) @@ -506,9 +506,9 @@ def remove_instance_profiles(connection, module, role_params, role): if delete_profiles: try: connection.delete_instance_profile(InstanceProfileName=profile_name, aws_retry=True) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to remove instance profile {0}".format(profile_name)) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to remove role {0} from instance profile {1}".format(role_name, profile_name)) @@ -535,7 +535,7 @@ def destroy_role(connection, module): try: if not module.check_mode: connection.delete_role(aws_retry=True, **role_params) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to delete role") module.exit_json(changed=True) @@ -544,7 +544,7 @@ def destroy_role(connection, module): def get_role_with_backoff(connection, module, name): try: return AWSRetry.jittered_backoff(catch_extra_error_codes=['NoSuchEntity'])(connection.get_role)(RoleName=name)['Role'] - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to get role {0}".format(name)) @@ -553,14 +553,14 @@ def get_role(connection, module, name): return connection.get_role(RoleName=name, aws_retry=True)['Role'] except is_boto3_error_code('NoSuchEntity'): return None - except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Unable to get role {0}".format(name)) def get_attached_policy_list(connection, module, name): try: return connection.list_attached_role_policies(RoleName=name, aws_retry=True)['AttachedPolicies'] - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to list attached policies for role {0}".format(name)) @@ -570,7 +570,7 @@ def get_role_tags(connection, module): return {} try: return boto3_tag_list_to_ansible_dict(connection.list_role_tags(RoleName=role_name, aws_retry=True)['Tags']) - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="Unable to list tags for role {0}".format(role_name)) @@ -585,7 +585,7 @@ def update_role_tags(connection, module, params, role): try: existing_tags = boto3_tag_list_to_ansible_dict(connection.list_role_tags(RoleName=role_name, aws_retry=True)['Tags']) - except (ClientError, KeyError): + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError, KeyError): existing_tags = {} tags_to_add, tags_to_remove = compare_aws_tags(existing_tags, new_tags, purge_tags=purge_tags) @@ -596,7 +596,7 @@ def update_role_tags(connection, module, params, role): connection.untag_role(RoleName=role_name, TagKeys=tags_to_remove, aws_retry=True) if tags_to_add: connection.tag_role(RoleName=role_name, Tags=ansible_dict_to_boto3_tag_list(tags_to_add), aws_retry=True) - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg='Unable to set tags for role %s' % role_name) changed = bool(tags_to_add) or bool(tags_to_remove) diff --git a/plugins/modules/iam_user.py b/plugins/modules/iam_user.py index 56519e94c03..269aeb7eb7a 100644 --- a/plugins/modules/iam_user.py +++ b/plugins/modules/iam_user.py @@ -300,7 +300,7 @@ def get_user(connection, module, name): return connection.get_user(**params) except is_boto3_error_code('NoSuchEntity'): return None - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Unable to get user {0}".format(name)) @@ -310,7 +310,7 @@ def get_attached_policy_list(connection, module, name): return connection.list_attached_user_policies(UserName=name)['AttachedPolicies'] except is_boto3_error_code('NoSuchEntity'): return None - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Unable to get policies for user {0}".format(name)) @@ -320,7 +320,7 @@ def delete_user_login_profile(connection, module, user_name): return connection.delete_login_profile(UserName=user_name) except is_boto3_error_code('NoSuchEntity'): return None - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Unable to delete login profile for user {0}".format(user_name)) diff --git a/plugins/modules/lambda_alias.py b/plugins/modules/lambda_alias.py index 619a8b9b72f..9962f9aa7ac 100644 --- a/plugins/modules/lambda_alias.py +++ b/plugins/modules/lambda_alias.py @@ -144,7 +144,7 @@ import re try: - from botocore.exceptions import ClientError, BotoCoreError + import botocore except ImportError: pass # Handled by AnsibleAWSModule @@ -183,12 +183,12 @@ def __init__(self, ansible_obj, resources, boto3_=True): if not self.region: self.region = self.resource_client['lambda'].meta.region_name - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: ansible_obj.fail_json(msg="Unable to connect, authorize or access resource: {0}".format(e)) try: self.account_id = self.resource_client['iam'].get_user()['User']['Arn'].split(':')[4] - except (ClientError, ValueError, KeyError, IndexError): + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError, ValueError, KeyError, IndexError): self.account_id = '' def client(self, resource='lambda'): @@ -272,7 +272,7 @@ def get_lambda_alias(module, aws): results = client.get_alias(**api_params) except is_boto3_error_code('ResourceNotFoundException'): results = None - except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg='Error retrieving function alias') return results @@ -313,7 +313,7 @@ def lambda_alias(module, aws): if not module.check_mode: try: results = client.update_alias(**api_params) - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json(msg='Error updating function alias: {0}'.format(e)) else: @@ -324,7 +324,7 @@ def lambda_alias(module, aws): if not module.check_mode: results = client.create_alias(**api_params) changed = True - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json(msg='Error creating function alias: {0}'.format(e)) else: # state = 'absent' @@ -336,7 +336,7 @@ def lambda_alias(module, aws): if not module.check_mode: results = client.delete_alias(**api_params) changed = True - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json(msg='Error deleting function alias: {0}'.format(e)) return dict(changed=changed, **dict(results or facts)) diff --git a/plugins/modules/lambda_facts.py b/plugins/modules/lambda_facts.py index 4b591073a85..a92be77457a 100644 --- a/plugins/modules/lambda_facts.py +++ b/plugins/modules/lambda_facts.py @@ -94,7 +94,7 @@ import re try: - from botocore.exceptions import ClientError + import botocore except ImportError: pass # caught by AnsibleAWSModule @@ -149,7 +149,7 @@ def alias_details(client, module): lambda_facts.update(aliases=client.list_aliases(FunctionName=function_name, **params)['Aliases']) except is_boto3_error_code('ResourceNotFoundException'): lambda_facts.update(aliases=[]) - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Trying to get aliases") else: module.fail_json(msg='Parameter function_name required for query=aliases.') @@ -202,7 +202,7 @@ def config_details(client, module): lambda_facts.update(client.get_function_configuration(FunctionName=function_name)) except is_boto3_error_code('ResourceNotFoundException'): lambda_facts.update(function={}) - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Trying to get {0} configuration".format(function_name)) else: params = dict() @@ -216,7 +216,7 @@ def config_details(client, module): lambda_facts.update(function_list=client.list_functions(**params)['Functions']) except is_boto3_error_code('ResourceNotFoundException'): lambda_facts.update(function_list=[]) - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Trying to get function list") functions = dict() @@ -256,7 +256,7 @@ def mapping_details(client, module): lambda_facts.update(mappings=client.list_event_source_mappings(**params)['EventSourceMappings']) except is_boto3_error_code('ResourceNotFoundException'): lambda_facts.update(mappings=[]) - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Trying to get source event mappings") if function_name: @@ -286,7 +286,7 @@ def policy_details(client, module): lambda_facts.update(policy=json.loads(client.get_policy(FunctionName=function_name)['Policy'])) except is_boto3_error_code('ResourceNotFoundException'): lambda_facts.update(policy={}) - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Trying to get {0} policy".format(function_name)) else: module.fail_json(msg='Parameter function_name required for query=policy.') @@ -318,7 +318,7 @@ def version_details(client, module): lambda_facts.update(versions=client.list_versions_by_function(FunctionName=function_name, **params)['Versions']) except is_boto3_error_code('ResourceNotFoundException'): lambda_facts.update(versions=[]) - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Trying to get {0} versions".format(function_name)) else: module.fail_json(msg='Parameter function_name required for query=versions.') diff --git a/plugins/modules/lambda_info.py b/plugins/modules/lambda_info.py index 9b39863d663..da5fa21345d 100644 --- a/plugins/modules/lambda_info.py +++ b/plugins/modules/lambda_info.py @@ -83,7 +83,7 @@ import re try: - from botocore.exceptions import ClientError + import botocore except ImportError: pass # caught by AnsibleAWSModule @@ -138,7 +138,7 @@ def alias_details(client, module): lambda_info.update(aliases=client.list_aliases(FunctionName=function_name, **params)['Aliases']) except is_boto3_error_code('ResourceNotFoundException'): lambda_info.update(aliases=[]) - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Trying to get aliases") else: module.fail_json(msg='Parameter function_name required for query=aliases.') @@ -191,7 +191,7 @@ def config_details(client, module): lambda_info.update(client.get_function_configuration(FunctionName=function_name)) except is_boto3_error_code('ResourceNotFoundException'): lambda_info.update(function={}) - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Trying to get {0} configuration".format(function_name)) else: params = dict() @@ -205,7 +205,7 @@ def config_details(client, module): lambda_info.update(function_list=client.list_functions(**params)['Functions']) except is_boto3_error_code('ResourceNotFoundException'): lambda_info.update(function_list=[]) - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Trying to get function list") functions = dict() @@ -245,7 +245,7 @@ def mapping_details(client, module): lambda_info.update(mappings=client.list_event_source_mappings(**params)['EventSourceMappings']) except is_boto3_error_code('ResourceNotFoundException'): lambda_info.update(mappings=[]) - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Trying to get source event mappings") if function_name: @@ -275,7 +275,7 @@ def policy_details(client, module): lambda_info.update(policy=json.loads(client.get_policy(FunctionName=function_name)['Policy'])) except is_boto3_error_code('ResourceNotFoundException'): lambda_info.update(policy={}) - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Trying to get {0} policy".format(function_name)) else: module.fail_json(msg='Parameter function_name required for query=policy.') @@ -307,7 +307,7 @@ def version_details(client, module): lambda_info.update(versions=client.list_versions_by_function(FunctionName=function_name, **params)['Versions']) except is_boto3_error_code('ResourceNotFoundException'): lambda_info.update(versions=[]) - except ClientError as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="Trying to get {0} versions".format(function_name)) else: module.fail_json(msg='Parameter function_name required for query=versions.') diff --git a/plugins/modules/lambda_policy.py b/plugins/modules/lambda_policy.py index 6f17ce34519..ff091a8beaa 100644 --- a/plugins/modules/lambda_policy.py +++ b/plugins/modules/lambda_policy.py @@ -136,7 +136,7 @@ import re try: - from botocore.exceptions import ClientError, BotoCoreError + import botocore except ImportError: pass # caught by AnsibleAWSModule @@ -289,7 +289,7 @@ def get_policy_statement(module, client): policy_results = client.get_policy(**api_params) except is_boto3_error_code('ResourceNotFoundException'): return {} - except (BotoCoreError, ClientError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e, msg="retrieving function policy") # get_policy returns a JSON string so must convert to dict before reassigning to its key @@ -325,7 +325,7 @@ def add_policy_permission(module, client): if not module.check_mode: try: client.add_permission(**api_params) - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="adding permission to policy") changed = True @@ -353,7 +353,7 @@ def remove_policy_permission(module, client): if not module.check_mode: client.remove_permission(**api_params) changed = True - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg="removing permission from policy") return changed diff --git a/plugins/modules/s3_lifecycle.py b/plugins/modules/s3_lifecycle.py index 8b97a9e85d1..0bc4a328680 100644 --- a/plugins/modules/s3_lifecycle.py +++ b/plugins/modules/s3_lifecycle.py @@ -194,7 +194,7 @@ import datetime try: - from botocore.exceptions import BotoCoreError, ClientError + import botocore except ImportError: pass # handled by AnsibleAwsModule @@ -227,7 +227,7 @@ def create_lifecycle_rule(client, module): current_lifecycle_rules = current_lifecycle['Rules'] except is_boto3_error_code('NoSuchLifecycleConfiguration'): current_lifecycle_rules = [] - except (BotoCoreError, ClientError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e) rule = dict(Filter=dict(Prefix=prefix), Status=status.title()) @@ -303,7 +303,7 @@ def create_lifecycle_rule(client, module): # Write lifecycle to bucket try: client.put_bucket_lifecycle_configuration(Bucket=name, LifecycleConfiguration=lifecycle_configuration) - except (BotoCoreError, ClientError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e) module.exit_json(changed=changed) @@ -388,7 +388,7 @@ def destroy_lifecycle_rule(client, module): current_lifecycle_rules = client.get_bucket_lifecycle_configuration(Bucket=name)['Rules'] except is_boto3_error_code('NoSuchLifecycleConfiguration'): current_lifecycle_rules = [] - except (ClientError, BotoCoreError) as e: # pylint: disable=duplicate-except + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e) # Create lifecycle @@ -418,7 +418,7 @@ def destroy_lifecycle_rule(client, module): elif current_lifecycle_rules: changed = True client.delete_bucket_lifecycle(Bucket=name) - except (ClientError, BotoCoreError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e) module.exit_json(changed=changed) diff --git a/plugins/modules/sqs_queue.py b/plugins/modules/sqs_queue.py index 4988b0454b5..16e07c651c9 100644 --- a/plugins/modules/sqs_queue.py +++ b/plugins/modules/sqs_queue.py @@ -222,7 +222,7 @@ import json try: - from botocore.exceptions import BotoCoreError, ClientError, ParamValidationError + import botocore except ImportError: pass # handled by AnsibleAWSModule @@ -417,7 +417,7 @@ def update_tags(client, queue_url, module): try: existing_tags = client.list_queue_tags(QueueUrl=queue_url, aws_retry=True)['Tags'] - except (ClientError, KeyError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError, KeyError) as e: existing_tags = {} tags_to_add, tags_to_remove = compare_aws_tags(existing_tags, new_tags, purge_tags=purge_tags) @@ -464,7 +464,7 @@ def main(): result = create_or_update_sqs_queue(client, module) elif state == 'absent': result = delete_sqs_queue(client, module) - except (BotoCoreError, ClientError, ParamValidationError) as e: + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: module.fail_json_aws(e, msg='Failed to control sqs queue') else: module.exit_json(**result) From fc013060f221faed3363f1b000db51d9c99711c8 Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Wed, 27 Jan 2021 10:37:54 +0100 Subject: [PATCH 07/11] Remove unused imports --- plugins/modules/ec2_instance.py | 1 - plugins/modules/iam_user.py | 1 - 2 files changed, 2 deletions(-) diff --git a/plugins/modules/ec2_instance.py b/plugins/modules/ec2_instance.py index 7153e215396..06ebda60341 100644 --- a/plugins/modules/ec2_instance.py +++ b/plugins/modules/ec2_instance.py @@ -813,7 +813,6 @@ from ansible.module_utils.six import string_types from ansible.module_utils.six.moves.urllib import parse as urlparse -import ansible_collections.amazon.aws.plugins.module_utils.ec2 as ec2_utils from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_message diff --git a/plugins/modules/iam_user.py b/plugins/modules/iam_user.py index 269aeb7eb7a..531ae6ba9ae 100644 --- a/plugins/modules/iam_user.py +++ b/plugins/modules/iam_user.py @@ -111,7 +111,6 @@ except ImportError: pass # caught by AnsibleAWSModule -from ansible.module_utils._text import to_native from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule From 37767aa600492b3521424c51a92d6ec6fcf04d58 Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Wed, 27 Jan 2021 10:38:31 +0100 Subject: [PATCH 08/11] Remove unused 'PolicyError' from iam_policy_info --- plugins/modules/iam_policy_info.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/plugins/modules/iam_policy_info.py b/plugins/modules/iam_policy_info.py index 0aa57d1099c..19c5a01885b 100644 --- a/plugins/modules/iam_policy_info.py +++ b/plugins/modules/iam_policy_info.py @@ -87,10 +87,6 @@ from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry -class PolicyError(Exception): - pass - - class Policy: def __init__(self, client, name, policy_name): @@ -207,8 +203,6 @@ def main(): module.exit_json(changed=False, msg=e.response['Error']['Message']) except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except module.fail_json_aws(e) - except PolicyError as e: - module.fail_json(msg=str(e)) if __name__ == '__main__': From 8487ee6f563ffd27cb9b0e956214f5a23d389ae0 Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Tue, 20 Oct 2020 12:42:11 +0200 Subject: [PATCH 09/11] Avoid catching botocore.exceptions.ClientError when we only want some error codes --- plugins/modules/data_pipeline.py | 3 +-- plugins/modules/ec2_asg.py | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/modules/data_pipeline.py b/plugins/modules/data_pipeline.py index 980fb62f23e..4874388c733 100644 --- a/plugins/modules/data_pipeline.py +++ b/plugins/modules/data_pipeline.py @@ -203,7 +203,6 @@ try: import botocore - from botocore.exceptions import ClientError except ImportError: pass # Handled by AnsibleAWSModule @@ -255,7 +254,7 @@ def pipeline_description(client, dp_id): """ try: return client.describe_pipelines(pipelineIds=[dp_id]) - except ClientError: + except is_boto3_error_code('PipelineNotFoundException', 'PipelineDeletedException'): raise DataPipelineNotFound diff --git a/plugins/modules/ec2_asg.py b/plugins/modules/ec2_asg.py index 1300b1e785c..152918b6d6c 100644 --- a/plugins/modules/ec2_asg.py +++ b/plugins/modules/ec2_asg.py @@ -595,13 +595,13 @@ def describe_launch_templates(connection, launch_template): try: lt = connection.describe_launch_templates(LaunchTemplateIds=[launch_template['launch_template_id']]) return lt - except (botocore.exceptions.ClientError) as e: + except is_boto3_error_code('InvalidLaunchTemplateName.NotFoundException'): module.fail_json(msg="No launch template found matching: %s" % launch_template) else: try: lt = connection.describe_launch_templates(LaunchTemplateNames=[launch_template['launch_template_name']]) return lt - except (botocore.exceptions.ClientError) as e: + except is_boto3_error_code('InvalidLaunchTemplateName.NotFoundException'): module.fail_json(msg="No launch template found matching: %s" % launch_template) From 4442a89a6c1ddfb6b90ae43e5906156480e7ec26 Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Wed, 27 Jan 2021 11:10:03 +0100 Subject: [PATCH 10/11] changelog --- changelogs/fragments/268-is_boto3_error.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelogs/fragments/268-is_boto3_error.yml diff --git a/changelogs/fragments/268-is_boto3_error.yml b/changelogs/fragments/268-is_boto3_error.yml new file mode 100644 index 00000000000..ad7b2ff1559 --- /dev/null +++ b/changelogs/fragments/268-is_boto3_error.yml @@ -0,0 +1,3 @@ +minor_changes: +- various community.aws modules - cleanup error handling to use ``is_boto3_error_code`` and ``is_boto3_error_message`` helpers (https://github.com/ansible-collections/community.aws/pull/268). +- various community.aws modules - improve consistency of handling Boto3 exceptions (https://github.com/ansible-collections/community.aws/pull/268). From 41c7024d6b41a52f57698079c15aaff346043b2e Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Wed, 27 Jan 2021 11:25:13 +0100 Subject: [PATCH 11/11] Import camel_dict_to_snake_dict/snake_dict_to_camel_dict from ansible.module_utils.common.dict_transformations --- plugins/modules/aws_glue_connection.py | 11 ++++++----- plugins/modules/aws_glue_job.py | 3 ++- .../aws_step_functions_state_machine_execution.py | 9 +++++---- plugins/modules/aws_waf_condition.py | 3 ++- plugins/modules/cloudfront_invalidation.py | 5 +++-- plugins/modules/cloudwatchevent_rule.py | 3 ++- plugins/modules/ec2_asg_info.py | 3 ++- plugins/modules/ec2_transit_gateway_info.py | 3 ++- plugins/modules/ec2_vpc_egress_igw.py | 3 ++- plugins/modules/ec2_vpc_nacl_info.py | 3 ++- plugins/modules/ec2_vpc_route_table.py | 5 +++-- plugins/modules/efs.py | 3 ++- plugins/modules/elb_target_group.py | 3 ++- plugins/modules/iam_group.py | 3 ++- plugins/modules/iam_password_policy.py | 3 ++- plugins/modules/iam_role.py | 3 ++- plugins/modules/iam_role_info.py | 3 ++- plugins/modules/lambda_alias.py | 3 ++- plugins/modules/lambda_facts.py | 3 ++- plugins/modules/lambda_info.py | 3 ++- plugins/modules/lightsail.py | 3 ++- plugins/modules/sqs_queue.py | 5 +++-- 22 files changed, 54 insertions(+), 32 deletions(-) diff --git a/plugins/modules/aws_glue_connection.py b/plugins/modules/aws_glue_connection.py index 91210671514..41bc99816a0 100644 --- a/plugins/modules/aws_glue_connection.py +++ b/plugins/modules/aws_glue_connection.py @@ -130,11 +130,6 @@ sample: {'subnet-id':'subnet-aabbccddee'} ''' -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import get_ec2_security_group_ids_from_names - # Non-ansible imports import copy import time @@ -143,6 +138,12 @@ except ImportError: pass +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code +from ansible_collections.amazon.aws.plugins.module_utils.ec2 import get_ec2_security_group_ids_from_names + def _get_glue_connection(connection, module): """ diff --git a/plugins/modules/aws_glue_job.py b/plugins/modules/aws_glue_job.py index 3e0f17c73da..7f6af1f4d0c 100644 --- a/plugins/modules/aws_glue_job.py +++ b/plugins/modules/aws_glue_job.py @@ -192,9 +192,10 @@ except ImportError: pass # Handled by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict def _get_glue_job(connection, module, glue_job_name): diff --git a/plugins/modules/aws_step_functions_state_machine_execution.py b/plugins/modules/aws_step_functions_state_machine_execution.py index c500af53b4e..8ecc2a1272d 100644 --- a/plugins/modules/aws_step_functions_state_machine_execution.py +++ b/plugins/modules/aws_step_functions_state_machine_execution.py @@ -89,15 +89,16 @@ ''' -from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule -from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict - try: import botocore except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + +from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule +from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code + def start_execution(module, sfn_client): ''' diff --git a/plugins/modules/aws_waf_condition.py b/plugins/modules/aws_waf_condition.py index 2de23cf12ff..77f66f9f767 100644 --- a/plugins/modules/aws_waf_condition.py +++ b/plugins/modules/aws_waf_condition.py @@ -402,10 +402,11 @@ except ImportError: pass # handled by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_policies from ansible_collections.amazon.aws.plugins.module_utils.waf import MATCH_LOOKUP from ansible_collections.amazon.aws.plugins.module_utils.waf import run_func_with_change_token_backoff diff --git a/plugins/modules/cloudfront_invalidation.py b/plugins/modules/cloudfront_invalidation.py index d3c7502b4eb..974358f3967 100644 --- a/plugins/modules/cloudfront_invalidation.py +++ b/plugins/modules/cloudfront_invalidation.py @@ -143,10 +143,11 @@ except ImportError: pass # caught by imported AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict +from ansible.module_utils.common.dict_transformations import snake_dict_to_camel_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_message -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import snake_dict_to_camel_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.cloudfront_facts import CloudFrontFactsServiceManager diff --git a/plugins/modules/cloudwatchevent_rule.py b/plugins/modules/cloudwatchevent_rule.py index 7f4564ec1c0..8de7dc7d291 100644 --- a/plugins/modules/cloudwatchevent_rule.py +++ b/plugins/modules/cloudwatchevent_rule.py @@ -154,9 +154,10 @@ except ImportError: pass # handled by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict class CloudWatchEventRule(object): diff --git a/plugins/modules/ec2_asg_info.py b/plugins/modules/ec2_asg_info.py index fa0ce72b6e7..819bf6e5ab3 100644 --- a/plugins/modules/ec2_asg_info.py +++ b/plugins/modules/ec2_asg_info.py @@ -223,9 +223,10 @@ except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict def match_asg_tags(tags_to_match, asg): diff --git a/plugins/modules/ec2_transit_gateway_info.py b/plugins/modules/ec2_transit_gateway_info.py index ec9783663fd..707e375a7ee 100644 --- a/plugins/modules/ec2_transit_gateway_info.py +++ b/plugins/modules/ec2_transit_gateway_info.py @@ -169,12 +169,13 @@ except ImportError: pass # handled by imported AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict class AnsibleEc2TgwInfo(object): diff --git a/plugins/modules/ec2_vpc_egress_igw.py b/plugins/modules/ec2_vpc_egress_igw.py index a48b9b4744a..0026ade65ad 100644 --- a/plugins/modules/ec2_vpc_egress_igw.py +++ b/plugins/modules/ec2_vpc_egress_igw.py @@ -62,9 +62,10 @@ except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict def delete_eigw(module, conn, eigw_id): diff --git a/plugins/modules/ec2_vpc_nacl_info.py b/plugins/modules/ec2_vpc_nacl_info.py index a9300f8df55..8c905f67e58 100644 --- a/plugins/modules/ec2_vpc_nacl_info.py +++ b/plugins/modules/ec2_vpc_nacl_info.py @@ -109,11 +109,12 @@ except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict diff --git a/plugins/modules/ec2_vpc_route_table.py b/plugins/modules/ec2_vpc_route_table.py index 8ed6fb4657f..cebbed38f8b 100644 --- a/plugins/modules/ec2_vpc_route_table.py +++ b/plugins/modules/ec2_vpc_route_table.py @@ -232,15 +232,16 @@ except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict +from ansible.module_utils.common.dict_transformations import snake_dict_to_camel_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_filter_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import snake_dict_to_camel_dict from ansible_collections.amazon.aws.plugins.module_utils.waiters import get_waiter diff --git a/plugins/modules/efs.py b/plugins/modules/efs.py index efc7268cca5..f46c3f588c4 100644 --- a/plugins/modules/efs.py +++ b/plugins/modules/efs.py @@ -234,11 +234,12 @@ except ImportError as e: pass # Handled by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags diff --git a/plugins/modules/elb_target_group.py b/plugins/modules/elb_target_group.py index 241b722b5e0..4980fc797ad 100644 --- a/plugins/modules/elb_target_group.py +++ b/plugins/modules/elb_target_group.py @@ -379,12 +379,13 @@ except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags diff --git a/plugins/modules/iam_group.py b/plugins/modules/iam_group.py index cdf75bec08c..af9d781a92f 100644 --- a/plugins/modules/iam_group.py +++ b/plugins/modules/iam_group.py @@ -182,9 +182,10 @@ except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry diff --git a/plugins/modules/iam_password_policy.py b/plugins/modules/iam_password_policy.py index 24b85768e8e..852deb0d10b 100644 --- a/plugins/modules/iam_password_policy.py +++ b/plugins/modules/iam_password_policy.py @@ -103,9 +103,10 @@ except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict class IAMConnection(object): diff --git a/plugins/modules/iam_role.py b/plugins/modules/iam_role.py index 18f6a10a898..ddc8ad23041 100644 --- a/plugins/modules/iam_role.py +++ b/plugins/modules/iam_role.py @@ -199,12 +199,13 @@ except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import ansible_dict_to_boto3_tag_list from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_policies diff --git a/plugins/modules/iam_role_info.py b/plugins/modules/iam_role_info.py index a050204b6b1..132bdeedcc9 100644 --- a/plugins/modules/iam_role_info.py +++ b/plugins/modules/iam_role_info.py @@ -152,11 +152,12 @@ except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_tag_list_to_ansible_dict -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict @AWSRetry.exponential_backoff() diff --git a/plugins/modules/lambda_alias.py b/plugins/modules/lambda_alias.py index 9962f9aa7ac..aeacb6e3b75 100644 --- a/plugins/modules/lambda_alias.py +++ b/plugins/modules/lambda_alias.py @@ -148,10 +148,11 @@ except ImportError: pass # Handled by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import boto3_conn -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import get_aws_connection_info diff --git a/plugins/modules/lambda_facts.py b/plugins/modules/lambda_facts.py index a92be77457a..b1a223b61db 100644 --- a/plugins/modules/lambda_facts.py +++ b/plugins/modules/lambda_facts.py @@ -98,9 +98,10 @@ except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict def fix_return(node): diff --git a/plugins/modules/lambda_info.py b/plugins/modules/lambda_info.py index da5fa21345d..725149d9c3b 100644 --- a/plugins/modules/lambda_info.py +++ b/plugins/modules/lambda_info.py @@ -87,9 +87,10 @@ except ImportError: pass # caught by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict def fix_return(node): diff --git a/plugins/modules/lightsail.py b/plugins/modules/lightsail.py index 699582b857d..a996edc5e85 100644 --- a/plugins/modules/lightsail.py +++ b/plugins/modules/lightsail.py @@ -160,9 +160,10 @@ # will be caught by AnsibleAWSModule pass +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict def find_instance_info(module, client, instance_name, fail_if_not_found=False): diff --git a/plugins/modules/sqs_queue.py b/plugins/modules/sqs_queue.py index 16e07c651c9..0a93909f021 100644 --- a/plugins/modules/sqs_queue.py +++ b/plugins/modules/sqs_queue.py @@ -226,13 +226,14 @@ except ImportError: pass # handled by AnsibleAWSModule +from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict +from ansible.module_utils.common.dict_transformations import snake_dict_to_camel_dict + from ansible_collections.amazon.aws.plugins.module_utils.core import AnsibleAWSModule from ansible_collections.amazon.aws.plugins.module_utils.core import is_boto3_error_code from ansible_collections.amazon.aws.plugins.module_utils.ec2 import AWSRetry -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import camel_dict_to_snake_dict from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_aws_tags from ansible_collections.amazon.aws.plugins.module_utils.ec2 import compare_policies -from ansible_collections.amazon.aws.plugins.module_utils.ec2 import snake_dict_to_camel_dict def get_queue_name(module, is_fifo=False):