Skip to content

Commit

Permalink
Fix Create missing and implement StackSet Create Missing support
Browse files Browse the repository at this point in the history
  • Loading branch information
flomotlik committed Jul 15, 2019
1 parent 3963c53 commit e2b58dd
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 8 deletions.
18 changes: 10 additions & 8 deletions formica/cli.py
Expand Up @@ -278,6 +278,7 @@ def stack_set_parser(parser):
add_stack_set_operation_preferences(update_parser)
add_organization_account_template_variables(update_parser)
add_yes_parameter(update_parser)
add_create_missing_argument(update_parser)
update_parser.set_defaults(func=stack_set.update_stack_set)

# Remove
Expand Down Expand Up @@ -569,14 +570,15 @@ def change(args):
change_set = ChangeSet(stack=args.stack, client=client)

change_set_type = "UPDATE"
try:
client.describe_stacks(StackName=args.stack)
except ClientError as e:
error = e.response["Error"]
if error["Code"] == "ValidationError" and "does not exist" in error["Message"]:
change_set_type = "CREATE"
else:
raise e
if args.create_missing:
try:
client.describe_stacks(StackName=args.stack)
except ClientError as e:
error = e.response["Error"]
if error["Code"] == "ValidationError" and "does not exist" in error["Message"]:
change_set_type = "CREATE"
else:
raise e

change_set.create(
template=loader.template(indent=None),
Expand Down
13 changes: 13 additions & 0 deletions formica/stack_set.py
@@ -1,6 +1,7 @@
import logging
import sys
import time
from botocore.exceptions import ClientError

from .aws import AWS
from .helper import collect_vars, main_account_id, aws_accounts, aws_regions
Expand Down Expand Up @@ -46,13 +47,25 @@ def ack(message):

@requires_stack_set
def update_stack_set(args):
if args.create_missing:
client = AWS.current_session().client("cloudformation")
try:
client.describe_stack_set(StackSetName=args.stack_set)
except ClientError as e:
if e.response["Error"]["Code"] == "StackSetNotFoundException":
create_stack_set(args)
return
else:
raise e

compare_stack_set(
stack=args.stack_set,
vars=collect_vars(args),
parameters=args.parameters,
tags=args.tags,
main_account_parameter=args.main_account_parameter,
)

if args.yes or ack("Do you want to update the StackSet with above changes"):
__manage_stack_set(args=args, create=False)
else:
Expand Down
7 changes: 7 additions & 0 deletions tests/unit/test_change.py
Expand Up @@ -117,6 +117,13 @@ def test_change_with_resource_types(change_set, client, loader):
role_arn=None)


def test_change_create_if_missing_without_parameter(change_set, client, loader):
client.get_caller_identity.return_value = {'Account': ACCOUNT_ID}
loader.return_value.template.return_value = TEMPLATE
cli.main(['change', '--stack', STACK])
client.describe_stacks.assert_not_called()


def test_change_create_if_missing(change_set, client, loader):
client.get_caller_identity.return_value = {'Account': ACCOUNT_ID}
exception = ClientError(
Expand Down
27 changes: 27 additions & 0 deletions tests/unit/test_stack_set.py
@@ -1,5 +1,7 @@
import pytest
import json
from botocore.exceptions import ClientError

from uuid import uuid4

from formica import cli, stack_set
Expand Down Expand Up @@ -282,6 +284,31 @@ def test_update_stack_set_with_all_subaccounts(client, logger, loader, input, co
)


def test_update_with_create_missing(client, logger, loader, input, compare, wait):
client.update_stack_set.return_value = {'OperationId': '12345'}
client.list_accounts.return_value = ACCOUNTS
client.get_caller_identity.return_value = {'Account': '5678'}
client.describe_regions.return_value = EC2_REGIONS
exception = ClientError(
dict(Error={'Code': 'StackSetNotFoundException'}), "DescribeStackSet")
print(exception)
client.describe_stack_set.side_effect = exception
cli.main([
'stack-set',
'update',
'--stack-set', STACK,
'--all-subaccounts',
'--create-missing'
])

client.create_stack_set.assert_called_with(
StackSetName=STACK,
TemplateBody=TEMPLATE
)

client.describe_stack_set.assert_called_with(StackSetName=STACK)


def test_add_stack_set_instances(client, loader, wait, input):
cli.main([
'stack-set',
Expand Down

0 comments on commit e2b58dd

Please sign in to comment.