1
1
import glob
2
2
import json
3
- import os
3
+ import pathlib
4
4
import re
5
5
import shutil
6
+ from os import chdir , getcwd , makedirs , mkdir , path
6
7
from pprint import pformat , pprint
7
8
8
9
from cookiecutter .exceptions import NonTemplatedInputDirException
@@ -21,73 +22,101 @@ def mkdir_safely(dir):
21
22
pass
22
23
23
24
try :
24
- os . mkdir (dir )
25
+ mkdir (dir )
25
26
except OSError :
26
27
pass
27
28
28
29
29
30
def prepare_render_dirs ():
30
- output_dir = os .path .join (tmp_dir , OUTPUT_DIR )
31
+ # return
32
+ output_dir = path .join (tmp_dir , OUTPUT_DIR )
31
33
32
34
mkdir_safely (output_dir )
33
- os . chdir (output_dir )
35
+ chdir (output_dir )
34
36
35
37
mkdir_safely (WORK_DIR )
36
- os . chdir (WORK_DIR )
38
+ chdir (WORK_DIR )
37
39
38
- mkdir_safely (FINAL_DIR )
40
+ # mkdir_safely(FINAL_DIR)
39
41
42
+ mkdir (WORK_DIR_FOR_COOKIECUTTER )
40
43
41
- def render_single_layer (resource , region ):
44
+
45
+ def find_templates_files (dir ):
46
+ pprint ("DIR = %s" % dir )
47
+
48
+ files = glob .glob (dir + "/*" ) + \
49
+ glob .glob (dir + "/.*" )
50
+
51
+ return files
52
+
53
+
54
+ def prepare_single_layer (resource , region , templates_dir , templates_files ):
42
55
43
56
dir_name = resource .get ("dir_name" )
44
57
45
- full_dir_name = ("single_layer/ %s/%s" % (region , dir_name )).lower ()
58
+ full_dir_name = ("%s/%s" % (region , dir_name )).lower ()
46
59
47
60
single_layer = {
48
- "dir_name" : full_dir_name ,
49
- "region" : region ,
50
- "module_source" : MODULES [resource ["type" ]]["source" ],
51
- "module_variables" : MODULES [resource ["type" ]]["variables" ],
61
+ "module_type" : resource ["type" ]
52
62
}
53
63
54
64
extra_context = resource .update (single_layer ) or resource
55
65
56
- cookiecutter (os .path .join (COOKIECUTTER_TEMPLATES_DIR , COOKIECUTTER_TEMPLATES_PREFIX + "-single-layer" ),
57
- config_file = os .path .join (COOKIECUTTER_TEMPLATES_DIR , "config_aws_lambda.yaml" ),
58
- no_input = True ,
59
- extra_context = extra_context )
66
+ data = '{%- set this = ' + str (extra_context ) + ' -%}'
60
67
68
+ dst_dir = path .join (getcwd (), WORK_DIR_FOR_COOKIECUTTER , full_dir_name )
61
69
62
- def render_common_layer (region ):
70
+ for file in templates_files :
71
+ # pprint("original = %s" % file)
72
+ part_of_path_to_keep = "" .join (file [len (templates_dir ):])
63
73
64
- common_layer = {
65
- "dir_name" : "common_layer" ,
66
- "region" : region ,
67
- }
74
+ # pprint("just relative file = %s" % part_file)
75
+ # pprint("getcwd = %s" % getcwd())
68
76
69
- try :
70
- cookiecutter (os .path .join (COOKIECUTTER_TEMPLATES_DIR , COOKIECUTTER_TEMPLATES_PREFIX + "-common-layer" ),
71
- config_file = os .path .join (COOKIECUTTER_TEMPLATES_DIR , "config_aws_lambda.yaml" ),
72
- no_input = True ,
73
- extra_context = common_layer )
74
- except NonTemplatedInputDirException :
75
- pass
77
+ dst_file = dst_dir + part_of_path_to_keep
78
+ # pprint("new file = %s" % dst_file)
76
79
80
+ with open (file , "r" ) as original :
81
+ original_data = original .read ()
82
+ original .close ()
77
83
78
- def render_root_dir ( source , region , dirs ):
84
+ makedirs ( path . dirname ( dst_file ), exist_ok = True )
79
85
80
- root_dir = {
81
- "dir_name" : "root_dir" ,
82
- "source_name" : source ["name" ],
83
- "region" : region ,
84
- "dirs" : dirs ,
85
- }
86
+ with open (dst_file , "w" ) as modified :
87
+ modified .write (data + "\n " + original_data )
88
+ modified .close ()
89
+
90
+ shutil .copy (templates_dir + "/../cookiecutter.json" , "cookiecutter.json" )
91
+
92
+ return resource ["type" ]
93
+
94
+
95
+ # Copy all files and subdirectories into working directory
96
+ def copy_to_working_dir (templates_dir ):
86
97
87
- cookiecutter (os .path .join (COOKIECUTTER_TEMPLATES_DIR , "root" ),
88
- config_file = os .path .join (COOKIECUTTER_TEMPLATES_DIR , "config_aws_lambda.yaml" ),
98
+ dst_dir = path .realpath (WORK_DIR_FOR_COOKIECUTTER )
99
+
100
+ files = find_templates_files (templates_dir )
101
+
102
+ for file in files :
103
+ pprint ("FILE == %s" % file )
104
+ pprint ("dst_dir == %s" % dst_dir )
105
+ if path .isdir (file ):
106
+ dst = path .join (dst_dir , path .basename (file ))
107
+ shutil .copytree (file , dst )
108
+ else :
109
+ shutil .copy (file , dst_dir )
110
+
111
+
112
+ def render_all (extra_context ):
113
+
114
+ output_dir = path .join (tmp_dir , OUTPUT_DIR , WORK_DIR )
115
+
116
+ cookiecutter (output_dir ,
117
+ config_file = path .join (COOKIECUTTER_TEMPLATES_DIR , "config_aws_lambda.yaml" ),
89
118
no_input = True ,
90
- extra_context = root_dir )
119
+ extra_context = extra_context )
91
120
92
121
93
122
# Count unique combination of type and text to decide if to append unique resource id
@@ -169,6 +198,13 @@ def render_from_modulestf_config(config, source, regions):
169
198
170
199
types_text [t ] = new_appendix
171
200
201
+ # Find all templates for single layer once
202
+ templates_dir = path .realpath (path .join (COOKIECUTTER_TEMPLATES_DIR , COOKIECUTTER_TEMPLATES_PREFIX + "-single-layer/template" ))
203
+ templates_files = find_templates_files (templates_dir )
204
+
205
+ # Set of used module to load data once
206
+ used_modules = set ()
207
+
172
208
# render single layers in a loop
173
209
for resource in resources :
174
210
@@ -201,23 +237,33 @@ def render_from_modulestf_config(config, source, regions):
201
237
202
238
# Render the layer
203
239
logger .info ("Rendering single layer resource id: %s" % resource .get ("ref_id" ))
204
- render_single_layer (resource , region )
240
+ used_module_type = prepare_single_layer (resource , region , templates_dir , templates_files )
205
241
206
- logger .info ("Rendering common layer" )
207
- render_common_layer (region )
242
+ used_modules .add (used_module_type )
208
243
209
- logger .info ("Rendering root dir" )
210
- render_root_dir (source , region , dirs )
244
+ extra_context = dict ({"module_sources" : {}, "module_variables" : {}})
245
+ for module_type in used_modules :
246
+ extra_context ["module_sources" ].update ({
247
+ module_type : MODULES [module_type ]["source" ],
248
+ })
211
249
212
- files = glob .glob ("single_layer/*" ) + \
213
- glob .glob ("single_layer/.*" ) + \
214
- glob .glob ("common_layer/*" ) + \
215
- glob .glob ("common_layer/.*" ) + \
216
- glob .glob ("root_dir/*" ) + \
217
- glob .glob ("root_dir/.*" )
250
+ extra_context ["module_variables" ].update ({
251
+ module_type : MODULES [module_type ]["variables" ],
252
+ })
218
253
219
- logger .info ("Moving files into final dir: %s" % FINAL_DIR )
220
- for file in files :
221
- shutil .move (file , FINAL_DIR )
254
+ logger .info ("Prepare common layer" )
255
+ templates_dir = path .realpath (path .join (COOKIECUTTER_TEMPLATES_DIR , COOKIECUTTER_TEMPLATES_PREFIX + "-common-layer/template" ))
256
+ copy_to_working_dir (templates_dir )
257
+
258
+ logger .info ("Prepare root dir" )
259
+ templates_dir = path .realpath (path .join (COOKIECUTTER_TEMPLATES_DIR , "root/template" ))
260
+ copy_to_working_dir (templates_dir )
261
+
262
+ extra_context ["source_name" ] = source ["name" ]
263
+ extra_context ["dirs" ] = dirs
264
+ extra_context ["region" ] = region
265
+
266
+ logger .info ("Rendering all" )
267
+ render_all (extra_context )
222
268
223
269
logger .info ("Complete!" )
0 commit comments