Skip to content
This repository has been archived by the owner on Jan 19, 2022. It is now read-only.

Commit

Permalink
Merge pull request #251 from ministryofjustice/fix-set-active-stack-o…
Browse files Browse the repository at this point in the history
…n-internal-lb

Fix set active stack on internal lb
  • Loading branch information
ltsampros committed Feb 22, 2017
2 parents 4cb4142 + 515d5f6 commit fffd09d
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 31 deletions.
64 changes: 37 additions & 27 deletions bootstrap_cfn/fab_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
from bootstrap_cfn.elb import ELB
from bootstrap_cfn.errors import (ActiveTagExistConflictError, BootstrapCfnError,
CfnConfigError, CloudResourceNotFoundError, DNSRecordNotFoundError,
PublicELBNotFoundError, StackRecordNotFoundError, TagRecordExistConflictError,
StackRecordNotFoundError, TagRecordExistConflictError,
TagRecordNotFoundError, UpdateDNSRecordError, UpdateDeployarnRecordError,
ZoneIDNotFoundError)
from bootstrap_cfn.iam import IAM
Expand Down Expand Up @@ -75,27 +75,35 @@ def aws(profile_name, region=None):
# If we are overriding the aws region, set it here,
# otherwise, we will rely on the aws credentials setup
if region is not None:
env.aws_region = str(region).lower()
logger.info("fab_tasks::aws: Setting profile {}, "
"region {}, and creating session..."
.format(env.aws, env.aws_region))
boto3.setup_default_session(profile_name=env.aws,
region_name=env.aws_region)
env.aws_region = str(region).lower()
logger.info("fab_tasks::aws: Setting profile {}, "
"region {}, and creating session..."
.format(env.aws, env.aws_region))
boto3.setup_default_session(profile_name=env.aws,
region_name=env.aws_region)
else:
boto3.setup_default_session(profile_name=env.aws)
logger.info("fab_tasks::aws: No region specified, "
"using profile information only...")
boto3.setup_default_session(profile_name=env.aws)
logger.info("fab_tasks::aws: No region specified, "
"using profile information only...")
# If we have no default region in our credentials session,
# set one.
if boto3.DEFAULT_SESSION.region_name is None:
try:
if boto3.DEFAULT_SESSION.region_name is not None:
env.aws_region = boto3.DEFAULT_SESSION.region_name
else:
logger.info("fab_tasks::aws: No region found in credentials, "
"setting region to default, {}..."
.format(default_region))
boto3.setup_default_session(profile_name=env.aws,
region_name=default_region)
env.aws_region = default_region
except AttributeError:
logger.info("fab_tasks::aws: No region found in credentials, "
"setting region to default, {}..."
.format(default_region))
.format(default_region))
boto3.setup_default_session(profile_name=env.aws,
region_name=default_region)
env.aws_region = default_region
else:
env.aws_region = boto3.DEFAULT_SESSION.region_name


@task
Expand Down Expand Up @@ -605,7 +613,7 @@ def cfn_delete(force=False, pre_delete_callbacks=None):
txt_tag_record = get_tag_record_name(stack_tag)

print green("\nDELETING DNS RECORDS...\n")
for elb in get_public_elbs():
for elb in get_all_elbs():
logger.info("Deleting '{}-{}' from '{}' ({})...".format(elb, stack_id, zone_name, zone_id))
try:
r53_conn.delete_record(zone_name, zone_id, elb, stack_id, stack_tag, txt_tag_record)
Expand Down Expand Up @@ -889,14 +897,15 @@ def set_active_stack(stack_tag, force=False):
sys.exit(1)

try:
set_active_deployarn(stack_tag)
r53_conn.update_dns_record(zone_id, "{}.{}".format(active_record, get_zone_name()), 'TXT',
'"{}"'.format(tag_stack_id))
logger.info("fab_tasks::set_active_stack: Successfully updated DNS "
"alias record for stack: %s", tag_stack_id)
except Exception:
raise UpdateDNSRecordError

elbs = get_public_elbs()
elbs = get_all_elbs()
logger.info('fab_tasks::set_active_stack: Found ELBs matching the stack: %s',
', '.join(elbs))
for elb in elbs:
Expand All @@ -917,7 +926,6 @@ def set_active_stack(stack_tag, force=False):
except Exception:
raise StackRecordNotFoundError(record_name)
try:
set_active_deployarn(stack_tag)
print green("Active stack switched to '{}' ({}).".format(tag_record, tag_stack_id))
return True
except:
Expand All @@ -941,12 +949,13 @@ def set_active_deployarn(stack_tag):
r53 = get_connection(R53)
try:
tag_arn_value = r53.get_deployarn_record(get_zone_id(), tag_arn_record, 'TXT')
if not tag_arn_value:
raise StackRecordNotFoundError(tag_arn_value)
print "Active deployarn was set to: {0}".format(tag_arn_value)
if tag_arn_value is None:
raise StackRecordNotFoundError('{}. Make sure you run "set_deploy_arn" on {}'
' before set_active_stack'.format(tag_arn_value), stack_tag)
zone_id = get_zone_id()
try:
r53.update_dns_record(zone_id, active_arn_record, 'TXT', '"{0}"'.format(tag_arn_value))
print "Active deployarn was set to: {0}".format(tag_arn_value)
except:
raise UpdateDeployarnRecordError
except:
Expand Down Expand Up @@ -980,7 +989,7 @@ def get_active_stack():
active_stack_id = r53_conn.get_record(zone_name, zone_id, active_record, 'TXT')

records = []
for elb in get_public_elbs():
for elb in get_all_elbs():
dns_record_name = '{}-{}'.format(elb, active_stack_id)

main_record_value = r53_conn.get_record(zone_name, zone_id, elb, 'A')
Expand All @@ -1007,30 +1016,31 @@ def get_active_stack():

def get_all_elbs(f=None):
"""
Returns a list of internet-facing ELBs from the CloudFormation
Returns a list of internet-facing and internal ELBs from the CloudFormation
configuration containing items for which the filter function f
returns True, or everything.
"""
cfn_config = get_config()
elbs = [x.get('name') for x in cfn_config.data.get('elb', {}) if x.get('scheme') == 'internet-facing']
elbs = [x.get('name') for x in cfn_config.data.get('elb', {}) if x.get('scheme') in ['internet-facing', 'internal']]
return filter(f, elbs) if f else elbs


def get_public_elbs(f=None):
"""
Returns a list of internet-facing ELBs from the CloudFormation
configuration containing items for which the filter function f
returns True, or everything. or None if empty.
returns True, or everything.
"""
elbs = get_all_elbs(f)
return elbs
cfn_config = get_config()
elbs = [x.get('name') for x in cfn_config.data.get('elb', {}) if x.get('scheme') == 'internet-facing']
return filter(f, elbs) if f else elbs


def get_first_public_elb():
"""
Returns the first public ELB if exists or None.
"""
elbs = get_all_elbs()
elbs = get_public_elbs()
return next(iter(elbs), None)


Expand Down
8 changes: 4 additions & 4 deletions tests/test_fab_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import yaml


from bootstrap_cfn import cloudformation, config, errors, fab_tasks, iam, r53
from bootstrap_cfn import cloudformation, config, fab_tasks, iam, r53
from mock import patch, Mock # noqa


Expand Down Expand Up @@ -167,7 +167,7 @@ def test_get_all_elbs_with_filter(self, get_config_function):
filtered_elbs = fab_tasks.get_all_elbs(regex.match)
self.assertEqual(filtered_elbs, ["unittest2"])

@patch('bootstrap_cfn.fab_tasks.get_all_elbs', return_value=["unittest_elb"])
@patch('bootstrap_cfn.fab_tasks.get_public_elbs', return_value=["unittest_elb"])
def test_get_first_public_elb(self, get_all_elbs_function):
'''
Check if get_first_public_elb() returns the first internet facing elb
Expand All @@ -182,7 +182,7 @@ def test_get_first_public_elb(self, get_all_elbs_function):
@patch('bootstrap_cfn.fab_tasks.get_zone_name', return_value="dsd.io")
@patch('bootstrap_cfn.fab_tasks.get_legacy_name', return_value="unittest-dev")
@patch('bootstrap_cfn.fab_tasks.get_zone_id', return_value="ASDAKSLDK")
@patch('bootstrap_cfn.fab_tasks.get_public_elbs', return_value=["unittest_elb"])
@patch('bootstrap_cfn.fab_tasks.get_all_elbs', return_value=["unittest_elb"])
def test_get_active_stack(self, get_public_elbs_function,
get_zone_id_function,
get_legacy_name_function,
Expand Down Expand Up @@ -212,7 +212,7 @@ def test_get_active_stack(self, get_public_elbs_function,
@patch('bootstrap_cfn.fab_tasks.get_zone_name', return_value="dsd.io")
@patch('bootstrap_cfn.fab_tasks.get_legacy_name', return_value="unittest-dev")
@patch('bootstrap_cfn.fab_tasks.get_zone_id', return_value="ASDAKSLDK")
@patch('bootstrap_cfn.fab_tasks.get_public_elbs', return_value=["unittest_elb"])
@patch('bootstrap_cfn.fab_tasks.get_all_elbs', return_value=["unittest_elb"])
@patch('bootstrap_cfn.fab_tasks.get_first_public_elb', return_value="unittest_elb")
def test_set_active_stack(self, get_public_elbs_function,
get_first_public_elb_function,
Expand Down

0 comments on commit fffd09d

Please sign in to comment.