Merge branch 'entrust_source' of github.com:sirferl/lemur into entrust_source
This commit is contained in:
@ -149,6 +149,38 @@ def get_listener_arn_from_endpoint(endpoint_name, endpoint_port, **kwargs):
|
||||
raise
|
||||
|
||||
|
||||
@sts_client("elbv2")
|
||||
@retry(retry_on_exception=retry_throttled, wait_fixed=2000, stop_max_attempt_number=5)
|
||||
def get_load_balancer_arn_from_endpoint(endpoint_name, **kwargs):
|
||||
"""
|
||||
Get a load balancer ARN from an endpoint.
|
||||
:param endpoint_name:
|
||||
:return:
|
||||
"""
|
||||
try:
|
||||
client = kwargs.pop("client")
|
||||
elbs = client.describe_load_balancers(Names=[endpoint_name])
|
||||
if "LoadBalancers" in elbs and elbs["LoadBalancers"]:
|
||||
return elbs["LoadBalancers"][0]["LoadBalancerArn"]
|
||||
|
||||
except Exception as e: # noqa
|
||||
metrics.send(
|
||||
"get_load_balancer_arn_from_endpoint",
|
||||
"counter",
|
||||
1,
|
||||
metric_tags={
|
||||
"error": str(e),
|
||||
"endpoint_name": endpoint_name,
|
||||
},
|
||||
)
|
||||
sentry.captureException(
|
||||
extra={
|
||||
"endpoint_name": str(endpoint_name),
|
||||
}
|
||||
)
|
||||
raise
|
||||
|
||||
|
||||
@sts_client("elb")
|
||||
@retry(retry_on_exception=retry_throttled, wait_fixed=2000, stop_max_attempt_number=20)
|
||||
def get_elbs(**kwargs):
|
||||
|
@ -300,6 +300,41 @@ class AWSSourcePlugin(SourcePlugin):
|
||||
)
|
||||
return None
|
||||
|
||||
def get_endpoint_certificate_names(self, endpoint):
|
||||
options = endpoint.source.options
|
||||
account_number = self.get_option("accountNumber", options)
|
||||
region = get_region_from_dns(endpoint.dnsname)
|
||||
certificate_names = []
|
||||
|
||||
if endpoint.type == "elb":
|
||||
elb_details = elb.get_elbs(account_number=account_number,
|
||||
region=region,
|
||||
LoadBalancerNames=[endpoint.name],)
|
||||
|
||||
for lb_description in elb_details["LoadBalancerDescriptions"]:
|
||||
for listener_description in lb_description["ListenerDescriptions"]:
|
||||
listener = listener_description.get("Listener")
|
||||
if not listener.get("SSLCertificateId"):
|
||||
continue
|
||||
|
||||
certificate_names.append(iam.get_name_from_arn(listener.get("SSLCertificateId")))
|
||||
elif endpoint.type == "elbv2":
|
||||
listeners = elb.describe_listeners_v2(
|
||||
account_number=account_number,
|
||||
region=region,
|
||||
LoadBalancerArn=elb.get_load_balancer_arn_from_endpoint(endpoint.name,
|
||||
account_number=account_number,
|
||||
region=region),
|
||||
)
|
||||
for listener in listeners["Listeners"]:
|
||||
if not listener.get("Certificates"):
|
||||
continue
|
||||
|
||||
for certificate in listener["Certificates"]:
|
||||
certificate_names.append(iam.get_name_from_arn(certificate["CertificateArn"]))
|
||||
|
||||
return certificate_names
|
||||
|
||||
|
||||
class AWSDestinationPlugin(DestinationPlugin):
|
||||
title = "AWS"
|
||||
@ -344,6 +379,10 @@ class AWSDestinationPlugin(DestinationPlugin):
|
||||
def deploy(self, elb_name, account, region, certificate):
|
||||
pass
|
||||
|
||||
def clean(self, certificate, options, **kwargs):
|
||||
account_number = self.get_option("accountNumber", options)
|
||||
iam.delete_cert(certificate.name, account_number=account_number)
|
||||
|
||||
|
||||
class S3DestinationPlugin(ExportDestinationPlugin):
|
||||
title = "AWS-S3"
|
||||
|
@ -1,5 +1,5 @@
|
||||
import boto3
|
||||
from moto import mock_sts, mock_elb
|
||||
from moto import mock_sts, mock_ec2, mock_elb, mock_elbv2, mock_iam
|
||||
|
||||
|
||||
@mock_sts()
|
||||
@ -27,3 +27,107 @@ def test_get_all_elbs(app, aws_credentials):
|
||||
|
||||
elbs = get_all_elbs(account_number="123456789012", region="us-east-1")
|
||||
assert elbs
|
||||
|
||||
|
||||
@mock_sts()
|
||||
@mock_ec2
|
||||
@mock_elbv2()
|
||||
@mock_iam
|
||||
def test_create_elb_with_https_listener_miscellaneous(app, aws_credentials):
|
||||
from lemur.plugins.lemur_aws import iam, elb
|
||||
endpoint_name = "example-lbv2"
|
||||
account_number = "123456789012"
|
||||
region_ue1 = "us-east-1"
|
||||
|
||||
client = boto3.client("elbv2", region_name="us-east-1")
|
||||
ec2 = boto3.resource("ec2", region_name="us-east-1")
|
||||
|
||||
# Create VPC
|
||||
vpc = ec2.create_vpc(CidrBlock="172.28.7.0/24")
|
||||
|
||||
# Create LB (elbv2) in above VPC
|
||||
assert create_load_balancer(client, ec2, vpc.id, endpoint_name)
|
||||
# Create target group
|
||||
target_group_arn = create_target_group(client, vpc.id)
|
||||
assert target_group_arn
|
||||
|
||||
# Test get_load_balancer_arn_from_endpoint
|
||||
lb_arn = elb.get_load_balancer_arn_from_endpoint(endpoint_name,
|
||||
account_number=account_number,
|
||||
region=region_ue1)
|
||||
assert lb_arn
|
||||
|
||||
# Test describe_listeners_v2
|
||||
listeners = elb.describe_listeners_v2(account_number=account_number,
|
||||
region=region_ue1,
|
||||
LoadBalancerArn=lb_arn)
|
||||
assert listeners
|
||||
assert not listeners["Listeners"]
|
||||
|
||||
# Upload cert
|
||||
response = iam.upload_cert("LemurTestCert", "testCert", "cert1", "cert2",
|
||||
account_number=account_number)
|
||||
assert response
|
||||
cert_arn = response["ServerCertificateMetadata"]["Arn"]
|
||||
assert cert_arn
|
||||
|
||||
# Create https listener using above cert
|
||||
listeners = client.create_listener(
|
||||
LoadBalancerArn=lb_arn,
|
||||
Protocol="HTTPS",
|
||||
Port=443,
|
||||
Certificates=[{"CertificateArn": cert_arn}],
|
||||
DefaultActions=[{"Type": "forward", "TargetGroupArn": target_group_arn}],
|
||||
)
|
||||
assert listeners
|
||||
listener_arn = listeners["Listeners"][0]["ListenerArn"]
|
||||
assert listener_arn
|
||||
|
||||
assert listeners["Listeners"]
|
||||
for listener in listeners["Listeners"]:
|
||||
if listener["Port"] == 443:
|
||||
assert listener["Certificates"]
|
||||
assert cert_arn == listener["Certificates"][0]["CertificateArn"]
|
||||
|
||||
# Test get_listener_arn_from_endpoint
|
||||
assert listener_arn == elb.get_listener_arn_from_endpoint(
|
||||
endpoint_name,
|
||||
443,
|
||||
account_number=account_number,
|
||||
region=region_ue1,
|
||||
)
|
||||
|
||||
|
||||
@mock_sts()
|
||||
@mock_elb()
|
||||
def test_get_all_elbs_v2():
|
||||
from lemur.plugins.lemur_aws.elb import get_all_elbs_v2
|
||||
|
||||
elbs = get_all_elbs_v2(account_number="123456789012",
|
||||
region="us-east-1")
|
||||
assert elbs
|
||||
|
||||
|
||||
def create_load_balancer(client, ec2, vpc_id, endpoint_name):
|
||||
subnet1 = ec2.create_subnet(
|
||||
VpcId=vpc_id,
|
||||
CidrBlock="172.28.7.192/26",
|
||||
AvailabilityZone="us-east-1a"
|
||||
)
|
||||
|
||||
return client.create_load_balancer(
|
||||
Name=endpoint_name,
|
||||
Subnets=[
|
||||
subnet1.id,
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
def create_target_group(client, vpc_id):
|
||||
response = client.create_target_group(
|
||||
Name="a-target",
|
||||
Protocol="HTTPS",
|
||||
Port=443,
|
||||
VpcId=vpc_id,
|
||||
)
|
||||
return response.get("TargetGroups")[0]["TargetGroupArn"]
|
||||
|
Reference in New Issue
Block a user