mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
[cloud] ec2_vpc_peer should remove peering connections (#20113)
Don't try to create tags on a vpc that you've just removed. Avoids ``` "msg": "An error occurred (InvalidParameterValue) when calling the CreateTags operation: You must specify one or more tags to create" ``` Although not quite sure why the `create_tags` was being called as `module.params.get('tags')` *should* have returned `None`.
This commit is contained in:
parent
d7b7cbac1a
commit
635e3fe9ee
1 changed files with 61 additions and 35 deletions
|
@ -13,6 +13,7 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'status': ['stableinterface'],
|
ANSIBLE_METADATA = {'status': ['stableinterface'],
|
||||||
'supported_by': 'committer',
|
'supported_by': 'committer',
|
||||||
'version': '1.0'}
|
'version': '1.0'}
|
||||||
|
@ -192,13 +193,14 @@ task:
|
||||||
type: dictionary
|
type: dictionary
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
from ansible.module_utils.basic import AnsibleModule
|
||||||
|
from ansible.module_utils.ec2 import boto3_conn, ec2_argument_spec
|
||||||
|
from ansible.module_utils.ec2 import get_aws_connection_info, HAS_BOTO3
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import json
|
|
||||||
import botocore
|
import botocore
|
||||||
import boto3
|
|
||||||
HAS_BOTO3 = True
|
|
||||||
except ImportError:
|
except ImportError:
|
||||||
HAS_BOTO3 = False
|
pass # caught by imported HAS_BOTO3
|
||||||
|
|
||||||
|
|
||||||
def tags_changed(pcx_id, client, module):
|
def tags_changed(pcx_id, client, module):
|
||||||
|
@ -224,15 +226,19 @@ def tags_changed(pcx_id, client, module):
|
||||||
|
|
||||||
|
|
||||||
def describe_peering_connections(params, client):
|
def describe_peering_connections(params, client):
|
||||||
result = client.describe_vpc_peering_connections(Filters=[
|
result = client.describe_vpc_peering_connections(
|
||||||
{'Name': 'requester-vpc-info.vpc-id', 'Values': [params['VpcId']]},
|
Filters=[
|
||||||
{'Name': 'accepter-vpc-info.vpc-id', 'Values': [params['PeerVpcId']]}
|
{'Name': 'requester-vpc-info.vpc-id', 'Values': [params['VpcId']]},
|
||||||
])
|
{'Name': 'accepter-vpc-info.vpc-id', 'Values': [params['PeerVpcId']]}
|
||||||
|
]
|
||||||
|
)
|
||||||
if result['VpcPeeringConnections'] == []:
|
if result['VpcPeeringConnections'] == []:
|
||||||
result = client.describe_vpc_peering_connections(Filters=[
|
result = client.describe_vpc_peering_connections(
|
||||||
{'Name': 'requester-vpc-info.vpc-id', 'Values': [params['PeerVpcId']]},
|
Filters=[
|
||||||
{'Name': 'accepter-vpc-info.vpc-id', 'Values': [params['VpcId']]}
|
{'Name': 'requester-vpc-info.vpc-id', 'Values': [params['PeerVpcId']]},
|
||||||
])
|
{'Name': 'accepter-vpc-info.vpc-id', 'Values': [params['VpcId']]}
|
||||||
|
]
|
||||||
|
)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
@ -272,6 +278,28 @@ def create_peer_connection(client, module):
|
||||||
module.fail_json(msg=str(e))
|
module.fail_json(msg=str(e))
|
||||||
|
|
||||||
|
|
||||||
|
def remove_peer_connection(client, module):
|
||||||
|
pcx_id = module.params.get('peering_id')
|
||||||
|
params = dict()
|
||||||
|
if not pcx_id:
|
||||||
|
params['VpcId'] = module.params.get('vpc_id')
|
||||||
|
params['PeerVpcId'] = module.params.get('peer_vpc_id')
|
||||||
|
if module.params.get('peer_owner_id'):
|
||||||
|
params['PeerOwnerId'] = str(module.params.get('peer_owner_id'))
|
||||||
|
params['DryRun'] = module.check_mode
|
||||||
|
peering_conns = describe_peering_connections(params, client)
|
||||||
|
if not peering_conns:
|
||||||
|
module.exit_json(changed=False)
|
||||||
|
else:
|
||||||
|
pcx_id = peering_conns['VpcPeeringConnections'][0]['VpcPeeringConnectionId']
|
||||||
|
try:
|
||||||
|
params['VpcPeeringConnectionId'] = pcx_id
|
||||||
|
client.delete_vpc_peering_connection(**params)
|
||||||
|
module.exit_json(changed=True)
|
||||||
|
except botocore.exceptions.ClientError as e:
|
||||||
|
module.fail_json(msg=str(e))
|
||||||
|
|
||||||
|
|
||||||
def peer_status(client, module):
|
def peer_status(client, module):
|
||||||
params = dict()
|
params = dict()
|
||||||
params['VpcPeeringConnectionIds'] = [module.params.get('peering_id')]
|
params['VpcPeeringConnectionIds'] = [module.params.get('peering_id')]
|
||||||
|
@ -279,19 +307,17 @@ def peer_status(client, module):
|
||||||
return vpc_peering_connection['VpcPeeringConnections'][0]['Status']['Code']
|
return vpc_peering_connection['VpcPeeringConnections'][0]['Status']['Code']
|
||||||
|
|
||||||
|
|
||||||
def accept_reject_delete(state, client, module):
|
def accept_reject(state, client, module):
|
||||||
changed = False
|
changed = False
|
||||||
params = dict()
|
params = dict()
|
||||||
params['VpcPeeringConnectionId'] = module.params.get('peering_id')
|
params['VpcPeeringConnectionId'] = module.params.get('peering_id')
|
||||||
params['DryRun'] = module.check_mode
|
params['DryRun'] = module.check_mode
|
||||||
invocations = {
|
if peer_status(client, module) != 'active':
|
||||||
'accept': client.accept_vpc_peering_connection,
|
|
||||||
'reject': client.reject_vpc_peering_connection,
|
|
||||||
'absent': client.delete_vpc_peering_connection
|
|
||||||
}
|
|
||||||
if state == 'absent' or peer_status(client, module) != 'active':
|
|
||||||
try:
|
try:
|
||||||
invocations[state](**params)
|
if state == 'accept':
|
||||||
|
client.accept_vpc_peering_connection(**params)
|
||||||
|
else:
|
||||||
|
client.reject_vpc_peering_connection(**params)
|
||||||
if module.params.get('tags'):
|
if module.params.get('tags'):
|
||||||
create_tags(params['VpcPeeringConnectionId'], client, module)
|
create_tags(params['VpcPeeringConnectionId'], client, module)
|
||||||
changed = True
|
changed = True
|
||||||
|
@ -334,38 +360,38 @@ def find_pcx_by_id(pcx_id, client, module):
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
argument_spec = ec2_argument_spec()
|
argument_spec = ec2_argument_spec()
|
||||||
argument_spec.update(dict(
|
argument_spec.update(
|
||||||
vpc_id=dict(),
|
dict(
|
||||||
peer_vpc_id=dict(),
|
vpc_id=dict(),
|
||||||
peering_id=dict(),
|
peer_vpc_id=dict(),
|
||||||
peer_owner_id=dict(),
|
peering_id=dict(),
|
||||||
tags=dict(required=False, type='dict'),
|
peer_owner_id=dict(),
|
||||||
profile=dict(),
|
tags=dict(required=False, type='dict'),
|
||||||
state=dict(default='present', choices=['present', 'absent', 'accept', 'reject'])
|
profile=dict(),
|
||||||
|
state=dict(default='present', choices=['present', 'absent', 'accept', 'reject'])
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
module = AnsibleModule(argument_spec=argument_spec)
|
module = AnsibleModule(argument_spec=argument_spec)
|
||||||
|
|
||||||
if not HAS_BOTO3:
|
if not HAS_BOTO3:
|
||||||
module.fail_json(msg='json, botocore and boto3 are required.')
|
module.fail_json(msg='json, botocore and boto3 are required.')
|
||||||
state = module.params.get('state').lower()
|
state = module.params.get('state')
|
||||||
try:
|
try:
|
||||||
region, ec2_url, aws_connect_kwargs = get_aws_connection_info(module, boto3=True)
|
region, ec2_url, aws_connect_kwargs = get_aws_connection_info(module, boto3=True)
|
||||||
client = boto3_conn(module, conn_type='client', resource='ec2', region=region, endpoint=ec2_url, **aws_connect_kwargs)
|
client = boto3_conn(module, conn_type='client', resource='ec2',
|
||||||
|
region=region, endpoint=ec2_url, **aws_connect_kwargs)
|
||||||
except botocore.exceptions.NoCredentialsError as e:
|
except botocore.exceptions.NoCredentialsError as e:
|
||||||
module.fail_json(msg="Can't authorize connection - "+str(e))
|
module.fail_json(msg="Can't authorize connection - "+str(e))
|
||||||
|
|
||||||
if state == 'present':
|
if state == 'present':
|
||||||
(changed, results) = create_peer_connection(client, module)
|
(changed, results) = create_peer_connection(client, module)
|
||||||
module.exit_json(changed=changed, peering_id=results)
|
module.exit_json(changed=changed, peering_id=results)
|
||||||
|
elif state == 'absent':
|
||||||
|
remove_peer_connection(client, module)
|
||||||
else:
|
else:
|
||||||
(changed, results) = accept_reject_delete(state, client, module)
|
(changed, results) = accept_reject(state, client, module)
|
||||||
module.exit_json(changed=changed, peering_id=results)
|
module.exit_json(changed=changed, peering_id=results)
|
||||||
|
|
||||||
|
|
||||||
# import module snippets
|
|
||||||
from ansible.module_utils.basic import *
|
|
||||||
from ansible.module_utils.ec2 import *
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
Loading…
Reference in a new issue