Add onfailure support, incl. config

This commit is contained in:
Stefan Reimer 2019-07-03 13:15:18 +00:00
parent f15e2903aa
commit 39c9c56fea
5 changed files with 17 additions and 4 deletions

View File

@ -1,5 +1,8 @@
# Changelog # Changelog
## 0.6.1
- Add support for onfailure for create stack, defaults to DELETE
## 0.6.0 ## 0.6.0
- Implemented Piped mode again - Implemented Piped mode again
Allows all stack references to be supplied via injected parameters Allows all stack references to be supplied via injected parameters

View File

@ -2,7 +2,7 @@ import logging
__author__ = "Stefan Reimer" __author__ = "Stefan Reimer"
__email__ = "stefan@zero-downtimet.net" __email__ = "stefan@zero-downtimet.net"
__version__ = "0.6.0" __version__ = "0.6.1"
# Set up logging to ``/dev/null`` like a library is supposed to. # Set up logging to ``/dev/null`` like a library is supposed to.

View File

@ -25,7 +25,7 @@ class CloudBender(object):
raise "Check '{0}' exists and is a valid project folder.".format(root_path) raise "Check '{0}' exists and is a valid project folder.".format(root_path)
def read_config(self): def read_config(self):
"""Load the <path>/config.yaml, <path>/*.yaml as stacks, sub-folders are child groups """ """Load the <path>/config.yaml, <path>/*.yaml as stacks, sub-folders are sub-groups """
# Read top level config.yaml and extract CloudBender CTX # Read top level config.yaml and extract CloudBender CTX
_config = read_config_file(os.path.join(self.ctx['config_path'], 'config.yaml')) _config = read_config_file(os.path.join(self.ctx['config_path'], 'config.yaml'))

View File

@ -1,2 +1,6 @@
class ParameterNotFound(Exception): class ParameterNotFound(Exception):
"""My documentation""" """My documentation"""
class ParameterIllegalValue(Exception):
"""My documentation"""

View File

@ -14,7 +14,7 @@ from .utils import dict_merge, search_refs
from .connection import BotoConnection from .connection import BotoConnection
from .jinja import JinjaEnv, read_config_file from .jinja import JinjaEnv, read_config_file
from . import __version__ from . import __version__
from .exceptions import ParameterNotFound from .exceptions import ParameterNotFound, ParameterIllegalValue
import cfnlint.core import cfnlint.core
@ -56,13 +56,14 @@ class Stack(object):
self.dependencies = set() self.dependencies = set()
self.default_lock = None self.default_lock = None
self.multi_delete = True self.multi_delete = True
self.onfailure = "DELETE"
def dump_config(self): def dump_config(self):
logger.debug("<Stack {}: {}>".format(self.id, vars(self))) logger.debug("<Stack {}: {}>".format(self.id, vars(self)))
def read_config(self): def read_config(self):
_config = read_config_file(self.path) _config = read_config_file(self.path)
for p in ["region", "stackname", "template", "default_lock", "multi_delete", "provides"]: for p in ["region", "stackname", "template", "default_lock", "multi_delete", "provides", "onfailure"]:
if p in _config: if p in _config:
setattr(self, p, _config[p]) setattr(self, p, _config[p])
@ -88,6 +89,10 @@ class Stack(object):
for dep in _config['dependencies']: for dep in _config['dependencies']:
self.dependencies.add(dep) self.dependencies.add(dep)
# Some sanity checks
if self.onfailure not in ["DO_NOTHING", "ROLLBACK", "DELETE"]:
raise ParameterIllegalValue("onfailure must be one of DO_NOTHING | ROLLBACK | DELETE")
logger.debug("Stack {} added.".format(self.id)) logger.debug("Stack {} added.".format(self.id))
def render(self): def render(self):
@ -339,6 +344,7 @@ class Stack(object):
{'StackName': self.stackname, {'StackName': self.stackname,
'TemplateBody': self.cfn_template, 'TemplateBody': self.cfn_template,
'Parameters': self.cfn_parameters, 'Parameters': self.cfn_parameters,
'OnFailure': self.onfailure,
'Tags': [{"Key": str(k), "Value": str(v)} for k, v in self.tags.items()], 'Tags': [{"Key": str(k), "Value": str(v)} for k, v in self.tags.items()],
'Capabilities': ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND']}, 'Capabilities': ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND']},
profile=self.profile, region=self.region) profile=self.profile, region=self.region)