def __init__(self, bot_name= None, profile_name = None, account_id=None, region_name=None, lambda_s3_bucket=None, lambda_role_name=None): aws_config = AWS_Config() if bot_name : aws_config.set_bot_name (bot_name) if profile_name : aws_config.set_aws_session_profile_name(profile_name ) if account_id : aws_config.set_aws_session_account_id (account_id ) if region_name : aws_config.set_aws_session_region_name (region_name ) if lambda_s3_bucket : aws_config.set_lambda_s3_bucket (lambda_s3_bucket) if lambda_role_name : aws_config.set_lambda_role_name (lambda_role_name) self.bot_name = aws_config.bot_name() self.profile_name = aws_config.aws_session_profile_name() self.region_name = aws_config.aws_session_region_name() self.account_id = aws_config.aws_session_account_id() self.s3_bucket_lambdas = aws_config.lambda_s3_bucket() self.lambda_role_name = aws_config.lambda_role_name() self.lambda_role_arn = f"arn:aws:iam::{self.account_id}:role/{self.lambda_role_name}" self.s3 = S3()
class test_Deploy_Lambda(TestCase): lambda_name = None lambda_code = None code_folder = None @staticmethod def setup_test_environment__Deploy_Lambda( cls): # todo: refactor into separate class STS().check_current_session_credentials() cls.lambda_name = "osbot_test_deploy_lambda" cls.lambda_code = Temp_Folder_With_Lambda_File(cls.lambda_name) cls.code_folder = cls.lambda_code.folder lambda_file = cls.lambda_code.tmp_file module_folder = path_combine(cls.code_folder, "osbot_test_deploy_lambda") lambda_in_module = path_combine(module_folder, file_name(lambda_file)) folder_create(module_folder) file_copy(lambda_file, lambda_in_module) # todo add a file_move to OSBot_Utils file_delete(lambda_file) file_create(path_combine(module_folder, '__init__.py'), "") sys.path.append(cls.code_folder) cls.lambda_module = importlib.import_module( "osbot_test_deploy_lambda.osbot_test_deploy_lambda") cls.lambda_function = cls.lambda_module.run @staticmethod def teardown_test_environment__Deploy_Lambda(cls): sys.path.remove(cls.code_folder) pass @classmethod def setUpClass(cls) -> None: cls.setup_test_environment__Deploy_Lambda(cls) @classmethod def tearDownClass(cls): cls.teardown_test_environment__Deploy_Lambda(cls) def setUp(self) -> None: self.deploy = Deploy_Lambda(self.lambda_function) self.aws_config = AWS_Config() # Test_Helper().check_aws_token() pass def tearDown(self): self.deploy.delete() def test_check_aws_role(self): assert Temp_Aws_Roles().for_lambda_invocation_exists() def test_get_package(self): package = self.deploy.get_package() assert package.lambda_name == 'osbot_test_deploy_lambda.osbot_test_deploy_lambda' assert package.s3_bucket == self.aws_config.lambda_s3_bucket() assert package.s3_key == f'{self.aws_config.lambda_s3_folder_lambdas()}/{package.lambda_name}.zip' assert package.role_arn == f"arn:aws:iam::{self.aws_config.aws_session_account_id()}:role/temp_role_for_lambda_invocation" assert folder_exists(package.tmp_folder) def test_update(self): deploy = Deploy_Lambda(self.lambda_function) result = deploy.update() assert result['status'] == 'ok' assert result['name'] == self.deploy.lambda_name().replace('.', "_") assert result['data'][ 'FunctionArn'] == f'arn:aws:lambda:{self.aws_config.aws_session_region_name()}:{self.aws_config.aws_session_account_id()}:function:osbot_test_deploy_lambda_osbot_test_deploy_lambda' assert result['data'][ 'FunctionName'] == 'osbot_test_deploy_lambda_osbot_test_deploy_lambda' assert result['data'][ 'Handler'] == 'osbot_test_deploy_lambda.osbot_test_deploy_lambda.run' assert result['data']['MemorySize'] == 10240 assert result['data']['PackageType'] == 'Zip' assert deploy.invoke() == 'hello None' assert deploy.invoke({"name": "world"}) == "hello world" print(deploy.delete()) def test_invoke(self): self.deploy.update() assert self.deploy.invoke({"name": "world"}) == "hello world" #invoke directly aws_lambda = Lambda(name=self.deploy.lambda_name()) assert aws_lambda.invoke() == 'hello None' assert aws_lambda.invoke({'name': 'world'}) == 'hello world'
class test_Check_Lambda_Deploy_Permissions(TestCase): def setUp(self): self.aws_config = AWS_Config() self.lambda_ = Lambda() self.s3 = S3() self.sts = STS() self.expected_account_id = '785217600689' self.expected_region = 'eu-west-1' self.expected_s3_prefix = 'lambdas' self.expected_role_name = None self.expected_s3_bucket = f'{self.expected_account_id}-osbot-{self.expected_s3_prefix}' self.expected_module = 'osbot_aws.lambdas.dev.hello_world' self.function_name = 'osbot_aws_lambdas_dev_hello_world' self.lambda_handler = run def test_aws_config(self): assert self.aws_config.aws_session_account_id( ) == self.expected_account_id assert self.aws_config.aws_session_region_name( ) == self.expected_region assert self.aws_config.lambda_role_name() == self.expected_role_name assert self.aws_config.lambda_s3_folder_lambdas( ) == self.expected_s3_prefix assert self.aws_config.lambda_s3_bucket() == self.expected_s3_bucket def test_check_sts_credentials(self): assert self.sts.caller_identity_account() == '785217600689' assert self.sts.check_current_session_credentials() is True assert self.sts.current_region_name() == self.expected_region def test_s3_read_access(self): expected_file = 'lambdas/k8_live_servers.lambdas.screenshot.zip' buckets = self.s3.buckets() files_in_bucket = self.s3.find_files(self.expected_s3_bucket, self.expected_s3_prefix) assert len(buckets) > 0 assert self.expected_s3_bucket in buckets assert len(files_in_bucket) > 0 assert expected_file in files_in_bucket def test_s3_write_access(self): temp_contents = random_string(length=1024) temp_file_name = f"{random_string()}_temp_file.txt" bucket = self.expected_s3_bucket temp_s3_key = f'{self.expected_s3_prefix}/{temp_file_name}' assert self.s3.file_exists(bucket=bucket, key=temp_s3_key) is False self.s3.file_create_from_string(file_contents=temp_contents, bucket=bucket, key=temp_s3_key) assert self.s3.file_delete(bucket=bucket, key=temp_s3_key) is True assert self.s3.file_exists(bucket=bucket, key=temp_s3_key) is False def test_lambda_upload_file(self): deploy_lambda = Deploy_Lambda(self.lambda_handler) package = deploy_lambda.package aws_lambda = package.aws_lambda deploy_lambda.add_function_source_code() assert run.__module__ == self.expected_module assert run.__name__ == 'run' assert '/osbot_aws/lambdas/dev/hello_world.py' in package.get_files() assert len(files_list(aws_lambda.folder_code)) == len( package.get_files()) assert file_exists( path_combine(aws_lambda.folder_code, 'osbot_aws/lambdas/dev/hello_world.py')) assert aws_lambda.s3_bucket == f'{self.expected_account_id}-osbot-lambdas' assert aws_lambda.s3_key == f'lambdas/{self.expected_module}.zip' assert self.s3.file_exists(bucket=aws_lambda.s3_bucket, key=aws_lambda.s3_key) is True assert self.s3.file_delete(bucket=aws_lambda.s3_bucket, key=aws_lambda.s3_key) is True assert self.s3.file_exists(bucket=aws_lambda.s3_bucket, key=aws_lambda.s3_key) is False self.s3.folder_upload(folder=aws_lambda.folder_code, s3_bucket=aws_lambda.s3_bucket, s3_key=aws_lambda.s3_key) assert self.s3.file_exists(bucket=aws_lambda.s3_bucket, key=aws_lambda.s3_key) is True def test_lambda_create_manually(self): deploy_lambda = Deploy_Lambda(self.lambda_handler) aws_lambda = deploy_lambda.package.aws_lambda function_arn = f'arn:aws:lambda:{self.expected_region}:{self.expected_account_id}:function:{self.function_name}' aws_lambda.delete() assert aws_lambda.exists() is False result = aws_lambda.create() data = result.get('data') assert aws_lambda.exists() is True assert result.get('status') == 'ok' assert result.get('name') == self.function_name assert result.get('status') == 'ok' assert data.get('CodeSize') > 80000 assert data.get('FunctionArn') == function_arn assert data.get('Handler') == f'{self.expected_module}.run' assert data.get('LastUpdateStatus') == 'Successful' assert data.get('MemorySize') == 10240 assert data.get('PackageType') == 'Zip' assert aws_lambda.invoke() == 'From lambda code, hello None' assert aws_lambda.delete() assert aws_lambda.invoke() == { 'error': 'An error occurred (ResourceNotFoundException) when calling the ' 'Invoke operation: Function not found: ' f'{function_arn}' } def test_lambda_create_using_deploy(self): deploy_lambda = Deploy_Lambda(self.lambda_handler) aws_lambda = deploy_lambda.package.aws_lambda aws_lambda.delete() assert aws_lambda.exists() is False assert deploy_lambda.deploy() is True assert aws_lambda.exists() is True assert aws_lambda.invoke() == 'From lambda code, hello None' assert aws_lambda.delete() is True def test_user_privs(self): user_name = 'AlekhAnejaUpwork' access_key_id = 'AKIA3NUU5XSYZRQYXMP2' iam_user = IAM(user_name=user_name) assert iam_user.user_exists() assert list_set(iam_user.user_access_keys(index_by='AccessKeyId')) == [ access_key_id ] pprint(iam_user.user_polices())