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
|
STATUS = 400
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidExecutionInput(AWSError):
|
||||||
|
TYPE = "InvalidExecutionInput"
|
||||||
|
STATUS = 400
|
||||||
|
|
||||||
|
|
||||||
class StateMachineDoesNotExist(AWSError):
|
class StateMachineDoesNotExist(AWSError):
|
||||||
TYPE = "StateMachineDoesNotExist"
|
TYPE = "StateMachineDoesNotExist"
|
||||||
STATUS = 400
|
STATUS = 400
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import json
|
||||||
import re
|
import re
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
@ -11,6 +12,7 @@ from .exceptions import (
|
|||||||
ExecutionAlreadyExists,
|
ExecutionAlreadyExists,
|
||||||
ExecutionDoesNotExist,
|
ExecutionDoesNotExist,
|
||||||
InvalidArn,
|
InvalidArn,
|
||||||
|
InvalidExecutionInput,
|
||||||
InvalidName,
|
InvalidName,
|
||||||
StateMachineDoesNotExist,
|
StateMachineDoesNotExist,
|
||||||
)
|
)
|
||||||
@ -209,6 +211,7 @@ class StepFunctionBackend(BaseBackend):
|
|||||||
def start_execution(self, state_machine_arn, name=None, execution_input=None):
|
def start_execution(self, state_machine_arn, name=None, execution_input=None):
|
||||||
state_machine_name = self.describe_state_machine(state_machine_arn).name
|
state_machine_name = self.describe_state_machine(state_machine_arn).name
|
||||||
self._ensure_execution_name_doesnt_exist(name)
|
self._ensure_execution_name_doesnt_exist(name)
|
||||||
|
self._validate_execution_input(execution_input)
|
||||||
execution = Execution(
|
execution = Execution(
|
||||||
region_name=self.region_name,
|
region_name=self.region_name,
|
||||||
account_id=self._get_account_id(),
|
account_id=self._get_account_id(),
|
||||||
@ -290,6 +293,14 @@ class StepFunctionBackend(BaseBackend):
|
|||||||
"Execution Already Exists: '" + execution.execution_arn + "'"
|
"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):
|
def _get_account_id(self):
|
||||||
return ACCOUNT_ID
|
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_stepfunctions
|
||||||
@mock_sts
|
@mock_sts
|
||||||
def test_state_machine_list_executions():
|
def test_state_machine_list_executions():
|
||||||
|
Loading…
Reference in New Issue
Block a user