-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathrender.py
executable file
·89 lines (70 loc) · 2.76 KB
/
render.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env python3
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
"""
Software Name : AWSTerraformStarterKit
SPDX-FileCopyrightText: Copyright (c) 2023 Orange Business
SPDX-License-Identifier: BSD-3-Clause
This software is distributed under the BSD License;
see the LICENSE file for more details.
Author: AWS Practice Team <[email protected]>
"""
import os
import sys
import jinja2
import yaml
import compute_deps
class Render:
TEMPLATES_DIR = os.environ.get('TEMPLATES_DIR') if os.environ.get(
'TEMPLATES_DIR') is not None else "/templates"
def __init__(self, template_name=None, variables_path=None):
self.template_name = template_name
self.variables_path = variables_path
self.env = jinja2.Environment(
loader=jinja2.FileSystemLoader(self.TEMPLATES_DIR),
extensions=['jinja2.ext.loopcontrols'],
autoescape=True,
lstrip_blocks=True,
newline_sequence="\n",
trim_blocks=True,
keep_trailing_newline=True
)
def yaml_filter(value):
return yaml.dump(value, Dumper=yaml.RoundTripDumper, indent=4)
def rend_template(self):
env_data = {}
for k, v in os.environ.items():
env_data[k] = v
var_data = {}
with open(self.variables_path, closefd=True) as f:
var_data = yaml.full_load(f)
# compute execution plan
for idx in range(len(var_data['plans'])):
var_data['plans'][idx] = var_data['plans'][idx] if isinstance(var_data['plans'][idx], dict) and 'name' in var_data['plans'][idx] else {
'name': var_data['plans'][idx]} # this is for backward compatiblity
exec_plan = compute_deps.build_exec_plan(plans=var_data['plans'])
var_data['exec_plan'] = exec_plan
## reorganize plans order based on execution order
var_data['plans'] = []
for exec_batch in exec_plan:
for plan in exec_batch:
var_data['plans'].append(plan)
# build final variables
data = env_data
for k, v in var_data.items():
data[k] = v
self.env.filters['yaml'] = self.yaml_filter
self.env.globals["environ"] = lambda key: os.environ.get(key)
try:
rendered = self.env.get_template(self.template_name).render(data)
except Exception as e:
raise e
return rendered
def main():
min_args = 3
if len(sys.argv) < min_args:
raise Exception(
"Error: Expecting at least {} args. Got {}, args={}".format(min_args, len(sys.argv), sys.argv))
sys.stdout.write(Render(sys.argv[1], sys.argv[2]).rend_template())
if __name__ == '__main__':
main()