forked from ansible/ansible
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[aws] Create classes for Application Load Balancer (ansible#33769)
* Create classes for Application Load Balancer * Add unsupported CI alias * Add AWSRetry * Add integration tests using the ALB
- Loading branch information
Showing
14 changed files
with
1,560 additions
and
754 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
#!/usr/bin/env python | ||
# Copyright (c) 2017 Ansible Project | ||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) | ||
|
||
from ansible.module_utils.ec2 import AWSRetry | ||
|
||
# Non-ansible imports | ||
try: | ||
from botocore.exceptions import BotoCoreError, ClientError | ||
except ImportError: | ||
pass | ||
|
||
|
||
def get_elb(connection, module, elb_name): | ||
""" | ||
Get an ELB based on name. If not found, return None. | ||
:param connection: AWS boto3 elbv2 connection | ||
:param module: Ansible module | ||
:param elb_name: Name of load balancer to get | ||
:return: boto3 ELB dict or None if not found | ||
""" | ||
try: | ||
return _get_elb(connection, module, elb_name) | ||
except (BotoCoreError, ClientError) as e: | ||
module.fail_json_aws(e) | ||
|
||
|
||
@AWSRetry.jittered_backoff() | ||
def _get_elb(connection, module, elb_name): | ||
""" | ||
Get an ELB based on name using AWSRetry. If not found, return None. | ||
:param connection: AWS boto3 elbv2 connection | ||
:param module: Ansible module | ||
:param elb_name: Name of load balancer to get | ||
:return: boto3 ELB dict or None if not found | ||
""" | ||
|
||
try: | ||
load_balancer_paginator = connection.get_paginator('describe_load_balancers') | ||
return (load_balancer_paginator.paginate(Names=[elb_name]).build_full_result())['LoadBalancers'][0] | ||
except (BotoCoreError, ClientError) as e: | ||
if e.response['Error']['Code'] == 'LoadBalancerNotFound': | ||
return None | ||
else: | ||
raise e | ||
|
||
|
||
def get_elb_listener(connection, module, elb_arn, listener_port): | ||
""" | ||
Get an ELB listener based on the port provided. If not found, return None. | ||
:param connection: AWS boto3 elbv2 connection | ||
:param module: Ansible module | ||
:param elb_arn: ARN of the ELB to look at | ||
:param listener_port: Port of the listener to look for | ||
:return: boto3 ELB listener dict or None if not found | ||
""" | ||
|
||
try: | ||
listener_paginator = connection.get_paginator('describe_listeners') | ||
listeners = (AWSRetry.jittered_backoff()(listener_paginator.paginate)(LoadBalancerArn=elb_arn).build_full_result())['Listeners'] | ||
except (BotoCoreError, ClientError) as e: | ||
module.fail_json_aws(e) | ||
|
||
l = None | ||
|
||
for listener in listeners: | ||
if listener['Port'] == listener_port: | ||
l = listener | ||
break | ||
|
||
return l | ||
|
||
|
||
def get_elb_listener_rules(connection, module, listener_arn): | ||
""" | ||
Get rules for a particular ELB listener using the listener ARN. | ||
:param connection: AWS boto3 elbv2 connection | ||
:param module: Ansible module | ||
:param listener_arn: ARN of the ELB listener | ||
:return: boto3 ELB rules list | ||
""" | ||
|
||
try: | ||
return AWSRetry.jittered_backoff()(connection.describe_rules)(ListenerArn=listener_arn)['Rules'] | ||
except (BotoCoreError, ClientError) as e: | ||
module.fail_json_aws(e) | ||
|
||
|
||
def convert_tg_name_to_arn(connection, module, tg_name): | ||
""" | ||
Get ARN of a target group using the target group's name | ||
:param connection: AWS boto3 elbv2 connection | ||
:param module: Ansible module | ||
:param tg_name: Name of the target group | ||
:return: target group ARN string | ||
""" | ||
|
||
try: | ||
response = AWSRetry.jittered_backoff()(connection.describe_target_groups)(Names=[tg_name]) | ||
except (BotoCoreError, ClientError) as e: | ||
module.fail_json_aws(e) | ||
|
||
tg_arn = response['TargetGroups'][0]['TargetGroupArn'] | ||
|
||
return tg_arn |
Oops, something went wrong.