예제 #1
0
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))
예제 #2
0
 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
     )
예제 #3
0
 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']
예제 #4
0
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'
예제 #5
0
    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