From 44f085599a4d77a5746d74ebd1b707c2f0e2b509 Mon Sep 17 00:00:00 2001 From: Bas van Driel Date: Tue, 21 Jan 2025 11:45:30 +0100 Subject: [PATCH 01/28] Add IoT crud event --- .../parser/models/iot_core_crud_event.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py diff --git a/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py b/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py new file mode 100644 index 00000000000..a2b306ae206 --- /dev/null +++ b/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py @@ -0,0 +1,29 @@ +import enum +from typing import Any, Optional + +from pydantic import BaseModel + + +class AWSIoTCRUDEventOperation(str, enum.Enum): + CREATED = "CREATED" + UPDATED = "UPDATED" + DELETED = "DELETED" + + +class AWSIoTCRUDEvent(BaseModel): + """The "Thing: created, updated, deleted" eventt""" + + eventType: str + eventId: str + timestamp: int + + operation: AWSIoTCRUDEventOperation + + thingId: str + + thingName: str + versionNumber: int + thingTypeName: Optional[str] + billinGroupName: Optional[str] + + attributes: dict[str, Any] From 48d6da8929a1fe95170dc950970cf66e4cf3f211 Mon Sep 17 00:00:00 2001 From: Bas van Driel Date: Tue, 21 Jan 2025 11:58:39 +0100 Subject: [PATCH 02/28] Fix typo --- .../utilities/parser/models/iot_core_crud_event.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py b/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py index a2b306ae206..b6472e3e19d 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py @@ -4,20 +4,20 @@ from pydantic import BaseModel -class AWSIoTCRUDEventOperation(str, enum.Enum): +class IoTCRUDEventOperation(str, enum.Enum): CREATED = "CREATED" UPDATED = "UPDATED" DELETED = "DELETED" -class AWSIoTCRUDEvent(BaseModel): - """The "Thing: created, updated, deleted" eventt""" +class IoTCRUDEvent(BaseModel): + """The "Thing: created, updated, deleted" event""" eventType: str eventId: str timestamp: int - operation: AWSIoTCRUDEventOperation + operation: IoTCRUDEventOperation thingId: str From dce4fa75890b361cbb00b126fba18331ba97687e Mon Sep 17 00:00:00 2001 From: Bas van Driel Date: Wed, 22 Jan 2025 09:23:11 +0100 Subject: [PATCH 03/28] work --- .../utilities/parser/models/iot_core_crud_event.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py b/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py index b6472e3e19d..b7bd6a144f4 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py @@ -1,5 +1,5 @@ import enum -from typing import Any, Optional +from typing import Any, Dict, Optional from pydantic import BaseModel @@ -26,4 +26,4 @@ class IoTCRUDEvent(BaseModel): thingTypeName: Optional[str] billinGroupName: Optional[str] - attributes: dict[str, Any] + attributes: Dict[str, Any] From 984aef5c8d59b4f3d3810aa7d0ab81687dd6e577 Mon Sep 17 00:00:00 2001 From: Bas van Driel Date: Thu, 13 Feb 2025 09:05:23 +0100 Subject: [PATCH 04/28] Added all registry events --- .../parser/models/iot_core_crud_event.py | 29 ----- .../parser/models/iot_registry_events.py | 110 ++++++++++++++++++ 2 files changed, 110 insertions(+), 29 deletions(-) delete mode 100644 aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py create mode 100644 aws_lambda_powertools/utilities/parser/models/iot_registry_events.py diff --git a/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py b/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py deleted file mode 100644 index b7bd6a144f4..00000000000 --- a/aws_lambda_powertools/utilities/parser/models/iot_core_crud_event.py +++ /dev/null @@ -1,29 +0,0 @@ -import enum -from typing import Any, Dict, Optional - -from pydantic import BaseModel - - -class IoTCRUDEventOperation(str, enum.Enum): - CREATED = "CREATED" - UPDATED = "UPDATED" - DELETED = "DELETED" - - -class IoTCRUDEvent(BaseModel): - """The "Thing: created, updated, deleted" event""" - - eventType: str - eventId: str - timestamp: int - - operation: IoTCRUDEventOperation - - thingId: str - - thingName: str - versionNumber: int - thingTypeName: Optional[str] - billinGroupName: Optional[str] - - attributes: Dict[str, Any] diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py new file mode 100644 index 00000000000..5cf3df81e16 --- /dev/null +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -0,0 +1,110 @@ +import enum +from typing import Any, Dict, List, Optional + +from pydantic import BaseModel + + +class IOTCoreRegistryEventBase(BaseModel): + eventType: str + eventId: str + timestamp: int + + +class IoTCRUDEventOperation(str, enum.Enum): + CREATED = "CREATED" + UPDATED = "UPDATED" + DELETED = "DELETED" + + +class AddRemoveOperation(str, enum.Enum): + ADDED = "ADDED" + REMOVED = "REMOVED" + + +class IoTCRUDEvent(IOTCoreRegistryEventBase): + """The "Thing: created, updated, deleted" event""" + + operation: IoTCRUDEventOperation + + thingId: str + thingName: str + versionNumber: int + thingTypeName: Optional[str] + billingGroupName: Optional[str] + + attributes: Dict[str, Any] + + +class IoTThingTypeCRUDEvent(IOTCoreRegistryEventBase): + operation: IoTCRUDEventOperation + accountId: str + thingTypeId: str + thingTypeName: str + isDeprecated: bool + deprecationDate: Optional[str] + searchableAttributes: List[str] + propagatingAttributes: Dict[str, str] + description: str + + +class IoTThingTypeAssociationEvent(IOTCoreRegistryEventBase): + """ + Thing Type Associated or Disassociated with a Thing + """ + + operation: AddRemoveOperation + thingId: str + thingName: str + thingTypeName: str + + +class RootToParentThingGroup(BaseModel): + groupArn: str + groupId: str + + +class IoTThingGroupCRUDEvent(IOTCoreRegistryEventBase): + """ + Thing Group Created/Updated/Deleted + """ + + operation: IoTCRUDEventOperation + accountId: str + thingGroupId: str + thingGroupName: str + versionNumber: int + parentGroupName: Optional[str] + parentGroupId: Optional[str] + description: str + rootToParentThingGroups: List[RootToParentThingGroup] + + attributes: Dict[str, Any] + + dynamicGroupMappingId: Optional[str] + + +class IoTThingAddedToOrRemoveFromThingGroupEvent(IOTCoreRegistryEventBase): + """ + Thing Added to or Removed from a Thing Group + """ + + operation: AddRemoveOperation + accountId: str + groupArn: str + groupId: str + thingArn: str + thingId: str + membershipId: str + + +class IoTThingGroupAddedToOrDeletedFromThingGroupEvent(IOTCoreRegistryEventBase): + """ + Thing Group Added to or Deleted from a Thing Group + """ + + operation: AddRemoveOperation + accountId: str + thingGroupId: str + thingGroupName: str + childGroupId: str + childGroupName: str From d52862447082aaa5152024699f50d4d63e0e3eba Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:23:33 +0100 Subject: [PATCH 05/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index 5cf3df81e16..ccff37974bc 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -21,7 +21,7 @@ class AddRemoveOperation(str, enum.Enum): REMOVED = "REMOVED" -class IoTCRUDEvent(IOTCoreRegistryEventBase): +class IoTCoreThingEvent(IoTCoreRegistryEventsBase): """The "Thing: created, updated, deleted" event""" operation: IoTCRUDEventOperation From 5ab83ffac0fce525003406f255ab908b2ddce07d Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:23:43 +0100 Subject: [PATCH 06/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index ccff37974bc..8600c83ee27 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -4,7 +4,7 @@ from pydantic import BaseModel -class IOTCoreRegistryEventBase(BaseModel): +class IoTCoreRegistryEventsBase(BaseModel): eventType: str eventId: str timestamp: int From 28a0d838a4a619df3b050dff8f2dca4a9308af33 Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:24:07 +0100 Subject: [PATCH 07/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index 8600c83ee27..566793b6b10 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -35,7 +35,7 @@ class IoTCoreThingEvent(IoTCoreRegistryEventsBase): attributes: Dict[str, Any] -class IoTThingTypeCRUDEvent(IOTCoreRegistryEventBase): +class IoTCoreThingTypeEvent(IoTCoreRegistryEventsBase): operation: IoTCRUDEventOperation accountId: str thingTypeId: str From 49536f956fcdea231f5cea119e4122ab90019c2a Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:24:15 +0100 Subject: [PATCH 08/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index 566793b6b10..38864a9febd 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -47,7 +47,7 @@ class IoTCoreThingTypeEvent(IoTCoreRegistryEventsBase): description: str -class IoTThingTypeAssociationEvent(IOTCoreRegistryEventBase): +class IoTCoreThingTypeAssociationEvent(IoTCoreRegistryEventsBase): """ Thing Type Associated or Disassociated with a Thing """ From a25225492d9bb8cf35e97de281708ef4278e141b Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:24:22 +0100 Subject: [PATCH 09/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index 38864a9febd..2892a9029d5 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -63,7 +63,7 @@ class RootToParentThingGroup(BaseModel): groupId: str -class IoTThingGroupCRUDEvent(IOTCoreRegistryEventBase): +class IoTCoreThingGroupEvent(IoTCoreRegistryEventsBase): """ Thing Group Created/Updated/Deleted """ From 06456ebac0262b23d61a5ce697b686e46e8877c0 Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:24:30 +0100 Subject: [PATCH 10/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index 2892a9029d5..b5cbb5b10fb 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -52,7 +52,7 @@ class IoTCoreThingTypeAssociationEvent(IoTCoreRegistryEventsBase): Thing Type Associated or Disassociated with a Thing """ - operation: AddRemoveOperation + operation: EVENT_ADD_REMOVE_OPERATION thingId: str thingName: str thingTypeName: str From 9753bbf53c3e51107864c8ca12242447751ea34d Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:24:38 +0100 Subject: [PATCH 11/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index b5cbb5b10fb..c54356e0774 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -102,7 +102,7 @@ class IoTThingGroupAddedToOrDeletedFromThingGroupEvent(IOTCoreRegistryEventBase) Thing Group Added to or Deleted from a Thing Group """ - operation: AddRemoveOperation + operation: EVENT_ADD_REMOVE_OPERATION accountId: str thingGroupId: str thingGroupName: str From c5a2e6fcc7aa59e724420ecce698af04846da0d5 Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:24:46 +0100 Subject: [PATCH 12/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index c54356e0774..ee00f07144b 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -68,7 +68,7 @@ class IoTCoreThingGroupEvent(IoTCoreRegistryEventsBase): Thing Group Created/Updated/Deleted """ - operation: IoTCRUDEventOperation + operation: EVENT_CRUD_OPERATION accountId: str thingGroupId: str thingGroupName: str From 86f1d91f831a33b504d929a11c5f8e490efd7470 Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:24:53 +0100 Subject: [PATCH 13/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index ee00f07144b..210782f7eea 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -88,7 +88,7 @@ class IoTThingAddedToOrRemoveFromThingGroupEvent(IOTCoreRegistryEventBase): Thing Added to or Removed from a Thing Group """ - operation: AddRemoveOperation + operation: EVENT_ADD_REMOVE_OPERATION accountId: str groupArn: str groupId: str From 8788bffb888e2f3a02740b478f7a469b0dda4685 Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:25:10 +0100 Subject: [PATCH 14/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index 210782f7eea..091e34c004c 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -27,6 +27,7 @@ class IoTCoreThingEvent(IoTCoreRegistryEventsBase): operation: IoTCRUDEventOperation thingId: str + accountId: str thingName: str versionNumber: int thingTypeName: Optional[str] From 74d9dbfe1a55308e91790e768d0377d02d9c7527 Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:26:06 +0100 Subject: [PATCH 15/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index 091e34c004c..cad1ae36578 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -84,7 +84,7 @@ class IoTCoreThingGroupEvent(IoTCoreRegistryEventsBase): dynamicGroupMappingId: Optional[str] -class IoTThingAddedToOrRemoveFromThingGroupEvent(IOTCoreRegistryEventBase): +class IoTCoreAddOrRemoveFromThingGroupEvent(IoTCoreRegistryEventsBase): """ Thing Added to or Removed from a Thing Group """ From f03655db46853f789fbe3befc0e51edd3c02a416 Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:26:22 +0100 Subject: [PATCH 16/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index cad1ae36578..e788cc35bc8 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -98,7 +98,7 @@ class IoTCoreAddOrRemoveFromThingGroupEvent(IoTCoreRegistryEventsBase): membershipId: str -class IoTThingGroupAddedToOrDeletedFromThingGroupEvent(IOTCoreRegistryEventBase): +class IoTCoreAddOrDeleteFromThingGroupEvent(IoTCoreRegistryEventsBase): """ Thing Group Added to or Deleted from a Thing Group """ From b66e5d8aa43721009b4dca84cea6c653105217fe Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:26:37 +0100 Subject: [PATCH 17/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index e788cc35bc8..460ea068a0f 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -24,7 +24,7 @@ class AddRemoveOperation(str, enum.Enum): class IoTCoreThingEvent(IoTCoreRegistryEventsBase): """The "Thing: created, updated, deleted" event""" - operation: IoTCRUDEventOperation + operation: EVENT_CRUD_OPERATION thingId: str accountId: str From 074d64f51a1d1f7a156cf9ab225abd912a1e58bf Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:26:50 +0100 Subject: [PATCH 18/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index 460ea068a0f..6b5ce1cb8d0 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -10,15 +10,8 @@ class IoTCoreRegistryEventsBase(BaseModel): timestamp: int -class IoTCRUDEventOperation(str, enum.Enum): - CREATED = "CREATED" - UPDATED = "UPDATED" - DELETED = "DELETED" - - -class AddRemoveOperation(str, enum.Enum): - ADDED = "ADDED" - REMOVED = "REMOVED" +EVENT_CRUD_OPERATION = Literal["CREATED", "UPDATED", "DELETED"] +EVENT_ADD_REMOVE_OPERATION = Literal["ADDED", "REMOVED"] class IoTCoreThingEvent(IoTCoreRegistryEventsBase): From 9b323c9c13c089da007d25a36f64d401f3500cab Mon Sep 17 00:00:00 2001 From: Bas Date: Thu, 13 Feb 2025 14:27:00 +0100 Subject: [PATCH 19/28] Update aws_lambda_powertools/utilities/parser/models/iot_registry_events.py Co-authored-by: Leandro Damascena Signed-off-by: Bas --- .../utilities/parser/models/iot_registry_events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index 6b5ce1cb8d0..00072fd9b7a 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -30,7 +30,7 @@ class IoTCoreThingEvent(IoTCoreRegistryEventsBase): class IoTCoreThingTypeEvent(IoTCoreRegistryEventsBase): - operation: IoTCRUDEventOperation + operation: EVENT_CRUD_OPERATION accountId: str thingTypeId: str thingTypeName: str From c7602ef90037e295a05187d97a9e24c3d02db8f1 Mon Sep 17 00:00:00 2001 From: Bas van Driel Date: Thu, 13 Feb 2025 14:29:39 +0100 Subject: [PATCH 20/28] work --- .../utilities/parser/models/iot_registry_events.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index 00072fd9b7a..0f4664b5e97 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -1,5 +1,4 @@ -import enum -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List, Literal, Optional from pydantic import BaseModel From 674f973f498f915efbee02ba3e3492b41171e581 Mon Sep 17 00:00:00 2001 From: Bas van Driel Date: Thu, 13 Feb 2025 15:01:27 +0100 Subject: [PATCH 21/28] add tests --- .../parser/models/iot_registry_events.py | 4 +- tests/unit/parser/_pydantic/test_iot.py | 137 ++++++++++++++++++ 2 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 tests/unit/parser/_pydantic/test_iot.py diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index 0f4664b5e97..cfeb4bda7bc 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -23,8 +23,6 @@ class IoTCoreThingEvent(IoTCoreRegistryEventsBase): thingName: str versionNumber: int thingTypeName: Optional[str] - billingGroupName: Optional[str] - attributes: Dict[str, Any] @@ -36,7 +34,7 @@ class IoTCoreThingTypeEvent(IoTCoreRegistryEventsBase): isDeprecated: bool deprecationDate: Optional[str] searchableAttributes: List[str] - propagatingAttributes: Dict[str, str] + propagatingAttributes: List[Dict[str, str]] description: str diff --git a/tests/unit/parser/_pydantic/test_iot.py b/tests/unit/parser/_pydantic/test_iot.py new file mode 100644 index 00000000000..18ca3b9966c --- /dev/null +++ b/tests/unit/parser/_pydantic/test_iot.py @@ -0,0 +1,137 @@ +from aws_lambda_powertools.utilities.parser import parse +from aws_lambda_powertools.utilities.parser.models.iot_registry_events import ( + IoTCoreAddOrDeleteFromThingGroupEvent, + IoTCoreAddOrRemoveFromThingGroupEvent, + IoTCoreThingEvent, + IoTCoreThingGroupEvent, + IoTCoreThingTypeAssociationEvent, + IoTCoreThingTypeEvent, +) + + +def test_IoTCoreThingEvent_serialization(): + event = { + "eventType": "THING_EVENT", + "eventId": "f5ae9b94-8b8e-4d8e-8c8f-b3266dd89853", + "timestamp": 1234567890123, + "operation": "CREATED", + "accountId": "123456789012", + "thingId": "b604f69c-aa9a-4d4a-829e-c480e958a0b5", + "thingName": "MyThing", + "versionNumber": 1, + "thingTypeName": None, + "attributes": {"attribute3": "value3", "attribute1": "value1", "attribute2": "value2"}, + } + parsed_event = parse(event, IoTCoreThingEvent) + assert parsed_event is not None + + +def test_IoTCoreThingTypeEvent_serialization(): + event = { + "eventType": "THING_TYPE_EVENT", + "eventId": "8827376c-4b05-49a3-9b3b-733729df7ed5", + "timestamp": 1234567890123, + "operation": "CREATED", + "accountId": "123456789012", + "thingTypeId": "c530ae83-32aa-4592-94d3-da29879d1aac", + "thingTypeName": "MyThingType", + "isDeprecated": False, + "deprecationDate": None, + "searchableAttributes": ["attribute1", "attribute2", "attribute3"], + "propagatingAttributes": [ + {"userPropertyKey": "key", "thingAttribute": "model"}, + {"userPropertyKey": "key", "connectionAttribute": "iot:ClientId"}, + ], + "description": "My thing type", + } + result = parse(event, IoTCoreThingTypeEvent) + assert result is not None + + +def test_IoTCoreThingTypeAssociationEvent_serialization(): + event = { + "eventId": "87f8e095-531c-47b3-aab5-5171364d138d", + "eventType": "THING_TYPE_ASSOCIATION_EVENT", + "operation": "ADDED", + "thingId": "b604f69c-aa9a-4d4a-829e-c480e958a0b5", + "thingName": "myThing", + "thingTypeName": "MyThingType", + "timestamp": 1234567890123, + } + result = parse(event, IoTCoreThingTypeAssociationEvent) + assert result is not None + + +def test_IoTCoreThingGroupEvent_serialization(): + event = { + "eventType": "THING_GROUP_EVENT", + "eventId": "8b9ea8626aeaa1e42100f3f32b975899", + "timestamp": 1603995417409, + "operation": "UPDATED", + "accountId": "571EXAMPLE833", + "thingGroupId": "8757eec8-bb37-4cca-a6fa-403b003d139f", + "thingGroupName": "Tg_level5", + "versionNumber": 3, + "parentGroupName": "Tg_level4", + "parentGroupId": "5fce366a-7875-4c0e-870b-79d8d1dce119", + "description": "New description for Tg_level5", + "rootToParentThingGroups": [ + { + "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/TgTopLevel", + "groupId": "36aa0482-f80d-4e13-9bff-1c0a75c055f6", + }, + { + "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/Tg_level1", + "groupId": "bc1643e1-5a85-4eac-b45a-92509cbe2a77", + }, + { + "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/Tg_level2", + "groupId": "0476f3d2-9beb-48bb-ae2c-ea8bd6458158", + }, + { + "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/Tg_level3", + "groupId": "1d9d4ffe-a6b0-48d6-9de6-2e54d1eae78f", + }, + { + "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/Tg_level4", + "groupId": "5fce366a-7875-4c0e-870b-79d8d1dce119", + }, + ], + "attributes": {"attribute1": "value1", "attribute3": "value3", "attribute2": "value2"}, + "dynamicGroupMappingId": None, + } + result = parse(event, IoTCoreThingGroupEvent) + assert result is not None + + +def test_IoTCoreAddOrRemoveFromThingGroupEvent_serialization(): + event = { + "eventType": "THING_GROUP_MEMBERSHIP_EVENT", + "eventId": "d684bd5f-6f6e-48e1-950c-766ac7f02fd1", + "timestamp": 1234567890123, + "operation": "ADDED", + "accountId": "123456789012", + "groupArn": "arn:aws:iot:ap-northeast-2:123456789012:thinggroup/MyChildThingGroup", + "groupId": "06838589-373f-4312-b1f2-53f2192291c4", + "thingArn": "arn:aws:iot:ap-northeast-2:123456789012:thing/MyThing", + "thingId": "b604f69c-aa9a-4d4a-829e-c480e958a0b5", + "membershipId": "8505ebf8-4d32-4286-80e9-c23a4a16bbd8", + } + result = parse(event, IoTCoreAddOrRemoveFromThingGroupEvent) + assert result is not None + + +def test_IoTCoreAddOrDeleteFromThingGroupEvent_serialization(): + event = { + "eventType": "THING_GROUP_HIERARCHY_EVENT", + "eventId": "264192c7-b573-46ef-ab7b-489fcd47da41", + "timestamp": 1234567890123, + "operation": "ADDED", + "accountId": "123456789012", + "thingGroupId": "8f82a106-6b1d-4331-8984-a84db5f6f8cb", + "thingGroupName": "MyRootThingGroup", + "childGroupId": "06838589-373f-4312-b1f2-53f2192291c4", + "childGroupName": "MyChildThingGroup", + } + result = parse(event, IoTCoreAddOrDeleteFromThingGroupEvent) + assert result is not None From bf5f3df19fe67172ebfd7d672f03ad5f2d486979 Mon Sep 17 00:00:00 2001 From: Bas van Driel Date: Thu, 13 Feb 2025 15:02:36 +0100 Subject: [PATCH 22/28] rename tests --- tests/unit/parser/_pydantic/test_iot.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/unit/parser/_pydantic/test_iot.py b/tests/unit/parser/_pydantic/test_iot.py index 18ca3b9966c..a451d9a42d6 100644 --- a/tests/unit/parser/_pydantic/test_iot.py +++ b/tests/unit/parser/_pydantic/test_iot.py @@ -9,7 +9,7 @@ ) -def test_IoTCoreThingEvent_serialization(): +def test_IoTCoreThingEvent_should_serialize_from_event_data(): event = { "eventType": "THING_EVENT", "eventId": "f5ae9b94-8b8e-4d8e-8c8f-b3266dd89853", @@ -26,7 +26,7 @@ def test_IoTCoreThingEvent_serialization(): assert parsed_event is not None -def test_IoTCoreThingTypeEvent_serialization(): +def test_IoTCoreThingTypeEvent_should_serialize_from_event_data(): event = { "eventType": "THING_TYPE_EVENT", "eventId": "8827376c-4b05-49a3-9b3b-733729df7ed5", @@ -48,7 +48,7 @@ def test_IoTCoreThingTypeEvent_serialization(): assert result is not None -def test_IoTCoreThingTypeAssociationEvent_serialization(): +def test_IoTCoreThingTypeAssociationEvent_should_serialize_from_event_data(): event = { "eventId": "87f8e095-531c-47b3-aab5-5171364d138d", "eventType": "THING_TYPE_ASSOCIATION_EVENT", @@ -62,7 +62,7 @@ def test_IoTCoreThingTypeAssociationEvent_serialization(): assert result is not None -def test_IoTCoreThingGroupEvent_serialization(): +def test_IoTCoreThingGroupEvent_should_serialize_from_event_data(): event = { "eventType": "THING_GROUP_EVENT", "eventId": "8b9ea8626aeaa1e42100f3f32b975899", @@ -104,7 +104,7 @@ def test_IoTCoreThingGroupEvent_serialization(): assert result is not None -def test_IoTCoreAddOrRemoveFromThingGroupEvent_serialization(): +def test_IoTCoreAddOrRemoveFromThingGroupEvent_should_serialize_from_event_data(): event = { "eventType": "THING_GROUP_MEMBERSHIP_EVENT", "eventId": "d684bd5f-6f6e-48e1-950c-766ac7f02fd1", @@ -121,7 +121,7 @@ def test_IoTCoreAddOrRemoveFromThingGroupEvent_serialization(): assert result is not None -def test_IoTCoreAddOrDeleteFromThingGroupEvent_serialization(): +def test_IoTCoreAddOrDeleteFromThingGroupEvent_should_serialize_from_event_data(): event = { "eventType": "THING_GROUP_HIERARCHY_EVENT", "eventId": "264192c7-b573-46ef-ab7b-489fcd47da41", From bfd8d9328bb63e2bd0d1a7f7b912a48364f71c63 Mon Sep 17 00:00:00 2001 From: Bas van Driel Date: Thu, 13 Feb 2025 15:02:52 +0100 Subject: [PATCH 23/28] rename test --- .../parser/_pydantic/{test_iot.py => test_iot_registry_events.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/unit/parser/_pydantic/{test_iot.py => test_iot_registry_events.py} (100%) diff --git a/tests/unit/parser/_pydantic/test_iot.py b/tests/unit/parser/_pydantic/test_iot_registry_events.py similarity index 100% rename from tests/unit/parser/_pydantic/test_iot.py rename to tests/unit/parser/_pydantic/test_iot_registry_events.py From 9e8aae2d02c0dc7047be7b1f83e7ead367f23680 Mon Sep 17 00:00:00 2001 From: Bas van Driel Date: Fri, 14 Feb 2025 08:41:06 +0100 Subject: [PATCH 24/28] wokr --- .../parser/models/iot_registry_events.py | 95 ++++++++----------- 1 file changed, 42 insertions(+), 53 deletions(-) diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index cfeb4bda7bc..9b2cdde2865 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -1,6 +1,6 @@ from typing import Any, Dict, List, Literal, Optional -from pydantic import BaseModel +from pydantic import BaseModel, Field class IoTCoreRegistryEventsBase(BaseModel): @@ -14,88 +14,77 @@ class IoTCoreRegistryEventsBase(BaseModel): class IoTCoreThingEvent(IoTCoreRegistryEventsBase): - """The "Thing: created, updated, deleted" event""" + """The 'Thing: created, updated, deleted' event""" operation: EVENT_CRUD_OPERATION - - thingId: str - accountId: str - thingName: str - versionNumber: int - thingTypeName: Optional[str] + thing_id: str = Field(..., alias="thingId") + account_id: str = Field(..., alias="accountId") + thing_name: str = Field(..., alias="thingName") + version_number: int = Field(..., alias="versionNumber") + thing_type_name: Optional[str] = Field(None, alias="thingTypeName") attributes: Dict[str, Any] class IoTCoreThingTypeEvent(IoTCoreRegistryEventsBase): operation: EVENT_CRUD_OPERATION - accountId: str - thingTypeId: str - thingTypeName: str - isDeprecated: bool - deprecationDate: Optional[str] - searchableAttributes: List[str] - propagatingAttributes: List[Dict[str, str]] + account_id: str = Field(..., alias="accountId") + thing_type_id: str = Field(..., alias="thingTypeId") + thing_type_name: str = Field(..., alias="thingTypeName") + is_deprecated: bool = Field(..., alias="isDeprecated") + deprecation_date: Optional[str] = Field(None, alias="deprecationDate") + searchable_attributes: List[str] = Field(..., alias="searchableAttributes") + propagating_attributes: List[Dict[str, str]] = Field(..., alias="propagatingAttributes") description: str class IoTCoreThingTypeAssociationEvent(IoTCoreRegistryEventsBase): - """ - Thing Type Associated or Disassociated with a Thing - """ + """Thing Type Associated or Disassociated with a Thing""" operation: EVENT_ADD_REMOVE_OPERATION - thingId: str - thingName: str - thingTypeName: str + thing_id: str = Field(..., alias="thingId") + thing_name: str = Field(..., alias="thingName") + thing_type_name: str = Field(..., alias="thingTypeName") class RootToParentThingGroup(BaseModel): - groupArn: str - groupId: str + group_arn: str = Field(..., alias="groupArn") + group_id: str = Field(..., alias="groupId") class IoTCoreThingGroupEvent(IoTCoreRegistryEventsBase): - """ - Thing Group Created/Updated/Deleted - """ + """Thing Group Created/Updated/Deleted""" operation: EVENT_CRUD_OPERATION - accountId: str - thingGroupId: str - thingGroupName: str - versionNumber: int - parentGroupName: Optional[str] - parentGroupId: Optional[str] + account_id: str = Field(..., alias="accountId") + thing_group_id: str = Field(..., alias="thingGroupId") + thing_group_name: str = Field(..., alias="thingGroupName") + version_number: int = Field(..., alias="versionNumber") + parent_group_name: Optional[str] = Field(None, alias="parentGroupName") + parent_group_id: Optional[str] = Field(None, alias="parentGroupId") description: str - rootToParentThingGroups: List[RootToParentThingGroup] - + root_to_parent_thing_groups: List[RootToParentThingGroup] = Field(..., alias="rootToParentThingGroups") attributes: Dict[str, Any] - - dynamicGroupMappingId: Optional[str] + dynamic_group_mapping_id: Optional[str] = Field(None, alias="dynamicGroupMappingId") class IoTCoreAddOrRemoveFromThingGroupEvent(IoTCoreRegistryEventsBase): - """ - Thing Added to or Removed from a Thing Group - """ + """Thing Added to or Removed from a Thing Group""" operation: EVENT_ADD_REMOVE_OPERATION - accountId: str - groupArn: str - groupId: str - thingArn: str - thingId: str - membershipId: str + account_id: str = Field(..., alias="accountId") + group_arn: str = Field(..., alias="groupArn") + group_id: str = Field(..., alias="groupId") + thing_arn: str = Field(..., alias="thingArn") + thing_id: str = Field(..., alias="thingId") + membership_id: str = Field(..., alias="membershipId") class IoTCoreAddOrDeleteFromThingGroupEvent(IoTCoreRegistryEventsBase): - """ - Thing Group Added to or Deleted from a Thing Group - """ + """Thing Group Added to or Deleted from a Thing Group""" operation: EVENT_ADD_REMOVE_OPERATION - accountId: str - thingGroupId: str - thingGroupName: str - childGroupId: str - childGroupName: str + account_id: str = Field(..., alias="accountId") + thing_group_id: str = Field(..., alias="thingGroupId") + thing_group_name: str = Field(..., alias="thingGroupName") + child_group_id: str = Field(..., alias="childGroupId") + child_group_name: str = Field(..., alias="childGroupName") From 501ce1cbac6166b554026a32f986e17ce57bd7a8 Mon Sep 17 00:00:00 2001 From: Bas van Driel Date: Fri, 14 Feb 2025 08:48:17 +0100 Subject: [PATCH 25/28] Add documentation --- docs/utilities/parser.md | 78 +++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/docs/utilities/parser.md b/docs/utilities/parser.md index 1df9c2342f1..76beda7dcc6 100644 --- a/docs/utilities/parser.md +++ b/docs/utilities/parser.md @@ -100,41 +100,47 @@ You can use pre-built models to work events from AWS services, so you don’t ne The example above uses `SqsModel`. Other built-in models can be found below. -| Model name | Description | -| ------------------------------------------- | ------------------------------------------------------------------------------------- | -| **AlbModel** | Lambda Event Source payload for Amazon Application Load Balancer | -| **APIGatewayProxyEventModel** | Lambda Event Source payload for Amazon API Gateway | -| **ApiGatewayAuthorizerToken** | Lambda Event Source payload for Amazon API Gateway Lambda Authorizer with Token | -| **ApiGatewayAuthorizerRequest** | Lambda Event Source payload for Amazon API Gateway Lambda Authorizer with Request | -| **APIGatewayProxyEventV2Model** | Lambda Event Source payload for Amazon API Gateway v2 payload | -| **ApiGatewayAuthorizerRequestV2** | Lambda Event Source payload for Amazon API Gateway v2 Lambda Authorizer | -| **APIGatewayWebSocketMessageEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API message body | -| **APIGatewayWebSocketConnectEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API $connect message | -| **APIGatewayWebSocketDisconnectEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API $disconnect message | -| **BedrockAgentEventModel** | Lambda Event Source payload for Bedrock Agents | -| **CloudFormationCustomResourceCreateModel** | Lambda Event Source payload for AWS CloudFormation `CREATE` operation | -| **CloudFormationCustomResourceUpdateModel** | Lambda Event Source payload for AWS CloudFormation `UPDATE` operation | -| **CloudFormationCustomResourceDeleteModel** | Lambda Event Source payload for AWS CloudFormation `DELETE` operation | -| **CloudwatchLogsModel** | Lambda Event Source payload for Amazon CloudWatch Logs | -| **DynamoDBStreamModel** | Lambda Event Source payload for Amazon DynamoDB Streams | -| **EventBridgeModel** | Lambda Event Source payload for Amazon EventBridge | -| **KafkaMskEventModel** | Lambda Event Source payload for AWS MSK payload | -| **KafkaSelfManagedEventModel** | Lambda Event Source payload for self managed Kafka payload | -| **KinesisDataStreamModel** | Lambda Event Source payload for Amazon Kinesis Data Streams | -| **KinesisFirehoseModel** | Lambda Event Source payload for Amazon Kinesis Firehose | -| **KinesisFirehoseSqsModel** | Lambda Event Source payload for SQS messages wrapped in Kinesis Firehose records | -| **LambdaFunctionUrlModel** | Lambda Event Source payload for Lambda Function URL payload | -| **S3BatchOperationModel** | Lambda Event Source payload for Amazon S3 Batch Operation | -| **S3EventNotificationEventBridgeModel** | Lambda Event Source payload for Amazon S3 Event Notification to EventBridge. | -| **S3Model** | Lambda Event Source payload for Amazon S3 | -| **S3ObjectLambdaEvent** | Lambda Event Source payload for Amazon S3 Object Lambda | -| **S3SqsEventNotificationModel** | Lambda Event Source payload for S3 event notifications wrapped in SQS event (S3->SQS) | -| **SesModel** | Lambda Event Source payload for Amazon Simple Email Service | -| **SnsModel** | Lambda Event Source payload for Amazon Simple Notification Service | -| **SqsModel** | Lambda Event Source payload for Amazon SQS | -| **TransferFamilyAuthorizer** | Lambda Event Source payload for AWS Transfer Family Lambda authorizer | -| **VpcLatticeModel** | Lambda Event Source payload for Amazon VPC Lattice | -| **VpcLatticeV2Model** | Lambda Event Source payload for Amazon VPC Lattice v2 payload | +| Model name | Description | +| ------------------------------------------- | --------------------------------------------------------------------------------------------- | +| **AlbModel** | Lambda Event Source payload for Amazon Application Load Balancer | +| **APIGatewayProxyEventModel** | Lambda Event Source payload for Amazon API Gateway | +| **ApiGatewayAuthorizerToken** | Lambda Event Source payload for Amazon API Gateway Lambda Authorizer with Token | +| **ApiGatewayAuthorizerRequest** | Lambda Event Source payload for Amazon API Gateway Lambda Authorizer with Request | +| **APIGatewayProxyEventV2Model** | Lambda Event Source payload for Amazon API Gateway v2 payload | +| **ApiGatewayAuthorizerRequestV2** | Lambda Event Source payload for Amazon API Gateway v2 Lambda Authorizer | +| **APIGatewayWebSocketMessageEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API message body | +| **APIGatewayWebSocketConnectEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API $connect message | +| **APIGatewayWebSocketDisconnectEventModel** | Lambda Event Source payload for Amazon API Gateway WebSocket API $disconnect message | +| **BedrockAgentEventModel** | Lambda Event Source payload for Bedrock Agents | +| **CloudFormationCustomResourceCreateModel** | Lambda Event Source payload for AWS CloudFormation `CREATE` operation | +| **CloudFormationCustomResourceUpdateModel** | Lambda Event Source payload for AWS CloudFormation `UPDATE` operation | +| **CloudFormationCustomResourceDeleteModel** | Lambda Event Source payload for AWS CloudFormation `DELETE` operation | +| **CloudwatchLogsModel** | Lambda Event Source payload for Amazon CloudWatch Logs | +| **DynamoDBStreamModel** | Lambda Event Source payload for Amazon DynamoDB Streams | +| **EventBridgeModel** | Lambda Event Source payload for Amazon EventBridge | +| **KafkaMskEventModel** | Lambda Event Source payload for AWS MSK payload | +| **KafkaSelfManagedEventModel** | Lambda Event Source payload for self managed Kafka payload | +| **KinesisDataStreamModel** | Lambda Event Source payload for Amazon Kinesis Data Streams | +| **KinesisFirehoseModel** | Lambda Event Source payload for Amazon Kinesis Firehose | +| **KinesisFirehoseSqsModel** | Lambda Event Source payload for SQS messages wrapped in Kinesis Firehose records | +| **LambdaFunctionUrlModel** | Lambda Event Source payload for Lambda Function URL payload | +| **S3BatchOperationModel** | Lambda Event Source payload for Amazon S3 Batch Operation | +| **S3EventNotificationEventBridgeModel** | Lambda Event Source payload for Amazon S3 Event Notification to EventBridge. | +| **S3Model** | Lambda Event Source payload for Amazon S3 | +| **S3ObjectLambdaEvent** | Lambda Event Source payload for Amazon S3 Object Lambda | +| **S3SqsEventNotificationModel** | Lambda Event Source payload for S3 event notifications wrapped in SQS event (S3->SQS) | +| **SesModel** | Lambda Event Source payload for Amazon Simple Email Service | +| **SnsModel** | Lambda Event Source payload for Amazon Simple Notification Service | +| **SqsModel** | Lambda Event Source payload for Amazon SQS | +| **TransferFamilyAuthorizer** | Lambda Event Source payload for AWS Transfer Family Lambda authorizer | +| **VpcLatticeModel** | Lambda Event Source payload for Amazon VPC Lattice | +| **VpcLatticeV2Model** | Lambda Event Source payload for Amazon VPC Lattice v2 payload | +| **IoTCoreThingEvent** | Lambda Event Source payload for IoT Core Thing created, updated, or deleted. | +| **IoTCoreThingTypeEvent** | Lambda Event Source payload for IoT Core Thing Type events. | +| **IoTCoreThingTypeAssociationEvent** | Lambda Event Source payload for IoT Core Thing Type associated or disassociated with a Thing. | +| **IoTCoreThingGroupEvent** | Lambda Event Source payload for IoT Core Thing Group created, updated, or deleted. | +| **IoTCoreAddOrRemoveFromThingGroupEvent** | Lambda Event Source payload for IoT Core Thing added to or removed from a Thing Group. | +| **IoTCoreAddOrDeleteFromThingGroupEvent** | Lambda Event Source payload for IoT Core Thing Group added to or deleted from a Thing Group. | #### Extending built-in models @@ -150,7 +156,7 @@ Use the model to validate and extract relevant information from the incoming eve ```python hl_lines="4 8 17" --8<-- "examples/parser/src/custom_data_model_with_eventbridge.py" - ``` + ```**** === "Sample event" From 0fd6f6eac048e5f48387c266a027d86599595d3a Mon Sep 17 00:00:00 2001 From: Bas van Driel Date: Fri, 14 Feb 2025 08:51:21 +0100 Subject: [PATCH 26/28] Remove stars --- docs/utilities/parser.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/utilities/parser.md b/docs/utilities/parser.md index 76beda7dcc6..60f08e75ea0 100644 --- a/docs/utilities/parser.md +++ b/docs/utilities/parser.md @@ -156,7 +156,7 @@ Use the model to validate and extract relevant information from the incoming eve ```python hl_lines="4 8 17" --8<-- "examples/parser/src/custom_data_model_with_eventbridge.py" - ```**** + ``` === "Sample event" From 9268902cd5342c5a8e885487556d5088dbec38b7 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Fri, 14 Feb 2025 10:36:58 +0000 Subject: [PATCH 27/28] Moving JSON events to events folder --- .../parser/models/iot_registry_events.py | 77 ++++-- docs/utilities/parser.md | 12 +- ...yEventsAddOrDeleteFromThingGroupEvent.json | 11 + ...yEventsAddOrRemoveFromThingGroupEvent.json | 12 + tests/events/iotRegistryEventsThingEvent.json | 12 + .../iotRegistryEventsThingGroupEvent.json | 37 +++ ...gistryEventsThingTypeAssociationEvent.json | 9 + .../iotRegistryEventsThingTypeEvent.json | 17 ++ .../_pydantic/test_iot_registry_events.py | 232 ++++++++---------- 9 files changed, 267 insertions(+), 152 deletions(-) create mode 100644 tests/events/iotRegistryEventsAddOrDeleteFromThingGroupEvent.json create mode 100644 tests/events/iotRegistryEventsAddOrRemoveFromThingGroupEvent.json create mode 100644 tests/events/iotRegistryEventsThingEvent.json create mode 100644 tests/events/iotRegistryEventsThingGroupEvent.json create mode 100644 tests/events/iotRegistryEventsThingTypeAssociationEvent.json create mode 100644 tests/events/iotRegistryEventsThingTypeEvent.json diff --git a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py index 9b2cdde2865..7af5992a20d 100644 --- a/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py +++ b/aws_lambda_powertools/utilities/parser/models/iot_registry_events.py @@ -1,21 +1,25 @@ +from datetime import datetime from typing import Any, Dict, List, Literal, Optional from pydantic import BaseModel, Field - -class IoTCoreRegistryEventsBase(BaseModel): - eventType: str - eventId: str - timestamp: int - - EVENT_CRUD_OPERATION = Literal["CREATED", "UPDATED", "DELETED"] EVENT_ADD_REMOVE_OPERATION = Literal["ADDED", "REMOVED"] +class IoTCoreRegistryEventsBase(BaseModel): + event_id: str = Field(..., alias="eventId") + timestamp: datetime + + class IoTCoreThingEvent(IoTCoreRegistryEventsBase): - """The 'Thing: created, updated, deleted' event""" + """ + Thing Created/Updated/Deleted + The registry publishes event messages when things are created, updated, or deleted. + """ + + event_type: Literal["THING_EVENT"] = Field(..., alias="eventType") operation: EVENT_CRUD_OPERATION thing_id: str = Field(..., alias="thingId") account_id: str = Field(..., alias="accountId") @@ -26,34 +30,55 @@ class IoTCoreThingEvent(IoTCoreRegistryEventsBase): class IoTCoreThingTypeEvent(IoTCoreRegistryEventsBase): + """ + Thing Type Created/Updated/Deprecated/Undeprecated/Deleted + The registry publishes event messages when thing types are created, updated, deprecated, undeprecated, or deleted. + + Format: + $aws/events/thingType/thingTypeName/created + $aws/events/thingType/thingTypeName/updated + $aws/events/thingType/thingTypeName/deleted + """ + + event_type: Literal["THING_TYPE_EVENT"] = Field(..., alias="eventType") operation: EVENT_CRUD_OPERATION account_id: str = Field(..., alias="accountId") thing_type_id: str = Field(..., alias="thingTypeId") thing_type_name: str = Field(..., alias="thingTypeName") is_deprecated: bool = Field(..., alias="isDeprecated") - deprecation_date: Optional[str] = Field(None, alias="deprecationDate") + deprecation_date: Optional[datetime] = Field(None, alias="deprecationDate") searchable_attributes: List[str] = Field(..., alias="searchableAttributes") propagating_attributes: List[Dict[str, str]] = Field(..., alias="propagatingAttributes") description: str class IoTCoreThingTypeAssociationEvent(IoTCoreRegistryEventsBase): - """Thing Type Associated or Disassociated with a Thing""" + """ + The registry publishes event messages when a thing type is associated or disassociated with a thing. + + Format: + $aws/events/thingTypeAssociation/thing/thingName/thingType/typeName/added + $aws/events/thingTypeAssociation/thing/thingName/thingType/typeName/removed + """ + event_type: Literal["THING_TYPE_ASSOCIATION_EVENT"] = Field(..., alias="eventType") operation: EVENT_ADD_REMOVE_OPERATION thing_id: str = Field(..., alias="thingId") thing_name: str = Field(..., alias="thingName") thing_type_name: str = Field(..., alias="thingTypeName") -class RootToParentThingGroup(BaseModel): - group_arn: str = Field(..., alias="groupArn") - group_id: str = Field(..., alias="groupId") - - class IoTCoreThingGroupEvent(IoTCoreRegistryEventsBase): - """Thing Group Created/Updated/Deleted""" + """ + The registry publishes the following event messages when a thing group is created, updated, or deleted. + + Format: + $aws/events/thingGroup/groupName/created + $aws/events/thingGroup/groupName/updated + $aws/events/thingGroup/groupName/deleted + """ + event_type: Literal["THING_GROUP_EVENT"] = Field(..., alias="eventType") operation: EVENT_CRUD_OPERATION account_id: str = Field(..., alias="accountId") thing_group_id: str = Field(..., alias="thingGroupId") @@ -62,14 +87,21 @@ class IoTCoreThingGroupEvent(IoTCoreRegistryEventsBase): parent_group_name: Optional[str] = Field(None, alias="parentGroupName") parent_group_id: Optional[str] = Field(None, alias="parentGroupId") description: str - root_to_parent_thing_groups: List[RootToParentThingGroup] = Field(..., alias="rootToParentThingGroups") + root_to_parent_thing_groups: List[Dict[str, str]] = Field(..., alias="rootToParentThingGroups") attributes: Dict[str, Any] dynamic_group_mapping_id: Optional[str] = Field(None, alias="dynamicGroupMappingId") class IoTCoreAddOrRemoveFromThingGroupEvent(IoTCoreRegistryEventsBase): - """Thing Added to or Removed from a Thing Group""" + """ + The registry publishes event messages when a thing is added to or removed from a thing group. + Format: + $aws/events/thingGroupMembership/thingGroup/thingGroupName/thing/thingName/added + $aws/events/thingGroupMembership/thingGroup/thingGroupName/thing/thingName/removed + """ + + event_type: Literal["THING_GROUP_MEMBERSHIP_EVENT"] = Field(..., alias="eventType") operation: EVENT_ADD_REMOVE_OPERATION account_id: str = Field(..., alias="accountId") group_arn: str = Field(..., alias="groupArn") @@ -80,8 +112,15 @@ class IoTCoreAddOrRemoveFromThingGroupEvent(IoTCoreRegistryEventsBase): class IoTCoreAddOrDeleteFromThingGroupEvent(IoTCoreRegistryEventsBase): - """Thing Group Added to or Deleted from a Thing Group""" + """ + The registry publishes event messages when a thing group is added to or removed from another thing group. + + Format: + $aws/events/thingGroupHierarchy/thingGroup/parentThingGroupName/childThingGroup/childThingGroupName/added + $aws/events/thingGroupHierarchy/thingGroup/parentThingGroupName/childThingGroup/childThingGroupName/removed + """ + event_type: Literal["THING_GROUP_HIERARCHY_EVENT"] = Field(..., alias="eventType") operation: EVENT_ADD_REMOVE_OPERATION account_id: str = Field(..., alias="accountId") thing_group_id: str = Field(..., alias="thingGroupId") diff --git a/docs/utilities/parser.md b/docs/utilities/parser.md index 60f08e75ea0..b6abbe965e1 100644 --- a/docs/utilities/parser.md +++ b/docs/utilities/parser.md @@ -118,6 +118,12 @@ The example above uses `SqsModel`. Other built-in models can be found below. | **CloudwatchLogsModel** | Lambda Event Source payload for Amazon CloudWatch Logs | | **DynamoDBStreamModel** | Lambda Event Source payload for Amazon DynamoDB Streams | | **EventBridgeModel** | Lambda Event Source payload for Amazon EventBridge | +| **IoTCoreThingEvent** | Lambda Event Source payload for IoT Core Thing created, updated, or deleted. | +| **IoTCoreThingTypeEvent** | Lambda Event Source payload for IoT Core Thing Type events. | +| **IoTCoreThingTypeAssociationEvent** | Lambda Event Source payload for IoT Core Thing Type associated or disassociated with a Thing. | +| **IoTCoreThingGroupEvent** | Lambda Event Source payload for IoT Core Thing Group created, updated, or deleted. | +| **IoTCoreAddOrRemoveFromThingGroupEvent** | Lambda Event Source payload for IoT Core Thing added to or removed from a Thing Group. | +| **IoTCoreAddOrDeleteFromThingGroupEvent** | Lambda Event Source payload for IoT Core Thing Group added to or deleted from a Thing Group. | | **KafkaMskEventModel** | Lambda Event Source payload for AWS MSK payload | | **KafkaSelfManagedEventModel** | Lambda Event Source payload for self managed Kafka payload | | **KinesisDataStreamModel** | Lambda Event Source payload for Amazon Kinesis Data Streams | @@ -135,12 +141,6 @@ The example above uses `SqsModel`. Other built-in models can be found below. | **TransferFamilyAuthorizer** | Lambda Event Source payload for AWS Transfer Family Lambda authorizer | | **VpcLatticeModel** | Lambda Event Source payload for Amazon VPC Lattice | | **VpcLatticeV2Model** | Lambda Event Source payload for Amazon VPC Lattice v2 payload | -| **IoTCoreThingEvent** | Lambda Event Source payload for IoT Core Thing created, updated, or deleted. | -| **IoTCoreThingTypeEvent** | Lambda Event Source payload for IoT Core Thing Type events. | -| **IoTCoreThingTypeAssociationEvent** | Lambda Event Source payload for IoT Core Thing Type associated or disassociated with a Thing. | -| **IoTCoreThingGroupEvent** | Lambda Event Source payload for IoT Core Thing Group created, updated, or deleted. | -| **IoTCoreAddOrRemoveFromThingGroupEvent** | Lambda Event Source payload for IoT Core Thing added to or removed from a Thing Group. | -| **IoTCoreAddOrDeleteFromThingGroupEvent** | Lambda Event Source payload for IoT Core Thing Group added to or deleted from a Thing Group. | #### Extending built-in models diff --git a/tests/events/iotRegistryEventsAddOrDeleteFromThingGroupEvent.json b/tests/events/iotRegistryEventsAddOrDeleteFromThingGroupEvent.json new file mode 100644 index 00000000000..6bb09236e46 --- /dev/null +++ b/tests/events/iotRegistryEventsAddOrDeleteFromThingGroupEvent.json @@ -0,0 +1,11 @@ +{ + "eventType": "THING_GROUP_HIERARCHY_EVENT", + "eventId": "264192c7-b573-46ef-ab7b-489fcd47da41", + "timestamp": 1234567890123, + "operation": "ADDED", + "accountId": "123456789012", + "thingGroupId": "8f82a106-6b1d-4331-8984-a84db5f6f8cb", + "thingGroupName": "MyRootThingGroup", + "childGroupId": "06838589-373f-4312-b1f2-53f2192291c4", + "childGroupName": "MyChildThingGroup" +} diff --git a/tests/events/iotRegistryEventsAddOrRemoveFromThingGroupEvent.json b/tests/events/iotRegistryEventsAddOrRemoveFromThingGroupEvent.json new file mode 100644 index 00000000000..35c1fa0ae04 --- /dev/null +++ b/tests/events/iotRegistryEventsAddOrRemoveFromThingGroupEvent.json @@ -0,0 +1,12 @@ +{ + "eventType": "THING_GROUP_MEMBERSHIP_EVENT", + "eventId": "d684bd5f-6f6e-48e1-950c-766ac7f02fd1", + "timestamp": 1234567890123, + "operation": "ADDED", + "accountId": "123456789012", + "groupArn": "arn:aws:iot:ap-northeast-2:123456789012:thinggroup/MyChildThingGroup", + "groupId": "06838589-373f-4312-b1f2-53f2192291c4", + "thingArn": "arn:aws:iot:ap-northeast-2:123456789012:thing/MyThing", + "thingId": "b604f69c-aa9a-4d4a-829e-c480e958a0b5", + "membershipId": "8505ebf8-4d32-4286-80e9-c23a4a16bbd8" +} diff --git a/tests/events/iotRegistryEventsThingEvent.json b/tests/events/iotRegistryEventsThingEvent.json new file mode 100644 index 00000000000..08db220337d --- /dev/null +++ b/tests/events/iotRegistryEventsThingEvent.json @@ -0,0 +1,12 @@ +{ + "eventType": "THING_EVENT", + "eventId": "f5ae9b94-8b8e-4d8e-8c8f-b3266dd89853", + "timestamp": 1234567890123, + "operation": "CREATED", + "accountId": "123456789012", + "thingId": "b604f69c-aa9a-4d4a-829e-c480e958a0b5", + "thingName": "MyThing", + "versionNumber": 1, + "thingTypeName": null, + "attributes": {"attribute3": "value3", "attribute1": "value1", "attribute2": "value2"} +} diff --git a/tests/events/iotRegistryEventsThingGroupEvent.json b/tests/events/iotRegistryEventsThingGroupEvent.json new file mode 100644 index 00000000000..3a68f5f15db --- /dev/null +++ b/tests/events/iotRegistryEventsThingGroupEvent.json @@ -0,0 +1,37 @@ +{ + "eventType": "THING_GROUP_EVENT", + "eventId": "8b9ea8626aeaa1e42100f3f32b975899", + "timestamp": 1603995417409, + "operation": "UPDATED", + "accountId": "571EXAMPLE833", + "thingGroupId": "8757eec8-bb37-4cca-a6fa-403b003d139f", + "thingGroupName": "Tg_level5", + "versionNumber": 3, + "parentGroupName": "Tg_level4", + "parentGroupId": "5fce366a-7875-4c0e-870b-79d8d1dce119", + "description": "New description for Tg_level5", + "rootToParentThingGroups": [ + { + "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/TgTopLevel", + "groupId": "36aa0482-f80d-4e13-9bff-1c0a75c055f6" + }, + { + "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/Tg_level1", + "groupId": "bc1643e1-5a85-4eac-b45a-92509cbe2a77" + }, + { + "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/Tg_level2", + "groupId": "0476f3d2-9beb-48bb-ae2c-ea8bd6458158" + }, + { + "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/Tg_level3", + "groupId": "1d9d4ffe-a6b0-48d6-9de6-2e54d1eae78f" + }, + { + "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/Tg_level4", + "groupId": "5fce366a-7875-4c0e-870b-79d8d1dce119" + } + ], + "attributes": {"attribute1": "value1", "attribute3": "value3", "attribute2": "value2"}, + "dynamicGroupMappingId": null +} diff --git a/tests/events/iotRegistryEventsThingTypeAssociationEvent.json b/tests/events/iotRegistryEventsThingTypeAssociationEvent.json new file mode 100644 index 00000000000..23d8cdea5bd --- /dev/null +++ b/tests/events/iotRegistryEventsThingTypeAssociationEvent.json @@ -0,0 +1,9 @@ +{ + "eventId": "87f8e095-531c-47b3-aab5-5171364d138d", + "eventType": "THING_TYPE_ASSOCIATION_EVENT", + "operation": "ADDED", + "thingId": "b604f69c-aa9a-4d4a-829e-c480e958a0b5", + "thingName": "myThing", + "thingTypeName": "MyThingType", + "timestamp": 1234567890123 +} diff --git a/tests/events/iotRegistryEventsThingTypeEvent.json b/tests/events/iotRegistryEventsThingTypeEvent.json new file mode 100644 index 00000000000..c205d86d015 --- /dev/null +++ b/tests/events/iotRegistryEventsThingTypeEvent.json @@ -0,0 +1,17 @@ +{ + "eventType": "THING_TYPE_EVENT", + "eventId": "8827376c-4b05-49a3-9b3b-733729df7ed5", + "timestamp": 1234567890123, + "operation": "CREATED", + "accountId": "123456789012", + "thingTypeId": "c530ae83-32aa-4592-94d3-da29879d1aac", + "thingTypeName": "MyThingType", + "isDeprecated": false, + "deprecationDate": null, + "searchableAttributes": ["attribute1", "attribute2", "attribute3"], + "propagatingAttributes": [ + {"userPropertyKey": "key", "thingAttribute": "model"}, + {"userPropertyKey": "key", "connectionAttribute": "iot:ClientId"} + ], + "description": "My thing type" +} diff --git a/tests/unit/parser/_pydantic/test_iot_registry_events.py b/tests/unit/parser/_pydantic/test_iot_registry_events.py index a451d9a42d6..a36e44e2a52 100644 --- a/tests/unit/parser/_pydantic/test_iot_registry_events.py +++ b/tests/unit/parser/_pydantic/test_iot_registry_events.py @@ -1,4 +1,3 @@ -from aws_lambda_powertools.utilities.parser import parse from aws_lambda_powertools.utilities.parser.models.iot_registry_events import ( IoTCoreAddOrDeleteFromThingGroupEvent, IoTCoreAddOrRemoveFromThingGroupEvent, @@ -7,131 +6,110 @@ IoTCoreThingTypeAssociationEvent, IoTCoreThingTypeEvent, ) +from tests.functional.utils import load_event -def test_IoTCoreThingEvent_should_serialize_from_event_data(): - event = { - "eventType": "THING_EVENT", - "eventId": "f5ae9b94-8b8e-4d8e-8c8f-b3266dd89853", - "timestamp": 1234567890123, - "operation": "CREATED", - "accountId": "123456789012", - "thingId": "b604f69c-aa9a-4d4a-829e-c480e958a0b5", - "thingName": "MyThing", - "versionNumber": 1, - "thingTypeName": None, - "attributes": {"attribute3": "value3", "attribute1": "value1", "attribute2": "value2"}, - } - parsed_event = parse(event, IoTCoreThingEvent) - assert parsed_event is not None - - -def test_IoTCoreThingTypeEvent_should_serialize_from_event_data(): - event = { - "eventType": "THING_TYPE_EVENT", - "eventId": "8827376c-4b05-49a3-9b3b-733729df7ed5", - "timestamp": 1234567890123, - "operation": "CREATED", - "accountId": "123456789012", - "thingTypeId": "c530ae83-32aa-4592-94d3-da29879d1aac", - "thingTypeName": "MyThingType", - "isDeprecated": False, - "deprecationDate": None, - "searchableAttributes": ["attribute1", "attribute2", "attribute3"], - "propagatingAttributes": [ - {"userPropertyKey": "key", "thingAttribute": "model"}, - {"userPropertyKey": "key", "connectionAttribute": "iot:ClientId"}, - ], - "description": "My thing type", - } - result = parse(event, IoTCoreThingTypeEvent) - assert result is not None - - -def test_IoTCoreThingTypeAssociationEvent_should_serialize_from_event_data(): - event = { - "eventId": "87f8e095-531c-47b3-aab5-5171364d138d", - "eventType": "THING_TYPE_ASSOCIATION_EVENT", - "operation": "ADDED", - "thingId": "b604f69c-aa9a-4d4a-829e-c480e958a0b5", - "thingName": "myThing", - "thingTypeName": "MyThingType", - "timestamp": 1234567890123, - } - result = parse(event, IoTCoreThingTypeAssociationEvent) - assert result is not None - - -def test_IoTCoreThingGroupEvent_should_serialize_from_event_data(): - event = { - "eventType": "THING_GROUP_EVENT", - "eventId": "8b9ea8626aeaa1e42100f3f32b975899", - "timestamp": 1603995417409, - "operation": "UPDATED", - "accountId": "571EXAMPLE833", - "thingGroupId": "8757eec8-bb37-4cca-a6fa-403b003d139f", - "thingGroupName": "Tg_level5", - "versionNumber": 3, - "parentGroupName": "Tg_level4", - "parentGroupId": "5fce366a-7875-4c0e-870b-79d8d1dce119", - "description": "New description for Tg_level5", - "rootToParentThingGroups": [ - { - "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/TgTopLevel", - "groupId": "36aa0482-f80d-4e13-9bff-1c0a75c055f6", - }, - { - "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/Tg_level1", - "groupId": "bc1643e1-5a85-4eac-b45a-92509cbe2a77", - }, - { - "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/Tg_level2", - "groupId": "0476f3d2-9beb-48bb-ae2c-ea8bd6458158", - }, - { - "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/Tg_level3", - "groupId": "1d9d4ffe-a6b0-48d6-9de6-2e54d1eae78f", - }, - { - "groupArn": "arn:aws:iot:us-west-2:571EXAMPLE833:thinggroup/Tg_level4", - "groupId": "5fce366a-7875-4c0e-870b-79d8d1dce119", - }, - ], - "attributes": {"attribute1": "value1", "attribute3": "value3", "attribute2": "value2"}, - "dynamicGroupMappingId": None, - } - result = parse(event, IoTCoreThingGroupEvent) - assert result is not None - - -def test_IoTCoreAddOrRemoveFromThingGroupEvent_should_serialize_from_event_data(): - event = { - "eventType": "THING_GROUP_MEMBERSHIP_EVENT", - "eventId": "d684bd5f-6f6e-48e1-950c-766ac7f02fd1", - "timestamp": 1234567890123, - "operation": "ADDED", - "accountId": "123456789012", - "groupArn": "arn:aws:iot:ap-northeast-2:123456789012:thinggroup/MyChildThingGroup", - "groupId": "06838589-373f-4312-b1f2-53f2192291c4", - "thingArn": "arn:aws:iot:ap-northeast-2:123456789012:thing/MyThing", - "thingId": "b604f69c-aa9a-4d4a-829e-c480e958a0b5", - "membershipId": "8505ebf8-4d32-4286-80e9-c23a4a16bbd8", - } - result = parse(event, IoTCoreAddOrRemoveFromThingGroupEvent) - assert result is not None - - -def test_IoTCoreAddOrDeleteFromThingGroupEvent_should_serialize_from_event_data(): - event = { - "eventType": "THING_GROUP_HIERARCHY_EVENT", - "eventId": "264192c7-b573-46ef-ab7b-489fcd47da41", - "timestamp": 1234567890123, - "operation": "ADDED", - "accountId": "123456789012", - "thingGroupId": "8f82a106-6b1d-4331-8984-a84db5f6f8cb", - "thingGroupName": "MyRootThingGroup", - "childGroupId": "06838589-373f-4312-b1f2-53f2192291c4", - "childGroupName": "MyChildThingGroup", - } - result = parse(event, IoTCoreAddOrDeleteFromThingGroupEvent) - assert result is not None +def test_iot_core_thing_event(): + raw_event = load_event("iotRegistryEventsThingEvent.json") + parsed_event: IoTCoreThingEvent = IoTCoreThingEvent(**raw_event) + + assert parsed_event.event_id == raw_event["eventId"] + assert parsed_event.event_type == raw_event["eventType"] + convert_time = int(round(parsed_event.timestamp.timestamp() * 1000)) + assert convert_time == raw_event["timestamp"] + assert parsed_event.operation == raw_event["operation"] + assert parsed_event.account_id == raw_event["accountId"] + assert parsed_event.thing_id == raw_event["thingId"] + assert parsed_event.thing_name == raw_event["thingName"] + assert parsed_event.version_number == raw_event["versionNumber"] + assert parsed_event.thing_type_name == raw_event["thingTypeName"] + assert parsed_event.attributes == raw_event["attributes"] + + +def test_iot_core_thing_type_event(): + raw_event = load_event("iotRegistryEventsThingTypeEvent.json") + parsed_event: IoTCoreThingTypeEvent = IoTCoreThingTypeEvent(**raw_event) + + assert parsed_event.event_id == raw_event["eventId"] + assert parsed_event.event_type == raw_event["eventType"] + convert_time = int(round(parsed_event.timestamp.timestamp() * 1000)) + assert convert_time == raw_event["timestamp"] + assert parsed_event.operation == raw_event["operation"] + assert parsed_event.account_id == raw_event["accountId"] + assert parsed_event.thing_type_id == raw_event["thingTypeId"] + assert parsed_event.thing_type_name == raw_event["thingTypeName"] + assert parsed_event.is_deprecated == raw_event["isDeprecated"] + assert parsed_event.deprecation_date == raw_event["deprecationDate"] + assert parsed_event.searchable_attributes == raw_event["searchableAttributes"] + assert parsed_event.propagating_attributes == raw_event["propagatingAttributes"] + assert parsed_event.description == raw_event["description"] + + +def test_iot_core_thing_type_association_event(): + raw_event = load_event("iotRegistryEventsThingTypeAssociationEvent.json") + parsed_event: IoTCoreThingTypeAssociationEvent = IoTCoreThingTypeAssociationEvent(**raw_event) + + assert parsed_event.event_id == raw_event["eventId"] + assert parsed_event.event_type == raw_event["eventType"] + convert_time = int(round(parsed_event.timestamp.timestamp() * 1000)) + assert convert_time == raw_event["timestamp"] + assert parsed_event.operation == raw_event["operation"] + assert parsed_event.thing_id == raw_event["thingId"] + assert parsed_event.thing_name == raw_event["thingName"] + assert parsed_event.thing_type_name == raw_event["thingTypeName"] + + +def test_iot_core_thing_group_event(): + + raw_event = load_event("iotRegistryEventsThingGroupEvent.json") + parsed_event: IoTCoreThingGroupEvent = IoTCoreThingGroupEvent(**raw_event) + + assert parsed_event.event_id == raw_event["eventId"] + assert parsed_event.event_type == raw_event["eventType"] + convert_time = int(round(parsed_event.timestamp.timestamp() * 1000)) + assert convert_time == raw_event["timestamp"] + assert parsed_event.operation == raw_event["operation"] + assert parsed_event.account_id == raw_event["accountId"] + assert parsed_event.thing_group_name == raw_event["thingGroupName"] + assert parsed_event.version_number == raw_event["versionNumber"] + assert parsed_event.parent_group_name == raw_event["parentGroupName"] + assert parsed_event.parent_group_id == raw_event["parentGroupId"] + assert parsed_event.description == raw_event["description"] + assert parsed_event.root_to_parent_thing_groups == raw_event["rootToParentThingGroups"] + assert parsed_event.attributes == raw_event["attributes"] + assert parsed_event.dynamic_group_mapping_id == raw_event["dynamicGroupMappingId"] + + +def test_iot_core_add_or_remove_from_thing_group_event(): + + raw_event = load_event("iotRegistryEventsAddOrRemoveFromThingGroupEvent.json") + parsed_event: IoTCoreAddOrRemoveFromThingGroupEvent = IoTCoreAddOrRemoveFromThingGroupEvent(**raw_event) + + assert parsed_event.event_id == raw_event["eventId"] + assert parsed_event.event_type == raw_event["eventType"] + convert_time = int(round(parsed_event.timestamp.timestamp() * 1000)) + assert convert_time == raw_event["timestamp"] + assert parsed_event.operation == raw_event["operation"] + assert parsed_event.account_id == raw_event["accountId"] + assert parsed_event.group_arn == raw_event["groupArn"] + assert parsed_event.group_id == raw_event["groupId"] + assert parsed_event.thing_arn == raw_event["thingArn"] + assert parsed_event.thing_id == raw_event["thingId"] + assert parsed_event.membership_id == raw_event["membershipId"] + + +def test_iot_core_add_or_delete_from_thing_group_event(): + + raw_event = load_event("iotRegistryEventsAddOrDeleteFromThingGroupEvent.json") + parsed_event: IoTCoreAddOrDeleteFromThingGroupEvent = IoTCoreAddOrDeleteFromThingGroupEvent(**raw_event) + + assert parsed_event.event_id == raw_event["eventId"] + assert parsed_event.event_type == raw_event["eventType"] + convert_time = int(round(parsed_event.timestamp.timestamp() * 1000)) + assert convert_time == raw_event["timestamp"] + assert parsed_event.operation == raw_event["operation"] + assert parsed_event.account_id == raw_event["accountId"] + assert parsed_event.thing_group_id == raw_event["thingGroupId"] + assert parsed_event.thing_group_name == raw_event["thingGroupName"] + assert parsed_event.child_group_id == raw_event["childGroupId"] + assert parsed_event.child_group_name == raw_event["childGroupName"] From 7068d1aeddbf779aeaa4e9e11319977aae358edd Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Fri, 14 Feb 2025 10:46:16 +0000 Subject: [PATCH 28/28] Moving JSON events to events folder --- tests/events/codePipelineEventWithEncryptionKey.json | 2 +- .../functional/parameters/_boto3/test_utilities_parameters.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/events/codePipelineEventWithEncryptionKey.json b/tests/events/codePipelineEventWithEncryptionKey.json index e4a8528e148..46b75536c41 100644 --- a/tests/events/codePipelineEventWithEncryptionKey.json +++ b/tests/events/codePipelineEventWithEncryptionKey.json @@ -30,7 +30,7 @@ }, "continuationToken": "A continuation token if continuing job", "encryptionKey": { - "id": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "id": "validkmskey", "type": "KMS" } } diff --git a/tests/functional/parameters/_boto3/test_utilities_parameters.py b/tests/functional/parameters/_boto3/test_utilities_parameters.py index fc4d869472e..42f654cbd1e 100644 --- a/tests/functional/parameters/_boto3/test_utilities_parameters.py +++ b/tests/functional/parameters/_boto3/test_utilities_parameters.py @@ -617,7 +617,7 @@ def test_ssm_provider_set_parameter_with_custom_options(monkeypatch, mock_name, "Overwrite": True, "Tier": "Advanced", "Description": "Parameter", - "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyId": "validkmskey", } stubber.add_response("put_parameter", response, expected_params) stubber.activate() @@ -631,7 +631,7 @@ def test_ssm_provider_set_parameter_with_custom_options(monkeypatch, mock_name, parameter_type="SecureString", overwrite=True, description="Parameter", - kms_key_id="arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + kms_key_id="validkmskey", ) assert version == response