From 7ae433d16ab4b0dc63294ef33b40a06a3a908db8 Mon Sep 17 00:00:00 2001 From: Mike Weeks Date: Mon, 23 Sep 2024 18:54:27 -0400 Subject: [PATCH 01/10] feat: Add CodeDeploy Lifecycle Hook event definition --- .../code_deploy_lifecycle_hook_event.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 aws_lambda_powertools/utilities/data_classes/code_deploy_lifecycle_hook_event.py 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..c4ea3aa52c3 --- /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 CodeDeployLifeCycleHookLambdaEvent(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"] From 9e1c8107f3c75e82a4250ff895764214205d7200 Mon Sep 17 00:00:00 2001 From: Mike Weeks Date: Tue, 24 Sep 2024 10:57:01 -0400 Subject: [PATCH 02/10] Add tests --- .../utilities/data_classes/__init__.py | 4 ++++ .../events/codeDeployLifecycleHookEvent.json | 4 ++++ .../test_code_deploy_lifecycle_hook_event.py | 20 +++++++++++++++++++ 3 files changed, 28 insertions(+) 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..3cf50b898c2 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 ( + CodeDeployLifeCycleHookLambdaEvent, +) 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", + "CodeDeployLifeCycleHookLambdaEvent", "CodePipelineJobEvent", "ConnectContactFlowEvent", "DynamoDBStreamEvent", 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..35d851b2671 --- /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 ( + CodeDeployLifeCycleHookLambdaEvent, +) +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 = CodeDeployLifeCycleHookLambdaEvent(raw_event) + + assert parsed_event.deployment_id == raw_event["DeploymentId"] + assert parsed_event.lifecycle_event_hook_execution_id == raw_event["LifecycleEventHookExecutionId"] From 04a52859303419a7b54008cfb5a1ae97cec4a3b2 Mon Sep 17 00:00:00 2001 From: Mike W <12434761+mw-root@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:40:30 -0400 Subject: [PATCH 03/10] 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> --- .../utilities/data_classes/code_deploy_lifecycle_hook_event.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index c4ea3aa52c3..a41634aa496 100644 --- 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 @@ -1,7 +1,7 @@ from aws_lambda_powertools.utilities.data_classes.common import DictWrapper -class CodeDeployLifeCycleHookLambdaEvent(DictWrapper): +class CodeDeployLifecycleHookEvent(DictWrapper): @property def deployment_id(self) -> str: """The unique ID of the calling CodeDeploy Deployment.""" From bf317fa73bb58af62fb1715fdb7f7f0f96daf0a5 Mon Sep 17 00:00:00 2001 From: Mike W <12434761+mw-root@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:40:42 -0400 Subject: [PATCH 04/10] 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> --- aws_lambda_powertools/utilities/data_classes/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/data_classes/__init__.py b/aws_lambda_powertools/utilities/data_classes/__init__.py index 3cf50b898c2..4ce2d4e0bde 100644 --- a/aws_lambda_powertools/utilities/data_classes/__init__.py +++ b/aws_lambda_powertools/utilities/data_classes/__init__.py @@ -62,7 +62,7 @@ "CloudWatchAlarmMetricStat", "CloudWatchDashboardCustomWidgetEvent", "CloudWatchLogsEvent", - "CodeDeployLifeCycleHookLambdaEvent", + "CodeDeployLifecycleHookEvent", "CodePipelineJobEvent", "ConnectContactFlowEvent", "DynamoDBStreamEvent", From 983146e2a45f5f0e8429a08a7240ea60114005bd Mon Sep 17 00:00:00 2001 From: Mike W <12434761+mw-root@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:40:47 -0400 Subject: [PATCH 05/10] 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> --- .../test_code_deploy_lifecycle_hook_event.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 35d851b2671..b712e57695c 100644 --- 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 @@ -14,7 +14,7 @@ ) def test_code_deploy_lifecycle_hook_event(event_file): raw_event = load_event(event_file) - parsed_event = CodeDeployLifeCycleHookLambdaEvent(raw_event) + parsed_event = CodeDeployLifecycleHookEvent(raw_event) assert parsed_event.deployment_id == raw_event["DeploymentId"] assert parsed_event.lifecycle_event_hook_execution_id == raw_event["LifecycleEventHookExecutionId"] From 38212207c603231e7dc5226d9057abf2ba5ac855 Mon Sep 17 00:00:00 2001 From: Mike W <12434761+mw-root@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:40:51 -0400 Subject: [PATCH 06/10] 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> --- .../test_code_deploy_lifecycle_hook_event.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index b712e57695c..9d532a82a6f 100644 --- 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 @@ -1,7 +1,7 @@ import pytest from aws_lambda_powertools.utilities.data_classes import ( - CodeDeployLifeCycleHookLambdaEvent, + CodeDeployLifecycleHookEvent, ) from tests.functional.utils import load_event From 573af296b1447dbbe05b41c904c0610fe45bc035 Mon Sep 17 00:00:00 2001 From: Mike W <12434761+mw-root@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:40:56 -0400 Subject: [PATCH 07/10] 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> --- aws_lambda_powertools/utilities/data_classes/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/data_classes/__init__.py b/aws_lambda_powertools/utilities/data_classes/__init__.py index 4ce2d4e0bde..9952fadb9ae 100644 --- a/aws_lambda_powertools/utilities/data_classes/__init__.py +++ b/aws_lambda_powertools/utilities/data_classes/__init__.py @@ -19,7 +19,7 @@ from .cloud_watch_logs_event import CloudWatchLogsEvent from .cloudformation_custom_resource_event import CloudFormationCustomResourceEvent from .code_deploy_lifecycle_hook_event import ( - CodeDeployLifeCycleHookLambdaEvent, + CodeDeployLifecycleHookEvent, ) from .code_pipeline_job_event import CodePipelineJobEvent from .connect_contact_flow_event import ConnectContactFlowEvent From 373aeb7ae06e0a97b48307aa244fbdbb8998dd86 Mon Sep 17 00:00:00 2001 From: Mike Weeks Date: Tue, 24 Sep 2024 13:10:45 -0400 Subject: [PATCH 08/10] Add docs --- docs/utilities/data_classes.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index 8935dc6e75e..afe93cd8513 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 From 7db1e213a45df9f45c237f500506bace6f318378 Mon Sep 17 00:00:00 2001 From: Mike W <12434761+mw-root@users.noreply.github.com> Date: Tue, 24 Sep 2024 13:19:27 -0400 Subject: [PATCH 09/10] Update docs/utilities/data_classes.md Co-authored-by: Leandro Damascena Signed-off-by: Mike W <12434761+mw-root@users.noreply.github.com> --- docs/utilities/data_classes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index afe93cd8513..7d7e765ef81 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -628,7 +628,7 @@ to test applications at different stages of deployment. from aws_lambda_powertools import Logger from aws_lambda_powertools.utilities.data_classes import ( event_source, - CodeDeployLifeCycleHookEvent, + CodeDeployLifecycleHookEvent, ) logger = Logger() From 1a56c94d2cbfc5dca1c0fb0505e29870ba9b9d5a Mon Sep 17 00:00:00 2001 From: Mike W <12434761+mw-root@users.noreply.github.com> Date: Tue, 24 Sep 2024 13:19:32 -0400 Subject: [PATCH 10/10] Update docs/utilities/data_classes.md Co-authored-by: Leandro Damascena Signed-off-by: Mike W <12434761+mw-root@users.noreply.github.com> --- docs/utilities/data_classes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/utilities/data_classes.md b/docs/utilities/data_classes.md index 7d7e765ef81..1fffdc1ce07 100644 --- a/docs/utilities/data_classes.md +++ b/docs/utilities/data_classes.md @@ -634,7 +634,7 @@ to test applications at different stages of deployment. logger = Logger() def lambda_handler( - event: CodeDeployLifeCycleHookEvent, context: LambdaContext + event: CodeDeployLifecycleHookEvent, context: LambdaContext ) -> None: deployment_id = event.deployment_id lifecycle_event_hook_execution_id = event.lifecycle_event_hook_execution_id