From 8329bf34dd64e22768353676e71ad05becc17940 Mon Sep 17 00:00:00 2001 From: Mike W <12434761+mw-root@users.noreply.github.com> Date: Tue, 24 Sep 2024 13:36:01 -0400 Subject: [PATCH] feat(event_source): add CodeDeploy Lifecycle Hook event (#5219) * feat: Add CodeDeploy Lifecycle Hook event definition * Add tests * Update aws_lambda_powertools/utilities/data_classes/code_deploy_lifecycle_hook_event.py Co-authored-by: Leandro Damascena Signed-off-by: Mike W <12434761+mw-root@users.noreply.github.com> * Update aws_lambda_powertools/utilities/data_classes/__init__.py Co-authored-by: Leandro Damascena Signed-off-by: Mike W <12434761+mw-root@users.noreply.github.com> * Update tests/unit/data_classes/required_dependencies/test_code_deploy_lifecycle_hook_event.py Co-authored-by: Leandro Damascena Signed-off-by: Mike W <12434761+mw-root@users.noreply.github.com> * Update tests/unit/data_classes/required_dependencies/test_code_deploy_lifecycle_hook_event.py Co-authored-by: Leandro Damascena Signed-off-by: Mike W <12434761+mw-root@users.noreply.github.com> * Update aws_lambda_powertools/utilities/data_classes/__init__.py Co-authored-by: Leandro Damascena Signed-off-by: Mike W <12434761+mw-root@users.noreply.github.com> * Add docs * Update docs/utilities/data_classes.md Co-authored-by: Leandro Damascena Signed-off-by: Mike W <12434761+mw-root@users.noreply.github.com> * Update docs/utilities/data_classes.md Co-authored-by: Leandro Damascena Signed-off-by: Mike W <12434761+mw-root@users.noreply.github.com> --------- Signed-off-by: Mike W <12434761+mw-root@users.noreply.github.com> Co-authored-by: Leandro Damascena --- .../utilities/data_classes/__init__.py | 4 +++ .../code_deploy_lifecycle_hook_event.py | 13 ++++++++++ docs/utilities/data_classes.md | 25 +++++++++++++++++++ .../events/codeDeployLifecycleHookEvent.json | 4 +++ .../test_code_deploy_lifecycle_hook_event.py | 20 +++++++++++++++ 5 files changed, 66 insertions(+) create mode 100644 aws_lambda_powertools/utilities/data_classes/code_deploy_lifecycle_hook_event.py create mode 100644 tests/events/codeDeployLifecycleHookEvent.json create mode 100644 tests/unit/data_classes/required_dependencies/test_code_deploy_lifecycle_hook_event.py diff --git a/aws_lambda_powertools/utilities/data_classes/__init__.py b/aws_lambda_powertools/utilities/data_classes/__init__.py index f68d8e607f8..9952fadb9ae 100644 --- a/aws_lambda_powertools/utilities/data_classes/__init__.py +++ b/aws_lambda_powertools/utilities/data_classes/__init__.py @@ -18,6 +18,9 @@ from .cloud_watch_custom_widget_event import CloudWatchDashboardCustomWidgetEvent from .cloud_watch_logs_event import CloudWatchLogsEvent from .cloudformation_custom_resource_event import CloudFormationCustomResourceEvent +from .code_deploy_lifecycle_hook_event import ( + CodeDeployLifecycleHookEvent, +) from .code_pipeline_job_event import CodePipelineJobEvent from .connect_contact_flow_event import ConnectContactFlowEvent from .dynamo_db_stream_event import DynamoDBStreamEvent @@ -59,6 +62,7 @@ "CloudWatchAlarmMetricStat", "CloudWatchDashboardCustomWidgetEvent", "CloudWatchLogsEvent", + "CodeDeployLifecycleHookEvent", "CodePipelineJobEvent", "ConnectContactFlowEvent", "DynamoDBStreamEvent", diff --git a/aws_lambda_powertools/utilities/data_classes/code_deploy_lifecycle_hook_event.py b/aws_lambda_powertools/utilities/data_classes/code_deploy_lifecycle_hook_event.py new file mode 100644 index 00000000000..a41634aa496 --- /dev/null +++ b/aws_lambda_powertools/utilities/data_classes/code_deploy_lifecycle_hook_event.py @@ -0,0 +1,13 @@ +from aws_lambda_powertools.utilities.data_classes.common import DictWrapper + + +class CodeDeployLifecycleHookEvent(DictWrapper): + @property + def deployment_id(self) -> str: + """The unique ID of the calling CodeDeploy Deployment.""" + return self["DeploymentId"] + + @property + def lifecycle_event_hook_execution_id(self) -> str: + """The unique ID of a deployments lifecycle hook.""" + return self["LifecycleEventHookExecutionId"] diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index 8935dc6e75e..1fffdc1ce07 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -90,6 +90,7 @@ Log Data Event for Troubleshooting | [CloudWatch Alarm State Change Action](#cloudwatch-alarm-state-change-action) | `CloudWatchAlarmEvent` | | [CloudWatch Dashboard Custom Widget](#cloudwatch-dashboard-custom-widget) | `CloudWatchDashboardCustomWidgetEvent` | | [CloudWatch Logs](#cloudwatch-logs) | `CloudWatchLogsEvent` | +| [CodeDeploy Lifecycle Hook](#codedeploy-lifecycle-hook) | `CodeDeployLifecycleHookEvent` | | [CodePipeline Job Event](#codepipeline-job) | `CodePipelineJobEvent` | | [Cognito User Pool](#cognito-user-pool) | Multiple available under `cognito_user_pool_event` | | [Connect Contact Flow](#connect-contact-flow) | `ConnectContactFlowEvent` | @@ -615,6 +616,30 @@ Alternatively, you can use `extract_cloudwatch_logs_from_record` to seamless int return processor.response() ``` +### CodeDeploy LifeCycle Hook + +CodeDeploy triggers Lambdas with this event when defined in +[AppSpec definitions](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html) +to test applications at different stages of deployment. + + +=== "app.py" + ```python + from aws_lambda_powertools import Logger + from aws_lambda_powertools.utilities.data_classes import ( + event_source, + CodeDeployLifecycleHookEvent, + ) + + logger = Logger() + + def lambda_handler( + event: CodeDeployLifecycleHookEvent, context: LambdaContext + ) -> None: + deployment_id = event.deployment_id + lifecycle_event_hook_execution_id = event.lifecycle_event_hook_execution_id + ``` + ### CodePipeline Job Data classes and utility functions to help create continuous delivery pipelines tasks with AWS Lambda diff --git a/tests/events/codeDeployLifecycleHookEvent.json b/tests/events/codeDeployLifecycleHookEvent.json new file mode 100644 index 00000000000..6e422a2d505 --- /dev/null +++ b/tests/events/codeDeployLifecycleHookEvent.json @@ -0,0 +1,4 @@ +{ + "DeploymentId": "d-ABCDEF", + "LifecycleEventHookExecutionId": "xxxxxxxxxxxxxxxxxxxxxxxx" +} diff --git a/tests/unit/data_classes/required_dependencies/test_code_deploy_lifecycle_hook_event.py b/tests/unit/data_classes/required_dependencies/test_code_deploy_lifecycle_hook_event.py new file mode 100644 index 00000000000..9d532a82a6f --- /dev/null +++ b/tests/unit/data_classes/required_dependencies/test_code_deploy_lifecycle_hook_event.py @@ -0,0 +1,20 @@ +import pytest + +from aws_lambda_powertools.utilities.data_classes import ( + CodeDeployLifecycleHookEvent, +) +from tests.functional.utils import load_event + + +@pytest.mark.parametrize( + "event_file", + [ + "codeDeployLifecycleHookEvent.json", + ], +) +def test_code_deploy_lifecycle_hook_event(event_file): + raw_event = load_event(event_file) + parsed_event = CodeDeployLifecycleHookEvent(raw_event) + + assert parsed_event.deployment_id == raw_event["DeploymentId"] + assert parsed_event.lifecycle_event_hook_execution_id == raw_event["LifecycleEventHookExecutionId"]