def test_smoke(self, lambda_client): resource_name = random_suffix_name("lambda-csc", 24) resources = get_bootstrap_resources() logging.debug(resources) replacements = REPLACEMENT_VALUES.copy() replacements["AWS_REGION"] = get_region() replacements["CODE_SIGNING_CONFIG_NAME"] = resource_name replacements["SIGNING_PROFILE_VERSION_ARN"] = resources.SigningProfileVersionArn # Load Lambda CR resource_data = load_lambda_resource( "code_signing_config", additional_replacements=replacements, ) logging.debug(resource_data) # Create k8s resource ref = k8s.CustomResourceReference( CRD_GROUP, CRD_VERSION, RESOURCE_PLURAL, resource_name, namespace="default", ) k8s.create_custom_resource(ref, resource_data) cr = k8s.wait_resource_consumed_by_controller(ref) assert cr is not None assert k8s.get_resource_exists(ref) codeSigningConfigARN = cr['status']['ackResourceMetadata']['arn'] time.sleep(CREATE_WAIT_AFTER_SECONDS) # Check Lambda code signing config exists exists = self.code_signing_config_exists(lambda_client, codeSigningConfigARN) assert exists # Update cr cr["spec"]["description"] = "new description" # Patch k8s resource k8s.patch_custom_resource(ref, cr) time.sleep(UPDATE_WAIT_AFTER_SECONDS) # Check code signing config description csc = self.get_code_signing_config(lambda_client, codeSigningConfigARN) assert csc is not None assert csc["Description"] == "new description" # Delete k8s resource _, deleted = k8s.delete_custom_resource(ref) assert deleted time.sleep(DELETE_WAIT_AFTER_SECONDS) # Check Lambda code signing config doesn't exist exists = self.code_signing_config_exists(lambda_client, codeSigningConfigARN) assert not exists
def test_smoke(self, lambda_client, lambda_function): (_, function_resource) = lambda_function lambda_function_name = function_resource["spec"]["name"] resource_name = random_suffix_name("lambda-alias", 24) replacements = REPLACEMENT_VALUES.copy() replacements["AWS_REGION"] = get_region() replacements["ALIAS_NAME"] = resource_name replacements["FUNCTION_NAME"] = lambda_function_name replacements["FUNCTION_VERSION"] = "$LATEST" # Load alias CR resource_data = load_lambda_resource( "alias", additional_replacements=replacements, ) logging.debug(resource_data) # Create k8s resource ref = k8s.CustomResourceReference( CRD_GROUP, CRD_VERSION, RESOURCE_PLURAL, resource_name, namespace="default", ) k8s.create_custom_resource(ref, resource_data) cr = k8s.wait_resource_consumed_by_controller(ref) assert cr is not None assert k8s.get_resource_exists(ref) time.sleep(CREATE_WAIT_AFTER_SECONDS) # Check alias exists alias = self.alias_exist(lambda_client, resource_name, lambda_function_name) assert alias is not None # Update cr cr["spec"]["description"] = "" # Patch k8s resource k8s.patch_custom_resource(ref, cr) time.sleep(UPDATE_WAIT_AFTER_SECONDS) # Check alias description alias = self.get_alias(lambda_client, resource_name, lambda_function_name) assert alias is not None assert alias["Description"] == "" # Delete k8s resource _, deleted = k8s.delete_custom_resource(ref) assert deleted time.sleep(DELETE_WAIT_AFTER_SECONDS) # Check alias doesn't exist exists = self.get_alias(lambda_client, resource_name, lambda_function_name) assert not exists
def lambda_function(): resource_name = random_suffix_name("lambda-function", 24) resources = get_bootstrap_resources() replacements = REPLACEMENT_VALUES.copy() replacements["FUNCTION_NAME"] = resource_name replacements["BUCKET_NAME"] = resources.FunctionsBucketName replacements["LAMBDA_ROLE"] = resources.LambdaESMRoleARN replacements["LAMBDA_FILE_NAME"] = resources.LambdaFunctionFileZip replacements["RESERVED_CONCURRENT_EXECUTIONS"] = "0" replacements["CODE_SIGNING_CONFIG_ARN"] = "" replacements["AWS_REGION"] = get_region() # Load function CR resource_data = load_lambda_resource( "function", additional_replacements=replacements, ) logging.debug(resource_data) # Create k8s resource function_reference = k8s.CustomResourceReference( CRD_GROUP, CRD_VERSION, "functions", resource_name, namespace="default", ) # Create lambda function k8s.create_custom_resource(function_reference, resource_data) function_resource = k8s.wait_resource_consumed_by_controller( function_reference) assert function_resource is not None assert k8s.get_resource_exists(function_reference) time.sleep(CREATE_WAIT_AFTER_SECONDS) yield (function_reference, function_resource) _, deleted = k8s.delete_custom_resource(function_reference) assert deleted
def code_signing_config(): resource_name = random_suffix_name("lambda-csc", 24) resources = get_bootstrap_resources() logging.debug(resources) replacements = REPLACEMENT_VALUES.copy() replacements["AWS_REGION"] = get_region() replacements["CODE_SIGNING_CONFIG_NAME"] = resource_name replacements[ "SIGNING_PROFILE_VERSION_ARN"] = resources.SigningProfileVersionArn # Load Lambda CR resource_data = load_lambda_resource( "code_signing_config", additional_replacements=replacements, ) logging.debug(resource_data) # Create k8s resource ref = k8s.CustomResourceReference( CRD_GROUP, CRD_VERSION, "codesigningconfigs", resource_name, namespace="default", ) k8s.create_custom_resource(ref, resource_data) cr = k8s.wait_resource_consumed_by_controller(ref) assert cr is not None assert k8s.get_resource_exists(ref) time.sleep(CREATE_WAIT_AFTER_SECONDS) yield (ref, cr) _, deleted = k8s.delete_custom_resource(ref) assert deleted
def test_smoke_dynamodb_table_stream(self, lambda_client, lambda_function): (_, function_resource) = lambda_function lambda_function_name = function_resource["spec"]["name"] resource_name = random_suffix_name("lambda-esm", 24) resources = get_bootstrap_resources() replacements = REPLACEMENT_VALUES.copy() replacements["AWS_REGION"] = get_region() replacements["EVENT_SOURCE_MAPPING_NAME"] = resource_name replacements["BATCH_SIZE"] = "10" replacements["FUNCTION_NAME"] = lambda_function_name replacements["EVENT_SOURCE_ARN"] = resources.DynamoDBTableARN replacements["STARTING_POSITION"] = "LATEST" replacements["MAXIMUM_RETRY_ATTEMPTS"] = "-1" # Load ESM CR resource_data = load_lambda_resource( "event_source_mapping_dynamodb", additional_replacements=replacements, ) logging.debug(resource_data) # Create k8s resource ref = k8s.CustomResourceReference( CRD_GROUP, CRD_VERSION, RESOURCE_PLURAL, resource_name, namespace="default", ) k8s.create_custom_resource(ref, resource_data) cr = k8s.wait_resource_consumed_by_controller(ref) assert cr is not None assert k8s.get_resource_exists(ref) time.sleep(CREATE_WAIT_AFTER_SECONDS) esm_uuid = cr['status']['uuid'] # Check ESM exists exists = self.event_source_mapping_exists(lambda_client, esm_uuid) assert exists # Update cr cr["spec"]["maximumRetryAttempts"] = 3 cr["spec"]["destinationConfig"] = { 'onFailure': { 'destination': resources.SQSQueueARN, } } # Patch k8s resource k8s.patch_custom_resource(ref, cr) time.sleep(UPDATE_WAIT_AFTER_SECONDS) # Check ESM maximum retry attempts esm = self.get_event_source_mapping(lambda_client, esm_uuid) assert esm is not None logging.info(esm) assert esm["MaximumRetryAttempts"] == 3 # Delete k8s resource _, deleted = k8s.delete_custom_resource(ref) assert deleted time.sleep(DELETE_WAIT_AFTER_SECONDS) # Check ESM doesn't exist exists = self.event_source_mapping_exists(lambda_client, esm_uuid) assert not exists
def test_smoke_sqs_queue_stream(self, lambda_client, lambda_function): (_, function_resource) = lambda_function lambda_function_name = function_resource["spec"]["name"] resource_name = random_suffix_name("lambda-esm", 24) resources = get_bootstrap_resources() replacements = REPLACEMENT_VALUES.copy() replacements["AWS_REGION"] = get_region() replacements["EVENT_SOURCE_MAPPING_NAME"] = resource_name replacements["BATCH_SIZE"] = "10" replacements["FUNCTION_NAME"] = lambda_function_name replacements["EVENT_SOURCE_ARN"] = resources.SQSQueueARN replacements["MAXIMUM_BATCHING_WINDOW_IN_SECONDS"] = "1" # Load ESM CR resource_data = load_lambda_resource( "event_source_mapping_sqs", additional_replacements=replacements, ) logging.debug(resource_data) # Create k8s resource ref = k8s.CustomResourceReference( CRD_GROUP, CRD_VERSION, RESOURCE_PLURAL, resource_name, namespace="default", ) k8s.create_custom_resource(ref, resource_data) cr = k8s.wait_resource_consumed_by_controller(ref) assert cr is not None assert k8s.get_resource_exists(ref) time.sleep(CREATE_WAIT_AFTER_SECONDS) esm_uuid = cr['status']['uuid'] # Check ESM exists exists = self.event_source_mapping_exists(lambda_client, esm_uuid) assert exists # Update cr cr["spec"]["batchSize"] = 20 # Patch k8s resource k8s.patch_custom_resource(ref, cr) time.sleep(UPDATE_WAIT_AFTER_SECONDS) # Check ESM batch size esm = self.get_event_source_mapping(lambda_client, esm_uuid) assert esm is not None assert esm["BatchSize"] == 20 # Delete k8s resource _, deleted = k8s.delete_custom_resource(ref) assert deleted time.sleep(DELETE_WAIT_AFTER_SECONDS) # Check ESM doesn't exist exists = self.event_source_mapping_exists(lambda_client, esm_uuid) assert not exists
def test_function_code_signing_config(self, lambda_client, code_signing_config): (_, csc_resource) = code_signing_config code_signing_config_arn = csc_resource["status"][ "ackResourceMetadata"]["arn"] resource_name = random_suffix_name("lambda-function", 24) resources = get_bootstrap_resources() replacements = REPLACEMENT_VALUES.copy() replacements["FUNCTION_NAME"] = resource_name replacements["BUCKET_NAME"] = resources.FunctionsBucketName replacements["LAMBDA_ROLE"] = resources.LambdaBasicRoleARN replacements["LAMBDA_FILE_NAME"] = resources.LambdaFunctionFileZip replacements["RESERVED_CONCURRENT_EXECUTIONS"] = "2" replacements["CODE_SIGNING_CONFIG_ARN"] = code_signing_config_arn replacements["AWS_REGION"] = get_region() # Load Lambda CR resource_data = load_lambda_resource( "function", additional_replacements=replacements, ) logging.debug(resource_data) # Create k8s resource ref = k8s.CustomResourceReference( CRD_GROUP, CRD_VERSION, RESOURCE_PLURAL, resource_name, namespace="default", ) k8s.create_custom_resource(ref, resource_data) cr = k8s.wait_resource_consumed_by_controller(ref) assert cr is not None assert k8s.get_resource_exists(ref) time.sleep(CREATE_WAIT_AFTER_SECONDS) cr = k8s.wait_resource_consumed_by_controller(ref) # Check Lambda function exists exists = self.function_exists(lambda_client, resource_name) assert exists # Check function code signing config is correct function_csc_arn = self.get_function_code_signing_config( lambda_client, resource_name) assert function_csc_arn == code_signing_config_arn # Delete function code signing config cr["spec"]["codeSigningConfigARN"] = "" k8s.patch_custom_resource(ref, cr) time.sleep(UPDATE_WAIT_AFTER_SECONDS) function_csc_arn = self.get_function_code_signing_config( lambda_client, resource_name) assert function_csc_arn is None # Delete k8s resource _, deleted = k8s.delete_custom_resource(ref) assert deleted is True time.sleep(DELETE_WAIT_AFTER_SECONDS) # Check Lambda function doesn't exist exists = self.function_exists(lambda_client, resource_name) assert not exists
def test_reserved_concurrent_executions(self, lambda_client): resource_name = random_suffix_name("lambda-function", 24) resources = get_bootstrap_resources() logging.debug(resources) replacements = REPLACEMENT_VALUES.copy() replacements["FUNCTION_NAME"] = resource_name replacements["BUCKET_NAME"] = resources.FunctionsBucketName replacements["LAMBDA_ROLE"] = resources.LambdaBasicRoleARN replacements["LAMBDA_FILE_NAME"] = resources.LambdaFunctionFileZip replacements["RESERVED_CONCURRENT_EXECUTIONS"] = "2" replacements["CODE_SIGNING_CONFIG_ARN"] = "" replacements["AWS_REGION"] = get_region() # Load Lambda CR resource_data = load_lambda_resource( "function", additional_replacements=replacements, ) logging.debug(resource_data) # Create k8s resource ref = k8s.CustomResourceReference( CRD_GROUP, CRD_VERSION, RESOURCE_PLURAL, resource_name, namespace="default", ) k8s.create_custom_resource(ref, resource_data) cr = k8s.wait_resource_consumed_by_controller(ref) assert cr is not None assert k8s.get_resource_exists(ref) time.sleep(CREATE_WAIT_AFTER_SECONDS) cr = k8s.wait_resource_consumed_by_controller(ref) # Check Lambda function exists exists = self.function_exists(lambda_client, resource_name) assert exists reservedConcurrentExecutions = self.get_function_concurrency( lambda_client, resource_name) assert reservedConcurrentExecutions == 2 # Update cr cr["spec"]["reservedConcurrentExecutions"] = 0 # Patch k8s resource k8s.patch_custom_resource(ref, cr) time.sleep(UPDATE_WAIT_AFTER_SECONDS) # Check function updated fields reservedConcurrentExecutions = self.get_function_concurrency( lambda_client, resource_name) assert reservedConcurrentExecutions == 0 # Delete k8s resource _, deleted = k8s.delete_custom_resource(ref) assert deleted is True time.sleep(DELETE_WAIT_AFTER_SECONDS) # Check Lambda function doesn't exist exists = self.function_exists(lambda_client, resource_name) assert not exists