diff options
author | Lars Wirzenius <liw@liw.fi> | 2017-03-10 19:35:38 +0200 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2017-03-10 19:35:38 +0200 |
commit | e4770cfe0c1759785df441339bf9e9e4f7fa3f25 (patch) | |
tree | d7ae6440003b6822e62768c6ce975dfe534d762e | |
parent | 8f50c63e5bd161b7a5e641a06fac72e5bdf0b860 (diff) | |
download | vmdb2-e4770cfe0c1759785df441339bf9e9e4f7fa3f25.tar.gz |
Add Jinja2 templating to values in spec files
-rw-r--r-- | vmdb/app.py | 30 | ||||
-rw-r--r-- | vmdb/plugins/echo_plugin.py | 11 | ||||
-rw-r--r-- | vmdb/plugins/error_plugin.py | 4 | ||||
-rw-r--r-- | vmdb/step_list.py | 4 | ||||
-rw-r--r-- | yarns/100-mvp.yarn | 1 | ||||
-rw-r--r-- | yarns/900-implements.yarn | 7 |
6 files changed, 44 insertions, 13 deletions
diff --git a/vmdb/app.py b/vmdb/app.py index c6696a7..45ebe13 100644 --- a/vmdb/app.py +++ b/vmdb/app.py @@ -20,6 +20,7 @@ import logging import sys import cliapp +import jinja2 import yaml @@ -28,6 +29,12 @@ import vmdb class Vmdb2(cliapp.Application): + def add_settings(self): + self.settings.string( + ['image'], + 'create image file FILE', + metavar='FILE') + def setup(self): self.step_runners = vmdb.StepRunnerList() @@ -55,8 +62,9 @@ class Vmdb2(cliapp.Application): try: for step in steps: steps_taken.append(step) + expanded_step = self.expand_step_spec(step) runner = self.step_runners.find(step) - runner.run(step) + runner.run(expanded_step, self.settings) except Exception as e: logging.error('ERROR: %s', str(e)) sys.stderr.write('ERROR: {}\n'.format(str(e))) @@ -66,5 +74,23 @@ class Vmdb2(cliapp.Application): def run_teardowns(self, steps_taken): for step in reversed(steps_taken): + expanded_step = self.expand_step_spec(step) runner = self.step_runners.find(step) - runner.teardown(step) + runner.teardown(expanded_step, self.settings) + + def expand_step_spec(self, step): + expanded = {} + for key in step: + expanded[key] = self.expand_jinja2(step[key]) + return expanded + + def expand_jinja2(self, value): + template = jinja2.Template(value) + vars = self.create_template_vars() + return template.render(**vars) + + def create_template_vars(self): + vars = dict() + for key in self.settings: + vars[key] = self.settings[key] + return vars diff --git a/vmdb/plugins/echo_plugin.py b/vmdb/plugins/echo_plugin.py index 706897c..195bbeb 100644 --- a/vmdb/plugins/echo_plugin.py +++ b/vmdb/plugins/echo_plugin.py @@ -36,11 +36,12 @@ class EchoStepRunner(vmdb.StepRunnerInterface): def get_required_keys(self): return ['echo'] - def run(self, step_spec): + def run(self, step_spec, settings): text = step_spec['echo'] sys.stdout.write('{}\n'.format(text)) - def teardown(self, step_spec): - text = step_spec['teardown'] - sys.stdout.write('{}\n'.format(text)) - logging.info('%s', text) + def teardown(self, step_spec, settings): + if 'teardown' in step_spec: + text = step_spec['teardown'] + sys.stdout.write('{}\n'.format(text)) + logging.info('%s', text) diff --git a/vmdb/plugins/error_plugin.py b/vmdb/plugins/error_plugin.py index 81cfb49..6686cbc 100644 --- a/vmdb/plugins/error_plugin.py +++ b/vmdb/plugins/error_plugin.py @@ -36,11 +36,11 @@ class ErrorStepRunner(vmdb.StepRunnerInterface): def get_required_keys(self): return ['error', 'teardown'] - def run(self, step_spec): + def run(self, step_spec, settings): sys.stdout.write('ERROR: {}\n'.format(step_spec['error'])) logging.error('%s', step_spec['error']) raise vmdb.StepError('an error occurred') - def teardown(self, step_spec): + def teardown(self, step_spec, settings): sys.stdout.write('ERROR: {}\n'.format(step_spec['teardown'])) logging.error('error cleanup: %s', step_spec['teardown']) diff --git a/vmdb/step_list.py b/vmdb/step_list.py index 407a4d4..3420f76 100644 --- a/vmdb/step_list.py +++ b/vmdb/step_list.py @@ -24,10 +24,10 @@ class StepRunnerInterface(object): # pragma: no cover def get_required_keys(self): raise NotImplementedError() - def run(self): + def run(self, step_spec, settings): raise NotImplementedError() - def teardown(self): + def teardown(self, step_spec, settings): # Default implementation does nop, so that sub-classes don't # need to have a nop teardown. pass diff --git a/yarns/100-mvp.yarn b/yarns/100-mvp.yarn index a3e3040..77f3db2 100644 --- a/yarns/100-mvp.yarn +++ b/yarns/100-mvp.yarn @@ -128,6 +128,7 @@ specification file would instead do thing like create the file. ... { ... steps: [ ... { echo: "image is {{ image }}" }, + ... { echo: "bar" }, ... ] ... } WHEN user runs vmdb2 --image=foo.img j2.vmdb diff --git a/yarns/900-implements.yarn b/yarns/900-implements.yarn index 1356bf1..f4c0538 100644 --- a/yarns/900-implements.yarn +++ b/yarns/900-implements.yarn @@ -9,10 +9,10 @@ This chapter contains the implementations for all scenario steps. open(filename, 'w').write(spec) IMPLEMENTS WHEN user runs vmdb2 (.*) - filename = helper.get_next_match() + args = helper.get_next_match() srcdir = os.environ['SRCDIR'] vmdb2 = os.path.join(srcdir, 'vmdb2') - exit, out, err = cliapp.runcmd_unchecked([vmdb2, filename]) + exit, out, err = cliapp.runcmd_unchecked([vmdb2] + args.split()) helper.set_variable('exit', exit) helper.set_variable('stdout', out) helper.set_variable('stderr', err) @@ -20,6 +20,9 @@ This chapter contains the implementations for all scenario steps. IMPLEMENTS THEN exit code is (\d+) wanted = int(helper.get_next_match()) exit = helper.get_variable('exit') + print 'exit code', exit + print 'stdout:', helper.get_variable('stdout') + print 'stderr:', helper.get_variable('stderr') helper.assertEqual(exit, wanted) IMPLEMENTS THEN stdout contains "(.+)" followed by "(.+)" |