# ============LICENSE_START======================================================= # org.onap.dcae # ================================================================================ # Copyright (c) 2017 AT&T Intellectual Property. All rights reserved. # ================================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============LICENSE_END========================================================= # # ECOMP is a trademark and service mark of AT&T Intellectual Property. import os, sys from sets import Set from jinja2 import Environment, PackageLoader, FileSystemLoader, meta ''' @contextfunction def get_exported_names(context): return sorted(context.exported_vars) ''' def build_context( jjt_directory ): context = {} for file in os.listdir(jjt_directory): if file.endswith(".txt"): with open(os.path.join(jjt_directory, file), 'r') as parameter_file: value = parameter_file.readline().rstrip() key = file.split('.txt', 1)[0] context[key] = value return context def render_template(tpl_path, context): path, filename = os.path.split(tpl_path) return Environment(loader = FileSystemLoader(path)).get_template(filename).render(context) def check_templates(jjt_directory, template_file_dir): all_variables = Set([]) env = Environment(loader=FileSystemLoader(template_file_dir)) for infname in os.listdir(template_file_dir): template_source = env.loader.get_source(env, infname)[0] parsed_content = env.parse(template_source) referenced_variables = meta.find_undeclared_variables(parsed_content) all_variables.update(referenced_variables) context_variables = Set(build_context(jjt_directory).keys()) undefined_variables = all_variables - context_variables if undefined_variables: print("Error: referenced but unprovided variables: {}".format(undefined_variables)) exit(1) else: print("All referenced template variables found. Proceed with de-templating") # using context provided in jjt_directory to de-tempatize blueprint inputs in in_directory to out_directory def detemplate_bpinputs(jjt_directory, in_directory, out_directory): context = build_context(jjt_directory) for infname in os.listdir(in_directory): infpath = os.path.join(in_directory, infname) outfpath = os.path.join(out_directory, infname) with open(outfpath, 'w') as f: print ('detemplating {} to {}'.format(infpath, outfpath)) inputs = render_template(infpath, context) f.write(inputs) def add_keystone_20(conf_directory, filename): fpath = os.path.join(conf_directory, filename) newurl = '' try: with open(fpath, 'r') as f: url = f.readline().rstrip() if not url.endswith('/v2.0'): if url.endswith('/'): newurl = url + 'v2.0' else: newurl = url + '/v2.0' except: newurl = '' print("add_keystone_20 eception reading file: " + conf_directory + "/" + filename) if newurl: try: with open(fpath, 'w') as f: f.write(newurl) except: print("add_keystone_20 eception writing file: " + conf_directory + "/" + filename) def main(): if len(sys.argv) != 4: print("Usgae: {} variable_def_dir template_dir template_output_dir".format(sys.argv[0])) exit(1) print("De-templatizing templates in {} using variable defs from {}, results in {}".format(sys.argv[1], sys.argv[2], sys.argv[3])) add_keystone_20(conf_directory = sys.argv[1], filename = 'keystone_url.txt') check_templates(sys.argv[1], sys.argv[2]) detemplate_bpinputs(jjt_directory = sys.argv[1], in_directory = sys.argv[2], out_directory = sys.argv[3]) ######################################## if __name__ == "__main__": main()