def render_src(src: str, **kwargs) -> dict: """Get object from jinja rendered yaml removing non-word chars from variable references. Args: src: templated source string kwargs: key-value pairs referenced in template Returns: A dict of the jinja rendered src """ clean_src = JINJA_PATTERN.sub(r'{{ \1 }}', src) return yaml.safe_load(J2Template(clean_src).render(**kwargs))
def open_userdata(self): """ Set userdata file for instances """ efs_mounts = [] if self.instance_base.get('efs_mounts'): for mount in self.instance_base.get('efs_mounts'): efs_mounts.append({ "path": mount.get('local_path'), "id": mount.get('efs_id') }) text = open(self.instance_base.get('user_data', '/ecs_cluster_deployer/compute/ecs_user_data.j2'), "r").read() t = J2Template(text) return t.render( cluster=self.cluster.get('name'), efs_mounts=efs_mounts, ecs_timeout=self.spot_fleets[0].get('timeout', "2m"), ecs_deployer_version=self.ecs_deployer_version, version=self.version )
def creative_name(self, cfg: dict, index: int): if self.is_size_override: tmpl = config.app['mgr']['creative']['size_override'][ 'name_template'] return J2Template(tmpl).render(name=cfg['name'], index=index + 1) return cfg['name']
def test_jinja_tz(): dt = date_from_string('11/21/20 12:11', '%m/%d/%y %H:%M', 'Europe/Oslo') obj = yaml.safe_load(J2Template("dt: {{ dt }}").render(dt=dt)) assert obj['dt'].tzinfo.zone == 'Europe/Oslo'
def create(self, src, dst, args, sudo=False, **kwargs): """ Copy a local file 'src' to a remote file 'dst'. If sudo is True, copy it to a remote temp folder first before moving it as superuser since we can only copy under the current remote user. kwargs is used for rendering the template """ # fullargs = args.copy() # fullargs['cubric'] = 'managed by Cubric' caller = inspect.stack()[1] filename = caller[1] # caller.filename is a 3.5ism callerbase = Path(filename).dirname() cwd = Path(os.getcwd()) tries = (cwd / src, callerbase / src, Path(__file__).dirname() / src, src) for t in tries: try: data = open(t, "r").read() break except FileNotFoundError: pass else: raise NotFoundException( "Could not find/resolve {0} to a template".format(src)) try: template = J2Template(data) except TemplateSyntaxError as e: raise TemplateException("{src}:{line} => {message}".format( src=src, message=e.message, line=e.lineno)) from None vars = args.dict() vars['ENV'] = [{ "key": k, "value": v } for (k, v) in self.env.env.items()] vars.update(kwargs) rendered = template.render(vars) m = hashlib.md5() m.update(rendered.encode('utf8')) md5sum = m.hexdigest() changed = True try: res = self.env.command("md5sum", dst) remotesum = res.split()[0] changed = (remotesum != md5sum) except NonZero: changed = True if changed: tmpname = "/tmp/{0}".format(next(tempfile._get_candidate_names())) with tempfile.NamedTemporaryFile() as fp: fp.write(rendered.encode('utf8')) fp.flush() # file.copy_owner ? if sudo or self.env._sudo: plumbum.path.utils.copy(fp.name, self.env.host.path(tmpname)) with self.env.sudo(): self.env.command("mv", tmpname, dst) # if sudo to a specific user, fix ownership if self.env._sudo: self.env.chown(dst, self.env._sudouser) else: plumbum.path.utils.copy(fp.name, self.env.host.path(dst)) self.env.last_result = changed return self