class Lambda_Package: def __init__(self,lambda_name): self.lambda_name = lambda_name self.aws_lambda = Lambda(self.lambda_name) self.s3_bucket = AWS_Config().lambda_s3_bucket() self.s3_key = f'{AWS_Config().lambda_s3_folder_lambdas()}/{self.lambda_name}.zip' self.role_arn = Temp_Aws_Roles().for_lambda_invocation__role_arn() self.tmp_folder = Files.temp_folder('tmp_lambda_') (self.aws_lambda.set_s3_bucket (self.s3_bucket ) .set_s3_key (self.s3_key ) .set_role (self.role_arn ) .set_folder_code (self.tmp_folder )) # helper methods @staticmethod def get_root_folder(): return Files.path_combine(__file__, '../..') # Lambda class wrappers def create(self ): return self.aws_lambda.create() def delete(self ): return self.aws_lambda.delete() def invoke(self, params=None): return self.aws_lambda.invoke(params) def update(self ): return self.aws_lambda.update() def reset (self ): return self.aws_lambda.update_lambda_code() # this will trigger a reset and force cold start on next execution # main methods def add_file(self, source): Files.copy(source, self.tmp_folder) def add_folder(self, source, ignore=None): destination = Files.path_combine(self.tmp_folder,Files.file_name(source)) if folder_not_exists(destination): folder_copy(source=source, destination=destination,ignore_pattern=ignore) self.remove_files('__pycache__') return self def add_module(self,module_name): module_path = importlib.import_module(module_name).__path__[0] # get folder of module self.add_folder(module_path) # add module's folder return self def add_modules(self, modules_names): for module_name in modules_names: self.add_module(module_name) return self def add_root_folder(self): self.add_folder(self.get_root_folder()) return self def add_osbot_aws(self): self.add_osbot_utils() self.add_module('osbot_aws') def add_osbot_browser(self): self.add_module('osbot_browser') def add_osbot_elastic(self): self.add_module('osbot_elastic') def add_osbot_utils(self): self.add_module('dotenv') self.add_module('osbot_utils') return self def arn(self): return self.aws_lambda.function_Arn() def get_files(self): all_files = [] for root, dirs, files in os.walk(self.tmp_folder): for file in files: file_path = Files.path_combine(root,file).replace(self.tmp_folder,'') all_files.append(file_path) return all_files def remove_files(self,pattern): for file in self.get_files(): if pattern in file: file_to_delete = Files.path_combine(self.tmp_folder,file[1:]) Files.delete(file_to_delete) def set_image_uri(self, image_uri): self.aws_lambda.image_uri = image_uri def use_lambda_file(self,lambda_file): file_path = Files.path_combine(self.get_root_folder(), lambda_file) if Files.exists(file_path) is False: return { 'status': 'error', 'data': 'could not find lambda file `{0}` in root folder `{1}`'.format(lambda_file, self.get_root_folder())} target_file = Files.path_combine(self.tmp_folder, '{0}.py'.format(self.lambda_name)) Files.copy(file_path,target_file) return { 'status': 'ok', 'file_path': file_path, 'target_file': target_file } def update_with_root_folder(self,delete_before=False): if delete_before: self.delete() self.add_root_folder() self.add_osbot_utils() self.update() return self def update_code(self): base_folder = self.lambda_name.split('.').pop(0) # will point to the top level module self.add_module(base_folder) # add module's folder self.add_root_folder() # add osbot-aws folder self.add_osbot_utils() # add osbot-utils folder self.update() # zip files up and update lambda return self
class Lambda_Package: def __init__(self, lambda_name): self.lambda_name = lambda_name self.aws_lambda = Lambda(self.lambda_name) self.s3_bucket = Globals.lambda_s3_bucket self.s3_key = f'{Globals.lambda_s3_key_prefix}/{self.lambda_name}.zip' self.role_arn = Temp_Aws_Roles().for_lambda_invocation() self.tmp_folder = Files.temp_folder('tmp_lambda_') (self.aws_lambda.set_s3_bucket(self.s3_bucket).set_s3_key( self.s3_key).set_role(self.role_arn).set_folder_code( self.tmp_folder)) # helper methods @staticmethod def get_root_folder(): return Files.path_combine(__file__, '../..') # Lambda class wrappers def create(self): return self.aws_lambda.create() def delete(self): return self.aws_lambda.delete() def invoke(self, params=None): return self.aws_lambda.invoke(params) def update(self): return self.aws_lambda.update() def reset(self): return self.aws_lambda.update_lambda_code() # main methods def add_file(self, source): Files.copy(source, self.tmp_folder) def add_folder(self, source): destination = Files.path_combine(self.tmp_folder, Files.file_name(source)) Temp_Files.folder_copy(source, destination) self.remove_files('__pycache__') return self def add_module(self, module_name): module_path = importlib.import_module(module_name).__path__[ 0] # get folder of module self.add_folder(module_path) # add module's folder return self def add_modules(self, modules_names): for module_name in modules_names: self.add_module(module_name) return self def add_root_folder(self): self.add_folder(self.get_root_folder()) return self def add_pbx_gs_python_utils(self): self.add_module( 'osbot_utils' ) # todo: when all dependencies on pbx_gs_python_utils have been removed lib_path = Files.folder_name( pbx_gs_python_utils.__file__ ) # refactor this to add_osbot_utils and remove pbx_gs_python_utils from codebase self.add_folder(lib_path) return self def arn(self): return self.aws_lambda.function_Arn() def get_files(self): all_files = [] for root, dirs, files in os.walk(self.tmp_folder): for file in files: file_path = Files.path_combine(root, file).replace( self.tmp_folder, '') all_files.append(file_path) return all_files def remove_files(self, pattern): for file in self.get_files(): if pattern in file: file_to_delete = Files.path_combine(self.tmp_folder, file[1:]) Files.delete(file_to_delete) def use_lambda_file(self, lambda_file): file_path = Files.path_combine(self.get_root_folder(), lambda_file) if Files.exists(file_path) is False: return { 'status': 'error', 'data': 'could not find lambda file `{0}` in root folder `{1}`'.format( lambda_file, self.get_root_folder()) } target_file = Files.path_combine(self.tmp_folder, '{0}.py'.format(self.lambda_name)) Files.copy(file_path, target_file) return { 'status': 'ok', 'file_path': file_path, 'target_file': target_file } def update_with_root_folder(self, delete_before=False): if delete_before: self.delete() self.add_root_folder() self.add_pbx_gs_python_utils() self.update() return self def update_code(self): base_folder = self.lambda_name.split('.').pop( 0) # will point to the top level module self.add_module(base_folder) # add module's folder self.add_root_folder() # add osbot-aws folder self.add_pbx_gs_python_utils() # add pbx-gs-python-utils folder self.update() # zip files up and update lambda return self