docs: def render(filename, obj):
      """Render a template, maybe mixing in extra variables"""
      template_path = abspath(filename)
      env = jinja_env(template_path)
      template_base = os.path.basename(template_path)
      try:
          parsed_content = env.parse(env
                                     .loader
                                     .get_source(env, template_base))
          template_vars = meta.find_undeclared_variables(parsed_content)
          if template_vars:
              missing_vars(template_vars, parsed_content, obj)
  
          LOG.debug("rendering %s with %s vars",
                    template_path, len(template_vars))
          return env \
              .get_template(template_base) \
              .render(**obj)
      except jinja2.exceptions.TemplateSyntaxError as exception:
          template_trace = traceback.format_tb(sys.exc_info()[2])
          # Different error context depending on whether it is the
          # pre-render variable scan or not
          if exception.filename:
              template_line = template_trace[len(template_trace) - 1]
              raise aomi_excep.Validation("Bad template %s %s" %
                                          (template_line,
                                           str(exception)))
  
          template_str = ''
          if isinstance(exception.source, tuple):
              # PyLint seems confused about whether or not this is a tuple
              # pylint: disable=locally-disabled, unsubscriptable-object
              template_str = "Embedded Template\n%s" % exception.source[0]
  
          raise aomi_excep.Validation("Bad template %s" % str(exception),
                                      source=template_str)
  
      except jinja2.exceptions.UndefinedError as exception:
          template_traces = [x.strip()
                             for x in traceback.format_tb(sys.exc_info()[2])
                             if 'template code' in x]
          raise aomi_excep.Validation("Missing template variable %s" %
                                      ' '.join(template_traces))