2021-09-21 22:00:20 +00:00
|
|
|
import boto3
|
2015-10-26 17:05:45 +00:00
|
|
|
|
2022-08-13 09:49:43 +00:00
|
|
|
from moto.core import DEFAULT_ACCOUNT_ID
|
2019-10-31 15:44:26 +00:00
|
|
|
from moto.swf.models import ActivityType, Domain, WorkflowType, WorkflowExecution
|
2015-10-04 21:37:50 +00:00
|
|
|
|
|
|
|
|
2015-11-02 23:28:13 +00:00
|
|
|
# Some useful constants
|
|
|
|
# Here are some activity timeouts we use in moto/swf tests ; they're extracted
|
2020-01-20 23:21:11 +00:00
|
|
|
# from semi-real world example, the goal is mostly to have predictable and
|
2015-11-02 23:28:13 +00:00
|
|
|
# intuitive behaviour in moto/swf own tests...
|
|
|
|
ACTIVITY_TASK_TIMEOUTS = {
|
2019-10-31 15:44:26 +00:00
|
|
|
"heartbeatTimeout": "300", # 5 mins
|
2016-02-02 19:02:37 +00:00
|
|
|
"scheduleToStartTimeout": "1800", # 30 mins
|
2019-10-31 15:44:26 +00:00
|
|
|
"startToCloseTimeout": "1800", # 30 mins
|
2016-02-02 19:02:37 +00:00
|
|
|
"scheduleToCloseTimeout": "2700", # 45 mins
|
2015-11-02 23:28:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# Some useful decisions
|
|
|
|
SCHEDULE_ACTIVITY_TASK_DECISION = {
|
|
|
|
"decisionType": "ScheduleActivityTask",
|
|
|
|
"scheduleActivityTaskDecisionAttributes": {
|
|
|
|
"activityId": "my-activity-001",
|
2016-02-02 19:02:37 +00:00
|
|
|
"activityType": {"name": "test-activity", "version": "v1.1"},
|
|
|
|
"taskList": {"name": "activity-task-list"},
|
2019-10-31 15:44:26 +00:00
|
|
|
},
|
2015-11-02 23:28:13 +00:00
|
|
|
}
|
2015-11-03 08:17:56 +00:00
|
|
|
for key, value in ACTIVITY_TASK_TIMEOUTS.items():
|
2019-10-31 15:44:26 +00:00
|
|
|
SCHEDULE_ACTIVITY_TASK_DECISION["scheduleActivityTaskDecisionAttributes"][
|
|
|
|
key
|
|
|
|
] = value
|
2015-11-02 23:28:13 +00:00
|
|
|
|
2016-02-02 19:02:37 +00:00
|
|
|
|
2015-10-25 10:30:11 +00:00
|
|
|
# A test Domain
|
|
|
|
def get_basic_domain():
|
2022-08-13 09:49:43 +00:00
|
|
|
return Domain("test-domain", "90", DEFAULT_ACCOUNT_ID, "us-east-1")
|
2015-10-25 10:30:11 +00:00
|
|
|
|
|
|
|
|
2015-10-26 05:31:00 +00:00
|
|
|
# A test WorkflowType
|
2015-10-04 21:37:50 +00:00
|
|
|
def _generic_workflow_type_attributes():
|
2019-10-31 15:44:26 +00:00
|
|
|
return (
|
|
|
|
["test-workflow", "v1.0"],
|
|
|
|
{
|
|
|
|
"task_list": "queue",
|
|
|
|
"default_child_policy": "ABANDON",
|
|
|
|
"default_execution_start_to_close_timeout": "7200",
|
|
|
|
"default_task_start_to_close_timeout": "300",
|
|
|
|
},
|
|
|
|
)
|
2015-10-04 21:37:50 +00:00
|
|
|
|
2016-02-02 19:02:37 +00:00
|
|
|
|
2021-09-21 22:00:20 +00:00
|
|
|
def _generic_workflow_type_attributes_boto3():
|
|
|
|
return {
|
|
|
|
"name": "test-workflow",
|
|
|
|
"version": "v1.0",
|
|
|
|
"defaultTaskList": {"name": "queue"},
|
|
|
|
"defaultChildPolicy": "ABANDON",
|
|
|
|
"defaultExecutionStartToCloseTimeout": "7200",
|
|
|
|
"defaultTaskStartToCloseTimeout": "300",
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-10-04 21:37:50 +00:00
|
|
|
def get_basic_workflow_type():
|
|
|
|
args, kwargs = _generic_workflow_type_attributes()
|
|
|
|
return WorkflowType(*args, **kwargs)
|
|
|
|
|
2016-02-02 19:02:37 +00:00
|
|
|
|
2015-10-04 21:37:50 +00:00
|
|
|
def mock_basic_workflow_type(domain_name, conn):
|
|
|
|
args, kwargs = _generic_workflow_type_attributes()
|
|
|
|
conn.register_workflow_type(domain_name, *args, **kwargs)
|
|
|
|
return conn
|
2015-10-26 05:31:00 +00:00
|
|
|
|
|
|
|
|
2021-09-21 22:00:20 +00:00
|
|
|
def mock_basic_workflow_type_boto3(domain_name, client):
|
|
|
|
kwargs = _generic_workflow_type_attributes_boto3()
|
|
|
|
client.register_workflow_type(domain=domain_name, **kwargs)
|
|
|
|
return client
|
|
|
|
|
|
|
|
|
2015-10-26 05:31:00 +00:00
|
|
|
# A test WorkflowExecution
|
|
|
|
def make_workflow_execution(**kwargs):
|
|
|
|
domain = get_basic_domain()
|
|
|
|
domain.add_type(ActivityType("test-activity", "v1.1"))
|
|
|
|
wft = get_basic_workflow_type()
|
|
|
|
return WorkflowExecution(domain, wft, "ab1234", **kwargs)
|
2015-10-26 17:05:45 +00:00
|
|
|
|
|
|
|
|
2015-11-09 22:44:49 +00:00
|
|
|
# Makes decision tasks start automatically on a given workflow
|
|
|
|
def auto_start_decision_tasks(wfe):
|
|
|
|
wfe.schedule_decision_task = wfe.schedule_and_start_decision_task
|
|
|
|
return wfe
|
|
|
|
|
|
|
|
|
2021-09-21 22:00:20 +00:00
|
|
|
# Setup a complete example workflow and return the connection object
|
|
|
|
def setup_workflow_boto3():
|
|
|
|
client = boto3.client("swf", region_name="us-west-1")
|
|
|
|
client.register_domain(
|
|
|
|
name="test-domain",
|
|
|
|
workflowExecutionRetentionPeriodInDays="60",
|
|
|
|
description="A test domain",
|
|
|
|
)
|
|
|
|
mock_basic_workflow_type_boto3("test-domain", client)
|
|
|
|
client.register_activity_type(
|
|
|
|
domain="test-domain",
|
|
|
|
name="test-activity",
|
|
|
|
version="v1.1",
|
|
|
|
defaultTaskHeartbeatTimeout="600",
|
|
|
|
defaultTaskScheduleToCloseTimeout="600",
|
|
|
|
defaultTaskScheduleToStartTimeout="600",
|
|
|
|
defaultTaskStartToCloseTimeout="600",
|
|
|
|
)
|
|
|
|
wfe = client.start_workflow_execution(
|
|
|
|
domain="test-domain",
|
|
|
|
workflowId="uid-abcd1234",
|
|
|
|
workflowType={"name": "test-workflow", "version": "v1.0"},
|
|
|
|
)
|
|
|
|
client.run_id = wfe["runId"]
|
|
|
|
return client
|
|
|
|
|
|
|
|
|
2015-11-05 01:47:05 +00:00
|
|
|
# A helper for processing the first timeout on a given object
|
|
|
|
def process_first_timeout(obj):
|
|
|
|
_timeout = obj.first_timeout()
|
|
|
|
if _timeout:
|
|
|
|
obj.timeout(_timeout)
|