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

Commit

Permalink
Add test cases for multiple stacks
Browse files Browse the repository at this point in the history
  • Loading branch information
yufangzhang committed Jul 22, 2016
1 parent 38d2c75 commit 8a07cb5
Show file tree
Hide file tree
Showing 3 changed files with 245 additions and 6 deletions.
10 changes: 5 additions & 5 deletions bootstrap_cfn/fab_tasks.py
Expand Up @@ -7,8 +7,6 @@

import boto3

import dns.resolver

from fabric.api import env, task
from fabric.colors import green, red
from fabric.utils import abort
Expand Down Expand Up @@ -361,21 +359,23 @@ def get_stack_name(new=False):
# know it yet...
env.stack_name = 'temp'
zone_name = get_zone_name()
zone_id = get_zone_id()
if not zone_name:
raise CfnConfigError("No master_zone in yaml, unable to create/find DNS records for stack name")
logger.info("fab_tasks::get_stack_name: Found master zone '{}' in config...".format(zone_name))
# get record name in the format of: stack.[stack_tag].[app]-[env]
record_name = get_tag_record_name(stack_tag)
dns_name = "{}.{}".format(record_name, zone_name)
r53_conn = get_connection(R53)
try:
# get stack id
stack_suffix = dns.resolver.query(dns_name, 'TXT')[0].to_text().replace('"', "")
stack_suffix = r53_conn.get_record(zone_name, zone_id, record_name, 'TXT').replace('"', "")
logger.info("fab_tasks::get_stack_name: Found stack suffix '{}' "
"for dns record '{}'... ".format(stack_suffix, dns_name))
legacy_name = get_legacy_name()
env.stack_name = "{0}-{1}".format(legacy_name, stack_suffix)
logger.info("fab_tasks::get_stack_name: Found stack name '{}'...".format(env.stack_name))
except dns.resolver.NXDOMAIN:
except:
raise DNSRecordNotFoundError(dns_name)

return env.stack_name
Expand Down Expand Up @@ -411,7 +411,7 @@ def set_stack_name():
else:
stack_tag = stack_suffix
env.tag = stack_tag
record = "{}.{}".format(get_tag_record_name(stack_tag), get_zone_name())
record = "{}.{}".format(get_tag_record_name(stack_tag), zone_name)
logger.info("fab_tasks::set_stack_name: "
"Creating stack suffix {} "
"for record '{}' "
Expand Down
199 changes: 198 additions & 1 deletion tests/test_fab_tasks.py
@@ -1,10 +1,63 @@
import unittest

from bootstrap_cfn import fab_tasks # noqa
import boto.route53

import yaml

from mock import patch, Mock # noqa

from bootstrap_cfn import config, errors, fab_tasks, r53

fake_profile = {'lol': {'aws_access_key_id': 'secretz', 'aws_secret_access_key': 'verysecretz'}}

basic_config = {'master_zone': 'dsd.io',
'ec2': {},
'elb': [{'hosted_zone': 'unittest.dsd.io.',
'name': 'unittest',
'scheme': 'internet-facing'}],
'rds': {},
's3': {}}
basic_config_yaml = yaml.dump(basic_config)


def r53_mock():
'''
Mock route53 connection and dsn records
Returns:
R53 Object
'''
r53_mock = Mock()
r53_connect_result = Mock(name='cf_connect')
r53_mock.return_value = r53_connect_result
m1 = Mock(alias_dns_name="unittest1")
m1.name = 'unittest_elb-12345678.dsd.io.'
m1.type = 'A'
m1.alias_hosted_zone_id = "ASDAKSLSA"
m1.alias_evaluate_target_health = False
m2 = Mock(resource_records=['"12345678"'])
m2.name = 'stack.active.unittest-dev.dsd.io.'
m2.type = 'TXT'
m2.alias_hosted_zone_id = "ASDAKSLSA"
m2.alias_evaluate_target_health = False
m3 = Mock(alias_dns_name="unittest1")
m3.name = 'unittest_elb.dsd.io.'
m3.type = 'A'
m3.alias_hosted_zone_id = "ASDAKSLSA"
m3.alias_evaluate_target_health = False
m4 = Mock(resource_records=['"12345678"'])
m4.name = 'stack.test.unittest-dev.dsd.io.'
m4.type = 'TXT'
m4.alias_hosted_zone_id = "ASDAKSLSA"
m4.alias_evaluate_target_health = False
response = [m1, m2, m3, m4]
mock_config = {'update_dns_record.return_value': response,
'get_all_rrsets.return_value': response}
r53_connect_result.configure_mock(**mock_config)
boto.route53.connect_to_region = r53_mock
r = r53.R53("profile_name")
fab_tasks.get_connection = Mock(return_value=r)
return True


class TestFabTasks(unittest.TestCase):

Expand All @@ -16,3 +69,147 @@ def test_loaded(self):
def test_aws_task(self, mock_botocore):
mock_botocore.return_value = fake_profile['lol']
fab_tasks.aws('nonexistent_profile')

@patch('bootstrap_cfn.fab_tasks.get_config')
def test_get_all_elbs(self, get_config_function):
basic_config_mock = yaml.load(basic_config_yaml)
get_config_function.return_value = config.ConfigParser(basic_config_mock, "unittest_stack_name", "dev", "test")

all_elbs = fab_tasks.get_all_elbs()
self.assertEqual(all_elbs, ["unittest"])

@patch('bootstrap_cfn.fab_tasks.get_all_elbs', return_value=["unittest_elb"])
def test_get_first_public_elb(self, get_all_elbs_function):
first_elb = fab_tasks.get_first_public_elb()
self.assertEqual(first_elb, "unittest_elb")

@patch('bootstrap_cfn.fab_tasks.get_all_elbs', return_value=[])
def test_no_public_elb(self, get_all_elbs_function):
with self.assertRaises(errors.PublicELBNotFoundError):
fab_tasks.get_first_public_elb()

@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_first_public_elb', return_value="unittest_elb")
def test_get_active_stack(self, get_first_public_elb_function,
get_zone_id_function,
get_legacy_name_function,
get_zone_name_function):
'''
Return stack_id of m2 record defined in def r53_mock()
Args:
get_first_public_elb_function:
get_zone_id_function:
get_legacy_name_function:
get_zone_name_function:
Returns:
'''
r53_mock()
# fab_tasks.get_connection = Mock(return_value=r)

res = fab_tasks.get_active_stack()
self.assertTrue(res)
self.assertEqual(res, "12345678")

@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_first_public_elb', return_value="unittest_elb")
def test_set_active_stack(self, get_first_public_elb_function,
get_zone_id_function,
get_legacy_name_function,
get_zone_name_function):
'''
set stack tagged with "test" as active stack, using m4 record defined in def r53_mock()
Args:
get_first_public_elb_function:
get_zone_id_function:
get_legacy_name_function:
get_zone_name_function:
Returns:
'''
r53_mock()
# fab_tasks.get_connection = Mock(return_value=r)
ret = fab_tasks.set_active_stack("test", force=True)
self.assertTrue(ret)

def test_cfn_delete(self):
'''r53_mock()
fab_tasks.cfn_delete(force=True)
self.assertTrue(True)'''
pass

def test_cfn_create(self):
self.assertTrue(True)

@patch('bootstrap_cfn.fab_tasks.get_legacy_name', return_value="unittest-dev")
def test_get_tag_record_name(self, get_legacy_name_function):
record_name = fab_tasks.get_tag_record_name("test")
self.assertEqual(record_name, "stack.test.unittest-dev")

@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_first_public_elb', return_value="unittest_elb")
def test_get_stack_name(self, get_first_public_elb_function,
get_zone_id_function,
get_legacy_name_function,
get_zone_name_function):
'''
test if it returns correct stack name
Args:
get_first_public_elb_function: get_first_public_elb()
get_zone_id_function: get_zone_id()
get_legacy_name_function: get_legacy_name(): [application-environment]
get_zone_name_function: get_zone_name()
'''
r53_mock()
# import pdb;pdb.set_trace()
stack_name = fab_tasks.get_stack_name(False)
self.assertTrue(stack_name)
self.assertEqual(stack_name, "unittest-dev-12345678")

@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_first_public_elb', return_value="unittest_elb")
def test_set_stack_name(self, get_first_public_elb_function,
get_zone_id_function,
get_legacy_name_function,
get_zone_name_function):
r53_mock()

stack_tag_mock = Mock(return_value="test")
fab_tasks.env.tag = stack_tag_mock
stack_name = fab_tasks.set_stack_name()
self.assertTrue(stack_name)

@patch('bootstrap_cfn.fab_tasks.get_basic_config')
def test_get_zone_name(self, get_config_function):
get_config_function.return_value = yaml.load(basic_config_yaml)
zone_name = fab_tasks.get_zone_name()
self.assertEqual(zone_name, "dsd.io")

@patch('bootstrap_cfn.fab_tasks.get_zone_name', return_value="dsd.io")
def test_get_zone_id(self, get_name_function):
r53_mock = Mock()
r53_connect_result = Mock(name='cf_connect')
r53_mock.return_value = r53_connect_result
response = {'GetHostedZoneResponse': {
"HostedZone": {
"Id": "/hostedzone/Z1GDM6HEODZI69"
}
}}
mock_config = {'get_hosted_zone_by_name.return_value': response}
r53_connect_result.configure_mock(**mock_config)
boto.route53.connect_to_region = r53_mock
r = r53.R53("profile_name")
fab_tasks.get_connection = Mock(return_value=r)

zone_id = fab_tasks.get_zone_id()
self.assertEqual(zone_id, "Z1GDM6HEODZI69")
42 changes: 42 additions & 0 deletions tests/test_r53.py
Expand Up @@ -29,6 +29,15 @@ def test_update_dns_record(self):
x = r.update_dns_record('blah/blah', 'x.y', 'A', '1.1.1.1')
self.assertTrue(x)

def test_delete_dns_record(self):
r53_mock = mock.Mock()
r53_connect_result = mock.Mock(name='cf_connect')
r53_mock.return_value = r53_connect_result
boto.route53.connect_to_region = r53_mock
r = r53.R53(self.env.aws_profile)
x = r.delete_dns_record('blah/blah', 'x.y', 'A', '1.1.1.1')
self.assertTrue(x)

def test_get_hosted_zone_id(self):
r53_mock = mock.Mock()
r53_connect_result = mock.Mock(name='cf_connect')
Expand Down Expand Up @@ -60,6 +69,23 @@ def test_get_record(self):
x = r.get_record('dsd.io', 'ASDAKSLDK', 'recordname', 'A')
self.assertEquals(x, 'dnsname')

def test_get_full_record(self):
record_fqdn = "recordname"
r53_mock = mock.Mock()
r53_connect_result = mock.Mock(name='cf_connect')
r53_mock.return_value = r53_connect_result
m = mock.Mock(record="unittest")
m.name = 'recordname.dsd.io.'
m.type = 'A'
response = [m]
mock_config = {'get_all_rrsets.return_value': response}
r53_connect_result.configure_mock(**mock_config)
boto.route53.connect_to_region = r53_mock
r = r53.R53(self.env.aws_profile)

rrsets = r.get_full_record('dsd.io', 'ASDAKSLDK', record_fqdn, 'A')
self.assertEqual(rrsets.record, m.record)

def test_get_TXT_record(self):
r53_mock = mock.Mock()
r53_connect_result = mock.Mock(name='cf_connect')
Expand All @@ -75,3 +101,19 @@ def test_get_TXT_record(self):
r = r53.R53(self.env.aws_profile)
x = r.get_record('dsd.io', 'ASDAKSLDK', 'blah', 'TXT')
self.assertEquals(x, 'lollol')

def test_hastag(self):
r53_mock = mock.Mock()
r53_connect_result = mock.Mock(name='cf_connect')
r53_mock.return_value = r53_connect_result

m = mock.Mock(resource_records=['"lollol"'])
m.name = 'recordname.dsd.io.'
m.type = 'TXT'
response = [m]
mock_config = {'get_all_rrsets.return_value': response}
r53_connect_result.configure_mock(**mock_config)
boto.route53.connect_to_region = r53_mock
r = r53.R53(self.env.aws_profile)
x = r.get_record("dsd.io", "ASDAKSLDK", "recordname", 'TXT')
self.assertTrue(x)

0 comments on commit 8a07cb5

Please sign in to comment.