Skip to content

Commit 3e51667

Browse files
author
Astraea Quinn S
authored
Merge branch 'main' into fix-stop-invoke
2 parents 8a16b2c + fbd96b9 commit 3e51667

8 files changed

Lines changed: 187 additions & 187 deletions

File tree

src/aws_durable_execution_sdk_python/botocore/data/lambdainternal-local/2015-03-31/service-2.json

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7321,10 +7321,9 @@
73217321
"Error":{"shape":"EventError"}
73227322
}
73237323
},
7324-
"InvokeDetails":{
7324+
"ChainedInvokeDetails":{
73257325
"type":"structure",
73267326
"members":{
7327-
"DurableExecutionArn":{"shape":"DurableExecutionArn"},
73287327
"Result":{"shape":"OperationPayload"},
73297328
"Error":{"shape":"ErrorObject"}
73307329
}
@@ -7343,12 +7342,11 @@
73437342
"RESPONSE_STREAM"
73447343
]
73457344
},
7346-
"InvokeOptions":{
7345+
"ChainedInvokeOptions":{
73477346
"type":"structure",
73487347
"members":{
73497348
"FunctionName":{"shape":"FunctionName"},
7350-
"FunctionQualifier":{"shape":"Version"},
7351-
"DurableExecutionName":{"shape":"DurableExecutionName"}
7349+
"TimeoutSeconds":{"shape":"DurationSeconds"}
73527350
}
73537351
},
73547352
"InvokeResponseStreamUpdate":{
@@ -9332,7 +9330,7 @@
93329330
"StepDetails":{"shape":"StepDetails"},
93339331
"WaitDetails":{"shape":"WaitDetails"},
93349332
"CallbackDetails":{"shape":"CallbackDetails"},
9335-
"InvokeDetails":{"shape":"InvokeDetails"}
9333+
"ChainedInvokeDetails":{"shape":"ChainedInvokeDetails"}
93369334
}
93379335
},
93389336
"OperationAction":{
@@ -9387,7 +9385,7 @@
93879385
"STEP",
93889386
"WAIT",
93899387
"CALLBACK",
9390-
"INVOKE"
9388+
"CHAINED_INVOKE"
93919389
]
93929390
},
93939391
"OperationUpdate":{
@@ -9405,7 +9403,7 @@
94059403
"StepOptions":{"shape":"StepOptions"},
94069404
"WaitOptions":{"shape":"WaitOptions"},
94079405
"CallbackOptions":{"shape":"CallbackOptions"},
9408-
"InvokeOptions":{"shape":"InvokeOptions"}
9406+
"ChainedInvokeOptions":{"shape":"ChainedInvokeOptions"}
94099407
}
94109408
},
94119409
"OperationUpdates":{

src/aws_durable_execution_sdk_python/botocore/data/lambdainternal/2015-03-31/service-2.json

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7320,10 +7320,9 @@
73207320
"Error":{"shape":"EventError"}
73217321
}
73227322
},
7323-
"InvokeDetails":{
7323+
"ChainedInvokeDetails":{
73247324
"type":"structure",
73257325
"members":{
7326-
"DurableExecutionArn":{"shape":"DurableExecutionArn"},
73277326
"Result":{"shape":"OperationPayload"},
73287327
"Error":{"shape":"ErrorObject"}
73297328
}
@@ -7342,12 +7341,11 @@
73427341
"RESPONSE_STREAM"
73437342
]
73447343
},
7345-
"InvokeOptions":{
7344+
"ChainedInvokeOptions":{
73467345
"type":"structure",
73477346
"members":{
73487347
"FunctionName":{"shape":"FunctionName"},
7349-
"FunctionQualifier":{"shape":"Version"},
7350-
"DurableExecutionName":{"shape":"DurableExecutionName"}
7348+
"TimeoutSeconds":{"shape":"DurationSeconds"}
73517349
}
73527350
},
73537351
"InvokeResponseStreamUpdate":{
@@ -9331,7 +9329,7 @@
93319329
"StepDetails":{"shape":"StepDetails"},
93329330
"WaitDetails":{"shape":"WaitDetails"},
93339331
"CallbackDetails":{"shape":"CallbackDetails"},
9334-
"InvokeDetails":{"shape":"InvokeDetails"}
9332+
"ChainedInvokeDetails":{"shape":"ChainedInvokeDetails"}
93359333
}
93369334
},
93379335
"OperationAction":{
@@ -9386,7 +9384,7 @@
93869384
"STEP",
93879385
"WAIT",
93889386
"CALLBACK",
9389-
"INVOKE"
9387+
"CHAINED_INVOKE"
93909388
]
93919389
},
93929390
"OperationUpdate":{
@@ -9404,7 +9402,7 @@
94049402
"StepOptions":{"shape":"StepOptions"},
94059403
"WaitOptions":{"shape":"WaitOptions"},
94069404
"CallbackOptions":{"shape":"CallbackOptions"},
9407-
"InvokeOptions":{"shape":"InvokeOptions"}
9405+
"ChainedInvokeOptions":{"shape":"ChainedInvokeOptions"}
94089406
}
94099407
},
94109408
"OperationUpdates":{

src/aws_durable_execution_sdk_python/lambda_service.py

Lines changed: 60 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222

2323
logger = logging.getLogger(__name__)
2424

25+
type ReplayChildren = bool
26+
type OperationPayload = str
27+
type TimeoutSeconds = int
28+
2529

2630
# region model
2731
class OperationAction(Enum):
@@ -49,7 +53,24 @@ class OperationType(Enum):
4953
STEP = "STEP"
5054
WAIT = "WAIT"
5155
CALLBACK = "CALLBACK"
52-
INVOKE = "INVOKE"
56+
CHAINED_INVOKE = "CHAINED_INVOKE"
57+
58+
59+
class CallbackTimeoutType(Enum):
60+
TIMEOUT = "Callback.Timeout"
61+
HEARTBEAT = "Callback.Heartbeat"
62+
63+
64+
class ChainedInvokeFailedToStartType(Enum):
65+
FAILED_TO_START = "ChainedInvoke.FailedToStart"
66+
67+
68+
class ChainedInvokeTimeoutType(Enum):
69+
TIMEOUT = "ChainedInvoke.Timeout"
70+
71+
72+
class ChainedInvokeStopType(Enum):
73+
STOPPED = "ChainedInvoke.Stopped"
5374

5475

5576
class OperationSubType(Enum):
@@ -77,8 +98,8 @@ def from_dict(cls, data: MutableMapping[str, Any]) -> ExecutionDetails:
7798

7899
@dataclass(frozen=True)
79100
class ContextDetails:
80-
replay_children: bool = False
81-
result: str | None = None
101+
replay_children: ReplayChildren = False
102+
result: OperationPayload | None = None
82103
error: ErrorObject | None = None
83104

84105
@classmethod
@@ -150,7 +171,7 @@ def to_callable_runtime_error(self) -> CallableRuntimeError:
150171
class StepDetails:
151172
attempt: int = 0
152173
next_attempt_timestamp: datetime.datetime | None = None
153-
result: str | None = None
174+
result: OperationPayload | None = None
154175
error: ErrorObject | None = None
155176

156177
@classmethod
@@ -190,16 +211,14 @@ def from_dict(cls, data: MutableMapping[str, Any]) -> CallbackDetails:
190211

191212

192213
@dataclass(frozen=True)
193-
class InvokeDetails:
194-
durable_execution_arn: str
214+
class ChainedInvokeDetails:
195215
result: str | None = None
196216
error: ErrorObject | None = None
197217

198218
@classmethod
199-
def from_dict(cls, data: MutableMapping[str, Any]) -> InvokeDetails:
219+
def from_dict(cls, data: MutableMapping[str, Any]) -> ChainedInvokeDetails:
200220
error_raw = data.get("Error")
201221
return cls(
202-
durable_execution_arn=data["DurableExecutionArn"],
203222
result=data.get("Result"),
204223
error=ErrorObject.from_dict(error_raw) if error_raw else None,
205224
)
@@ -233,7 +252,7 @@ def to_dict(self) -> MutableMapping[str, Any]:
233252

234253
@dataclass(frozen=True)
235254
class CallbackOptions:
236-
timeout_seconds: int = 0
255+
timeout_seconds: TimeoutSeconds = 0
237256
heartbeat_timeout_seconds: int = 0
238257

239258
@classmethod
@@ -251,26 +270,28 @@ def to_dict(self) -> MutableMapping[str, Any]:
251270

252271

253272
@dataclass(frozen=True)
254-
class InvokeOptions:
273+
class ChainedInvokeOptions:
255274
function_name: str
256-
timeout_seconds: int = 0
275+
timeout_seconds: TimeoutSeconds = 0
257276

258277
@classmethod
259-
def from_dict(cls, data: MutableMapping[str, Any]) -> InvokeOptions:
278+
def from_dict(cls, data: MutableMapping[str, Any]) -> ChainedInvokeOptions:
260279
return cls(
261280
function_name=data["FunctionName"],
262281
timeout_seconds=data.get("TimeoutSeconds", 0),
263282
)
264283

265284
def to_dict(self) -> MutableMapping[str, Any]:
266-
result: MutableMapping[str, Any] = {"FunctionName": self.function_name}
267-
result["TimeoutSeconds"] = self.timeout_seconds
285+
result: MutableMapping[str, Any] = {
286+
"FunctionName": self.function_name,
287+
"TimeoutSeconds": self.timeout_seconds,
288+
}
268289
return result
269290

270291

271292
@dataclass(frozen=True)
272293
class ContextOptions:
273-
replay_children: bool = False
294+
replay_children: ReplayChildren = False
274295

275296
@classmethod
276297
def from_dict(cls, data: MutableMapping[str, Any]) -> ContextOptions:
@@ -299,7 +320,7 @@ class OperationUpdate:
299320
step_options: StepOptions | None = None
300321
wait_options: WaitOptions | None = None
301322
callback_options: CallbackOptions | None = None
302-
invoke_options: InvokeOptions | None = None
323+
chained_invoke_options: ChainedInvokeOptions | None = None
303324

304325
def to_dict(self) -> MutableMapping[str, Any]:
305326
result: MutableMapping[str, Any] = {
@@ -326,8 +347,8 @@ def to_dict(self) -> MutableMapping[str, Any]:
326347
result["WaitOptions"] = self.wait_options.to_dict()
327348
if self.callback_options:
328349
result["CallbackOptions"] = self.callback_options.to_dict()
329-
if self.invoke_options:
330-
result["InvokeOptions"] = self.invoke_options.to_dict()
350+
if self.chained_invoke_options:
351+
result["ChainedInvokeOptions"] = self.chained_invoke_options.to_dict()
331352

332353
return result
333354

@@ -352,9 +373,9 @@ def from_dict(cls, data: MutableMapping[str, Any]) -> OperationUpdate:
352373
if callback_data := data.get("CallbackOptions"):
353374
callback_options = CallbackOptions.from_dict(callback_data)
354375

355-
invoke_options = None
356-
if invoke_data := data.get("InvokeOptions"):
357-
invoke_options = InvokeOptions.from_dict(invoke_data)
376+
chained_invoke_options = None
377+
if invoke_data := data.get("ChainedInvokeOptions"):
378+
chained_invoke_options = ChainedInvokeOptions.from_dict(invoke_data)
358379

359380
return cls(
360381
operation_id=data["Id"],
@@ -369,7 +390,7 @@ def from_dict(cls, data: MutableMapping[str, Any]) -> OperationUpdate:
369390
step_options=step_options,
370391
wait_options=wait_options,
371392
callback_options=callback_options,
372-
invoke_options=invoke_options,
393+
chained_invoke_options=chained_invoke_options,
373394
)
374395

375396
@classmethod
@@ -537,18 +558,18 @@ def create_invoke_start(
537558
cls,
538559
identifier: OperationIdentifier,
539560
payload: str,
540-
invoke_options: InvokeOptions,
561+
chained_invoke_options: ChainedInvokeOptions,
541562
) -> OperationUpdate:
542563
"""Create an instance of OperationUpdate for type: INVOKE, action: START."""
543564
return cls(
544565
operation_id=identifier.operation_id,
545566
parent_id=identifier.parent_id,
546-
operation_type=OperationType.INVOKE,
567+
operation_type=OperationType.CHAINED_INVOKE,
547568
sub_type=OperationSubType.INVOKE,
548569
action=OperationAction.START,
549570
name=identifier.name,
550571
payload=payload,
551-
invoke_options=invoke_options,
572+
chained_invoke_options=chained_invoke_options,
552573
)
553574

554575
# endregion invoke
@@ -657,7 +678,7 @@ class Operation:
657678
step_details: StepDetails | None = None
658679
wait_details: WaitDetails | None = None
659680
callback_details: CallbackDetails | None = None
660-
invoke_details: InvokeDetails | None = None
681+
chained_invoke_details: ChainedInvokeDetails | None = None
661682

662683
@classmethod
663684
def from_dict(cls, data: MutableMapping[str, Any]) -> Operation:
@@ -696,9 +717,11 @@ def from_dict(cls, data: MutableMapping[str, Any]) -> Operation:
696717
if callback_details_input := data.get("CallbackDetails"):
697718
callback_details = CallbackDetails.from_dict(callback_details_input)
698719

699-
invoke_details = None
700-
if invoke_details_input := data.get("InvokeDetails"):
701-
invoke_details = InvokeDetails.from_dict(invoke_details_input)
720+
chained_invoke_details = None
721+
if chained_invoke_details := data.get("chained_invoke_details"):
722+
chained_invoke_details = ChainedInvokeDetails.from_dict(
723+
chained_invoke_details
724+
)
702725

703726
return cls(
704727
operation_id=data["Id"],
@@ -714,7 +737,7 @@ def from_dict(cls, data: MutableMapping[str, Any]) -> Operation:
714737
step_details=step_details,
715738
wait_details=wait_details,
716739
callback_details=callback_details,
717-
invoke_details=invoke_details,
740+
chained_invoke_details=chained_invoke_details,
718741
)
719742

720743
def to_dict(self) -> MutableMapping[str, Any]:
@@ -763,15 +786,13 @@ def to_dict(self) -> MutableMapping[str, Any]:
763786
if self.callback_details.error:
764787
callback_dict["Error"] = self.callback_details.error.to_dict()
765788
result["CallbackDetails"] = callback_dict
766-
if self.invoke_details:
767-
invoke_dict: MutableMapping[str, Any] = {
768-
"DurableExecutionArn": self.invoke_details.durable_execution_arn
769-
}
770-
if self.invoke_details.result:
771-
invoke_dict["Result"] = self.invoke_details.result
772-
if self.invoke_details.error:
773-
invoke_dict["Error"] = self.invoke_details.error.to_dict()
774-
result["InvokeDetails"] = invoke_dict
789+
if self.chained_invoke_details:
790+
invoke_dict: MutableMapping[str, Any] = {}
791+
if self.chained_invoke_details.result:
792+
invoke_dict["Result"] = self.chained_invoke_details.result
793+
if self.chained_invoke_details.error:
794+
invoke_dict["Error"] = self.chained_invoke_details.error.to_dict()
795+
result["ChainedInvokeDetails"] = invoke_dict
775796
return result
776797

777798

src/aws_durable_execution_sdk_python/operation/invoke.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
FatalError,
1111
)
1212
from aws_durable_execution_sdk_python.lambda_service import (
13-
InvokeOptions,
13+
ChainedInvokeOptions,
1414
OperationUpdate,
1515
)
1616
from aws_durable_execution_sdk_python.serdes import deserialize, serialize
@@ -50,12 +50,12 @@ def invoke_handler(
5050
# Return persisted result - no need to check for errors in successful operations
5151
if (
5252
checkpointed_result.operation
53-
and checkpointed_result.operation.invoke_details
54-
and checkpointed_result.operation.invoke_details.result
53+
and checkpointed_result.operation.chained_invoke_details
54+
and checkpointed_result.operation.chained_invoke_details.result
5555
):
5656
return deserialize(
5757
serdes=config.serdes_result,
58-
data=checkpointed_result.operation.invoke_details.result,
58+
data=checkpointed_result.operation.chained_invoke_details.result,
5959
operation_id=operation_identifier.operation_id,
6060
durable_execution_arn=state.durable_execution_arn,
6161
)
@@ -89,7 +89,7 @@ def invoke_handler(
8989
start_operation: OperationUpdate = OperationUpdate.create_invoke_start(
9090
identifier=operation_identifier,
9191
payload=serialized_payload,
92-
invoke_options=InvokeOptions(
92+
chained_invoke_options=ChainedInvokeOptions(
9393
function_name=function_name, timeout_seconds=config.timeout_seconds
9494
),
9595
)

src/aws_durable_execution_sdk_python/state.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ def create_from_operation(cls, operation: Operation) -> CheckpointedResult:
5959
result = callback_details.result if callback_details else None
6060
error = callback_details.error if callback_details else None
6161

62-
case OperationType.INVOKE:
63-
invoke_details = operation.invoke_details
62+
case OperationType.CHAINED_INVOKE:
63+
invoke_details = operation.chained_invoke_details
6464
result = invoke_details.result if invoke_details else None
6565
error = invoke_details.error if invoke_details else None
6666

0 commit comments

Comments
 (0)