summaryrefslogtreecommitdiff
path: root/cloudinit/templater.py
diff options
context:
space:
mode:
authorJoshua Harlow <harlowja@gmail.com>2014-03-02 20:37:27 -0800
committerJoshua Harlow <harlowja@gmail.com>2014-03-02 20:37:27 -0800
commit3f3450660f5f7118ac0583de5d137120c1ae4abd (patch)
tree3662863b7b845b4a2f476cdd22c108f04d7e91c3 /cloudinit/templater.py
parentacfd6c50e4dc3de5e20cfabe6bac1569e43d3ff1 (diff)
downloadvyos-cloud-init-3f3450660f5f7118ac0583de5d137120c1ae4abd.tar.gz
vyos-cloud-init-3f3450660f5f7118ac0583de5d137120c1ae4abd.zip
Allow the usage of mako templates
Mako is a python 2.6->3.x compatible templating engine, allow its optional usage (until we can depricate cheetah) by allowing for specifying a template file header that can define which template engine to use. For now support cheetah (the default) and if specified support mako as well.
Diffstat (limited to 'cloudinit/templater.py')
-rw-r--r--cloudinit/templater.py32
1 files changed, 30 insertions, 2 deletions
diff --git a/cloudinit/templater.py b/cloudinit/templater.py
index 77af1270..a7527964 100644
--- a/cloudinit/templater.py
+++ b/cloudinit/templater.py
@@ -20,10 +20,37 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from Cheetah.Template import Template
+import re
+from Cheetah.Template import Template as CTemplate
+from mako.template import Template as MTemplate
+
+from cloudinit import log as logging
from cloudinit import util
+LOG = logging.getLogger(__name__)
+DEF_RENDERER = (lambda content, params:
+ CTemplate(content, searchList=[params]).respond())
+RENDERERS = {
+ 'mako': lambda content, params: MTemplate(content).render(**params),
+ 'cheetah': DEF_RENDERER,
+}
+TYPE_MATCHER = re.compile(r"##\s*template:(.*)", re.I)
+
+
+def detect_template(text):
+ lines = text.splitlines()
+ if not lines:
+ return DEF_RENDERER
+ line = lines[0]
+ type_match = TYPE_MATCHER.match(line)
+ if not type_match:
+ return DEF_RENDERER
+ template_type = type_match.group(1).lower().strip()
+ if template_type not in RENDERERS:
+ LOG.warn("Unknown template type requested: %s", template_type)
+ return RENDERERS.get(template_type, DEF_RENDERER)
+
def render_from_file(fn, params):
return render_string(util.load_file(fn), params)
@@ -37,4 +64,5 @@ def render_to_file(fn, outfn, params, mode=0644):
def render_string(content, params):
if not params:
params = {}
- return Template(content, searchList=[params]).respond()
+ renderer = detect_template(content)
+ return renderer(content, params)