def test_task_policy_class(self):
        policy = policies.base.TaskPolicy()

        policy._schema = {"properties": {"delay": {"type": "integer"}}}

        wf_ex = models.WorkflowExecution(id='1-2-3-4',
                                         context={},
                                         input={},
                                         params={})

        task_ex = models.TaskExecution(in_context={'int_var': 5})
        task_ex.workflow_execution = wf_ex

        policy.delay = "<% $.int_var %>"

        # Validation is ok.
        policy.before_task_start(task_ex, None)

        policy.delay = "some_string"

        # Validation is failing now.
        exception = self.assertRaises(exc.InvalidModelException,
                                      policy.before_task_start, task_ex, None)

        self.assertIn("Invalid data type in TaskPolicy", str(exception))
Exemple #2
0
def update_workflow_execution_state(id, cur_state, state, session=None):
    wf_ex = None

    # Use WHERE clause to exclude possible conflicts if the state has
    # already been changed.
    try:
        specimen = models.WorkflowExecution(
            id=id,
            state=cur_state
        )

        wf_ex = b.model_query(
            models.WorkflowExecution).update_on_match(
            specimen=specimen,
            surrogate_key='id',
            values={'state': state}
        )
    except oslo_sqlalchemy.update_match.NoRowsMatched:
        LOG.info(
            "Can't change workflow execution state from %s to %s, "
            "because it has already been changed. [execution_id=%s]",
            cur_state, state, id
        )

    return wf_ex
Exemple #3
0
def create_workflow_execution(values, session=None):
    wf_ex = models.WorkflowExecution()

    wf_ex.update(values.copy())

    try:
        wf_ex.save(session=session)
    except db_exc.DBDuplicateEntry as e:
        raise exc.DBDuplicateEntryError(
            "Duplicate entry for WorkflowExecution: %s" % e.columns)

    return wf_ex
    def _prepare_test(self, wf_text):
        wfs = wf_service.create_workflows(wf_text)
        wf_spec = spec_parser.get_workflow_spec_by_id(wfs[0].id)

        wf_ex = models.WorkflowExecution(id='1-2-3-4',
                                         spec=wf_spec.to_dict(),
                                         state=states.RUNNING,
                                         workflow_id=wfs[0].id)

        self.wf_ex = wf_ex
        self.wf_spec = wf_spec
        self.wf_ctrl = d_wf.DirectWorkflowController(wf_ex)
Exemple #5
0
    def _prepare_test(self, wf_text):
        wf_spec = spec_parser.get_workflow_list_spec_from_yaml(wf_text)[0]

        wf_ex = models.WorkflowExecution()
        wf_ex.update({
            'id': '1-2-3-4',
            'spec': wf_spec.to_dict(),
            'state': states.RUNNING
        })

        self.wf_ex = wf_ex
        self.wf_spec = wf_spec
        self.wf_ctrl = d_wf.DirectWorkflowController(wf_ex)
Exemple #6
0
def create_workflow_execution(values, session=None):
    wf_ex = models.WorkflowExecution()

    wf_ex.update(values.copy())

    try:
        wf_ex.save(session=session)
    except db_exc.DBDuplicateEntry as e:
        raise exc.DBDuplicateEntryError(
            "Duplicate entry for WorkflowExecution with ID: {value} ".format(
                value=e.value))

    return wf_ex
    def _prepare_test(self, wf_text):
        wfs = wf_service.create_workflows(wf_text)
        wf_spec = spec_parser.get_workflow_spec_by_definition_id(
            wfs[0].id, wfs[0].updated_at)

        wf_ex = models.WorkflowExecution(id='1-2-3-4',
                                         spec=wf_spec.to_dict(),
                                         state=states.RUNNING,
                                         workflow_id=wfs[0].id)

        self.wf_ex = wf_ex
        self.wf_spec = wf_spec

        return wf_ex
Exemple #8
0
    def setUp(self):
        super(ReverseWorkflowControllerTest, self).setUp()

        wb_spec = spec_parser.get_workbook_spec_from_yaml(WB)

        wf_ex = models.WorkflowExecution(
            id='1-2-3-4',
            spec=wb_spec.get_workflows().get('wf').to_dict(),
            state=states.RUNNING,
            params={}
        )

        self.wf_ex = wf_ex
        self.wb_spec = wb_spec
        self.wf_ctrl = reverse_wf.ReverseWorkflowController(wf_ex)
Exemple #9
0
    def setUp(self):
        super(DirectWorkflowControllerTest, self).setUp()

        wb_spec = spec_parser.get_workbook_spec_from_yaml(WB)

        wf_ex = models.WorkflowExecution()
        wf_ex.update({
            'id': '1-2-3-4',
            'spec': wb_spec.get_workflows().get('wf').to_dict(),
            'state': states.RUNNING
        })

        self.wf_ex = wf_ex
        self.wb_spec = wb_spec
        self.wf_ctrl = d_wf.DirectWorkflowController(wf_ex)
Exemple #10
0
    def setUp(self):
        super(ReverseWorkflowControllerTest, self).setUp()

        wb_service.create_workbook_v2(WB)

        wf_def = db_api.get_workflow_definitions()[0]

        wb_spec = spec_parser.get_workbook_spec_from_yaml(WB)

        wf_ex = models.WorkflowExecution(
            id='1-2-3-4',
            spec=wb_spec.get_workflows().get('wf').to_dict(),
            state=states.RUNNING,
            params={},
            workflow_id=wf_def.id)

        self.wf_ex = wf_ex
        self.wb_spec = wb_spec
Exemple #11
0
from mistral.tests.unit.api import base
from mistral.workflow import data_flow
from mistral.workflow import states

# TODO(everyone): later we need additional tests verifying all the errors etc.

RESULT = {"some": "result"}
PUBLISHED = {"var": "val"}

WF_EX = models.WorkflowExecution(id='abc',
                                 workflow_name='some',
                                 description='execution description.',
                                 spec={'name': 'some'},
                                 state=states.RUNNING,
                                 state_info=None,
                                 input={'foo': 'bar'},
                                 output={},
                                 params={'env': {
                                     'k1': 'abc'
                                 }},
                                 created_at=datetime.datetime(1970, 1, 1),
                                 updated_at=datetime.datetime(1970, 1, 1))

TASK_EX = models.TaskExecution(
    id='123',
    name='task',
    workflow_name='flow',
    workflow_id='123e4567-e89b-12d3-a456-426655441111',
    spec={
        'type': 'direct',
        'version': '2.0',
Exemple #12
0
from mistral.tests.unit import base as unit_base
from mistral import utils
from mistral.utils import rest_utils
from mistral.workflow import states

# This line is needed for correct initialization of messaging config.
oslo_messaging.get_rpc_transport(cfg.CONF)

WF_EX = models.WorkflowExecution(
    id='123e4567-e89b-12d3-a456-426655440000',
    workflow_name='some',
    workflow_id='123e4567-e89b-12d3-a456-426655441111',
    description='execution description.',
    spec={'name': 'some'},
    state=states.RUNNING,
    state_info=None,
    input={'foo': 'bar'},
    output={},
    params={'env': {
        'k1': 'abc'
    }},
    created_at=datetime.datetime(1970, 1, 1),
    updated_at=datetime.datetime(1970, 1, 1))

WF_EX_JSON = {
    'id': '123e4567-e89b-12d3-a456-426655440000',
    'input': '{"foo": "bar"}',
    'output': '{}',
    'params': '{"env": {"k1": "abc"}}',
    'state': 'RUNNING',
    'state_info': None,
    def test_get_controller_reverse(self):
        wf_spec = spec_parser.get_workflow_list_spec_from_yaml(REVERSE_WF)[0]
        wf_ex = db_models.WorkflowExecution(spec=wf_spec.to_dict())

        self.assertIsInstance(wf_base.get_controller(wf_ex, wf_spec),
                              reverse_wf.ReverseWorkflowController)
    def test_get_controller_direct(self):
        wf_spec = spec_parser.get_workflow_list_spec_from_yaml(DIRECT_WF)[0]
        wf_ex = db_models.WorkflowExecution(spec=wf_spec.to_dict())

        self.assertIsInstance(wf_base.get_controller(wf_ex, wf_spec),
                              direct_wf.DirectWorkflowController)
Exemple #15
0
def update_workflow_execution_state(id, cur_state, state):
    specimen = models.WorkflowExecution(id=id, state=cur_state)

    return update_on_match(id, specimen, values={'state': state}, attempts=1)