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

Commit

Permalink
Added tests and updated README
Browse files Browse the repository at this point in the history
  • Loading branch information
yufangzhang committed Sep 30, 2016
1 parent 36d1ab6 commit d31a88d
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 18 deletions.
7 changes: 5 additions & 2 deletions README.rst
Expand Up @@ -62,7 +62,7 @@ Multiple Stacks
If you want to bring up a new stack as active stack, you will need to run the following fab tasks which we will explain later:

- **fab-env keyname:keyops tag:test cfn_create:** create a new stack with a tag and keyname specified.
- **fab-env salt.wait_for_minions:** check if creation is done
- **fab-env -u ubuntu salt.wait_for_minions:** check if creation is done
- **fab-env -i ~/.ssh/id_your_ssh_private_key -u ubuntu update:** install salt on the stack, add admins from keys.sls
- **fab-env -u [your-ssh-name] update:** remove `ubuntu` user for security reason

Expand Down Expand Up @@ -101,12 +101,15 @@ NB fab task `get_stack_list` returns all stacks of that application in case if y

set_active_stack(tag_name)
---
An app's DNS entry is what your active stack at

After having created a new stack, you can switch to it simply by changing DNS records using ``set_active_stack(tag_name)``:
After having created a new stack, you can set it to be the active stack simply by changing DNS records using ``set_active_stack(tag_name)``:

fab application:courtfinder aws:my_project_prod environment:dev config:/path/to/courtfinder-dev.yaml set_active_stack:[tag_name]

where [tag_name] would be the stack you would like to switch to.
NB this process will also automatically set deployarn record accordingly.


cfn_delete
---
Expand Down
24 changes: 12 additions & 12 deletions bootstrap_cfn/fab_tasks.py
@@ -1,6 +1,5 @@
#!/usr/bin/env python

import dns.resolver
import logging
import os
import re
Expand All @@ -21,7 +20,7 @@
from bootstrap_cfn.errors import (ActiveTagExistConflictError, BootstrapCfnError,
CfnConfigError, CloudResourceNotFoundError, DNSRecordNotFoundError,
PublicELBNotFoundError, StackRecordNotFoundError, TagRecordExistConflictError,
TagRecordNotFoundError, UpdateDeployarnRecordError, UpdateDNSRecordError,
TagRecordNotFoundError, UpdateDNSRecordError, UpdateDeployarnRecordError,
ZoneIDNotFoundError)
from bootstrap_cfn.iam import IAM
from bootstrap_cfn.r53 import R53
Expand Down Expand Up @@ -887,23 +886,16 @@ def set_active_deployarn(stack_tag):
(String) AWS arn value
"""

cfn_config = get_basic_config()
zone_name = get_zone_name()
active_arn_record = 'deployarn.{0}.{1}.{2}.{3}'.format("active",
env.environment,
env.application,
zone_name)
tag_arn_record = 'deployarn.{0}.{1}.{2}.{3}.'.format(stack_tag,
env.environment,
env.application,
zone_name)
tag_arn_record = arn_record_name(stack_tag, zone_name)
active_arn_record = arn_record_name('active', zone_name)
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)
zone_id = r53.get_hosted_zone_id(zone_name)
zone_id = get_zone_id()
try:
r53.update_dns_record(zone_id, active_arn_record, 'TXT', '"{0}"'.format(tag_arn_value))
except:
Expand All @@ -913,6 +905,14 @@ def set_active_deployarn(stack_tag):
return tag_arn_value


def arn_record_name(stack_tag, zone_name):
tag_arn_record = 'deployarn.{0}.{1}.{2}.{3}.'.format(stack_tag,
env.environment,
env.application,
zone_name)
return tag_arn_record


@task
def get_active_stack():
"""
Expand Down
17 changes: 14 additions & 3 deletions tests/test_fab_tasks.py
Expand Up @@ -98,7 +98,12 @@ def r53_mock(self):
m4.type = 'TXT'
m4.alias_hosted_zone_id = "ASDAKSLSA"
m4.alias_evaluate_target_health = False
response = [m1, m2, m3, m4]
m5 = Mock(resource_records=['"12345678"'])
m5.name = 'deployarn.test.unittest-dev.dsd.io.'
m5.type = 'TXT'
m5.alias_hosted_zone_id = "ASDAKSLSA"
m5.alias_evaluate_target_health = False
response = [m1, m2, m3, m4, m5]
mock_config = {'update_dns_record.return_value': True,
'get_all_rrsets.return_value': response,
'delete_dns_record.return_value': True}
Expand Down Expand Up @@ -190,6 +195,7 @@ def test_get_active_stack(self, get_first_public_elb_function,
self.assertTrue(res)
self.assertEqual(res, "12345678")

@patch('bootstrap_cfn.fab_tasks.arn_record_name')
@patch('bootstrap_cfn.fab_tasks.get_connection')
@patch('bootstrap_cfn.fab_tasks.get_zone_name', return_value="dsd.io")
@patch('bootstrap_cfn.fab_tasks.get_legacy_name', return_value="unittest-dev")
Expand All @@ -199,7 +205,8 @@ def test_set_active_stack(self, get_first_public_elb_function,
get_zone_id_function,
get_legacy_name_function,
get_zone_name_function,
get_connection_function):
get_connection_function,
arn_record_name_mock):
'''
set stack tagged with "test" as active stack,
using m4 record defined in def r53_mock()
Expand All @@ -209,15 +216,19 @@ def test_set_active_stack(self, get_first_public_elb_function,
get_legacy_name_function:
get_zone_name_function:
get_connection_function:
arn_record_name: set up deployarn record name, e.g. deployarn.tag.app-env.dsd.io
Returns:
'''
arn_record_name_mock.side_effect = self.arn_record_name_side_effect
get_connection_function.side_effect = self.connection_side_effect
# fab_tasks.get_connection = Mock(return_value=r)
ret = fab_tasks.set_active_stack("test", force=True)
self.assertTrue(ret)

def arn_record_name_side_effect(self, stack_tag, zone_name):
return 'deployarn.{}.unittest-dev.dsd.io.'.format(stack_tag)

@patch('bootstrap_cfn.fab_tasks.isactive', return_value=True)
@patch('bootstrap_cfn.fab_tasks.get_connection')
@patch('bootstrap_cfn.fab_tasks.get_config')
Expand Down
2 changes: 1 addition & 1 deletion tests/tests.py
Expand Up @@ -495,7 +495,7 @@ def test_elasticache(self):
ReplicationGroupDescription='Elasticache Replication Group',
Engine='redis',
NumCacheClusters=3,
CacheNodeType='cache.m1.small',
CacheNodeType='cache.m1.medium',
SecurityGroupIds=[GetAtt(es_sg, "GroupId")],
CacheSubnetGroupName=Ref(es_subnet_group),
SnapshotArns=["arn:aws:s3:::somebucket/redis.rdb"],
Expand Down

0 comments on commit d31a88d

Please sign in to comment.