2014-08-27 11:17:06 -04:00
|
|
|
from __future__ import unicode_literals
|
2014-03-27 19:12:53 -04:00
|
|
|
import json
|
|
|
|
|
|
|
|
from moto.core import BaseBackend
|
|
|
|
|
2014-10-21 12:45:03 -04:00
|
|
|
from .parsing import ResourceMap, OutputMap
|
2014-03-27 19:12:53 -04:00
|
|
|
from .utils import generate_stack_id
|
2014-10-23 14:39:15 -04:00
|
|
|
from .exceptions import ValidationError
|
2014-03-27 19:12:53 -04:00
|
|
|
|
|
|
|
|
|
|
|
class FakeStack(object):
|
2014-10-29 11:59:41 -04:00
|
|
|
def __init__(self, stack_id, name, template, notification_arns=None):
|
2014-03-27 19:12:53 -04:00
|
|
|
self.stack_id = stack_id
|
|
|
|
self.name = name
|
2014-10-29 11:59:41 -04:00
|
|
|
self.notification_arns = notification_arns if notification_arns else []
|
2014-03-27 19:12:53 -04:00
|
|
|
self.template = template
|
2014-10-22 23:58:42 -04:00
|
|
|
self.status = 'CREATE_COMPLETE'
|
2014-03-27 19:12:53 -04:00
|
|
|
|
|
|
|
template_dict = json.loads(self.template)
|
|
|
|
self.description = template_dict.get('Description')
|
|
|
|
|
|
|
|
self.resource_map = ResourceMap(stack_id, name, template_dict)
|
|
|
|
self.resource_map.create()
|
|
|
|
|
2014-10-21 12:45:03 -04:00
|
|
|
self.output_map = OutputMap(self.resource_map, template_dict)
|
|
|
|
self.output_map.create()
|
|
|
|
|
2014-03-27 19:12:53 -04:00
|
|
|
@property
|
|
|
|
def stack_resources(self):
|
|
|
|
return self.resource_map.values()
|
|
|
|
|
2014-10-21 12:45:03 -04:00
|
|
|
@property
|
|
|
|
def stack_outputs(self):
|
|
|
|
return self.output_map.values()
|
|
|
|
|
2014-03-27 19:12:53 -04:00
|
|
|
|
|
|
|
class CloudFormationBackend(BaseBackend):
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
self.stacks = {}
|
2014-10-22 23:58:42 -04:00
|
|
|
self.deleted_stacks = {}
|
2014-03-27 19:12:53 -04:00
|
|
|
|
2014-10-29 11:59:41 -04:00
|
|
|
def create_stack(self, name, template, notification_arns=None):
|
2014-03-27 19:12:53 -04:00
|
|
|
stack_id = generate_stack_id(name)
|
2014-10-29 11:59:41 -04:00
|
|
|
new_stack = FakeStack(stack_id=stack_id, name=name, template=template, notification_arns=notification_arns)
|
2014-03-27 19:12:53 -04:00
|
|
|
self.stacks[stack_id] = new_stack
|
|
|
|
return new_stack
|
|
|
|
|
2014-10-22 23:58:42 -04:00
|
|
|
def describe_stacks(self, name_or_stack_id):
|
2014-03-27 19:12:53 -04:00
|
|
|
stacks = self.stacks.values()
|
2014-10-22 23:58:42 -04:00
|
|
|
if name_or_stack_id:
|
|
|
|
for stack in stacks:
|
|
|
|
if stack.name == name_or_stack_id or stack.stack_id == name_or_stack_id:
|
|
|
|
return [stack]
|
2014-10-23 14:39:15 -04:00
|
|
|
if self.deleted_stacks:
|
|
|
|
deleted_stacks = self.deleted_stacks.values()
|
|
|
|
for stack in deleted_stacks:
|
|
|
|
if stack.stack_id == name_or_stack_id:
|
|
|
|
return [stack]
|
|
|
|
raise ValidationError(name_or_stack_id)
|
2014-03-27 19:12:53 -04:00
|
|
|
else:
|
|
|
|
return stacks
|
|
|
|
|
|
|
|
def list_stacks(self):
|
|
|
|
return self.stacks.values()
|
|
|
|
|
|
|
|
def get_stack(self, name_or_stack_id):
|
|
|
|
if name_or_stack_id in self.stacks:
|
|
|
|
# Lookup by stack id
|
|
|
|
return self.stacks.get(name_or_stack_id)
|
|
|
|
else:
|
|
|
|
# Lookup by stack name
|
|
|
|
return [stack for stack in self.stacks.values() if stack.name == name_or_stack_id][0]
|
|
|
|
|
|
|
|
# def update_stack(self, name, template):
|
|
|
|
# stack = self.get_stack(name)
|
|
|
|
# stack.template = template
|
|
|
|
# return stack
|
|
|
|
|
|
|
|
def delete_stack(self, name_or_stack_id):
|
|
|
|
if name_or_stack_id in self.stacks:
|
|
|
|
# Delete by stack id
|
2014-10-22 23:58:42 -04:00
|
|
|
stack = self.stacks.pop(name_or_stack_id, None)
|
|
|
|
stack.status = 'DELETE_COMPLETE'
|
|
|
|
self.deleted_stacks[stack.stack_id] = stack
|
2014-03-27 19:12:53 -04:00
|
|
|
return self.stacks.pop(name_or_stack_id, None)
|
|
|
|
else:
|
|
|
|
# Delete by stack name
|
|
|
|
stack_to_delete = [stack for stack in self.stacks.values() if stack.name == name_or_stack_id][0]
|
|
|
|
self.delete_stack(stack_to_delete.stack_id)
|
|
|
|
|
|
|
|
|
|
|
|
cloudformation_backend = CloudFormationBackend()
|