syndicate/core/generators/lambda_function.py (556 lines of code) (raw):

""" Copyright 2018 EPAM Systems, Inc. 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. """ import json import os from pathlib import Path from syndicate.commons.log_helper import get_logger, get_user_logger from syndicate.core import ProjectState from syndicate.core.project_state.project_state import BUILD_MAPPINGS from syndicate.core.generators import (_touch, _mkdir, _write_content_to_file, FILE_LAMBDA_HANDLER_PYTHON, FILE_LAMBDA_HANDLER_NODEJS, _read_content_from_file) from syndicate.core.generators.project import _generate_java_project_hierarchy from syndicate.core.generators.tests import _generate_python_tests from syndicate.core.generators.contents import ( NODEJS_LAMBDA_HANDLER_TEMPLATE, _generate_python_node_lambda_config, _generate_lambda_role_config, _generate_nodejs_node_lambda_config, CANCEL_MESSAGE, _generate_package_nodejs_lambda, _generate_package_lock_nodejs_lambda, JAVA_LAMBDA_HANDLER_CLASS, SRC_MAIN_JAVA, FILE_POM, PYTHON_LAMBDA_HANDLER_TEMPLATE, INIT_CONTENT, ABSTRACT_LAMBDA_CONTENT, EXCEPTION_CONTENT, LOG_HELPER_CONTENT, _generate_python_node_layer_config, REQUIREMENTS_FILE_CONTENT, LOCAL_REQUIREMENTS_FILE_CONTENT, _generate_node_layer_package_file, _generate_node_layer_package_lock_file, JAVA_TAG_ANNOTATION_TEMPLATE, JAVA_TAGS_ANNOTATION_TEMPLATE, JAVA_TAGS_IMPORT, DOTNET_LAMBDA_HANDLER_TEMPLATE, DOTNET_LAMBDA_CSPROJ_TEMPLATE, _generate_dotnet_lambda_config, DOTNET_LAMBDA_LAYER_CSPROJ_TEMPLATE) from syndicate.core.groups import (RUNTIME_JAVA, RUNTIME_NODEJS, RUNTIME_PYTHON, RUNTIME_PYTHON_LAYER, RUNTIME_NODEJS_LAYER, RUNTIME_DOTNET, RUNTIME_DOTNET_LAYER) _LOG = get_logger(__name__) USER_LOG = get_user_logger() FOLDER_LAMBDAS = 'lambdas' FOLDER_COMMONS = 'commons' FOLDER_LAYERS = 'layers' FILE_DEPLOYMENT_RESOURCES = 'deployment_resources.json' FILE_INIT_PYTHON = '__init__.py' FILE_LAMBDA_CONFIG = 'lambda_config.json' FILE_PACKAGE_LOCK = 'package-lock.json' FILE_PACKAGE = 'package.json' FILE_LAYER_CONFIG = 'lambda_layer_config.json' FILE_REQUIREMENTS = 'requirements.txt' FILE_LOCAL_REQUIREMENTS = 'local_requirements.txt' FILE_DOTNET_FUNCTION = 'Function.cs' FILE_DOTNET_FUNCTION_CONFIG = 'Function.csproj' FILE_DOTNET_LAYER_PACKAGES = 'packages.csproj' LAMBDA_ROLE_NAME_PATTERN = '{0}-role' # 0 - lambda_name POLICY_NAME_PATTERN = '{0}-policy' # 0 - lambda_name ABSTRACT_LAMBDA_NAME = 'abstract_lambda' PROJECT_STATE_PARAM = 'project_state' LAMBDAS_PATH_PARAM = 'lambdas_path' LAMBDA_NAMES_PARAM = 'lambda_names' PROJECT_NAME_PARAM = 'project_name' PROJECT_PATH_PARAM = 'project_path' LAYER_NAME_PARAM = 'layer_name' LAYERS_PATH_PARAM = 'layers_path' RUNTIME_PARAM = 'runtime' TAGS_PARAM = 'tags' PYTHON_LAMBDA_FILES = [ FILE_INIT_PYTHON, FILE_LOCAL_REQUIREMENTS, FILE_REQUIREMENTS, FILE_DEPLOYMENT_RESOURCES, # content FILE_LAMBDA_CONFIG # content ] # + handler content PYTHON_LAYER_FILES = [ FILE_LOCAL_REQUIREMENTS, FILE_REQUIREMENTS, FILE_LAYER_CONFIG ] NODEJS_LAMBDA_FILES = [ FILE_PACKAGE, FILE_PACKAGE_LOCK, FILE_LAMBDA_CONFIG, FILE_LAMBDA_HANDLER_NODEJS, FILE_DEPLOYMENT_RESOURCES ] NODEJS_LAYER_FILES = [ FILE_PACKAGE, FILE_PACKAGE_LOCK, FILE_LAYER_CONFIG ] DOTNET_LAMBDA_FILES = [ FILE_DOTNET_FUNCTION, FILE_DOTNET_FUNCTION_CONFIG, FILE_LAMBDA_CONFIG, FILE_DEPLOYMENT_RESOURCES ] DOTNET_LAYER_FILES = [ FILE_LAYER_CONFIG, FILE_DOTNET_LAYER_PACKAGES ] def generate_common_module(src_path, runtime): runtime_processor = COMMON_MODULE_PROCESSORS.get(runtime) if not runtime_processor: raise AssertionError(f'Unable to create a common module in {src_path}') runtime_processor(src_path=src_path) def generate_lambda_function(project_path, runtime, lambda_names, tags): if not os.path.exists(project_path): USER_LOG.info(f'Project "{project_path}" you ' f'have provided does not exist') return if not ProjectState.check_if_project_state_exists( project_path=project_path): USER_LOG.info(f'Seems that the path {project_path} is not a project') return project_state = ProjectState(project_path=project_path) src_path = os.path.join(project_path, BUILD_MAPPINGS[runtime]) common_module_generator = COMMON_MODULE_PROCESSORS.get(runtime) if not common_module_generator: raise AssertionError(f'The runtime {runtime} is not currently ' f'supported to bootstrap the project') common_module_generator(src_path=src_path) project_state.add_project_build_mapping(runtime=runtime) processor = LAMBDAS_PROCESSORS.get(runtime) if not processor: raise RuntimeError(f'Wrong project runtime {runtime}') lambdas_path = os.path.join(src_path, FOLDER_LAMBDAS) generated_lambdas = processor( project_path=project_path, lambda_names=lambda_names, lambdas_path=lambdas_path, project_state=project_state, tags=tags) tests_generator = TESTS_MODULE_PROCESSORS.get(runtime) [tests_generator(project_path, name) for name in lambda_names] project_state.save() if len(generated_lambdas) == 1: USER_LOG.info(f'Lambda {generated_lambdas[0]} has been successfully ' f'added to the project.') elif len(generated_lambdas) > 1: generated_lambda_names = ', '.join(generated_lambdas) USER_LOG.info(f'The following lambdas have been successfully ' f'added to the project: {generated_lambda_names}') def generate_lambda_layer(name, runtime, project_path, lambda_names=None): if not os.path.exists(project_path): USER_LOG.info(f'Project "{project_path}" you ' f'have provided does not exist') return if not ProjectState.check_if_project_state_exists( project_path=project_path): USER_LOG.info(f'Seems that the path {project_path} is not a project') return project_state = ProjectState(project_path=project_path) src_path = os.path.join(project_path, BUILD_MAPPINGS[runtime]) common_module_generator = COMMON_MODULE_PROCESSORS.get(runtime + '_layer') if not common_module_generator: raise AssertionError(f'The layer runtime {runtime} is not currently ' f'supported to bootstrap the project') common_module_generator(src_path=src_path) project_state.add_project_build_mapping(runtime=runtime) processor = LAYERS_PROCESSORS.get(runtime) if not processor: raise RuntimeError(f'Wrong layer runtime {runtime}') layers_path = os.path.join(src_path, FOLDER_LAMBDAS, FOLDER_LAYERS) result = processor( layer_name=name, layers_path=layers_path, runtime=runtime ) project_state.save() if result is None: return USER_LOG.info(f'Layer \'{name}\' has been successfully ' f'added to the project.') if lambda_names: _LOG.debug(f'Going to link layer {name} with lambdas: {lambda_names}') project_lambdas = project_state.lambdas _link_layer_to_lambdas(lambda_names=lambda_names, layer_name=name, layer_runtime=runtime, existent_lambdas=project_lambdas, lambda_path=src_path) def _generate_python_lambdas(**kwargs): lambdas_path = kwargs.get(LAMBDAS_PATH_PARAM) lambda_names = kwargs.get(LAMBDA_NAMES_PARAM) project_state = kwargs.get(PROJECT_STATE_PARAM) tags = kwargs.get(TAGS_PARAM) generated_lambdas = [] if not os.path.exists(lambdas_path): _mkdir(lambdas_path, exist_ok=True) init_file = os.path.join(lambdas_path, '__init__.py') _touch(init_file) _LOG.info(f'Lambdas path: {lambdas_path}') for lambda_name in lambda_names: lambda_folder = os.path.join(lambdas_path, lambda_name) answer = _mkdir( path=lambda_folder, fault_message=f'\nLambda {lambda_name} already exists.\nOverride ' f'the Lambda function? [y/n]: ') if not answer: USER_LOG.info(CANCEL_MESSAGE.format(lambda_name)) continue PYTHON_LAMBDA_FILES.append( FILE_LAMBDA_HANDLER_PYTHON) # add lambda handler for file in PYTHON_LAMBDA_FILES: _touch(os.path.join(lambda_folder, file)) # fill handler.py lambda_class_name = __lambda_name_to_class_name( lambda_name=lambda_name) python_lambda_handler_template = PYTHON_LAMBDA_HANDLER_TEMPLATE. \ replace('LambdaName', lambda_class_name) _write_content_to_file(os.path.join( lambda_folder, FILE_LAMBDA_HANDLER_PYTHON), python_lambda_handler_template) # fill deployment_resources.json pattern_format = LAMBDA_ROLE_NAME_PATTERN.format(lambda_name) role_def = _generate_lambda_role_config(pattern_format, tags) _write_content_to_file(os.path.join( lambda_folder, FILE_DEPLOYMENT_RESOURCES), role_def) # fill lambda_config.json lambda_def = _generate_python_node_lambda_config( lambda_name, os.path.join(FOLDER_LAMBDAS, lambda_name), tags) _write_content_to_file(os.path.join(lambda_folder, FILE_LAMBDA_CONFIG), lambda_def) # fill local_dependencies.txt _write_content_to_file( os.path.join(lambda_folder, FILE_LOCAL_REQUIREMENTS), FOLDER_COMMONS) project_state.add_lambda(lambda_name=lambda_name, runtime='python') _LOG.info(f'Lambda {lambda_name} created') generated_lambdas.append(lambda_name) return generated_lambdas def __lambda_name_to_class_name(lambda_name): class_name = lambda_name.split('-') if len(class_name) == 1: class_name = lambda_name.split('_') return ''.join([_.capitalize() for _ in class_name]) def _generate_java_lambdas(**kwargs): from click import confirm as click_confirm project_path = kwargs.get(PROJECT_PATH_PARAM) project_state = kwargs.get(PROJECT_STATE_PARAM) project_name = project_state.name lambda_names = kwargs.get(LAMBDA_NAMES_PARAM, []) tags = kwargs.get(TAGS_PARAM) generated_lambdas = [] _generate_java_project_hierarchy(project_name=project_name, full_project_path=project_path) java_package_name = _generate_java_package_name(project_name) java_package_as_path = java_package_name.replace('.', '/') pom_file_path = os.path.join(project_path, FILE_POM) pom_xml_content = _read_content_from_file(pom_file_path) pom_xml_content = pom_xml_content.replace( '<!--packages to scan-->', f'<package>{java_package_name}</package>') _write_content_to_file(pom_file_path, pom_xml_content) full_package_path = Path(project_path, SRC_MAIN_JAVA, java_package_as_path) for lambda_name in lambda_names: if not os.path.exists(full_package_path): _mkdir(full_package_path, exist_ok=True) lambda_class_name = _get_parts_split_by_chars(to_split=lambda_name, chars=['-', '_']).title() lambda_class_name = lambda_class_name.replace(' ', '') lambda_role_name = LAMBDA_ROLE_NAME_PATTERN.format(lambda_name) lambda_tags_import, lambda_tags = _resolve_java_tags(tags) java_handler_content = \ (JAVA_LAMBDA_HANDLER_CLASS .replace('{java_package_name}', java_package_name) .replace('{lambda_name}', lambda_name) .replace('{lambda_class_name}', lambda_class_name) .replace('{lambda_role_name}', lambda_role_name) .replace('{tags_import}', lambda_tags_import) .replace('{tags}', lambda_tags)) java_handler_file_name = os.path.join( project_path, SRC_MAIN_JAVA, java_package_as_path, f'{lambda_class_name}.java') if Path(str(java_handler_file_name)).is_file(): if not click_confirm( f'\nLambda {lambda_name} already exists.\nOverride ' f'the Lambda function?'): USER_LOG.info(CANCEL_MESSAGE.format(lambda_name)) continue _write_content_to_file( java_handler_file_name, java_handler_content ) # add role to deployment_resource.json dep_res_path = os.path.join(project_path, FILE_DEPLOYMENT_RESOURCES) if not Path(dep_res_path).is_file(): _LOG.warning( 'The project root \'deployment_resources.json\' file is ' 'absent. Creating...' ) _touch(dep_res_path) deployment_resources = {} else: deployment_resources = json.loads(_read_content_from_file( dep_res_path )) deployment_resources.update(_generate_lambda_role_config( lambda_role_name, tags, stringify=False)) _write_content_to_file(dep_res_path, json.dumps(deployment_resources, indent=2)) project_state.add_lambda(lambda_name=lambda_name, runtime=RUNTIME_JAVA) _LOG.info(f'Lambda {lambda_name} created') generated_lambdas.append(lambda_name) return generated_lambdas def _generate_java_package_name(project_name): unified_package_name = _get_parts_split_by_chars(to_split=project_name, chars=['-', '_']) java_package_name = unified_package_name.replace(' ', '') java_package_name = f'com.{java_package_name}' return java_package_name def _resolve_java_tags(tags): if tags: tag_annotations = [] for key, value in tags.items(): tag_annotations.append(JAVA_TAG_ANNOTATION_TEMPLATE .replace('{key}', key) .replace('{value}', value)) return (JAVA_TAGS_IMPORT, JAVA_TAGS_ANNOTATION_TEMPLATE.replace( '{tags}', ',\n'.join(tag_annotations))) return '', '' def _get_parts_split_by_chars(chars, to_split): result = to_split for char in chars: result = result.replace(char, ' ') return result def _generate_nodejs_lambdas(**kwargs): lambdas_path = kwargs.get(LAMBDAS_PATH_PARAM) lambda_names = kwargs.get(LAMBDA_NAMES_PARAM, []) project_state = kwargs.get(PROJECT_STATE_PARAM) tags = kwargs.get(TAGS_PARAM) generated_lambdas = [] if not os.path.exists(lambdas_path): _mkdir(lambdas_path, exist_ok=True) for lambda_name in lambda_names: lambda_folder = os.path.join(lambdas_path, lambda_name) answer = _mkdir( path=lambda_folder, fault_message=f'\nLambda {lambda_name} already exists.\n' f'Override the Lambda function? [y/n]: ') if not answer: USER_LOG.info(CANCEL_MESSAGE.format(lambda_name)) continue for file in NODEJS_LAMBDA_FILES: _touch(Path(lambda_folder, file)) # fill index.js _write_content_to_file( os.path.join(lambda_folder, FILE_LAMBDA_HANDLER_NODEJS), NODEJS_LAMBDA_HANDLER_TEMPLATE) # fill package.json package_def = _generate_package_nodejs_lambda(lambda_name) _write_content_to_file(os.path.join(lambda_folder, FILE_PACKAGE), package_def) # fill package.json package_lock_def = _generate_package_lock_nodejs_lambda( lambda_name) _write_content_to_file(os.path.join(lambda_folder, FILE_PACKAGE_LOCK), package_lock_def) # fill deployment_resources.json role_def = _generate_lambda_role_config( LAMBDA_ROLE_NAME_PATTERN.format(lambda_name), tags) _write_content_to_file( os.path.join(lambda_folder, FILE_DEPLOYMENT_RESOURCES), role_def) # fill lambda_config.json lambda_def = _generate_nodejs_node_lambda_config( lambda_name, os.path.join(FOLDER_LAMBDAS, lambda_name), tags) _write_content_to_file(os.path.join(lambda_folder, FILE_LAMBDA_CONFIG), lambda_def) project_state.add_lambda(lambda_name=lambda_name, runtime=RUNTIME_NODEJS) _LOG.info(f'Lambda {lambda_name} created') generated_lambdas.append(lambda_name) return generated_lambdas def _generate_dotnet_lambdas(**kwargs): lambdas_path = kwargs.get(LAMBDAS_PATH_PARAM) lambda_names = kwargs.get(LAMBDA_NAMES_PARAM, []) project_state = kwargs.get(PROJECT_STATE_PARAM) tags = kwargs.get(TAGS_PARAM) generated_lambdas = [] if not os.path.exists(lambdas_path): _mkdir(lambdas_path, exist_ok=True) for lambda_name in lambda_names: lambda_folder = os.path.join(lambdas_path, lambda_name) answer = _mkdir( path=lambda_folder, fault_message=f'\nLambda {lambda_name} already exists.\n' f'Override the Lambda function? [y/n]: ') if not answer: USER_LOG.info(CANCEL_MESSAGE.format(lambda_name)) continue for file in DOTNET_LAMBDA_FILES: _touch(Path(lambda_folder, file)) # fill Function.cs _write_content_to_file( os.path.join(lambda_folder, FILE_DOTNET_FUNCTION), DOTNET_LAMBDA_HANDLER_TEMPLATE) # fill Function.csproj _write_content_to_file(os.path.join( lambda_folder, FILE_DOTNET_FUNCTION_CONFIG), DOTNET_LAMBDA_CSPROJ_TEMPLATE) # fill deployment_resources.json role_def = _generate_lambda_role_config( LAMBDA_ROLE_NAME_PATTERN.format(lambda_name), tags) _write_content_to_file( os.path.join(lambda_folder, FILE_DEPLOYMENT_RESOURCES), role_def) # fill lambda_config.json lambda_def = _generate_dotnet_lambda_config( lambda_name, os.path.join(FOLDER_LAMBDAS, lambda_name), tags) _write_content_to_file(os.path.join(lambda_folder, FILE_LAMBDA_CONFIG), lambda_def) project_state.add_lambda(lambda_name=lambda_name, runtime=RUNTIME_DOTNET) _LOG.info(f'Lambda {lambda_name} created') generated_lambdas.append(lambda_name) return generated_lambdas def _generate_python_layer(**kwargs): layer_name = kwargs.get(LAYER_NAME_PARAM) layers_path = kwargs.get(LAYERS_PATH_PARAM) runtime = kwargs.get(RUNTIME_PARAM) layer_folder = os.path.join(layers_path, layer_name) answer = _mkdir( path=layer_folder, fault_message=f'\nLayer \'{layer_name}\' already exists.\n' f'Override? [y/n]: ') if not answer: USER_LOG.info(f'Creation of the layer \'{layer_name}\' skipped') return for file in PYTHON_LAYER_FILES: _touch(Path(layer_folder, file)) layer_config = _generate_python_node_layer_config(layer_name, runtime) _write_content_to_file(os.path.join(layer_folder, FILE_LAYER_CONFIG), layer_config) _write_content_to_file(os.path.join(layer_folder, FILE_REQUIREMENTS), REQUIREMENTS_FILE_CONTENT) _write_content_to_file(os.path.join(layer_folder, FILE_LOCAL_REQUIREMENTS), LOCAL_REQUIREMENTS_FILE_CONTENT) return layer_name def _generate_nodejs_layer(**kwargs): layer_name = kwargs.get(LAYER_NAME_PARAM) layers_path = kwargs.get(LAYERS_PATH_PARAM) runtime = kwargs.get(RUNTIME_PARAM) layer_folder = os.path.join(layers_path, layer_name) answer = _mkdir( path=layer_folder, fault_message=f'\nLayer \'{layer_name}\' already exists.\n' f'Override? [y/n]: ') if not answer: USER_LOG.info(f'Creation of the layer \'{layer_name}\' skipped') return for file in NODEJS_LAYER_FILES: _touch(Path(layer_folder, file)) layer_config = _generate_python_node_layer_config(layer_name, runtime) _write_content_to_file(os.path.join(layer_folder, FILE_LAYER_CONFIG), layer_config) _write_content_to_file(os.path.join(layer_folder, FILE_PACKAGE), _generate_node_layer_package_file(layer_name)) _write_content_to_file(os.path.join(layer_folder, FILE_PACKAGE_LOCK), _generate_node_layer_package_lock_file(layer_name)) return layer_name def _generate_dotnet_layer(**kwargs): layer_name = kwargs.get(LAYER_NAME_PARAM) layers_path = kwargs.get(LAYERS_PATH_PARAM) runtime = kwargs.get(RUNTIME_PARAM) layer_folder = os.path.join(layers_path, layer_name) answer = _mkdir( path=layer_folder, fault_message=f'\nLayer \'{layer_name}\' already exists.\n' f'Override? [y/n]: ') if not answer: USER_LOG.info(f'Creation of the layer \'{layer_name}\' skipped') return for file in DOTNET_LAYER_FILES: _touch(Path(layer_folder, file)) layer_config = _generate_python_node_layer_config(layer_name, runtime) _write_content_to_file(os.path.join(layer_folder, FILE_LAYER_CONFIG), layer_config) _write_content_to_file( os.path.join(layer_folder, FILE_DOTNET_LAYER_PACKAGES), DOTNET_LAMBDA_LAYER_CSPROJ_TEMPLATE) return layer_name def _link_layer_to_lambdas(lambda_names, layer_name, layer_runtime, existent_lambdas, lambda_path): for lambda_name in lambda_names: if lambda_name not in existent_lambdas: USER_LOG.warn(f'The layer \'{layer_name}\' can\'t be linked with ' f'lambda function \'{lambda_name}\' due to an ' f'absence the function in the project.') continue lambda_runtime = existent_lambdas[lambda_name][RUNTIME_PARAM] if lambda_runtime != layer_runtime: USER_LOG.warn(f'The layer \'{layer_name}\' with runtime ' f'\'{layer_runtime}\' can\'t be linked with lambda ' f'\'{lambda_name}\' with runtime ' f'\'{lambda_runtime}\'') continue config_file_path = Path(lambda_path, FOLDER_LAMBDAS, lambda_name, FILE_LAMBDA_CONFIG) if not os.path.isfile(config_file_path): USER_LOG.warn(f'The layer \'{layer_name}\' can\'t be linked with ' f'lambda function \'{lambda_name}\' due to an ' f'absence the function config file.') continue lambda_config = json.loads(_read_content_from_file(config_file_path)) layers = lambda_config.get('layers') if isinstance(layers, list): layers.append(layer_name) else: layers = [layer_name] lambda_config['layers'] = list(set(layers)) _write_content_to_file(config_file_path, json.dumps(lambda_config)) USER_LOG.info(f'The layer \'{layer_name}\' was linked with ' f'\'{lambda_name}\'') LAMBDAS_PROCESSORS = { RUNTIME_JAVA: _generate_java_lambdas, RUNTIME_NODEJS: _generate_nodejs_lambdas, RUNTIME_PYTHON: _generate_python_lambdas, RUNTIME_DOTNET: _generate_dotnet_lambdas } LAYERS_PROCESSORS = { RUNTIME_NODEJS: _generate_nodejs_layer, RUNTIME_PYTHON: _generate_python_layer, RUNTIME_DOTNET: _generate_dotnet_layer } def _common_java_module(src_path): pass def _common_nodejs_module(src_path): pass def _common_dotnet_module(src_path): pass def _common_python_module(src_path): common_module_path = os.path.join(src_path, FOLDER_COMMONS) _mkdir(path=common_module_path, exist_ok=True) init_path = os.path.join(common_module_path, '__init__.py') _touch(init_path) _write_content_to_file(file=init_path, content=INIT_CONTENT) abstract_lambda_path = os.path.join(common_module_path, 'abstract_lambda.py') _touch(path=abstract_lambda_path) _write_content_to_file(file=abstract_lambda_path, content=ABSTRACT_LAMBDA_CONTENT) logger_path = os.path.join(common_module_path, 'log_helper.py') _touch(path=logger_path) _write_content_to_file(file=logger_path, content=LOG_HELPER_CONTENT) exception_path = os.path.join(common_module_path, 'exception.py') _touch(path=exception_path) _write_content_to_file(file=exception_path, content=EXCEPTION_CONTENT) def resolve_lambda_path(project: Path, runtime: str, source: str) -> Path: _lambda = '' if runtime == RUNTIME_JAVA: _lambda = _generate_java_package_name(project.name).replace('.', '/') elif runtime in LAMBDAS_PROCESSORS: _lambda = FOLDER_LAMBDAS return project/Path(source, _lambda) def _common_python_nodejs_dotnet_layer_module(src_path): layer_path = os.path.join(src_path, FOLDER_LAMBDAS, FOLDER_LAYERS) _mkdir(path=layer_path, exist_ok=True) COMMON_MODULE_PROCESSORS = { RUNTIME_JAVA: _common_java_module, RUNTIME_NODEJS: _common_nodejs_module, RUNTIME_PYTHON: _common_python_module, RUNTIME_DOTNET: _common_dotnet_module, RUNTIME_PYTHON_LAYER: _common_python_nodejs_dotnet_layer_module, RUNTIME_NODEJS_LAYER: _common_python_nodejs_dotnet_layer_module, RUNTIME_DOTNET_LAYER: _common_python_nodejs_dotnet_layer_module } TESTS_MODULE_PROCESSORS = { RUNTIME_JAVA: lambda project_path, lambda_name: None, RUNTIME_NODEJS: lambda project_path, lambda_name: None, RUNTIME_DOTNET: lambda project_path, lambda_name: None, RUNTIME_PYTHON: _generate_python_tests, }