summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2017-03-10 19:35:38 +0200
committerLars Wirzenius <liw@liw.fi>2017-03-10 19:35:38 +0200
commite4770cfe0c1759785df441339bf9e9e4f7fa3f25 (patch)
treed7ae6440003b6822e62768c6ce975dfe534d762e
parent8f50c63e5bd161b7a5e641a06fac72e5bdf0b860 (diff)
downloadvmdb2-e4770cfe0c1759785df441339bf9e9e4f7fa3f25.tar.gz
Add Jinja2 templating to values in spec files
-rw-r--r--vmdb/app.py30
-rw-r--r--vmdb/plugins/echo_plugin.py11
-rw-r--r--vmdb/plugins/error_plugin.py4
-rw-r--r--vmdb/step_list.py4
-rw-r--r--yarns/100-mvp.yarn1
-rw-r--r--yarns/900-implements.yarn7
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 "(.+)"