kolypto / j2cli

Jinja2 Command-Line Tool, reworked

Home Page:http://pypi.python.org/pypi/j2cli

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

add from_json filter, useful to move any object through env vars

ollofx opened this issue · comments

container_env:
  mongo_servers: '{{ mongo_servers | to_json }}'

consider creation of ENV variable on into Docker Container, couldn't pass object but a serialized json string.

        "mongo_servers": [
            {
                "addr": "tkd-anex_store01.tkd-dev.teramag.com:27017",
                "fqdn": "tkd-anex_store01.tkd-dev.teramag.com",
                "hostname": "tkd-anex_store01",
                "port": 27017,
                "vm_lb_id": "01"
            },
            {
                "addr": "tkd-anex_store02.tkd-dev.teramag.com:27017",
                "fqdn": "tkd-anex_store02.tkd-dev.teramag.com",
                "hostname": "tkd-anex_store02",
                "port": 27017,
                "vm_lb_id": "02"
            },
            {
                "addr": "tkd-anex_store03.tkd-dev.teramag.com:27017",
                "fqdn": "tkd-anex_store03.tkd-dev.teramag.com",
                "hostname": "tkd-anex_store03",
                "port": 27017,
                "vm_lb_id": "03"
            }
        ]

ENV

$ env | grep mongo_servers
mongo_servers=[{"vm_lb_id": "01", "hostname": "tkd-anex_store01", "fqdn": "tkd-anex_store01.tkd-dev.teramag.com", "addr": "tkd-anex_store01.tkd-dev.teramag.com:27017", "port": 27017}, {"vm_lb_id": "02", "hostname": "tkd-anex_store02", "fqdn": "tkd-anex_store02.tkd-dev.teramag.com", "addr": "tkd-anex_store02.tkd-dev.teramag.com:27017", "port": 27017}, {"vm_lb_id": "03", "hostname": "tkd-anex_store03", "fqdn": "tkd-anex_store03.tkd-dev.teramag.com", "addr": "tkd-anex_store03.tkd-dev.teramag.com:27017", "port": 27017}]
$  env | grep mongo_servers | j2 --format=env servers.conf.jinja2 -o servers.conf
jinja2.exceptions.TemplateAssertionError: No filter named 'from_json'.

now this object could be recovered back into j2cli from this ENV var with this simple filter (already available as an extra filter into ansible)

{% for server in mongo_servers | from_json %}
    '{{ server.addr }}',
{% endfor %}

this filter could be added by appending these to changes to j2cli package
j2cli/extras/filters.py add

import json

def from_json(data):
    return json.loads(data)

to j2cli/extras/cli.py add at line 176

    # Filters, Tests
    renderer.register_filters({
        'docker_link': filters.docker_link,
        'env': filters.env,
        'from_json': filters.from_json,
    })