241
243
:param str source: The template source file, relative to
242
244
`$CHARM_DIR/templates`
243
:param str target: The target to write the rendered template to
246
:param str target: The target to write the rendered template to (or None)
244
247
:param str owner: The owner of the rendered file
245
248
:param str group: The group of the rendered file
246
249
:param int perms: The permissions of the rendered file
250
:param partial on_change_action: functools partial to be executed when
251
rendered file changes
252
:param jinja2 loader template_loader: A jinja2 template loader
254
:return str: The rendered template
249
256
def __init__(self, source, target,
250
owner='root', group='root', perms=0o444):
257
owner='root', group='root', perms=0o444,
258
on_change_action=None, template_loader=None):
251
259
self.source = source
252
260
self.target = target
253
261
self.owner = owner
254
262
self.group = group
255
263
self.perms = perms
264
self.on_change_action = on_change_action
265
self.template_loader = template_loader
257
267
def __call__(self, manager, service_name, event_name):
269
if self.on_change_action and os.path.isfile(self.target):
270
pre_checksum = host.file_hash(self.target)
258
271
service = manager.get_service(service_name)
272
context = {'ctx': {}}
260
273
for ctx in service.get('required_data', []):
261
274
context.update(ctx)
262
templating.render(self.source, self.target, context,
263
self.owner, self.group, self.perms)
275
context['ctx'].update(ctx)
277
result = templating.render(self.source, self.target, context,
278
self.owner, self.group, self.perms,
279
template_loader=self.template_loader)
280
if self.on_change_action:
281
if pre_checksum == host.file_hash(self.target):
283
'No change detected: {}'.format(self.target),
286
self.on_change_action()
266
291
# Convenience aliases for templates