Example #1
0
def test_choice_state_with_placeholders():

    first_state = Task(
        'FirstState',
        resource='arn:aws:lambda:us-east-1:1234567890:function:FirstState')
    retry = Chain([Pass('Retry'), Pass('Cleanup'), first_state])

    choice_state = Choice('Is Completed?')
    choice_state.add_choice(
        ChoiceRule.BooleanEquals(choice_state.output()["Completed"], True),
        Succeed('Complete'))
    choice_state.add_choice(
        ChoiceRule.BooleanEquals(choice_state.output()["Completed"], False),
        retry)

    first_state.next(choice_state)

    result = Graph(first_state).to_dict()

    expected_repr = {
        "StartAt": "FirstState",
        "States": {
            "FirstState": {
                "Resource":
                "arn:aws:lambda:us-east-1:1234567890:function:FirstState",
                "Type": "Task",
                "Next": "Is Completed?"
            },
            "Is Completed?": {
                "Type":
                "Choice",
                "Choices": [{
                    "Variable": "$['Completed']",
                    "BooleanEquals": True,
                    "Next": "Complete"
                }, {
                    "Variable": "$['Completed']",
                    "BooleanEquals": False,
                    "Next": "Retry"
                }]
            },
            "Complete": {
                "Type": "Succeed"
            },
            "Retry": {
                "Type": "Pass",
                "Next": "Cleanup"
            },
            "Cleanup": {
                "Type": "Pass",
                "Next": "FirstState"
            }
        }
    }

    assert result == expected_repr
Example #2
0
def test_wait_loop():
    first_state = Task(
        'FirstState',
        resource='arn:aws:lambda:us-east-1:1234567890:function:FirstState')
    retry = Chain([Pass('Retry'), Pass('Cleanup'), first_state])

    choice_state = Choice('Is Completed?')
    choice_state.add_choice(ChoiceRule.BooleanEquals('$.Completed', True),
                            Succeed('Complete'))
    choice_state.add_choice(ChoiceRule.BooleanEquals('$.Completed', False),
                            retry)
    first_state.next(choice_state)

    result = Graph(first_state).to_dict()
    assert result == {
        'StartAt': 'FirstState',
        'States': {
            'FirstState': {
                'Type': 'Task',
                'Resource':
                'arn:aws:lambda:us-east-1:1234567890:function:FirstState',
                'Next': 'Is Completed?'
            },
            'Is Completed?': {
                'Type':
                'Choice',
                'Choices': [{
                    'Variable': '$.Completed',
                    'BooleanEquals': True,
                    'Next': 'Complete'
                }, {
                    'Variable': '$.Completed',
                    'BooleanEquals': False,
                    'Next': 'Retry'
                }]
            },
            'Complete': {
                'Type': 'Succeed'
            },
            'Retry': {
                'Type': 'Pass',
                'Next': 'Cleanup',
            },
            'Cleanup': {
                'Type': 'Pass',
                'Next': 'FirstState'
            }
        }
    }
def test_rule_serialization():
    bool_rule = ChoiceRule.BooleanEquals('$.BooleanVariable', True)
    assert bool_rule.to_dict() == {
        'Variable': '$.BooleanVariable',
        'BooleanEquals': True
    }

    string_rule = ChoiceRule.StringEquals('$.StringVariable', 'ABC')
    assert string_rule.to_dict() == {
        'Variable': '$.StringVariable',
        'StringEquals': 'ABC'
    }

    and_rule = ChoiceRule.And([bool_rule, string_rule])
    assert and_rule.to_dict() == {
        'And': [{
            'Variable': '$.BooleanVariable',
            'BooleanEquals': True
        }, {
            'Variable': '$.StringVariable',
            'StringEquals': 'ABC'
        }]
    }

    not_rule = ChoiceRule.Not(string_rule)
    assert not_rule.to_dict() == {
        'Not': {
            'Variable': '$.StringVariable',
            'StringEquals': 'ABC'
        }
    }

    compound_rule = ChoiceRule.Or([and_rule, not_rule])
    assert compound_rule.to_dict() == {
        'Or': [{
            'And': [{
                'Variable': '$.BooleanVariable',
                'BooleanEquals': True
            }, {
                'Variable': '$.StringVariable',
                'StringEquals': 'ABC'
            }],
        }, {
            'Not': {
                'Variable': '$.StringVariable',
                'StringEquals': 'ABC'
            }
        }]
    }
def test_variable_value_must_be_consistent():
    string_functions = (
        'StringEquals',
        'StringLessThan',
        'StringGreaterThan',
        'StringLessThanEquals',
        'StringGreaterThanEquals',
    )
    for string_function in string_functions:
        func = getattr(ChoiceRule, string_function)
        with pytest.raises(ValueError):
            func('$.Variable', 42)

    numeric_functions = (
        'NumericEquals',
        'NumericLessThan',
        'NumericGreaterThan',
        'NumericLessThanEquals',
        'NumericGreaterThanEquals',
    )
    for numeric_function in numeric_functions:
        func = getattr(ChoiceRule, numeric_function)
        with pytest.raises(ValueError):
            func('$.Variable', 'ABC')

    with pytest.raises(ValueError):
        ChoiceRule.BooleanEquals('$.Variable', 42)

    timestamp_functions = (
        'TimestampEquals',
        'TimestampLessThan',
        'TimestampGreaterThan',
        'TimestampLessThanEquals',
        'TimestampGreaterThanEquals',
    )
    for timestamp_function in timestamp_functions:
        func = getattr(ChoiceRule, timestamp_function)
        with pytest.raises(ValueError):
            func('$.Variable', True)
crawl_database_check_status.add_retry(
    sf.steps.Retry(error_equals=[
        "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException"
    ])
)
crawl_database_check_status.add_catch(Catch(
    error_equals=["States.TaskFailed"],
    next_step=fail_state
))

crawl_database_check_choice = sf.steps.Choice(
    state_id='Check finished?',
)

crawl_database_check_choice.add_choice(
    ChoiceRule.BooleanEquals('$.crawlerStatus', False),
    crawl_database_wait
)
crawl_database_check_choice.add_choice(
    ChoiceRule.BooleanEquals('$.crawlerStatus', True),
    finish
)

workflow_definition = sf.steps.Chain([
    glue_import_to_s3_job,
    crawl_params,
    crawl_database_start,
    crawl_database_wait,
    crawl_database_check_status,
    crawl_database_check_choice
])