예제 #1
0
def test_get_history(monkeypatch):
    """Test the decider history
    """

    from tests.fixtures.flows import example

    events = decider_events.history.get('events')
    half = int(len(events) / 2)
    events = events[:half * 2]
    pool_1 = events[half:]
    pool_2 = events[:half]
    identity = 'identity'

    d = decider.DeciderWorker(example)
    d.client.poll_for_decision_task = MagicMock(
        return_value={'events': pool_2})

    resp = d.get_history(identity, {
        'events': pool_1,
        'nextPageToken': 'nextPage'
    })

    d.client.poll_for_decision_task.assert_called_with(
        domain=example.domain,
        next_page_token='nextPage',
        identity=identity,
        taskList=dict(name=d.task_list))
    assert len(resp) == len(
        [evt for evt in events if evt['eventType'].startswith('Decision')])
예제 #2
0
def test_create_decisions_from_flow_exception(monkeypatch):
    """Test exception is raised and workflow fails when exception raised.
    """

    mock(monkeypatch)
    from tests.fixtures.flows import example

    decider_worker = decider.DeciderWorker(example)
    decider_worker.logger.error = MagicMock()
    decider_worker.on_exception = MagicMock()

    exception = Exception('test')
    monkeypatch.setattr(decider.activity, 'find_available_activities',
                        MagicMock(side_effect=exception))

    mock_decisions = MagicMock()
    mock_activity_states = MagicMock()
    mock_context = MagicMock()
    decider_worker.create_decisions_from_flow(mock_decisions,
                                              mock_activity_states,
                                              mock_context)

    mock_decisions.fail_workflow_execution.assert_called_with(
        reason=str(exception))
    assert decider_worker.on_exception.called
    decider_worker.logger.error.assert_called_with(exception, exc_info=True)
예제 #3
0
def test_create_decisions_from_flow_exception(monkeypatch):
    """Test exception is raised and workflow fails when exception raised.
    """

    from tests.fixtures.flows import example

    decider_worker = decider.DeciderWorker(example, register=False)
    decider_worker.logger.error = MagicMock()
    decider_worker.on_exception = MagicMock()

    exception = Exception('test')
    monkeypatch.setattr(decider.activity, 'find_available_activities',
                        MagicMock(side_effect=exception))

    decisions = []
    mock_activity_states = MagicMock()
    mock_context = MagicMock()
    decider_worker.create_decisions_from_flow(decisions, mock_activity_states,
                                              mock_context)

    failed_execution = dict(
        decisionType='FailWorkflowExecution',
        failWorkflowExecutionDecisionAttributes=dict(reason=str(exception)))

    assert failed_execution in decisions
    assert decider_worker.on_exception.called
    decider_worker.logger.error.assert_called_with(exception, exc_info=True)
예제 #4
0
def test_running_workflow(monkeypatch):
    """Test running a workflow.
    """

    mock(monkeypatch)
    from tests.fixtures.flows import example

    d = decider.DeciderWorker(example)
    d.poll = MagicMock(return_value=decider_events.history)
    d.complete = MagicMock()
    d.create_decisions_from_flow = MagicMock()

    # Via flow.
    d.run()
    assert d.create_decisions_from_flow.called

    # Via custom decider
    spy = MagicMock()

    def custom_decider(schedule):
        spy()

    example.decider = custom_decider
    d.run()
    assert spy.called
예제 #5
0
def test_create_decider(monkeypatch):
    """Create a decider and check the behavior of the registration.
    """

    mock(monkeypatch)
    from tests.fixtures.flows import example

    d = decider.DeciderWorker(example)
    assert len(d.activities) == 4
    assert d.flow
    assert d.domain

    monkeypatch.setattr(decider.DeciderWorker, 'register', MagicMock())
    d = decider.DeciderWorker(example)
    assert d.register.called

    monkeypatch.setattr(decider.DeciderWorker, 'register', MagicMock())
    dec = decider.DeciderWorker(example, register=False)
    assert not dec.register.called
예제 #6
0
def run_decider(flow, **kwargs):
    """Launch the SWF decider process.

    Args:
        flow (module): Garcon flow module.

    """
    worker = decider.DeciderWorker(flow)
    while True:
        worker.run()
        time.sleep(1)
예제 #7
0
def test_running_workflow_without_events(monkeypatch):
    """Test running a workflow without having any events.
    """

    from tests.fixtures.flows import example

    d = decider.DeciderWorker(example, register=False)
    d.client.poll_for_decision_task = MagicMock(return_value={})
    d.get_history = MagicMock()
    d.run()

    assert not d.get_history.called
예제 #8
0
def test_running_workflow_without_events(monkeypatch):
    """Test running a workflow without having any events.
    """

    mock(monkeypatch)
    from tests.fixtures.flows import example

    d = decider.DeciderWorker(example)
    d.poll = MagicMock(return_value={})
    d.get_history = MagicMock()
    d.run()

    assert not d.get_history.called
예제 #9
0
def test_get_activity_states(monkeypatch):
    """Test get activity states from history.
    """

    mock(monkeypatch)
    from tests.fixtures.flows import example

    events = decider_events.history.get('events')
    d = decider.DeciderWorker(example)
    history = d.get_history({'events': events})
    states = d.get_activity_states(history)

    for activity_name, activity_instances in states.items():
        for activity_instance, activity_state in activity_instances.items():
            assert isinstance(activity_state, activity.ActivityState)
예제 #10
0
def test_running_workflow_exception(monkeypatch):
    """Run a decider with an exception raised during poll.
    """

    mock(monkeypatch)
    from tests.fixtures.flows import example

    d = decider.DeciderWorker(example)
    d.poll = MagicMock(return_value=decider_events.history)
    d.complete = MagicMock()
    d.create_decisions_from_flow = MagicMock()
    d.poll.side_effect = Exception('test')
    d.on_exception = MagicMock()
    d.run()
    assert d.on_exception.called
    assert not d.complete.called
예제 #11
0
def test_running_workflow_identity(monkeypatch):
    """Test running a workflow with and without identity.
    """

    mock(monkeypatch)
    from tests.fixtures.flows import example

    d = decider.DeciderWorker(example)
    d.poll = MagicMock()
    d.complete = MagicMock()
    d.create_decisions_from_flow = MagicMock()

    # assert running decider without identity
    d.run()
    d.poll.assert_called_with(identity=None)

    # assert running decider with identity
    d.run('foo')
    d.poll.assert_called_with(identity='foo')
예제 #12
0
def test_running_workflow_exception(monkeypatch):
    """Run a decider with an exception raised during poll.
    """

    from tests.fixtures.flows import example

    d = decider.DeciderWorker(example, register=False)
    d.client.poll_for_decision_task = MagicMock(
        return_value=decider_events.history)
    d.complete = MagicMock()
    d.create_decisions_from_flow = MagicMock()
    exception = Exception('test')
    d.client.poll_for_decision_task.side_effect = exception
    d.on_exception = MagicMock()
    d.logger.error = MagicMock()
    d.run()
    assert d.on_exception.called
    d.logger.error.assert_called_with(exception, exc_info=True)
    assert not d.complete.called
예제 #13
0
def test_running_workflow_identity(monkeypatch):
    """Test running a workflow with and without identity.
    """

    from tests.fixtures.flows import example

    d = decider.DeciderWorker(example, register=False)
    d.client.poll_for_decision_task = MagicMock()
    d.complete = MagicMock()
    d.create_decisions_from_flow = MagicMock()

    # assert running decider without identity
    d.run()
    d.client.poll_for_decision_task.assert_called_with(
        domain=d.domain, taskList=dict(name=d.task_list), identity='')

    # assert running decider with identity
    d.run('foo')
    d.client.poll_for_decision_task.assert_called_with(
        domain=d.domain, taskList=dict(name=d.task_list), identity='foo')
예제 #14
0
def test_get_history(monkeypatch):
    """Test the decider history
    """

    mock(monkeypatch)
    from tests.fixtures.flows import example

    events = decider_events.history.get('events')
    half = int(len(events) / 2)
    events = events[:half * 2]
    pool_1 = events[half:]
    pool_2 = events[:half]

    d = decider.DeciderWorker(example)
    d.poll = MagicMock(return_value={'events': pool_2})

    resp = d.get_history({'events': pool_1, 'nextPageToken': 'nextPage'})

    d.poll.assert_called_with(next_page_token='nextPage')
    assert len(resp) == len(
        [evt for evt in events if evt['eventType'].startswith('Decision')])
예제 #15
0
from garcon import activity
from garcon import decider
from threading import Thread
import boto3
import time

import workflow

client = boto3.client('swf', region_name='us-east-1')
deciderworker = decider.DeciderWorker(client, workflow)

client.start_workflow_execution(domain=workflow.domain,
                                workflowId='unique-workflow-identifier',
                                workflowType=dict(name=workflow.name,
                                                  version='1.0'),
                                taskList=dict(name=workflow.name))

Thread(target=activity.ActivityWorker(client, workflow).run).start()
while (True):
    deciderworker.run()
    time.sleep(1)
예제 #16
0
from garcon import activity
from garcon import decider
from threading import Thread
import boto.swf.layer2 as swf
import time

import test_flow

deciderworker = decider.DeciderWorker(test_flow)

swf.WorkflowType(name=test_flow.name,
                 domain=test_flow.domain,
                 version='1.0',
                 task_list=test_flow.name).start()

Thread(target=activity.ActivityWorker(test_flow).run).start()
while (True):
    deciderworker.run()
    time.sleep(1)
예제 #17
0
from garcon import activity
from garcon import decider
from threading import Thread
import time

import boto3
import workflow

# Initiate the workflow on the dev domain and custom_decider name.
client = boto3.client('swf', region_name='us-east-1')
workflow = workflow.Workflow(client, 'dev', 'custom_decider')
deciderworker = decider.DeciderWorker(workflow)

client.start_workflow_execution(
    domain=workflow.domain,
    workflowId='unique-workflow-identifier',
    workflowType=dict(
        name=workflow.name,
        version='1.0'),
    executionStartToCloseTimeout='3600',
    taskStartToCloseTimeout='3600',
    childPolicy='TERMINATE',
    taskList=dict(name=workflow.name))

Thread(target=activity.ActivityWorker(workflow).run).start()
while(True):
    deciderworker.run()
    time.sleep(1)
예제 #18
0
import time

from garcon import decider

import flow


hello_world_flow = flow.Flow('dev', '1.0')
decider_worker = decider.DeciderWorker(hello_world_flow)
while(True):
    decider_worker.run()
    time.sleep(1)