From 551c9fc6c5c0efeba97a08c5aed304c11f7aaa0a Mon Sep 17 00:00:00 2001 From: Alina Buzachis Date: Fri, 23 Sep 2022 10:24:34 +0200 Subject: [PATCH] Migrate rds_subnet_group* modules and tests (#1532) Migrate rds_subnet_group* modules and tests Depends-On: ansible-collections/amazon.aws#1058 Remove rds_subnet_group* modules and tests These modules have been migrated to amazon.aws Update runtime.yml with redirects to that collection Update ignore files Reviewed-by: Mark Chappell --- .../fragments/migrate_rds_subnet_group.yml | 4 + meta/runtime.yml | 11 +- plugins/modules/rds_subnet_group.py | 367 ---------- .../targets/rds_subnet_group/aliases | 1 - .../rds_subnet_group/defaults/main.yml | 8 - .../targets/rds_subnet_group/meta/main.yml | 1 - .../targets/rds_subnet_group/tasks/main.yml | 115 --- .../targets/rds_subnet_group/tasks/params.yml | 30 - .../targets/rds_subnet_group/tasks/tests.yml | 676 ------------------ 9 files changed, 10 insertions(+), 1203 deletions(-) create mode 100644 changelogs/fragments/migrate_rds_subnet_group.yml delete mode 100644 plugins/modules/rds_subnet_group.py delete mode 100644 tests/integration/targets/rds_subnet_group/aliases delete mode 100644 tests/integration/targets/rds_subnet_group/defaults/main.yml delete mode 100644 tests/integration/targets/rds_subnet_group/meta/main.yml delete mode 100644 tests/integration/targets/rds_subnet_group/tasks/main.yml delete mode 100644 tests/integration/targets/rds_subnet_group/tasks/params.yml delete mode 100644 tests/integration/targets/rds_subnet_group/tasks/tests.yml diff --git a/changelogs/fragments/migrate_rds_subnet_group.yml b/changelogs/fragments/migrate_rds_subnet_group.yml new file mode 100644 index 00000000000..b4b27a1b2f4 --- /dev/null +++ b/changelogs/fragments/migrate_rds_subnet_group.yml @@ -0,0 +1,4 @@ +breaking_changes: +- rds_subnet_group - The module has been migrated from the ``community.aws`` collection. + Playbooks using the Fully Qualified Collection Name for this module should be updated + to use ``amazon.aws.rds_subnet_group``. diff --git a/meta/runtime.yml b/meta/runtime.yml index 48622539546..7c40055d222 100644 --- a/meta/runtime.yml +++ b/meta/runtime.yml @@ -191,7 +191,6 @@ action_groups: - rds_option_group - rds_option_group_info - rds_param_group - - rds_subnet_group - redshift - redshift_cross_region_snapshots - redshift_info @@ -465,6 +464,10 @@ plugin_routing: redirect: amazon.aws.iam_policy iam_policy_info: redirect: amazon.aws.iam_policy_info + kms_key: + redirect: amazon.aws.kms_key + kms_key_info: + redirect: amazon.aws.kms_key_info rds_cluster: redirect: amazon.aws.rds_cluster rds_cluster_info: @@ -479,7 +482,5 @@ plugin_routing: redirect: amazon.aws.rds_instance_snapshot rds_snapshot_info: redirect: amazon.aws.rds_snapshot_info - kms_key: - redirect: amazon.aws.kms_key - kms_key_info: - redirect: amazon.aws.kms_key_info + rds_subnet_group: + redirect: amazon.aws.rds_subnet_group diff --git a/plugins/modules/rds_subnet_group.py b/plugins/modules/rds_subnet_group.py deleted file mode 100644 index 3ce90a5d863..00000000000 --- a/plugins/modules/rds_subnet_group.py +++ /dev/null @@ -1,367 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright: Ansible Project -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - - -DOCUMENTATION = r''' ---- -module: rds_subnet_group -version_added: 1.0.0 -short_description: manage RDS database subnet groups -description: - - Creates, modifies, and deletes RDS database subnet groups. -options: - state: - description: - - Specifies whether the subnet should be present or absent. - required: true - choices: [ 'present' , 'absent' ] - type: str - name: - description: - - Database subnet group identifier. - required: true - type: str - description: - description: - - Database subnet group description. - - Required when I(state=present). - type: str - subnets: - description: - - List of subnet IDs that make up the database subnet group. - - Required when I(state=present). - type: list - elements: str -notes: - - Support for I(tags) and I(purge_tags) was added in release 3.2.0. -author: - - "Scott Anderson (@tastychutney)" - - "Alina Buzachis (@alinabuzachis)" -extends_documentation_fragment: - - amazon.aws.aws - - amazon.aws.ec2 - - amazon.aws.tags - -''' - -EXAMPLES = r''' -- name: Add or change a subnet group - community.aws.rds_subnet_group: - state: present - name: norwegian-blue - description: My Fancy Ex Parrot Subnet Group - subnets: - - subnet-aaaaaaaa - - subnet-bbbbbbbb - -- name: Add or change a subnet group and associate tags - community.aws.rds_subnet_group: - state: present - name: norwegian-blue - description: My Fancy Ex Parrot Subnet Group - subnets: - - subnet-aaaaaaaa - - subnet-bbbbbbbb - tags: - tag1: Tag1 - tag2: Tag2 - -- name: Remove a subnet group - community.aws.rds_subnet_group: - state: absent - name: norwegian-blue -''' - -RETURN = r''' -changed: - description: True if listing the RDS subnet group succeeds. - type: bool - returned: always - sample: "false" -subnet_group: - description: Dictionary of DB subnet group values - returned: I(state=present) - type: complex - contains: - name: - description: The name of the DB subnet group (maintained for backward compatibility) - returned: I(state=present) - type: str - sample: "ansible-test-mbp-13950442" - db_subnet_group_name: - description: The name of the DB subnet group - returned: I(state=present) - type: str - sample: "ansible-test-mbp-13950442" - description: - description: The description of the DB subnet group (maintained for backward compatibility) - returned: I(state=present) - type: str - sample: "Simple description." - db_subnet_group_description: - description: The description of the DB subnet group - returned: I(state=present) - type: str - sample: "Simple description." - vpc_id: - description: The VpcId of the DB subnet group - returned: I(state=present) - type: str - sample: "vpc-0acb0ba033ff2119c" - subnet_ids: - description: Contains a list of Subnet IDs - returned: I(state=present) - type: list - sample: - "subnet-08c94870f4480797e" - subnets: - description: Contains a list of Subnet elements (@see https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.describe_db_subnet_groups) # noqa - returned: I(state=present) - type: list - contains: - subnet_availability_zone: - description: Contains Availability Zone information. - returned: I(state=present) - type: dict - version_added: 3.2.0 - sample: - name: "eu-north-1b" - subnet_identifier: - description: The identifier of the subnet. - returned: I(state=present) - type: str - version_added: 3.2.0 - sample: "subnet-08c94870f4480797e" - subnet_outpost: - description: This value specifies the Outpost. - returned: I(state=present) - type: dict - version_added: 3.2.0 - sample: {} - subnet_status: - description: The status of the subnet. - returned: I(state=present) - type: str - version_added: 3.2.0 - sample: "Active" - status: - description: The status of the DB subnet group (maintained for backward compatibility) - returned: I(state=present) - type: str - sample: "Complete" - subnet_group_status: - description: The status of the DB subnet group - returned: I(state=present) - type: str - sample: "Complete" - db_subnet_group_arn: - description: The ARN of the DB subnet group - returned: I(state=present) - type: str - sample: "arn:aws:rds:eu-north-1:721066863947:subgrp:ansible-test-13950442" - tags: - description: The tags associated with the subnet group - returned: I(state=present) - type: dict - version_added: 3.2.0 - sample: - tag1: Tag1 - tag2: Tag2 -''' - -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.rds import get_tags -from ansible_collections.amazon.aws.plugins.module_utils.rds import ensure_tags - - -try: - import botocore -except ImportError: - pass # Handled by AnsibleAWSModule - - -def create_result(changed, subnet_group=None): - if subnet_group is None: - return dict( - changed=changed - ) - result_subnet_group = dict(subnet_group) - result_subnet_group['name'] = result_subnet_group.get( - 'db_subnet_group_name') - result_subnet_group['description'] = result_subnet_group.get( - 'db_subnet_group_description') - result_subnet_group['status'] = result_subnet_group.get( - 'subnet_group_status') - result_subnet_group['subnet_ids'] = create_subnet_list( - subnet_group.get('subnets')) - return dict( - changed=changed, - subnet_group=result_subnet_group - ) - - -@AWSRetry.jittered_backoff() -def _describe_db_subnet_groups_with_backoff(client, **kwargs): - paginator = client.get_paginator('describe_db_subnet_groups') - return paginator.paginate(**kwargs).build_full_result() - - -def get_subnet_group(client, module): - params = dict() - params['DBSubnetGroupName'] = module.params.get('name').lower() - - try: - _result = _describe_db_subnet_groups_with_backoff(client, **params) - except is_boto3_error_code('DBSubnetGroupNotFoundFault'): - return None - except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: # pylint: disable=duplicate-except - module.fail_json_aws(e, msg="Couldn't describe subnet groups.") - - if _result: - result = camel_dict_to_snake_dict(_result['DBSubnetGroups'][0]) - result['tags'] = get_tags(client, module, result['db_subnet_group_arn']) - - return result - - -def create_subnet_list(subnets): - r''' - Construct a list of subnet ids from a list of subnets dicts returned by boto3. - Parameters: - subnets (list): A list of subnets definitions. - @see https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.describe_db_subnet_groups - Returns: - (list): List of subnet ids (str) - ''' - subnets_ids = [] - for subnet in subnets: - subnets_ids.append(subnet.get('subnet_identifier')) - return subnets_ids - - -def main(): - argument_spec = dict( - state=dict(required=True, choices=['present', 'absent']), - name=dict(required=True), - description=dict(required=False), - subnets=dict(required=False, type='list', elements='str'), - tags=dict(required=False, type='dict', aliases=['resource_tags']), - purge_tags=dict(type='bool', default=True), - ) - required_if = [('state', 'present', ['description', 'subnets'])] - - module = AnsibleAWSModule( - argument_spec=argument_spec, - required_if=required_if, - supports_check_mode=True - ) - - state = module.params.get('state') - group_name = module.params.get('name').lower() - group_description = module.params.get('description') - group_subnets = module.params.get('subnets') or [] - - try: - connection = module.client('rds', retry_decorator=AWSRetry.jittered_backoff()) - except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: - module.fail_json_aws(e, 'Failed to instantiate AWS connection.') - - # Default. - changed = None - result = create_result(False) - tags_update = False - subnet_update = False - - if module.params.get("tags") is not None: - _tags = ansible_dict_to_boto3_tag_list(module.params.get("tags")) - else: - _tags = list() - - matching_groups = get_subnet_group(connection, module) - - if state == 'present': - if matching_groups: - # We have one or more subnets at this point. - - # Check if there is any tags update - tags_update = ensure_tags( - connection, - module, - matching_groups['db_subnet_group_arn'], - matching_groups['tags'], - module.params.get("tags"), - module.params['purge_tags'] - ) - - # Sort the subnet groups before we compare them - existing_subnets = create_subnet_list(matching_groups['subnets']) - existing_subnets.sort() - group_subnets.sort() - - # See if anything changed. - if ( - matching_groups['db_subnet_group_name'] != group_name or - matching_groups['db_subnet_group_description'] != group_description or - existing_subnets != group_subnets - ): - if not module.check_mode: - # Modify existing group. - try: - connection.modify_db_subnet_group( - aws_retry=True, - DBSubnetGroupName=group_name, - DBSubnetGroupDescription=group_description, - SubnetIds=group_subnets - ) - except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: - module.fail_json_aws(e, 'Failed to update a subnet group.') - subnet_update = True - else: - if not module.check_mode: - try: - connection.create_db_subnet_group( - aws_retry=True, - DBSubnetGroupName=group_name, - DBSubnetGroupDescription=group_description, - SubnetIds=group_subnets, - Tags=_tags - ) - except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: - module.fail_json_aws(e, 'Failed to create a new subnet group.') - subnet_update = True - elif state == 'absent': - if not module.check_mode: - try: - connection.delete_db_subnet_group(aws_retry=True, DBSubnetGroupName=group_name) - except is_boto3_error_code('DBSubnetGroupNotFoundFault'): - module.exit_json(**result) - except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: # pylint: disable=duplicate-except - module.fail_json_aws(e, 'Failed to delete a subnet group.') - else: - subnet_group = get_subnet_group(connection, module) - if subnet_group: - subnet_update = True - result = create_result(subnet_update, subnet_group) - module.exit_json(**result) - - subnet_update = True - - subnet_group = get_subnet_group(connection, module) - changed = tags_update or subnet_update - result = create_result(changed, subnet_group) - module.exit_json(**result) - - -if __name__ == '__main__': - main() diff --git a/tests/integration/targets/rds_subnet_group/aliases b/tests/integration/targets/rds_subnet_group/aliases deleted file mode 100644 index 4ef4b2067d0..00000000000 --- a/tests/integration/targets/rds_subnet_group/aliases +++ /dev/null @@ -1 +0,0 @@ -cloud/aws diff --git a/tests/integration/targets/rds_subnet_group/defaults/main.yml b/tests/integration/targets/rds_subnet_group/defaults/main.yml deleted file mode 100644 index 07e0fe93f8e..00000000000 --- a/tests/integration/targets/rds_subnet_group/defaults/main.yml +++ /dev/null @@ -1,8 +0,0 @@ -vpc_cidr: '10.{{ 256 | random(seed=resource_prefix) }}.0.0/16' -subnet_a: '10.{{ 256 | random(seed=resource_prefix) }}.10.0/24' -subnet_b: '10.{{ 256 | random(seed=resource_prefix) }}.11.0/24' -subnet_c: '10.{{ 256 | random(seed=resource_prefix) }}.12.0/24' -subnet_d: '10.{{ 256 | random(seed=resource_prefix) }}.13.0/24' - -group_description: 'Created by integration test : {{ resource_prefix }}' -group_description_changed: 'Created by integration test : {{ resource_prefix }} - changed' diff --git a/tests/integration/targets/rds_subnet_group/meta/main.yml b/tests/integration/targets/rds_subnet_group/meta/main.yml deleted file mode 100644 index 32cf5dda7ed..00000000000 --- a/tests/integration/targets/rds_subnet_group/meta/main.yml +++ /dev/null @@ -1 +0,0 @@ -dependencies: [] diff --git a/tests/integration/targets/rds_subnet_group/tasks/main.yml b/tests/integration/targets/rds_subnet_group/tasks/main.yml deleted file mode 100644 index ff31d014673..00000000000 --- a/tests/integration/targets/rds_subnet_group/tasks/main.yml +++ /dev/null @@ -1,115 +0,0 @@ ---- -# Tests for rds_subnet_group -# -# Note: (From Amazon's documentation) -# https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.modify_db_subnet_group -# DB subnet groups must contain at least one subnet in at least two AZs in the -# AWS Region. - -- module_defaults: - group/aws: - aws_access_key: '{{ aws_access_key }}' - aws_secret_key: '{{ aws_secret_key }}' - security_token: '{{ security_token | default(omit) }}' - region: '{{ aws_region }}' - collections: - - amazon.aws - block: - - # ============================================================ - - - name: 'Fetch AZ availability' - aws_az_info: - register: az_info - - - name: 'Assert that we have multiple AZs available to us' - assert: - that: az_info.availability_zones | length >= 2 - - - name: 'Pick AZs' - set_fact: - az_one: '{{ az_info.availability_zones[0].zone_name }}' - az_two: '{{ az_info.availability_zones[1].zone_name }}' - - # ============================================================ - - - name: 'Create a VPC' - ec2_vpc_net: - state: present - cidr_block: '{{ vpc_cidr }}' - name: '{{ resource_prefix }}' - register: vpc - - - name: 'Create subnets' - ec2_vpc_subnet: - state: present - cidr: '{{ item.cidr }}' - az: '{{ item.az }}' - vpc_id: '{{ vpc.vpc.id }}' - tags: - Name: '{{ item.name }}' - with_items: - - cidr: '{{ subnet_a }}' - az: '{{ az_one }}' - name: '{{ resource_prefix }}-subnet-a' - - cidr: '{{ subnet_b }}' - az: '{{ az_two }}' - name: '{{ resource_prefix }}-subnet-b' - - cidr: '{{ subnet_c }}' - az: '{{ az_one }}' - name: '{{ resource_prefix }}-subnet-c' - - cidr: '{{ subnet_d }}' - az: '{{ az_two }}' - name: '{{ resource_prefix }}-subnet-d' - register: subnets - - - set_fact: - subnet_ids: '{{ subnets.results | map(attribute="subnet.id") | list }}' - - # ============================================================ - - - include_tasks: 'params.yml' - - - include_tasks: 'tests.yml' - - # ============================================================ - - always: - - name: 'Remove subnet group' - rds_subnet_group: - state: absent - name: '{{ resource_prefix }}' - ignore_errors: yes - - - name: 'Remove subnets' - ec2_vpc_subnet: - state: absent - cidr: '{{ item.cidr }}' - vpc_id: '{{ vpc.vpc.id }}' - with_items: - - cidr: '{{ subnet_a }}' - name: '{{ resource_prefix }}-subnet-a' - - cidr: '{{ subnet_b }}' - name: '{{ resource_prefix }}-subnet-b' - - cidr: '{{ subnet_c }}' - name: '{{ resource_prefix }}-subnet-c' - - cidr: '{{ subnet_d }}' - name: '{{ resource_prefix }}-subnet-d' - ignore_errors: yes - register: removed_subnets - until: removed_subnets is succeeded - retries: 5 - delay: 5 - - - name: 'Remove the VPC' - ec2_vpc_net: - state: absent - cidr_block: '{{ vpc_cidr }}' - name: '{{ resource_prefix }}' - ignore_errors: yes - register: removed_vpc - until: removed_vpc is success - retries: 5 - delay: 5 - - # ============================================================ diff --git a/tests/integration/targets/rds_subnet_group/tasks/params.yml b/tests/integration/targets/rds_subnet_group/tasks/params.yml deleted file mode 100644 index e6b042f7a2f..00000000000 --- a/tests/integration/targets/rds_subnet_group/tasks/params.yml +++ /dev/null @@ -1,30 +0,0 @@ ---- -# Try creating without a description -- name: "Create a subnet group (no description)" - rds_subnet_group: - state: present - name: "{{ resource_prefix }}" - subnets: - - "{{ subnet_ids[0] }}" - - "{{ subnet_ids[1] }}" - ignore_errors: yes - register: create_missing_param -- assert: - that: - - create_missing_param is failed - - "'description' in create_missing_param.msg" - - "'state is present but all of the following are missing' in create_missing_param.msg" - -# Try creating without subnets -- name: "Create a subnet group (no subnets)" - rds_subnet_group: - state: present - name: "{{ resource_prefix }}" - description: "{{ group_description }}" - ignore_errors: yes - register: create_missing_param -- assert: - that: - - create_missing_param is failed - - "'subnets' in create_missing_param.msg" - - "'state is present but all of the following are missing' in create_missing_param.msg" diff --git a/tests/integration/targets/rds_subnet_group/tasks/tests.yml b/tests/integration/targets/rds_subnet_group/tasks/tests.yml deleted file mode 100644 index 7018448c415..00000000000 --- a/tests/integration/targets/rds_subnet_group/tasks/tests.yml +++ /dev/null @@ -1,676 +0,0 @@ ---- -# ============================================================ -# Basic creation -- name: 'Create a subnet group - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - check_mode: true - register: result - -- assert: - that: - - result is changed - -- name: 'Create a subnet group' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - register: result - -- assert: - that: - - result is changed - - result.subnet_group.description == group_description - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - -- name: 'Create a subnet group (idempotency) - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - check_mode: true - register: result - -- assert: - that: - - result is not changed - -- name: 'Create a subnet group (idempotency)' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - register: result - -- assert: - that: - - result is not changed - - result.subnet_group.description == group_description - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - -# ============================================================ -# Update description -- name: 'Update subnet group description - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - check_mode: true - register: result - -- assert: - that: - - result is changed - -- name: 'Update subnet group description' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - register: result - -- assert: - that: - - result is changed - - result.subnet_group.description == group_description_changed - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - -- name: 'Update subnet group description (idempotency) - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - check_mode: true - register: result - -- assert: - that: - - result is not changed - -- name: 'Update subnet group description (idempotency)' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - register: result - -- assert: - that: - - result is not changed - - result.subnet_group.description == group_description_changed - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - -- name: 'Restore subnet group description - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - check_mode: true - register: result - -- assert: - that: - - result is changed - -- name: 'Restore subnet group description' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - register: result - -- assert: - that: - - result is changed - - result.subnet_group.description == group_description - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - -# ============================================================ -# Update subnets -- name: 'Update subnet group list - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[2] }}' - - '{{ subnet_ids[3] }}' - check_mode: true - register: result - -- assert: - that: - - result is changed - -- name: 'Update subnet group list' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[2] }}' - - '{{ subnet_ids[3] }}' - register: result - -- assert: - that: - - result is changed - - result.subnet_group.description == group_description - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[2] in result.subnet_group.subnet_ids - - subnet_ids[3] in result.subnet_group.subnet_ids - -- name: 'Update subnet group list (idempotency) - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[2] }}' - - '{{ subnet_ids[3] }}' - check_mode: true - register: result - -- assert: - that: - - result is not changed - -- name: 'Update subnet group list (idempotency)' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[2] }}' - - '{{ subnet_ids[3] }}' - register: result - -- assert: - that: - - result is not changed - - result.subnet_group.description == group_description - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[2] in result.subnet_group.subnet_ids - - subnet_ids[3] in result.subnet_group.subnet_ids - -- name: 'Add more subnets subnet group list - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - - '{{ subnet_ids[2] }}' - - '{{ subnet_ids[3] }}' - check_mode: true - register: result - -- assert: - that: - - result is changed - -- name: 'Add more subnets subnet group list' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - - '{{ subnet_ids[2] }}' - - '{{ subnet_ids[3] }}' - register: result - -- assert: - that: - - result is changed - - result.subnet_group.description == group_description - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 4 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - - subnet_ids[2] in result.subnet_group.subnet_ids - - subnet_ids[3] in result.subnet_group.subnet_ids - -- name: 'Add more members to subnet group list (idempotency) - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - - '{{ subnet_ids[2] }}' - - '{{ subnet_ids[3] }}' - check_mode: true - register: result - -- assert: - that: - - result is not changed - -- name: 'Add more members to subnet group list (idempotency)' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - - '{{ subnet_ids[2] }}' - - '{{ subnet_ids[3] }}' - register: result - -- assert: - that: - - result is not changed - - result.subnet_group.description == group_description - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 4 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - - subnet_ids[2] in result.subnet_group.subnet_ids - - subnet_ids[3] in result.subnet_group.subnet_ids - -# ============================================================ -# Add tags to subnets -- name: 'Update subnet with tags - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - tags: - tag_one: '{{ resource_prefix }} One' - "Tag Two": 'two {{ resource_prefix }}' - check_mode: true - register: result - -- assert: - that: - - result is changed - -- name: 'Update subnet with tags' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - tags: - tag_one: '{{ resource_prefix }} One' - "Tag Two": 'two {{ resource_prefix }}' - register: result - -- assert: - that: - - result is changed - - result.subnet_group.description == group_description_changed - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - - '"tags" in result.subnet_group' - - result.subnet_group.tags | length == 2 - - result.subnet_group.tags["tag_one"] == '{{ resource_prefix }} One' - - result.subnet_group.tags["Tag Two"] == 'two {{ resource_prefix }}' - -- name: 'Update subnet with tags (idempotency) - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - tags: - tag_one: '{{ resource_prefix }} One' - "Tag Two": 'two {{ resource_prefix }}' - check_mode: true - register: result - -- assert: - that: - - result is not changed - -- name: 'Update subnet with tags (idempotency)' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - tags: - tag_one: '{{ resource_prefix }} One' - "Tag Two": 'two {{ resource_prefix }}' - register: result - -- assert: - that: - - result is not changed - - result.subnet_group.description == group_description_changed - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - - '"tags" in result.subnet_group' - - result.subnet_group.tags | length == 2 - - result.subnet_group.tags["tag_one"] == '{{ resource_prefix }} One' - - result.subnet_group.tags["Tag Two"] == 'two {{ resource_prefix }}' - -- name: 'Update (add/remove) tags - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - tags: - tag_three: '{{ resource_prefix }} Three' - "Tag Two": 'two {{ resource_prefix }}' - check_mode: true - register: result - -- assert: - that: - - result is changed - -- name: 'Update (add/remove) tags' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - tags: - tag_three: '{{ resource_prefix }} Three' - "Tag Two": 'two {{ resource_prefix }}' - register: result - -- assert: - that: - - result is changed - - result.subnet_group.description == group_description_changed - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - - '"tags" in result.subnet_group' - - result.subnet_group.tags | length == 2 - - result.subnet_group.tags["tag_three"] == '{{ resource_prefix }} Three' - - result.subnet_group.tags["Tag Two"] == 'two {{ resource_prefix }}' - -- name: 'Update tags without purge - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - purge_tags: no - tags: - tag_one: '{{ resource_prefix }} One' - check_mode: true - register: result - -- assert: - that: - - result is changed - -- name: 'Update tags without purge' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - purge_tags: no - tags: - tag_one: '{{ resource_prefix }} One' - register: result - -- assert: - that: - - result is changed - - result.subnet_group.description == group_description_changed - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - - '"tags" in result.subnet_group' - - result.subnet_group.tags | length == 3 - - result.subnet_group.tags["tag_three"] == '{{ resource_prefix }} Three' - - result.subnet_group.tags["Tag Two"] == 'two {{ resource_prefix }}' - - result.subnet_group.tags["tag_one"] == '{{ resource_prefix }} One' - -- name: 'Remove all the tags - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - tags: {} - check_mode: true - register: result - -- assert: - that: - - result is changed - -- name: 'Remove all the tags' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - tags: {} - register: result - -- assert: - that: - - result is changed - - result.subnet_group.description == group_description_changed - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - - '"tags" in result.subnet_group' - -- name: 'Update with CamelCase tags - CHECK_MODE' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - tags: - "lowercase spaced": 'hello cruel world' - "Title Case": 'Hello Cruel World' - CamelCase: 'SimpleCamelCase' - snake_case: 'simple_snake_case' - check_mode: true - register: result - -- assert: - that: - - result is changed - -- name: 'Update with CamelCase tags' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - tags: - "lowercase spaced": 'hello cruel world' - "Title Case": 'Hello Cruel World' - CamelCase: 'SimpleCamelCase' - snake_case: 'simple_snake_case' - register: result - -- assert: - that: - - result is changed - - result.subnet_group.description == group_description_changed - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - - '"tags" in result.subnet_group' - - result.subnet_group.tags | length == 4 - - result.subnet_group.tags["lowercase spaced"] == 'hello cruel world' - - result.subnet_group.tags["Title Case"] == 'Hello Cruel World' - - result.subnet_group.tags["CamelCase"] == 'SimpleCamelCase' - - result.subnet_group.tags["snake_case"] == 'simple_snake_case' - -- name: 'Do not specify any tag to ensure previous tags are not removed' - rds_subnet_group: - state: present - name: '{{ resource_prefix }}' - description: '{{ group_description_changed }}' - subnets: - - '{{ subnet_ids[0] }}' - - '{{ subnet_ids[1] }}' - register: result - -- assert: - that: - - result is not changed - - result.subnet_group.description == group_description_changed - - result.subnet_group.name == resource_prefix - - result.subnet_group.vpc_id == vpc.vpc.id - - result.subnet_group.subnet_ids | length == 2 - - subnet_ids[0] in result.subnet_group.subnet_ids - - subnet_ids[1] in result.subnet_group.subnet_ids - - '"tags" in result.subnet_group' - - result.subnet_group.tags | length == 4 - - result.subnet_group.tags["lowercase spaced"] == 'hello cruel world' - - result.subnet_group.tags["Title Case"] == 'Hello Cruel World' - - result.subnet_group.tags["CamelCase"] == 'SimpleCamelCase' - - result.subnet_group.tags["snake_case"] == 'simple_snake_case' - - -# ============================================================ -# Deletion -- name: 'Delete a subnet group - CHECK_MODE' - rds_subnet_group: - state: absent - name: '{{ resource_prefix }}' - check_mode: true - register: result - -- assert: - that: - - result is changed - -- name: 'Delete a subnet group' - rds_subnet_group: - state: absent - name: '{{ resource_prefix }}' - register: result - -- assert: - that: - - result is changed - -- name: 'Delete a subnet group - CHECK_MODE (idempotency)' - rds_subnet_group: - state: absent - name: '{{ resource_prefix }}' - check_mode: true - register: result - -- assert: - that: - - result is not changed - -- name: 'Delete a subnet group (idempotency)' - rds_subnet_group: - state: absent - name: '{{ resource_prefix }}' - register: result - -- assert: - that: - - result is not changed