Merge pull request #3286 from ciaranevans/add-input-validation
Add Step Function Execution Input validation
This commit is contained in:
commit
c3b8b2343b
@ -38,6 +38,11 @@ class InvalidName(AWSError):
|
||||
STATUS = 400
|
||||
|
||||
|
||||
class InvalidExecutionInput(AWSError):
|
||||
TYPE = "InvalidExecutionInput"
|
||||
STATUS = 400
|
||||
|
||||
|
||||
class StateMachineDoesNotExist(AWSError):
|
||||
TYPE = "StateMachineDoesNotExist"
|
||||
STATUS = 400
|
||||
|
@ -1,3 +1,4 @@
|
||||
import json
|
||||
import re
|
||||
from datetime import datetime
|
||||
|
||||
@ -11,6 +12,7 @@ from .exceptions import (
|
||||
ExecutionAlreadyExists,
|
||||
ExecutionDoesNotExist,
|
||||
InvalidArn,
|
||||
InvalidExecutionInput,
|
||||
InvalidName,
|
||||
StateMachineDoesNotExist,
|
||||
)
|
||||
@ -209,6 +211,7 @@ class StepFunctionBackend(BaseBackend):
|
||||
def start_execution(self, state_machine_arn, name=None, execution_input=None):
|
||||
state_machine_name = self.describe_state_machine(state_machine_arn).name
|
||||
self._ensure_execution_name_doesnt_exist(name)
|
||||
self._validate_execution_input(execution_input)
|
||||
execution = Execution(
|
||||
region_name=self.region_name,
|
||||
account_id=self._get_account_id(),
|
||||
@ -290,6 +293,14 @@ class StepFunctionBackend(BaseBackend):
|
||||
"Execution Already Exists: '" + execution.execution_arn + "'"
|
||||
)
|
||||
|
||||
def _validate_execution_input(self, execution_input):
|
||||
try:
|
||||
json.loads(execution_input)
|
||||
except Exception as ex:
|
||||
raise InvalidExecutionInput(
|
||||
"Invalid State Machine Execution Input: '" + str(ex) + "'"
|
||||
)
|
||||
|
||||
def _get_account_id(self):
|
||||
return ACCOUNT_ID
|
||||
|
||||
|
@ -425,6 +425,47 @@ def test_state_machine_start_execution_fails_on_duplicate_execution_name():
|
||||
)
|
||||
|
||||
|
||||
@mock_stepfunctions
|
||||
@mock_sts
|
||||
def test_state_machine_start_execution_with_custom_input():
|
||||
client = boto3.client("stepfunctions", region_name=region)
|
||||
#
|
||||
sm = client.create_state_machine(
|
||||
name="name", definition=str(simple_definition), roleArn=_get_default_role()
|
||||
)
|
||||
execution_input = json.dumps({"input_key": "input_value"})
|
||||
execution = client.start_execution(
|
||||
stateMachineArn=sm["stateMachineArn"], input=execution_input
|
||||
)
|
||||
#
|
||||
execution["ResponseMetadata"]["HTTPStatusCode"].should.equal(200)
|
||||
uuid_regex = "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"
|
||||
expected_exec_name = (
|
||||
"arn:aws:states:"
|
||||
+ region
|
||||
+ ":"
|
||||
+ _get_account_id()
|
||||
+ ":execution:name:"
|
||||
+ uuid_regex
|
||||
)
|
||||
execution["executionArn"].should.match(expected_exec_name)
|
||||
execution["startDate"].should.be.a(datetime)
|
||||
|
||||
|
||||
@mock_stepfunctions
|
||||
@mock_sts
|
||||
def test_state_machine_start_execution_with_invalid_input():
|
||||
client = boto3.client("stepfunctions", region_name=region)
|
||||
#
|
||||
sm = client.create_state_machine(
|
||||
name="name", definition=str(simple_definition), roleArn=_get_default_role()
|
||||
)
|
||||
with assert_raises(ClientError):
|
||||
_ = client.start_execution(stateMachineArn=sm["stateMachineArn"], input="")
|
||||
with assert_raises(ClientError):
|
||||
_ = client.start_execution(stateMachineArn=sm["stateMachineArn"], input="{")
|
||||
|
||||
|
||||
@mock_stepfunctions
|
||||
@mock_sts
|
||||
def test_state_machine_list_executions():
|
||||
|
Loading…
Reference in New Issue
Block a user