Skip to content

Commit

Permalink
Merge branch 'master' into throttling
Browse files Browse the repository at this point in the history
  • Loading branch information
jmcs committed Sep 28, 2016
2 parents 7d90f43 + fe537a4 commit 4e794f6
Show file tree
Hide file tree
Showing 9 changed files with 36 additions and 26 deletions.
17 changes: 10 additions & 7 deletions senza/arguments.py
@@ -1,18 +1,21 @@
import re

import boto3.session
import click

from .error_handling import HandleExceptions

REGION_PATTERN = re.compile(r'^[a-z]{2}-[a-z]+-[0-9]$')


def validate_region(ctx, param, value):
"""Validate Click region param parameter."""

if value is not None:
if not REGION_PATTERN.match(value):
raise click.BadParameter("'{}'. Region must be a valid "
"AWS region.".format(value))
session = boto3.session.Session()
valid_regions = session.get_available_regions('cloudformation')
if value not in valid_regions:
valid_regions.sort()
raise click.BadParameter("'{}'. Region must be one of the "
"following AWS regions:\n"
" - {}".format(value,
"\n - ".join(valid_regions)))
return value


Expand Down
7 changes: 2 additions & 5 deletions senza/cli.py
Expand Up @@ -418,12 +418,9 @@ def get_region(region):
pass

if not region:
raise click.UsageError('Please specify the AWS region on the command line (--region) or in ~/.aws/config')
raise click.UsageError('Please specify the AWS region on the '
'command line (--region) or in ~/.aws/config')

# FIXME bool(BotoClientProxy('cloudformation', 'moon-1')) == True
cf = BotoClientProxy('cloudformation', region)
if not cf:
raise click.UsageError('Invalid region "{}"'.format(region))
return region


Expand Down
4 changes: 2 additions & 2 deletions senza/components/elastic_load_balancer.py
Expand Up @@ -6,7 +6,7 @@
from ..manaus import ClientError
from ..manaus.acm import ACM, ACMCertificate
from ..manaus.iam import IAM, IAMServerCertificate
from ..manaus.route53 import convert_domain_records_to_alias
from ..manaus.route53 import convert_cname_records_to_alias

SENZA_PROPERTIES = frozenset(['Domains', 'HealthCheckPath', 'HealthCheckPort', 'HealthCheckProtocol',
'HTTPPort', 'Name', 'SecurityGroups', 'SSLCertificateId', 'Type'])
Expand Down Expand Up @@ -104,7 +104,7 @@ def component_elastic_load_balancer(definition,

domain_name = "{0}.{1}".format(domain["Subdomain"], domain["Zone"])

convert_domain_records_to_alias(domain_name)
convert_cname_records_to_alias(domain_name)

properties = {"Type": "A",
"Name": domain_name,
Expand Down
4 changes: 2 additions & 2 deletions senza/components/elastic_load_balancer_v2.py
Expand Up @@ -3,7 +3,7 @@
from senza.components.elastic_load_balancer import ALLOWED_LOADBALANCER_SCHEMES, get_load_balancer_name, get_ssl_cert

from ..cli import AccountArguments, TemplateArguments
from ..manaus.route53 import convert_domain_records_to_alias
from ..manaus.route53 import convert_cname_records_to_alias

SENZA_PROPERTIES = frozenset(['Domains', 'HealthCheckPath', 'HealthCheckPort', 'HealthCheckProtocol',
'HTTPPort', 'Name', 'SecurityGroups', 'SSLCertificateId', 'Type'])
Expand Down Expand Up @@ -40,7 +40,7 @@ def component_elastic_load_balancer_v2(definition,

domain_name = "{0}.{1}".format(domain["Subdomain"], domain["Zone"])

convert_domain_records_to_alias(domain_name)
convert_cname_records_to_alias(domain_name)

properties = {"Type": "A",
"Name": domain_name,
Expand Down
6 changes: 3 additions & 3 deletions senza/manaus/route53.py
Expand Up @@ -281,7 +281,7 @@ def to_alias(self,
if self.alias_target is not None:
# Record is already an Alias
return deepcopy(self)
elif self.type == RecordType.CNAME:
if self.type == RecordType.CNAME:
dns_name = self.resource_records[0]['Value']
# dns name looks like lb-name-123456.aws-region-1.elb.amazonaws.com
sub_domain, _ = dns_name.split('.', maxsplit=1) # type: str
Expand Down Expand Up @@ -373,12 +373,12 @@ def get_records(cls, *,
yield record


def convert_domain_records_to_alias(domain_name: str):
def convert_cname_records_to_alias(domain_name: str):
records = Route53.get_records(name=domain_name)
converted_records = defaultdict(lambda: {'delete': [],
'upsert': []})
for record in records:
if record.type != 'A':
if record.type == RecordType.CNAME:
converted_records[record.hosted_zone]['delete'].append(record)
try:
alias_record = record.to_alias()
Expand Down
4 changes: 2 additions & 2 deletions senza/traffic.py
Expand Up @@ -12,7 +12,7 @@
from .manaus.cloudformation import CloudFormationStack, ResourceType
from .manaus.exceptions import ELBNotFound, StackNotFound, StackNotUpdated
from .manaus.route53 import (RecordType, Route53, Route53HostedZone,
convert_domain_records_to_alias)
convert_cname_records_to_alias)

PERCENT_RESOLUTION = 2
FULL_PERCENTAGE = PERCENT_RESOLUTION * 100
Expand Down Expand Up @@ -125,7 +125,7 @@ def set_new_weights(dns_names: list, identifier, lb_dns_name: str,
for idx, dns_name in enumerate(dns_names):
domain = dns_name.split('.', 1)[1]
hosted_zone = Route53HostedZone.get_by_domain_name(domain)
convert_domain_records_to_alias(dns_name)
convert_cname_records_to_alias(dns_name)

changed = False
for stack_name, percentage in new_record_weights.items():
Expand Down
9 changes: 9 additions & 0 deletions tests/fixtures.py
Expand Up @@ -281,3 +281,12 @@ def my_resource(rtype, *args):
return MagicMock()

monkeypatch.setattr('boto3.resource', my_resource)


@pytest.fixture(autouse=True)
def valid_regions(monkeypatch):
m_session = MagicMock()
m_session.return_value = m_session
m_session.get_available_regions.return_value = ['aa-fakeregion-1']
monkeypatch.setattr('boto3.session.Session', m_session)
return m_session
5 changes: 3 additions & 2 deletions tests/test_cli.py
Expand Up @@ -19,7 +19,8 @@
from senza.traffic import PERCENT_RESOLUTION, StackVersion

from fixtures import (HOSTED_ZONE_EXAMPLE_NET, # noqa: F401
HOSTED_ZONE_EXAMPLE_ORG, boto_client, boto_resource)
HOSTED_ZONE_EXAMPLE_ORG, boto_client, boto_resource,
valid_regions)


def test_invalid_definition():
Expand Down Expand Up @@ -190,7 +191,7 @@ def test_region_validation(monkeypatch):
catch_exceptions=False)

assert ('Error: Invalid value for "--region": \'invalid-region\'. '
'Region must be a valid AWS region.' in result.output)
'Region must be one of the following AWS regions:' in result.output)


def test_print_replace_mustache(monkeypatch):
Expand Down
6 changes: 3 additions & 3 deletions tests/test_manaus/test_route53.py
Expand Up @@ -7,7 +7,7 @@
RecordNotFound)
from senza.manaus.route53 import (RecordType, Route53, Route53HostedZone,
Route53Record,
convert_domain_records_to_alias)
convert_cname_records_to_alias)


def test_hosted_zone_from_boto_dict():
Expand Down Expand Up @@ -438,7 +438,7 @@ def test_convert_domain_records_to_alias(monkeypatch):
mock_isatty = MagicMock(return_value=True)
monkeypatch.setattr('sys.stdin.isatty', mock_isatty)

convert_domain_records_to_alias("app1.example.com")
convert_cname_records_to_alias("app1.example.com")

mock_hz1.delete.assert_called_once_with([mock_record1],
comment='Records that will be converted to Alias')
Expand All @@ -448,7 +448,7 @@ def test_convert_domain_records_to_alias(monkeypatch):

mock_confirm.return_value = False
with pytest.raises(InvalidState):
convert_domain_records_to_alias("app1.example.com")
convert_cname_records_to_alias("app1.example.com")


def test_hosted_zone_get_by_domain_name(monkeypatch):
Expand Down

0 comments on commit 4e794f6

Please sign in to comment.