Skip to content

Commit 385f1d7

Browse files
author
Astraea Quinn S
authored
[Chore] Model updates (#66)
- Updates InvokeOptions -> ChainedInvokeOptions - Invoke<Status>Details -> ChainedInvoke<Status>Details This pr matches the changes done in aws/aws-durable-execution-sdk-python#67
1 parent 48eae39 commit 385f1d7

File tree

17 files changed

+225
-199
lines changed

17 files changed

+225
-199
lines changed

src/aws_durable_execution_sdk_python_testing/checkpoint/processors/base.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88

99
from aws_durable_execution_sdk_python.lambda_service import (
1010
CallbackDetails,
11+
ChainedInvokeDetails,
1112
ContextDetails,
1213
ExecutionDetails,
13-
InvokeDetails,
1414
Operation,
1515
OperationStatus,
1616
OperationType,
@@ -105,16 +105,15 @@ def _create_callback_details(
105105
else None
106106
)
107107

108-
def _create_invoke_details(self, update: OperationUpdate) -> InvokeDetails | None:
109-
"""Create InvokeDetails from OperationUpdate."""
110-
if update.operation_type == OperationType.INVOKE and update.invoke_options:
111-
# Create a basic ARN using the function name
112-
# In a real implementation, this would need more context about the execution
113-
# TODO: To confirm how or if this works
114-
arn = f"arn:aws:lambda:us-west-2:123456789012:durable-execution:{update.invoke_options.function_name}:execution-name"
115-
return InvokeDetails(
116-
durable_execution_arn=arn, result=update.payload, error=update.error
117-
)
108+
def _create_invoke_details(
109+
self, update: OperationUpdate
110+
) -> ChainedInvokeDetails | None:
111+
"""Create ChainedInvokeDetails from OperationUpdate."""
112+
if (
113+
update.operation_type == OperationType.CHAINED_INVOKE
114+
and update.chained_invoke_options
115+
):
116+
return ChainedInvokeDetails(result=update.payload, error=update.error)
118117
return None
119118

120119
def _create_wait_details(
@@ -165,6 +164,6 @@ def _translate_update_to_operation(
165164
context_details=context_details,
166165
step_details=step_details,
167166
callback_details=callback_details,
168-
invoke_details=invoke_details,
167+
chained_invoke_details=invoke_details,
169168
wait_details=wait_details,
170169
)

src/aws_durable_execution_sdk_python_testing/checkpoint/processors/step.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@ def process(
9494
callback_details=current_op.callback_details
9595
if current_op
9696
else None,
97-
invoke_details=current_op.invoke_details if current_op else None,
97+
chained_invoke_details=current_op.chained_invoke_details
98+
if current_op
99+
else None,
98100
)
99101

100102
# Schedule step retry timer to fire after delay

src/aws_durable_execution_sdk_python_testing/checkpoint/processors/wait.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def process(
6363
step_details=None,
6464
wait_details=wait_details,
6565
callback_details=None,
66-
invoke_details=None,
66+
chained_invoke_details=None,
6767
)
6868

6969
# Schedule wait timer to complete after delay

src/aws_durable_execution_sdk_python_testing/checkpoint/validators/checkpoint.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
ExecutionOperationValidator,
2121
)
2222
from aws_durable_execution_sdk_python_testing.checkpoint.validators.operations.invoke import (
23-
InvokeOperationValidator,
23+
ChainedInvokeOperationValidator,
2424
)
2525
from aws_durable_execution_sdk_python_testing.checkpoint.validators.operations.step import (
2626
StepOperationValidator,
@@ -118,8 +118,8 @@ def _validate_operation_status_transition(
118118
WaitOperationValidator.validate(current_state, update)
119119
case OperationType.CALLBACK:
120120
CallbackOperationValidator.validate(current_state, update)
121-
case OperationType.INVOKE:
122-
InvokeOperationValidator.validate(current_state, update)
121+
case OperationType.CHAINED_INVOKE:
122+
ChainedInvokeOperationValidator.validate(current_state, update)
123123
case OperationType.EXECUTION:
124124
ExecutionOperationValidator.validate(update)
125125
case _: # pragma: no cover

src/aws_durable_execution_sdk_python_testing/checkpoint/validators/operations/invoke.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
)
2323

2424

25-
class InvokeOperationValidator:
25+
class ChainedInvokeOperationValidator:
2626
"""Validates INVOKE operation transitions."""
2727

2828
_ALLOWED_STATUS_TO_CANCEL = frozenset(
@@ -46,7 +46,7 @@ def validate(current_state: Operation | None, update: OperationUpdate) -> None:
4646
if (
4747
current_state is None
4848
or current_state.status
49-
not in InvokeOperationValidator._ALLOWED_STATUS_TO_CANCEL
49+
not in ChainedInvokeOperationValidator._ALLOWED_STATUS_TO_CANCEL
5050
):
5151
msg_invoke_cancel: str = "Cannot cancel an INVOKE that does not exist or has already completed."
5252
raise InvalidParameterValueException(msg_invoke_cancel)

src/aws_durable_execution_sdk_python_testing/checkpoint/validators/transitions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class ValidActionsByOperationTypeValidator:
4242
OperationType.CONTEXT: VALID_ACTIONS_FOR_CONTEXT,
4343
OperationType.WAIT: VALID_ACTIONS_FOR_WAIT,
4444
OperationType.CALLBACK: VALID_ACTIONS_FOR_CALLBACK,
45-
OperationType.INVOKE: VALID_ACTIONS_FOR_INVOKE,
45+
OperationType.CHAINED_INVOKE: VALID_ACTIONS_FOR_INVOKE,
4646
OperationType.EXECUTION: VALID_ACTIONS_FOR_EXECUTION,
4747
}
4848

src/aws_durable_execution_sdk_python_testing/execution.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,11 @@ def has_pending_operations(self, execution: Execution) -> bool:
173173
and operation.status == OperationStatus.PENDING
174174
) or (
175175
operation.operation_type
176-
in [OperationType.WAIT, OperationType.CALLBACK, OperationType.INVOKE]
176+
in [
177+
OperationType.WAIT,
178+
OperationType.CALLBACK,
179+
OperationType.CHAINED_INVOKE,
180+
]
177181
and operation.status == OperationStatus.STARTED
178182
):
179183
return True

src/aws_durable_execution_sdk_python_testing/model.py

Lines changed: 70 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
# Import existing types from the main SDK - REUSE EVERYTHING POSSIBLE
99
from aws_durable_execution_sdk_python.lambda_service import (
1010
CallbackOptions,
11+
ChainedInvokeOptions,
1112
ContextOptions,
1213
ErrorObject,
13-
InvokeOptions,
1414
Operation,
1515
OperationAction,
1616
OperationSubType,
@@ -801,15 +801,15 @@ def to_dict(self) -> dict[str, Any]:
801801

802802

803803
@dataclass(frozen=True)
804-
class InvokeStartedDetails:
804+
class ChainedInvokeStartedDetails:
805805
"""Invoke started event details."""
806806

807807
input: EventInput | None = None
808808
function_arn: str | None = None
809809
durable_execution_arn: str | None = None
810810

811811
@classmethod
812-
def from_dict(cls, data: dict) -> InvokeStartedDetails:
812+
def from_dict(cls, data: dict) -> ChainedInvokeStartedDetails:
813813
input_data = None
814814
if input_dict := data.get("Input"):
815815
input_data = EventInput.from_dict(input_dict)
@@ -832,13 +832,13 @@ def to_dict(self) -> dict[str, Any]:
832832

833833

834834
@dataclass(frozen=True)
835-
class InvokeSucceededDetails:
835+
class ChainedInvokeSucceededDetails:
836836
"""Invoke succeeded event details."""
837837

838838
result: EventResult | None = None
839839

840840
@classmethod
841-
def from_dict(cls, data: dict) -> InvokeSucceededDetails:
841+
def from_dict(cls, data: dict) -> ChainedInvokeSucceededDetails:
842842
result_data = None
843843
if result_dict := data.get("Result"):
844844
result_data = EventResult.from_dict(result_dict)
@@ -853,13 +853,13 @@ def to_dict(self) -> dict[str, Any]:
853853

854854

855855
@dataclass(frozen=True)
856-
class InvokeFailedDetails:
856+
class ChainedInvokeFailedDetails:
857857
"""Invoke failed event details."""
858858

859859
error: EventError | None = None
860860

861861
@classmethod
862-
def from_dict(cls, data: dict) -> InvokeFailedDetails:
862+
def from_dict(cls, data: dict) -> ChainedInvokeFailedDetails:
863863
error_data = None
864864
if error_dict := data.get("Error"):
865865
error_data = EventError.from_dict(error_dict)
@@ -874,13 +874,13 @@ def to_dict(self) -> dict[str, Any]:
874874

875875

876876
@dataclass(frozen=True)
877-
class InvokeTimedOutDetails:
877+
class ChainedInvokeTimedOutDetails:
878878
"""Invoke timed out event details."""
879879

880880
error: EventError | None = None
881881

882882
@classmethod
883-
def from_dict(cls, data: dict) -> InvokeTimedOutDetails:
883+
def from_dict(cls, data: dict) -> ChainedInvokeTimedOutDetails:
884884
error_data = None
885885
if error_dict := data.get("Error"):
886886
error_data = EventError.from_dict(error_dict)
@@ -895,13 +895,13 @@ def to_dict(self) -> dict[str, Any]:
895895

896896

897897
@dataclass(frozen=True)
898-
class InvokeStoppedDetails:
898+
class ChainedInvokeStoppedDetails:
899899
"""Invoke stopped event details."""
900900

901901
error: EventError | None = None
902902

903903
@classmethod
904-
def from_dict(cls, data: dict) -> InvokeStoppedDetails:
904+
def from_dict(cls, data: dict) -> ChainedInvokeStoppedDetails:
905905
error_data = None
906906
if error_dict := data.get("Error"):
907907
error_data = EventError.from_dict(error_dict)
@@ -1030,11 +1030,11 @@ class Event:
10301030
step_started_details: StepStartedDetails | None = None
10311031
step_succeeded_details: StepSucceededDetails | None = None
10321032
step_failed_details: StepFailedDetails | None = None
1033-
invoke_started_details: InvokeStartedDetails | None = None
1034-
invoke_succeeded_details: InvokeSucceededDetails | None = None
1035-
invoke_failed_details: InvokeFailedDetails | None = None
1036-
invoke_timed_out_details: InvokeTimedOutDetails | None = None
1037-
invoke_stopped_details: InvokeStoppedDetails | None = None
1033+
chained_invoke_started_details: ChainedInvokeStartedDetails | None = None
1034+
chained_invoke_succeeded_details: ChainedInvokeSucceededDetails | None = None
1035+
chained_invoke_failed_details: ChainedInvokeFailedDetails | None = None
1036+
chained_invoke_timed_out_details: ChainedInvokeTimedOutDetails | None = None
1037+
chained_invoke_stopped_details: ChainedInvokeStoppedDetails | None = None
10381038
callback_started_details: CallbackStartedDetails | None = None
10391039
callback_succeeded_details: CallbackSucceededDetails | None = None
10401040
callback_failed_details: CallbackFailedDetails | None = None
@@ -1103,25 +1103,35 @@ def from_dict(cls, data: dict) -> Event:
11031103
if details_data := data.get("StepFailedDetails"):
11041104
step_failed_details = StepFailedDetails.from_dict(details_data)
11051105

1106-
invoke_started_details = None
1107-
if details_data := data.get("InvokeStartedDetails"):
1108-
invoke_started_details = InvokeStartedDetails.from_dict(details_data)
1106+
chained_invoke_started_details = None
1107+
if details_data := data.get("ChainedInvokeStartedDetails"):
1108+
chained_invoke_started_details = ChainedInvokeStartedDetails.from_dict(
1109+
details_data
1110+
)
11091111

1110-
invoke_succeeded_details = None
1111-
if details_data := data.get("InvokeSucceededDetails"):
1112-
invoke_succeeded_details = InvokeSucceededDetails.from_dict(details_data)
1112+
chained_invoke_succeeded_details = None
1113+
if details_data := data.get("ChainedInvokeSucceededDetails"):
1114+
chained_invoke_succeeded_details = ChainedInvokeSucceededDetails.from_dict(
1115+
details_data
1116+
)
11131117

1114-
invoke_failed_details = None
1115-
if details_data := data.get("InvokeFailedDetails"):
1116-
invoke_failed_details = InvokeFailedDetails.from_dict(details_data)
1118+
chained_invoke_failed_details = None
1119+
if details_data := data.get("ChainedInvokeFailedDetails"):
1120+
chained_invoke_failed_details = ChainedInvokeFailedDetails.from_dict(
1121+
details_data
1122+
)
11171123

1118-
invoke_timed_out_details = None
1119-
if details_data := data.get("InvokeTimedOutDetails"):
1120-
invoke_timed_out_details = InvokeTimedOutDetails.from_dict(details_data)
1124+
chained_invoke_timed_out_details = None
1125+
if details_data := data.get("ChainedInvokeTimedOutDetails"):
1126+
chained_invoke_timed_out_details = ChainedInvokeTimedOutDetails.from_dict(
1127+
details_data
1128+
)
11211129

1122-
invoke_stopped_details = None
1123-
if details_data := data.get("InvokeStoppedDetails"):
1124-
invoke_stopped_details = InvokeStoppedDetails.from_dict(details_data)
1130+
chained_invoke_stopped_details = None
1131+
if details_data := data.get("ChainedInvokeStoppedDetails"):
1132+
chained_invoke_stopped_details = ChainedInvokeStoppedDetails.from_dict(
1133+
details_data
1134+
)
11251135

11261136
callback_started_details = None
11271137
if details_data := data.get("CallbackStartedDetails"):
@@ -1163,11 +1173,11 @@ def from_dict(cls, data: dict) -> Event:
11631173
step_started_details=step_started_details,
11641174
step_succeeded_details=step_succeeded_details,
11651175
step_failed_details=step_failed_details,
1166-
invoke_started_details=invoke_started_details,
1167-
invoke_succeeded_details=invoke_succeeded_details,
1168-
invoke_failed_details=invoke_failed_details,
1169-
invoke_timed_out_details=invoke_timed_out_details,
1170-
invoke_stopped_details=invoke_stopped_details,
1176+
chained_invoke_started_details=chained_invoke_started_details,
1177+
chained_invoke_succeeded_details=chained_invoke_succeeded_details,
1178+
chained_invoke_failed_details=chained_invoke_failed_details,
1179+
chained_invoke_timed_out_details=chained_invoke_timed_out_details,
1180+
chained_invoke_stopped_details=chained_invoke_stopped_details,
11711181
callback_started_details=callback_started_details,
11721182
callback_succeeded_details=callback_succeeded_details,
11731183
callback_failed_details=callback_failed_details,
@@ -1220,16 +1230,26 @@ def to_dict(self) -> dict[str, Any]:
12201230
result["StepSucceededDetails"] = self.step_succeeded_details.to_dict()
12211231
if self.step_failed_details is not None:
12221232
result["StepFailedDetails"] = self.step_failed_details.to_dict()
1223-
if self.invoke_started_details is not None:
1224-
result["InvokeStartedDetails"] = self.invoke_started_details.to_dict()
1225-
if self.invoke_succeeded_details is not None:
1226-
result["InvokeSucceededDetails"] = self.invoke_succeeded_details.to_dict()
1227-
if self.invoke_failed_details is not None:
1228-
result["InvokeFailedDetails"] = self.invoke_failed_details.to_dict()
1229-
if self.invoke_timed_out_details is not None:
1230-
result["InvokeTimedOutDetails"] = self.invoke_timed_out_details.to_dict()
1231-
if self.invoke_stopped_details is not None:
1232-
result["InvokeStoppedDetails"] = self.invoke_stopped_details.to_dict()
1233+
if self.chained_invoke_started_details is not None:
1234+
result["ChainedInvokeStartedDetails"] = (
1235+
self.chained_invoke_started_details.to_dict()
1236+
)
1237+
if self.chained_invoke_succeeded_details is not None:
1238+
result["ChainedInvokeSucceededDetails"] = (
1239+
self.chained_invoke_succeeded_details.to_dict()
1240+
)
1241+
if self.chained_invoke_failed_details is not None:
1242+
result["ChainedInvokeFailedDetails"] = (
1243+
self.chained_invoke_failed_details.to_dict()
1244+
)
1245+
if self.chained_invoke_timed_out_details is not None:
1246+
result["ChainedInvokeTimedOutDetails"] = (
1247+
self.chained_invoke_timed_out_details.to_dict()
1248+
)
1249+
if self.chained_invoke_stopped_details is not None:
1250+
result["ChainedInvokeStoppedDetails"] = (
1251+
self.chained_invoke_stopped_details.to_dict()
1252+
)
12331253
if self.callback_started_details is not None:
12341254
result["CallbackStartedDetails"] = self.callback_started_details.to_dict()
12351255
if self.callback_succeeded_details is not None:
@@ -1522,8 +1542,10 @@ def from_dict(
15221542
callback_options=CallbackOptions(**update_data["CallbackOptions"])
15231543
if update_data.get("CallbackOptions")
15241544
else None,
1525-
invoke_options=InvokeOptions(**update_data["InvokeOptions"])
1526-
if update_data.get("InvokeOptions")
1545+
chained_invoke_options=ChainedInvokeOptions(
1546+
**update_data["ChainedInvokeOptions"]
1547+
)
1548+
if update_data.get("ChainedInvokeOptions")
15271549
else None,
15281550
)
15291551
updates.append(operation_update)

0 commit comments

Comments
 (0)