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

Commit cfd0321

Browse files
committed
Implement atomic deployments for Nulecule application. Fixes #421
When there's an error during running a Nulecule application, rollback the changes made by stopping the application.
1 parent 81a4cdb commit cfd0321

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

atomicapp/nulecule/base.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,22 +135,23 @@ def run(self, provider_key=None, dryrun=False):
135135
for component in self.components:
136136
component.run(provider_key, dryrun)
137137

138-
def stop(self, provider_key=None, dryrun=False):
138+
def stop(self, provider_key=None, dryrun=False, ignore_errors=False):
139139
"""
140140
Stop the Nulecule application.
141141
142142
Args:
143143
provider_key (str): Provider to use for running Nulecule
144144
application
145145
dryrun (bool): Do not make changes to host when True
146+
ignore_errors (bool): Ignore errors, if any, when True
146147
147148
Returns:
148149
None
149150
"""
150151
provider_key, provider = self.get_provider(provider_key, dryrun)
151152
# stop the Nulecule application
152153
for component in self.components:
153-
component.stop(provider_key, dryrun)
154+
component.stop(provider_key, dryrun, ignore_errors)
154155

155156
def uninstall(self):
156157
# uninstall the Nulecule application
@@ -264,7 +265,7 @@ def run(self, provider_key, dryrun=False):
264265
provider.init()
265266
provider.deploy()
266267

267-
def stop(self, provider_key=None, dryrun=False):
268+
def stop(self, provider_key=None, dryrun=False, ignore_errors=False):
268269
"""
269270
Stop the Nulecule component with the specified provider.
270271
"""
@@ -274,7 +275,11 @@ def stop(self, provider_key=None, dryrun=False):
274275
provider_key, provider = self.get_provider(provider_key, dryrun)
275276
provider.artifacts = self.rendered_artifacts.get(provider_key, [])
276277
provider.init()
277-
provider.undeploy()
278+
try:
279+
provider.undeploy()
280+
except Exception as e:
281+
if not ignore_errors:
282+
raise e
278283

279284
def load_config(self, config=None, ask=False, skip_asking=False):
280285
"""

atomicapp/nulecule/main.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ def run(self, cli_provider, answers_output, ask,
192192

193193
self.nulecule.load_config(config=self.nulecule.config, ask=ask)
194194
self.nulecule.render(cli_provider, dryrun)
195-
self.nulecule.run(cli_provider, dryrun)
195+
196196
runtime_answers = self._get_runtime_answers(
197197
self.nulecule.config, cli_provider)
198198
self._write_answers(
@@ -202,12 +202,21 @@ def run(self, cli_provider, answers_output, ask,
202202
self._write_answers(answers_output, runtime_answers,
203203
self.answers_format)
204204

205-
def stop(self, cli_provider, **kwargs):
205+
try:
206+
self.nulecule.run(cli_provider, dryrun)
207+
except Exception as e:
208+
logger.error('Application run error: %s' % e)
209+
logger.debug('Nulecule run error: %s' % e, exc_info=True)
210+
logger.info('Rolling back changes')
211+
self.stop(cli_provider, ignore_errors=True, **kwargs)
212+
213+
def stop(self, cli_provider, ignore_errors=False, **kwargs):
206214
"""
207215
Stops a running Nulecule application.
208216
209217
Args:
210218
cli_provider (str): Provider running the Nulecule application
219+
ignore_errors (bool): Ignore errors, if any, when True
211220
kwargs (dict): Extra keyword arguments
212221
"""
213222
# For stop we use the generated answer file from the run
@@ -219,7 +228,7 @@ def stop(self, cli_provider, **kwargs):
219228
self.app_path, config=self.answers, dryrun=dryrun)
220229
self.nulecule.load_config(config=self.answers)
221230
self.nulecule.render(cli_provider, dryrun=dryrun)
222-
self.nulecule.stop(cli_provider, dryrun)
231+
self.nulecule.stop(cli_provider, dryrun, ignore_errors)
223232

224233
def uninstall(self):
225234
# For future use

0 commit comments

Comments
 (0)