diff options
author | Joshua Harlow <harlowja@yahoo-inc.com> | 2014-07-18 10:52:11 -0700 |
---|---|---|
committer | Joshua Harlow <harlowja@yahoo-inc.com> | 2014-07-18 10:52:11 -0700 |
commit | f9d18e2ed747a6d44e60547fbcc0bbff780f351f (patch) | |
tree | 66a2f42ac631081e848c7c849d1ceaf673a7f12d | |
parent | 960f7c637d07c81f9e8dab2c81f113ee6654f31d (diff) | |
download | vyos-cloud-init-f9d18e2ed747a6d44e60547fbcc0bbff780f351f.tar.gz vyos-cloud-init-f9d18e2ed747a6d44e60547fbcc0bbff780f351f.zip |
Add non braces matching and a few more tests
-rw-r--r-- | cloudinit/templater.py | 15 | ||||
-rw-r--r-- | tests/unittests/test_templating.py | 36 |
2 files changed, 47 insertions, 4 deletions
diff --git a/cloudinit/templater.py b/cloudinit/templater.py index 95916dff..02f6261d 100644 --- a/cloudinit/templater.py +++ b/cloudinit/templater.py @@ -42,18 +42,25 @@ from cloudinit import util LOG = logging.getLogger(__name__) TYPE_MATCHER = re.compile(r"##\s*template:(.*)", re.I) -BASIC_MATCHER = re.compile(r'\$\{([A-Za-z0-9_.]+)\}') +BASIC_MATCHER = re.compile(r'\$\{([A-Za-z0-9_.]+)\}|\$([A-Za-z0-9_.]+)') def basic_render(content, params): """This does simple replacement of bash variable like templates. - It identifies patterns like ${a} and can also identify patterns like - ${a.b} which will look for a key 'b' in the dictionary rooted by key 'a'. + It identifies patterns like ${a} or $a and can also identify patterns like + ${a.b} or $a.b which will look for a key 'b' in the dictionary rooted + by key 'a'. """ def replacer(match): - path = collections.deque(match.group(1).split(".")) + # Only 1 of the 2 groups will actually have a valid entry. + name = match.group(1) + if name is None: + name = match.group(2) + if name is None: + raise RuntimeError("Match encountered but no valid group present") + path = collections.deque(name.split(".")) selected_params = params while len(path) > 1: key = path.popleft() diff --git a/tests/unittests/test_templating.py b/tests/unittests/test_templating.py index c3faac3d..5601a2e1 100644 --- a/tests/unittests/test_templating.py +++ b/tests/unittests/test_templating.py @@ -68,3 +68,39 @@ $a,$b''' blob = '''$a,$b''' c = templater.render_string(blob, {"a": 1, "b": 2}) self.assertEquals("1,2", c) + + def test_render_basic_deeper(self): + hn = 'myfoohost.yahoo.com' + expected_data = "h=%s\nc=d\n" % hn + in_data = "h=$hostname.canonical_name\nc=d\n" + params = { + "hostname": { + "canonical_name": hn, + }, + } + out_data = templater.render_string(in_data, params) + self.assertEqual(expected_data, out_data) + + def test_render_basic_no_parens(self): + hn = "myfoohost" + in_data = "h=$hostname\nc=d\n" + expected_data = "h=%s\nc=d\n" % hn + out_data = templater.basic_render(in_data, {'hostname': hn}) + self.assertEqual(expected_data, out_data) + + def test_render_basic_parens(self): + hn = "myfoohost" + in_data = "h = ${hostname}\nc=d\n" + expected_data = "h = %s\nc=d\n" % hn + out_data = templater.basic_render(in_data, {'hostname': hn}) + self.assertEqual(expected_data, out_data) + + def test_render_basic2(self): + mirror = "mymirror" + codename = "zany" + in_data = "deb $mirror $codename-updates main contrib non-free" + ex_data = "deb %s %s-updates main contrib non-free" % (mirror, codename) + + out_data = templater.basic_render(in_data, + {'mirror': mirror, 'codename': codename}) + self.assertEqual(ex_data, out_data) |