Merge "Create and run a workflow within a namespace"

This commit is contained in:
Jenkins 2017-08-01 20:02:02 +00:00 committed by Gerrit Code Review
commit f2ed583540
72 changed files with 961 additions and 335 deletions

View File

@ -23,7 +23,7 @@ fi
echo "Successfully contacted Mistral API"
# Where tempest code lives
TEMPEST_DIR=${TEMPEST_DIR:-/opt/stack/new/tempest}
TEMPEST_DIR=${TEMPEST_DIR:-/opt/stack/tempest}
# Path to directory with tempest.conf file, otherwise it will
# take relative path from where the run tests command is being executed.
@ -31,8 +31,8 @@ export TEMPEST_CONFIG_DIR=${TEMPEST_CONFIG_DIR:-$TEMPEST_DIR/etc/}
echo "Tempest configuration file directory: $TEMPEST_CONFIG_DIR"
# Where mistral code and mistralclient code live
MISTRAL_DIR=/opt/stack/new/mistral
MISTRALCLIENT_DIR=/opt/stack/new/python-mistralclient
MISTRAL_DIR=/opt/stack/mistral
MISTRALCLIENT_DIR=/opt/stack/python-mistralclient
# Define PYTHONPATH
export PYTHONPATH=$PYTHONPATH:$TEMPEST_DIR

View File

@ -208,6 +208,7 @@ class ExecutionsController(rest.RestController):
result = engine.start_workflow(
exec_dict.get('workflow_id', exec_dict.get('workflow_name')),
exec_dict.get('workflow_namespace', ''),
exec_dict.get('input'),
exec_dict.get('description', ''),
**exec_dict.get('params') or {}

View File

@ -69,6 +69,7 @@ class Workflow(resource.Resource):
id = wtypes.text
name = wtypes.text
namespace = wtypes.text
input = wtypes.text
definition = wtypes.text
@ -92,7 +93,8 @@ class Workflow(resource.Resource):
scope='private',
project_id='a7eb669e9819420ea4bd1453e672c0a7',
created_at='1970-01-01T00:00:00.000000',
updated_at='1970-01-01T00:00:00.000000')
updated_at='1970-01-01T00:00:00.000000',
namespace='')
@classmethod
def _set_input(cls, obj, wf_spec):
@ -214,6 +216,14 @@ class Execution(resource.Resource):
workflow_name = wtypes.text
"reference to workflow definition"
workflow_namespace = wtypes.text
("reference to workflow namespace. The workflow namespace is also saved "
"under params and passed to all sub-workflow executions. When looking for"
" the next sub-workflow to run, The correct workflow will be found by "
"name and namespace, where the namespace can be the workflow namespace or"
" the default namespace. Workflows in the same namespace will be given "
"a higher priority.")
workflow_id = wtypes.text
"reference to workflow ID"
@ -246,6 +256,7 @@ class Execution(resource.Resource):
def sample(cls):
return cls(id='123e4567-e89b-12d3-a456-426655440000',
workflow_name='flow',
workflow_namespace='some_namespace',
workflow_id='123e4567-e89b-12d3-a456-426655441111',
description='this is the first execution.',
state='SUCCESS',
@ -287,6 +298,7 @@ class Task(resource.Resource):
type = wtypes.text
workflow_name = wtypes.text
workflow_namespace = wtypes.text
workflow_id = wtypes.text
workflow_execution_id = wtypes.text
@ -358,6 +370,7 @@ class ActionExecution(resource.Resource):
id = wtypes.text
workflow_name = wtypes.text
workflow_namespace = wtypes.text
task_name = wtypes.text
task_execution_id = wtypes.text

View File

@ -76,27 +76,34 @@ class WorkflowsController(rest.RestController, hooks.HookController):
)
@rest_utils.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(resources.Workflow, wtypes.text)
def get(self, identifier):
@wsme_pecan.wsexpose(resources.Workflow, wtypes.text, wtypes.text)
def get(self, identifier, namespace=''):
"""Return the named workflow.
:param identifier: Name or UUID of the workflow to retrieve.
:param namespace: Optional. Namespace of the workflow to retrieve.
"""
acl.enforce('workflows:get', context.ctx())
LOG.info("Fetch workflow [identifier=%s]", identifier)
db_model = db_api.get_workflow_definition(identifier)
db_model = db_api.get_workflow_definition(
identifier,
namespace=namespace
)
return resources.Workflow.from_db_model(db_model)
@rest_utils.wrap_pecan_controller_exception
@pecan.expose(content_type="text/plain")
def put(self, identifier=None):
def put(self, identifier=None, namespace=''):
"""Update one or more workflows.
:param identifier: Optional. If provided, it's UUID of a workflow.
Only one workflow can be updated with identifier param.
:param namespace: Optional. If provided int's the namespace of the
workflow/workflows. currently namespace cannot be
changed.
The text is allowed to have definitions of multiple workflows. In this
case they all will be updated.
@ -117,7 +124,8 @@ class WorkflowsController(rest.RestController, hooks.HookController):
db_wfs = workflows.update_workflows(
definition,
scope=scope,
identifier=identifier
identifier=identifier,
namespace=namespace
)
workflow_list = [
@ -129,11 +137,15 @@ class WorkflowsController(rest.RestController, hooks.HookController):
@rest_utils.wrap_pecan_controller_exception
@pecan.expose(content_type="text/plain")
def post(self):
def post(self, namespace=''):
"""Create a new workflow.
NOTE: The text is allowed to have definitions
of multiple workflows. In this case they all will be created.
:param namespace: Optional. The namespace to create the workflow
in. Workflows with the same name can be added to a given
project if are in two different namespaces.
"""
acl.enforce('workflows:create', context.ctx())
@ -149,7 +161,11 @@ class WorkflowsController(rest.RestController, hooks.HookController):
LOG.info("Create workflow(s) [definition=%s]", definition)
db_wfs = workflows.create_workflows(definition, scope=scope)
db_wfs = workflows.create_workflows(
definition,
scope=scope,
namespace=namespace
)
workflow_list = [
resources.Workflow.from_db_model(db_wf) for db_wf in db_wfs
@ -158,30 +174,32 @@ class WorkflowsController(rest.RestController, hooks.HookController):
return resources.Workflows(workflows=workflow_list).to_json()
@rest_utils.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(None, wtypes.text, status_code=204)
def delete(self, identifier):
@wsme_pecan.wsexpose(None, wtypes.text, wtypes.text, status_code=204)
def delete(self, identifier, namespace=''):
"""Delete a workflow.
:param identifier: Name or ID of workflow to delete.
:param namespace: Optional. Namespace of the workflow to delete.
"""
acl.enforce('workflows:delete', context.ctx())
LOG.info("Delete workflow [identifier=%s]", identifier)
LOG.info("Delete workflow [identifier=%s, namespace=%s]",
identifier, namespace)
with db_api.transaction():
db_api.delete_workflow_definition(identifier)
db_api.delete_workflow_definition(identifier, namespace)
@rest_utils.wrap_wsme_controller_exception
@wsme_pecan.wsexpose(resources.Workflows, types.uuid, int,
types.uniquelist, types.list, types.uniquelist,
wtypes.text, wtypes.text, wtypes.text, wtypes.text,
resources.SCOPE_TYPES, types.uuid, wtypes.text,
wtypes.text, bool)
wtypes.text, bool, wtypes.text)
def get_all(self, marker=None, limit=None, sort_keys='created_at',
sort_dirs='asc', fields='', name=None, input=None,
definition=None, tags=None, scope=None,
project_id=None, created_at=None, updated_at=None,
all_projects=False):
all_projects=False, namespace=None):
"""Return a list of workflows.
:param marker: Optional. Pagination marker for large data sets.
@ -198,6 +216,8 @@ class WorkflowsController(rest.RestController, hooks.HookController):
fields if it's provided, since it will be used when
constructing 'next' link.
:param name: Optional. Keep only resources with a specific name.
:param namespace: Optional. Keep only resources with a specific
namespace
:param input: Optional. Keep only resources with a specific input.
:param definition: Optional. Keep only resources with a specific
definition.
@ -224,7 +244,8 @@ class WorkflowsController(rest.RestController, hooks.HookController):
updated_at=updated_at,
input=input,
definition=definition,
project_id=project_id
project_id=project_id,
namespace=namespace
)
LOG.info("Fetch workflows. marker=%s, limit=%s, sort_keys=%s, "

View File

@ -0,0 +1,114 @@
# Copyright 2017 OpenStack Foundation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""namespace_support
Revision ID: 022
Revises: 021
Create Date: 2017-06-11 13:09:06.782095
"""
# revision identifiers, used by Alembic.
revision = '022'
down_revision = '021'
from alembic import op
import sqlalchemy as sa
from sqlalchemy.sql import table, column
# A simple model of the workflow definitions table with only the field needed
wf_def = table('workflow_definitions_v2', column('namespace'))
# A simple model of the workflow executions table with only the field needed
wf_exec = table('workflow_executions_v2', column('workflow_namespace'))
# A simple model of the task executions table with only the field needed
task_exec = table('task_executions_v2', column('workflow_namespace'))
# A simple model of the action executions table with only the fields needed
action_executions = sa.Table(
'action_executions_v2',
sa.MetaData(),
sa.Column('id', sa.String(36), nullable=False),
sa.Column('workflow_name', sa.String(255)),
sa.Column('workflow_namespace', sa.String(255), nullable=True)
)
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column(
'workflow_definitions_v2',
sa.Column(
'namespace',
sa.String(length=255),
nullable=True
)
)
op.drop_index('name', table_name='workflow_definitions_v2')
op.create_unique_constraint(
None,
'workflow_definitions_v2',
['name', 'namespace', 'project_id']
)
op.add_column(
'workflow_executions_v2',
sa.Column(
'workflow_namespace',
sa.String(length=255),
nullable=True
)
)
op.add_column(
'task_executions_v2',
sa.Column(
'workflow_namespace',
sa.String(length=255),
nullable=True
)
)
op.add_column(
'action_executions_v2',
sa.Column('workflow_namespace', sa.String(length=255), nullable=True)
)
session = sa.orm.Session(bind=op.get_bind())
values = []
for row in session.query(action_executions):
values.append({'id': row[0],
'workflow_name': row[1]})
with session.begin(subtransactions=True):
session.execute(wf_def.update().values(namespace=''))
session.execute(wf_exec.update().values(workflow_namespace=''))
session.execute(task_exec.update().values(workflow_namespace=''))
for value in values:
if value['workflow_name']:
session.execute(action_executions.update().values(
workflow_namespace=''
).where(action_executions.c.id == value['id']))
# this commit appears to be necessary
session.commit()
# ### end Alembic commands ###

View File

@ -114,17 +114,17 @@ def delete_workbooks(**kwargs):
# Workflow definitions.
def get_workflow_definition(identifier):
return IMPL.get_workflow_definition(identifier)
def get_workflow_definition(identifier, namespace=''):
return IMPL.get_workflow_definition(identifier, namespace=namespace)
def get_workflow_definition_by_id(id):
return IMPL.get_workflow_definition_by_id(id)
def load_workflow_definition(name):
def load_workflow_definition(name, namespace=''):
"""Unlike get_workflow_definition this method is allowed to return None."""
return IMPL.load_workflow_definition(name)
return IMPL.load_workflow_definition(name, namespace)
def get_workflow_definitions(limit=None, marker=None, sort_keys=None,
@ -143,16 +143,16 @@ def create_workflow_definition(values):
return IMPL.create_workflow_definition(values)
def update_workflow_definition(identifier, values):
return IMPL.update_workflow_definition(identifier, values)
def update_workflow_definition(identifier, values, namespace):
return IMPL.update_workflow_definition(identifier, values, namespace)
def create_or_update_workflow_definition(name, values):
return IMPL.create_or_update_workflow_definition(name, values)
def delete_workflow_definition(identifier):
IMPL.delete_workflow_definition(identifier)
def delete_workflow_definition(identifier, namespace=''):
IMPL.delete_workflow_definition(identifier, namespace)
def delete_workflow_definitions(**kwargs):

View File

@ -253,8 +253,36 @@ def _get_collection_sorted_by_time(model, insecure=False, fields=None,
)
def _get_db_object_by_name(model, name):
return _secure_query(model).filter_by(name=name).first()
def _get_db_object_by_name(model, name, filter_=None, order_by=None):
query = _secure_query(model)
final_filter = model.name == name
if filter_ is not None:
final_filter = sa.and_(final_filter, filter_)
if order_by is not None:
query = query.order_by(order_by)
return query.filter(final_filter).first()
def _get_wf_object_by_name_and_namespace(model, name, namespace=None):
query = _secure_query(model)
filter_ = model.name == name
if namespace is not None:
in_namespace = sa.or_(
model.namespace == namespace,
model.namespace == ''
)
filter_ = sa.and_(filter_, in_namespace)
# Give priority to objects not in the default namespace.
query = query.order_by(model.namespace.desc())
return query.filter(filter_).first()
def _get_db_object_by_id(model, id, insecure=False):
@ -264,11 +292,28 @@ def _get_db_object_by_id(model, id, insecure=False):
def _get_db_object_by_name_or_id(model, identifier, insecure=False):
return _get_db_object_by_name_and_namespace_or_id(
model,
identifier,
insecure=insecure
)
def _get_db_object_by_name_and_namespace_or_id(model, identifier,
namespace=None, insecure=False):
query = b.model_query(model) if insecure else _secure_query(model)
match_name = model.name == identifier
if namespace is not None:
match_name = sa.and_(match_name, model.namespace == namespace)
match_id = model.id == identifier
query = query.filter(
sa.or_(
model.id == identifier,
model.name == identifier
match_id,
match_name
)
)
@ -421,24 +466,27 @@ def delete_workbooks(session=None, **kwargs):
# Workflow definitions.
@b.session_aware()
def get_workflow_definition(identifier, session=None):
def get_workflow_definition(identifier, namespace='', session=None):
"""Gets workflow definition by name or uuid.
:param identifier: Identifier could be in the format of plain string or
uuid.
:param namespace: The namespace the workflow is in. Optional.
:return: Workflow definition.
"""
ctx = context.ctx()
wf_def = _get_db_object_by_name_or_id(
wf_def = _get_db_object_by_name_and_namespace_or_id(
models.WorkflowDefinition,
identifier,
namespace=namespace,
insecure=ctx.is_admin
)
if not wf_def:
raise exc.DBEntityNotFoundError(
"Workflow not found [workflow_identifier=%s]" % identifier
"Workflow not found [workflow_identifier=%s, namespace=%s]"
% (identifier, namespace)
)
return wf_def
@ -457,8 +505,23 @@ def get_workflow_definition_by_id(id, session=None):
@b.session_aware()
def load_workflow_definition(name, session=None):
return _get_db_object_by_name(models.WorkflowDefinition, name)
def load_workflow_definition(name, namespace='', session=None):
model = models.WorkflowDefinition
filter_ = sa.or_(
model.namespace == namespace,
model.namespace == ''
)
# Give priority to objects not in the default namespace.
order_by = model.namespace.desc()
return _get_db_object_by_name(
model,
name,
filter_,
order_by
)
@b.session_aware()
@ -493,8 +556,8 @@ def create_workflow_definition(values, session=None):
@b.session_aware()
def update_workflow_definition(identifier, values, session=None):
wf_def = get_workflow_definition(identifier)
def update_workflow_definition(identifier, values, namespace='', session=None):
wf_def = get_workflow_definition(identifier, namespace=namespace)
m_dbutils.check_db_obj_access(wf_def)
@ -537,8 +600,8 @@ def create_or_update_workflow_definition(name, values, session=None):
@b.session_aware()
def delete_workflow_definition(identifier, session=None):
wf_def = get_workflow_definition(identifier)
def delete_workflow_definition(identifier, namespace='', session=None):
wf_def = get_workflow_definition(identifier, namespace)
m_dbutils.check_db_obj_access(wf_def)

View File

@ -121,9 +121,13 @@ class WorkflowDefinition(Definition):
"""Contains info about workflow (including definition in Mistral DSL)."""
__tablename__ = 'workflow_definitions_v2'
namespace = sa.Column(sa.String(255), nullable=True)
__table_args__ = (
sa.UniqueConstraint('name', 'project_id'),
sa.UniqueConstraint(
'name',
'namespace',
'project_id'
),
sa.Index('%s_is_system' % __tablename__, 'is_system'),
sa.Index('%s_project_id' % __tablename__, 'project_id'),
sa.Index('%s_scope' % __tablename__, 'scope'),
@ -162,6 +166,7 @@ class Execution(mb.MistralSecureModelBase):
name = sa.Column(sa.String(255))
description = sa.Column(sa.String(255), nullable=True)
workflow_name = sa.Column(sa.String(255))
workflow_namespace = sa.Column(sa.String(255))
workflow_id = sa.Column(sa.String(80))
spec = sa.Column(st.JsonMediumDictType())
state = sa.Column(sa.String(20))

View File

@ -144,6 +144,7 @@ class Action(object):
values.update({
'task_execution_id': self.task_ex.id,
'workflow_name': self.task_ex.workflow_name,
'workflow_namespace': self.task_ex.workflow_namespace,
'workflow_id': self.task_ex.workflow_id,
'project_id': self.task_ex.project_id,
})
@ -492,7 +493,8 @@ class WorkflowAction(Action):
wf_def = engine_utils.resolve_workflow_definition(
parent_wf_ex.workflow_name,
parent_wf_spec.get_name(),
wf_spec_name
namespace=parent_wf_ex.params['namespace'],
wf_spec_name=wf_spec_name
)
wf_spec = spec_parser.get_workflow_spec_by_definition_id(
@ -502,7 +504,8 @@ class WorkflowAction(Action):
wf_params = {
'task_execution_id': self.task_ex.id,
'index': index
'index': index,
'namespace': parent_wf_ex.params['namespace']
}
if 'env' in parent_wf_ex.params:
@ -516,6 +519,7 @@ class WorkflowAction(Action):
wf_handler.start_workflow(
wf_def.id,
wf_def.namespace,
input_dict,
"sub-workflow execution",
wf_params

View File

@ -28,13 +28,14 @@ class Engine(object):
"""Engine interface."""
@abc.abstractmethod
def start_workflow(self, wf_identifier, wf_input, description='',
**params):
def start_workflow(self, wf_identifier, wf_namespace='', wf_input=None,
description='', **params):
"""Starts the specified workflow.
:param wf_identifier: Workflow ID or name. Workflow ID is recommended,
workflow name will be deprecated since Mitaka.
:param wf_input: Workflow input data as a dictionary.
:param wf_namespace: Workflow input data as a dictionary.
:param description: Execution description.
:param params: Additional workflow type specific parameters.
:return: Workflow execution object.

View File

@ -36,12 +36,16 @@ from mistral.workflow import states
class DefaultEngine(base.Engine):
@action_queue.process
@profiler.trace('engine-start-workflow', hide_args=True)
def start_workflow(self, wf_identifier, wf_input, description='',
**params):
def start_workflow(self, wf_identifier, wf_namespace='', wf_input=None,
description='', **params):
if wf_namespace:
params['namespace'] = wf_namespace
with db_api.transaction():
wf_ex = wf_handler.start_workflow(
wf_identifier,
wf_input,
wf_namespace,
wf_input or {},
description,
params
)

View File

@ -78,12 +78,13 @@ class EngineServer(service_base.MistralService):
if self._rpc_server:
self._rpc_server.stop(graceful)
def start_workflow(self, rpc_ctx, workflow_identifier, workflow_input,
description, params):
def start_workflow(self, rpc_ctx, workflow_identifier, workflow_namespace,
workflow_input, description, params):
"""Receives calls over RPC to start workflows on engine.
:param rpc_ctx: RPC request context.
:param workflow_identifier: Workflow definition identifier.
:param workflow_namespace: Workflow definition identifier.
:param workflow_input: Workflow input.
:param description: Workflow execution description.
:param params: Additional workflow type specific parameters.
@ -101,6 +102,7 @@ class EngineServer(service_base.MistralService):
return self.engine.start_workflow(
workflow_identifier,
workflow_namespace,
workflow_input,
description,
**params

View File

@ -216,6 +216,7 @@ class Task(object):
'name': task_name,
'workflow_execution_id': self.wf_ex.id,
'workflow_name': self.wf_ex.workflow_name,
'workflow_namespace': self.wf_ex.workflow_namespace,
'workflow_id': self.wf_ex.workflow_id,
'state': state,
'state_info': state_info,

View File

@ -67,7 +67,7 @@ def validate_input(expected_input, actual_input, obj_name, obj_class):
def resolve_workflow_definition(parent_wf_name, parent_wf_spec_name,
wf_spec_name):
namespace, wf_spec_name):
wf_def = None
if parent_wf_name != parent_wf_spec_name:
@ -80,14 +80,15 @@ def resolve_workflow_definition(parent_wf_name, parent_wf_spec_name,
wf_full_name = "%s.%s" % (wb_name, wf_spec_name)
wf_def = db_api.load_workflow_definition(wf_full_name)
wf_def = db_api.load_workflow_definition(wf_full_name, namespace)
if not wf_def:
wf_def = db_api.load_workflow_definition(wf_spec_name)
wf_def = db_api.load_workflow_definition(wf_spec_name, namespace)
if not wf_def:
raise exc.WorkflowException(
"Failed to find workflow [name=%s]" % wf_spec_name
"Failed to find workflow [name=%s] [namespace=%s]" %
(wf_spec_name, namespace)
)
return wf_def

View File

@ -33,11 +33,16 @@ _CHECK_AND_COMPLETE_PATH = (
@profiler.trace('workflow-handler-start-workflow', hide_args=True)
def start_workflow(wf_identifier, wf_input, desc, params):
def start_workflow(wf_identifier, wf_namespace, wf_input, desc, params):
wf = workflows.Workflow()
wf_def = db_api.get_workflow_definition(wf_identifier, wf_namespace)
if 'namespace' not in params:
params['namespace'] = wf_def.namespace
wf.start(
wf_def=db_api.get_workflow_definition(wf_identifier),
wf_def=wf_def,
input_dict=wf_input,
desc=desc,
params=params

View File

@ -233,6 +233,7 @@ class Workflow(object):
'name': wf_def.name,
'description': desc,
'workflow_name': wf_def.name,
'workflow_namespace': wf_def.namespace,
'workflow_id': wf_def.id,
'spec': self.wf_spec.to_dict(),
'state': states.IDLE,

View File

@ -79,8 +79,8 @@ class EngineClient(eng.Engine):
self._client = base.get_rpc_client_driver()(rpc_conf_dict)
@base.wrap_messaging_exception
def start_workflow(self, wf_identifier, wf_input, description='',
**params):
def start_workflow(self, wf_identifier, wf_namespace, wf_input=None,
description='', **params):
"""Starts workflow sending a request to engine over RPC.
:return: Workflow execution.
@ -89,6 +89,7 @@ class EngineClient(eng.Engine):
auth_ctx.ctx(),
'start_workflow',
workflow_identifier=wf_identifier,
workflow_namespace=wf_namespace,
workflow_input=wf_input or {},
description=description,
params=params

View File

@ -99,6 +99,7 @@ def _create_or_update_workflows(wb_db, workflows_spec):
'spec': wf_spec.to_dict(),
'scope': wb_db.scope,
'project_id': wb_db.project_id,
'namespace': '',
'tags': wf_spec.get_tags()
}

View File

@ -36,7 +36,8 @@ def register_standard_workflows(run_in_tx=True):
workflow_definition,
scope='public',
is_system=True,
run_in_tx=run_in_tx
run_in_tx=run_in_tx,
namespace=''
)
@ -52,7 +53,7 @@ def sync_db():
def create_workflows(definition, scope='private', is_system=False,
run_in_tx=True):
run_in_tx=True, namespace=''):
LOG.debug("creating workflows")
wf_list_spec = spec_parser.get_workflow_list_spec_from_yaml(definition)
db_wfs = []
@ -63,6 +64,7 @@ def create_workflows(definition, scope='private', is_system=False,
definition,
is_system,
scope,
namespace,
wf_list_spec,
db_wfs
)
@ -71,6 +73,7 @@ def create_workflows(definition, scope='private', is_system=False,
definition,
is_system,
scope,
namespace,
wf_list_spec,
db_wfs
)
@ -78,14 +81,22 @@ def create_workflows(definition, scope='private', is_system=False,
return db_wfs
def _append_all_workflows(definition, is_system, scope, wf_list_spec, db_wfs):
def _append_all_workflows(definition, is_system, scope, namespace,
wf_list_spec, db_wfs):
for wf_spec in wf_list_spec.get_workflows():
db_wfs.append(
_create_workflow(wf_spec, definition, scope, is_system)
_create_workflow(
wf_spec,
definition,
scope,
namespace,
is_system
)
)
def update_workflows(definition, scope='private', identifier=None):
def update_workflows(definition, scope='private', identifier=None,
namespace=''):
LOG.debug("updating workflows")
wf_list_spec = spec_parser.get_workflow_list_spec_from_yaml(definition)
wfs = wf_list_spec.get_workflows()
@ -105,6 +116,7 @@ def update_workflows(definition, scope='private', identifier=None):
wf_spec,
definition,
scope,
namespace=namespace,
identifier=identifier
))
@ -128,29 +140,33 @@ def update_workflow_execution_env(wf_ex, env):
return wf_ex
def _get_workflow_values(wf_spec, definition, scope, is_system=False):
def _get_workflow_values(wf_spec, definition, scope, namespace=None,
is_system=False):
values = {
'name': wf_spec.get_name(),
'tags': wf_spec.get_tags(),
'definition': definition,
'spec': wf_spec.to_dict(),
'scope': scope,
'namespace': namespace,
'is_system': is_system
}
return values
def _create_workflow(wf_spec, definition, scope, is_system):
def _create_workflow(wf_spec, definition, scope, namespace, is_system):
return db_api.create_workflow_definition(
_get_workflow_values(wf_spec, definition, scope, is_system)
_get_workflow_values(wf_spec, definition, scope, namespace, is_system)
)
def _update_workflow(wf_spec, definition, scope, identifier=None):
values = _get_workflow_values(wf_spec, definition, scope)
def _update_workflow(wf_spec, definition, scope, identifier=None,
namespace=''):
values = _get_workflow_values(wf_spec, definition, scope, namespace)
return db_api.update_workflow_definition(
identifier if identifier else values['name'],
values
values,
namespace=namespace
)

View File

@ -0,0 +1,6 @@
---
version: '2.0'
lowest_level_wf:
tasks:
noop_task:
action: std.noop

View File

@ -0,0 +1,6 @@
---
version: '2.0'
middle_wf:
tasks:
run_workflow_with_name_lowest_level_wf:
workflow: lowest_level_wf

View File

@ -0,0 +1,6 @@
---
version: '2.0'
top_level_wf:
tasks:
run_workflow_with_name_middle_wf:
workflow: middle_wf

View File

@ -468,6 +468,7 @@ class TestExecutionsController(base.APITest):
f.assert_called_once_with(
exec_dict['workflow_id'],
'',
json.loads(exec_dict['input']),
exec_dict['description'],
**json.loads(exec_dict['params'])

View File

@ -167,9 +167,7 @@ class TestMembersController(base.APITest):
def test_get_memberships_nonexistent_wf(self, auth_mock):
nonexistent_wf_id = uuidutils.generate_uuid()
resp = self.app.get(
'/v2/workflows/%s/members' % nonexistent_wf_id,
)
resp = self.app.get('/v2/workflows/%s/members' % nonexistent_wf_id)
self.assertEqual(200, resp.status_int)
self.assertEqual(0, len(resp.json['members']))

View File

@ -60,6 +60,26 @@ WF = {
'input': 'param1'
}
WF_DB_WITHIN_ABC_NAMESPACE = models.WorkflowDefinition(
id='234560fe-162a-4060-a16a-a0d9eee9b408',
name='flow',
namespace='abc',
definition=WF_DEFINITION,
created_at=datetime.datetime(1970, 1, 1),
updated_at=datetime.datetime(1970, 1, 1),
spec={'input': ['param1']}
)
WF_WITH_NAMESPACE = {
'id': '234560fe-162a-4060-a16a-a0d9eee9b408',
'name': 'flow',
'namespace': 'abc',
'definition': WF_DEFINITION,
'created_at': '1970-01-01 00:00:00',
'updated_at': '1970-01-01 00:00:00',
'input': 'param1'
}
WF_DEFINITION_WITH_INPUT = """
---
version: '2.0'
@ -218,7 +238,8 @@ class TestWorkflowsController(base.APITest):
update_mock.assert_called_once_with(
UPDATED_WF_DEFINITION,
scope='private',
identifier='123e4567-e89b-12d3-a456-426655440000'
identifier='123e4567-e89b-12d3-a456-426655440000',
namespace=''
)
self.assertDictEqual(UPDATED_WF, resp.json)
@ -603,3 +624,45 @@ class TestWorkflowsController(base.APITest):
self.assertEqual(200, resp.status_int)
self.assertFalse(resp.json['valid'])
self.assertIn("Invalid DSL", resp.json['error'])
@mock.patch("mistral.services.workflows.update_workflows")
@mock.patch.object(db_api, "create_workflow_definition")
def test_workflow_within_namespace(self, mock_mtd, update_mock):
mock_mtd.return_value = WF_DB_WITHIN_ABC_NAMESPACE
namespace = 'abc'
resp = self.app.post(
'/v2/workflows?namespace=%s' % namespace,
WF_DEFINITION,
headers={'Content-Type': 'text/plain'}
)
self.assertEqual(201, resp.status_int)
self.assertDictEqual({'workflows': [WF_WITH_NAMESPACE]}, resp.json)
self.assertEqual(1, mock_mtd.call_count)
spec = mock_mtd.call_args[0][0]['spec']
self.assertIsNotNone(spec)
self.assertEqual(WF_DB.name, spec['name'])
self.assertEqual(WF_DB_WITHIN_ABC_NAMESPACE.namespace, namespace)
update_mock.return_value = [WF_DB_WITHIN_ABC_NAMESPACE]
id_ = '234560fe-162a-4060-a16a-a0d9eee9b408'
resp = self.app.put(
'/v2/workflows/%s?namespace=%s' % (id_, namespace),
WF_DEFINITION,
headers={'Content-Type': 'text/plain'}
)
self.assertEqual(200, resp.status_int)
update_mock.assert_called_once_with(
WF_DEFINITION,
scope='private',
identifier=id_,
namespace='abc'
)
self.assertDictEqual(WF_WITH_NAMESPACE, resp.json)

View File

@ -373,7 +373,8 @@ WF_DEFINITIONS = [
'scope': 'public',
'project_id': '1233',
'trust_id': '1234',
'created_at': datetime.datetime(2016, 12, 1, 15, 0, 0)
'created_at': datetime.datetime(2016, 12, 1, 15, 0, 0),
'namespace': ''
},
{
'name': 'my_wf2',
@ -383,7 +384,8 @@ WF_DEFINITIONS = [
'scope': 'private',
'project_id': '1233',
'trust_id': '12345',
'created_at': datetime.datetime(2016, 12, 1, 15, 1, 0)
'created_at': datetime.datetime(2016, 12, 1, 15, 1, 0),
'namespace': ''
},
]

View File

@ -60,7 +60,7 @@ class ActionContextTest(base.EngineTestCase):
def test_action_context(self):
wb_service.create_workbook_v2(WORKBOOK)
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1')
self.await_workflow_success(wf_ex.id)

View File

@ -105,7 +105,7 @@ class ActionDefaultTest(base.EngineTestCase):
def test_action_defaults_from_env(self):
wf_service.create_workflows(WORKFLOW1)
wf_ex = self.engine.start_workflow('wf1', None, env=ENV)
wf_ex = self.engine.start_workflow('wf1', env=ENV)
self.await_workflow_success(wf_ex.id)
@ -131,7 +131,7 @@ class ActionDefaultTest(base.EngineTestCase):
def test_action_defaults_from_env_not_applied(self):
wf_service.create_workflows(WORKFLOW2)
wf_ex = self.engine.start_workflow('wf2', None, env=ENV)
wf_ex = self.engine.start_workflow('wf2', env=ENV)
self.await_workflow_success(wf_ex.id)
@ -167,6 +167,7 @@ class ActionDefaultTest(base.EngineTestCase):
wf_ex = self.engine.start_workflow(
'wf1_with_items',
'',
wf_input,
env=ENV
)
@ -206,6 +207,7 @@ class ActionDefaultTest(base.EngineTestCase):
wf_ex = self.engine.start_workflow(
'wf2_with_items',
'',
wf_input,
env=ENV
)

View File

@ -112,6 +112,7 @@ class AdhocActionsTest(base.EngineTestCase):
def test_run_workflow_with_adhoc_action(self):
wf_ex = self.engine.start_workflow(
'my_wb.wf1',
'',
{'str1': 'a', 'str2': 'b'}
)
@ -131,6 +132,7 @@ class AdhocActionsTest(base.EngineTestCase):
def test_run_adhoc_action_without_input_value(self):
wf_ex = self.engine.start_workflow(
'my_wb.wf2',
'',
{'str1': 'a', 'str2': 'b'}
)
@ -149,6 +151,7 @@ class AdhocActionsTest(base.EngineTestCase):
def test_run_adhoc_action_without_sufficient_input_value(self):
wf_ex = self.engine.start_workflow(
'my_wb.wf3',
'',
{'str1': 'a', 'str2': 'b'}
)
@ -157,7 +160,7 @@ class AdhocActionsTest(base.EngineTestCase):
def test_run_adhoc_action_with_env(self):
wf_ex = self.engine.start_workflow(
'my_wb.wf4', {'str1': 'a'}, env={'foo': 'bar'})
'my_wb.wf4', '', {'str1': 'a'}, env={'foo': 'bar'})
self.await_workflow_success(wf_ex.id)
with db_api.transaction():

View File

@ -58,7 +58,7 @@ class SimpleEngineCommandsTest(base.EngineTestCase):
wb_service.create_workbook_v2(WORKBOOK1)
def test_fail(self):
wf_ex = self.engine.start_workflow('my_wb.wf', {'my_var': 1})
wf_ex = self.engine.start_workflow('my_wb.wf', '', {'my_var': 1})
self.await_workflow_error(wf_ex.id)
@ -75,7 +75,7 @@ class SimpleEngineCommandsTest(base.EngineTestCase):
)
def test_succeed(self):
wf_ex = self.engine.start_workflow('my_wb.wf', {'my_var': 2})
wf_ex = self.engine.start_workflow('my_wb.wf', '', {'my_var': 2})
self.await_workflow_success(wf_ex.id)
@ -92,7 +92,7 @@ class SimpleEngineCommandsTest(base.EngineTestCase):
)
def test_pause(self):
wf_ex = self.engine.start_workflow('my_wb.wf', {'my_var': 3})
wf_ex = self.engine.start_workflow('my_wb.wf', '', {'my_var': 3})
self.await_workflow_paused(wf_ex.id)
@ -144,7 +144,7 @@ class SimpleEngineWorkflowLevelCommandsTest(base.EngineTestCase):
wb_service.create_workbook_v2(WORKBOOK2)
def test_fail(self):
wf_ex = self.engine.start_workflow('my_wb.wf', {'my_var': 1})
wf_ex = self.engine.start_workflow('my_wb.wf', '', {'my_var': 1})
self.await_workflow_error(wf_ex.id)
@ -161,7 +161,7 @@ class SimpleEngineWorkflowLevelCommandsTest(base.EngineTestCase):
)
def test_succeed(self):
wf_ex = self.engine.start_workflow('my_wb.wf', {'my_var': 2})
wf_ex = self.engine.start_workflow('my_wb.wf', '', {'my_var': 2})
self.await_workflow_success(wf_ex.id)
@ -178,7 +178,7 @@ class SimpleEngineWorkflowLevelCommandsTest(base.EngineTestCase):
)
def test_pause(self):
wf_ex = self.engine.start_workflow('my_wb.wf', {'my_var': 3})
wf_ex = self.engine.start_workflow('my_wb.wf', '', {'my_var': 3})
self.await_workflow_paused(wf_ex.id)
@ -263,7 +263,7 @@ class OrderEngineCommandsTest(base.EngineTestCase):
wb_service.create_workbook_v2(WORKBOOK3)
def test_fail_first(self):
wf_ex = self.engine.start_workflow('my_wb.fail_first_wf', None)
wf_ex = self.engine.start_workflow('my_wb.fail_first_wf', '', None)
self.await_workflow_error(wf_ex.id)
@ -280,7 +280,7 @@ class OrderEngineCommandsTest(base.EngineTestCase):
)
def test_fail_second(self):
wf_ex = self.engine.start_workflow('my_wb.fail_second_wf', None)
wf_ex = self.engine.start_workflow('my_wb.fail_second_wf', '', None)
self.await_workflow_error(wf_ex.id)
@ -301,7 +301,7 @@ class OrderEngineCommandsTest(base.EngineTestCase):
self.await_workflow_error(wf_ex.id)
def test_succeed_first(self):
wf_ex = self.engine.start_workflow('my_wb.succeed_first_wf', None)
wf_ex = self.engine.start_workflow('my_wb.succeed_first_wf', '', None)
self.await_workflow_success(wf_ex.id)
@ -318,7 +318,7 @@ class OrderEngineCommandsTest(base.EngineTestCase):
)
def test_succeed_second(self):
wf_ex = self.engine.start_workflow('my_wb.succeed_second_wf', None)
wf_ex = self.engine.start_workflow('my_wb.succeed_second_wf', '', None)
self.await_workflow_success(wf_ex.id)
@ -371,7 +371,7 @@ class SimpleEngineCmdsWithMsgTest(base.EngineTestCase):
wb_service.create_workbook_v2(WORKBOOK4)
def test_fail(self):
wf_ex = self.engine.start_workflow('my_wb.wf', {'my_var': 1})
wf_ex = self.engine.start_workflow('my_wb.wf', '', {'my_var': 1})
self.await_workflow_error(wf_ex.id)
@ -390,7 +390,7 @@ class SimpleEngineCmdsWithMsgTest(base.EngineTestCase):
self.assertEqual('my_var value is 1', wf_ex.state_info)
def test_succeed(self):
wf_ex = self.engine.start_workflow('my_wb.wf', {'my_var': 2})
wf_ex = self.engine.start_workflow('my_wb.wf', '', {'my_var': 2})
self.await_workflow_success(wf_ex.id)
@ -409,7 +409,7 @@ class SimpleEngineCmdsWithMsgTest(base.EngineTestCase):
self.assertEqual("my_var value is 2", wf_ex.state_info)
def test_pause(self):
wf_ex = self.engine.start_workflow('my_wb.wf', {'my_var': 3})
wf_ex = self.engine.start_workflow('my_wb.wf', '', {'my_var': 3})
self.await_workflow_paused(wf_ex.id)
@ -462,7 +462,7 @@ class SimpleEngineWorkflowLevelCmdsWithMsgTest(base.EngineTestCase):
wb_service.create_workbook_v2(WORKBOOK5)
def test_fail(self):
wf_ex = self.engine.start_workflow('my_wb.wf', {'my_var': 1})
wf_ex = self.engine.start_workflow('my_wb.wf', '', {'my_var': 1})
self.await_workflow_error(wf_ex.id)
@ -481,7 +481,7 @@ class SimpleEngineWorkflowLevelCmdsWithMsgTest(base.EngineTestCase):
self.assertEqual("my_var value is 1", wf_ex.state_info)
def test_succeed(self):
wf_ex = self.engine.start_workflow('my_wb.wf', {'my_var': 2})
wf_ex = self.engine.start_workflow('my_wb.wf', '', {'my_var': 2})
self.await_workflow_success(wf_ex.id)
@ -500,7 +500,7 @@ class SimpleEngineWorkflowLevelCmdsWithMsgTest(base.EngineTestCase):
self.assertEqual("my_var value is 2", wf_ex.state_info)
def test_pause(self):
wf_ex = self.engine.start_workflow('my_wb.wf', {'my_var': 3})
wf_ex = self.engine.start_workflow('my_wb.wf', '', {'my_var': 3})
self.await_workflow_paused(wf_ex.id)

View File

@ -63,7 +63,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(linear_wf)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {}, env={'from': 'Neo'})
wf_ex = self.engine.start_workflow('wf', '', {}, env={'from': 'Neo'})
self.await_workflow_success(wf_ex.id)
@ -133,7 +133,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(linear_with_branches_wf)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {}, env={'from': 'Neo'})
wf_ex = self.engine.start_workflow('wf', '', {}, env={'from': 'Neo'})
self.await_workflow_success(wf_ex.id)
@ -208,7 +208,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(parallel_tasks_wf)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -286,7 +286,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(parallel_tasks_complex_wf)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -367,6 +367,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wf',
'',
{},
env={'from': 'Neo'}
)
@ -425,6 +426,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wf',
'',
{},
env={'from': 'Neo'}
)
@ -482,7 +484,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(linear_wf)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -517,7 +519,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(linear_wf)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -557,7 +559,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf)
# Start workflow.
wf_ex = self.engine.start_workflow('wf1_with_items', {})
wf_ex = self.engine.start_workflow('wf1_with_items', '', {})
self.await_workflow_success(wf_ex.id)
@ -595,7 +597,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_def)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -655,7 +657,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wb_service.create_workbook_v2(wb_def)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
self.await_workflow_error(wf_ex.id)
@ -701,7 +703,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
}
# Start workflow.
wf_ex = self.engine.start_workflow('wf', wf_input)
wf_ex = self.engine.start_workflow('wf', '', wf_input)
self.await_workflow_success(wf_ex.id)
@ -734,7 +736,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -773,7 +775,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -817,7 +819,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -858,7 +860,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -905,7 +907,7 @@ class DataFlowEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)

View File

@ -110,6 +110,7 @@ class DefaultEngineTest(base.DbTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wb.wf',
'',
wf_input,
'my execution',
task_name='task2'
@ -154,6 +155,7 @@ class DefaultEngineTest(base.DbTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wb.wf',
'',
wf_input,
task_name='task1'
)
@ -200,6 +202,7 @@ class DefaultEngineTest(base.DbTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wb.wf',
'',
wf_input,
env=env,
task_name='task2')
@ -221,6 +224,7 @@ class DefaultEngineTest(base.DbTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wb.wf',
'',
wf_input,
env='test',
task_name='task2'
@ -238,6 +242,7 @@ class DefaultEngineTest(base.DbTestCase):
exc.InputException,
self.engine.start_workflow,
'wb.wf',
'',
{
'param1': '<% env().key1 %>',
'param2': 'some value'
@ -253,6 +258,7 @@ class DefaultEngineTest(base.DbTestCase):
exc.InputException,
self.engine.start_workflow,
'wb.wf',
'',
{
'param1': '<% env().key1 %>',
'param2': 'some value'
@ -268,6 +274,7 @@ class DefaultEngineTest(base.DbTestCase):
exc.InputException,
self.engine.start_workflow,
'wb.wf',
'',
None,
task_name='task2'
)
@ -280,6 +287,7 @@ class DefaultEngineTest(base.DbTestCase):
exc.InputException,
self.engine.start_workflow,
'wb.wf',
'',
{
'param1': 'Hey',
'param2': 'Hi',
@ -297,6 +305,7 @@ class DefaultEngineTest(base.DbTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wb.wf',
'',
wf_input,
task_name='task2'
)
@ -410,6 +419,7 @@ class DefaultEngineTest(base.DbTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wb.wf',
'',
{
'param1': 'Hey',
'param2': 'Hi'
@ -432,6 +442,7 @@ class DefaultEngineTest(base.DbTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wb.wf',
'',
{
'param1': 'Hey',
'param2': 'Hi'
@ -453,6 +464,7 @@ class DefaultEngineTest(base.DbTestCase):
def test_stop_workflow_bad_status(self):
wf_ex = self.engine.start_workflow(
'wb.wf',
'',
{
'param1': 'Hey',
'param2': 'Hi'

View File

@ -32,7 +32,7 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
def _run_workflow(self, wf_text, expected_state=states.ERROR):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_state(wf_ex.id, expected_state)
@ -113,7 +113,7 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
"""
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -147,7 +147,7 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -243,7 +243,7 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', None)
wf_ex = self.engine.start_workflow('wf', '', None)
self.assertIn(
"Failed to find action [action_name=wrong.task]",
@ -406,7 +406,7 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', None)
wf_ex = self.engine.start_workflow('wf', '', None)
self.assertIn(
"Can not evaluate YAQL expression [expression=wrong(yaql)",
@ -429,7 +429,7 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {'var': 2})
wf_ex = self.engine.start_workflow('wf', '', {'var': 2})
self.assertIn("Can not evaluate YAQL expression", wf_ex.state_info)
self.assertEqual(states.ERROR, wf_ex.state)
@ -460,7 +460,7 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -612,7 +612,7 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
calls = db_api.get_delayed_calls()
@ -639,7 +639,7 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
calls = db_api.get_delayed_calls()
@ -670,7 +670,7 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -705,7 +705,7 @@ class DirectWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)

View File

@ -224,7 +224,7 @@ class DirectWorkflowRerunTest(base.EngineTestCase):
wb_service.create_workbook_v2(SIMPLE_WORKBOOK)
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb1.wf1', {})
wf_ex = self.engine.start_workflow('wb1.wf1', '', {})
self.await_workflow_error(wf_ex.id)
@ -326,7 +326,7 @@ class DirectWorkflowRerunTest(base.EngineTestCase):
}
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb1.wf1', {}, env=env)
wf_ex = self.engine.start_workflow('wb1.wf1', '', {}, env=env)
self.await_workflow_error(wf_ex.id)
@ -472,7 +472,7 @@ class DirectWorkflowRerunTest(base.EngineTestCase):
wb_service.create_workbook_v2(SIMPLE_WORKBOOK)
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb1.wf1', {})
wf_ex = self.engine.start_workflow('wb1.wf1', '', {})
self.await_workflow_error(wf_ex.id)
@ -526,7 +526,7 @@ class DirectWorkflowRerunTest(base.EngineTestCase):
wb_service.create_workbook_v2(WITH_ITEMS_WORKBOOK)
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb3.wf1', {})
wf_ex = self.engine.start_workflow('wb3.wf1', '', {})
self.await_workflow_error(wf_ex.id)
@ -618,7 +618,7 @@ class DirectWorkflowRerunTest(base.EngineTestCase):
wb_service.create_workbook_v2(WITH_ITEMS_WORKBOOK_CONCURRENCY)
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb3.wf1', {})
wf_ex = self.engine.start_workflow('wb3.wf1', '', {})
self.await_workflow_error(wf_ex.id)
@ -700,7 +700,7 @@ class DirectWorkflowRerunTest(base.EngineTestCase):
env = {'var1': 'fee fi fo fum'}
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb3.wf1', {}, env=env)
wf_ex = self.engine.start_workflow('wb3.wf1', '', {}, env=env)
self.await_workflow_error(wf_ex.id)
@ -806,7 +806,7 @@ class DirectWorkflowRerunTest(base.EngineTestCase):
wb_service.create_workbook_v2(JOIN_WORKBOOK)
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb1.wf1', {})
wf_ex = self.engine.start_workflow('wb1.wf1', '', {})
wf_ex = db_api.get_workflow_execution(wf_ex.id)
@ -905,7 +905,7 @@ class DirectWorkflowRerunTest(base.EngineTestCase):
wb_service.create_workbook_v2(JOIN_WORKBOOK)
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb1.wf1', {})
wf_ex = self.engine.start_workflow('wb1.wf1', '', {})
with db_api.transaction():
wf_ex = db_api.get_workflow_execution(wf_ex.id)
@ -1057,7 +1057,7 @@ class DirectWorkflowRerunTest(base.EngineTestCase):
wb_service.create_workbook_v2(WITH_ITEMS_WORKBOOK)
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb3.wf1', {})
wf_ex = self.engine.start_workflow('wb3.wf1', '', {})
self.await_workflow_error(wf_ex.id)
@ -1206,7 +1206,7 @@ class DirectWorkflowRerunTest(base.EngineTestCase):
wb_service.create_workbook_v2(SUBFLOW_WORKBOOK)
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb1.wf1', {})
wf_ex = self.engine.start_workflow('wb1.wf1', '', {})
self.await_workflow_error(wf_ex.id)
@ -1299,7 +1299,7 @@ class DirectWorkflowRerunTest(base.EngineTestCase):
wb_service.create_workbook_v2(SUBFLOW_WORKBOOK)
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb1.wf1', {})
wf_ex = self.engine.start_workflow('wb1.wf1', '', {})
self.await_workflow_error(wf_ex.id)

View File

@ -65,7 +65,7 @@ class DirectWorkflowRerunCancelledTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb_def)
wf1_ex = self.engine.start_workflow('wb1.wf1', {})
wf1_ex = self.engine.start_workflow('wb1.wf1', '', {})
self.await_workflow_state(wf1_ex.id, states.RUNNING)
@ -232,7 +232,7 @@ class DirectWorkflowRerunCancelledTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb_def)
wf1_ex = self.engine.start_workflow('wb1.wf1', {})
wf1_ex = self.engine.start_workflow('wb1.wf1', '', {})
self.await_workflow_state(wf1_ex.id, states.RUNNING)
@ -402,7 +402,7 @@ class DirectWorkflowRerunCancelledTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb_def)
wf1_ex = self.engine.start_workflow('wb1.wf1', {})
wf1_ex = self.engine.start_workflow('wb1.wf1', '', {})
self.await_workflow_state(wf1_ex.id, states.RUNNING)
@ -561,7 +561,7 @@ class DirectWorkflowRerunCancelledTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb_def)
wf1_ex = self.engine.start_workflow('wb1.wf1', {})
wf1_ex = self.engine.start_workflow('wb1.wf1', '', {})
self.await_workflow_state(wf1_ex.id, states.RUNNING)

View File

@ -58,7 +58,7 @@ class DirectWorkflowWithCyclesTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf')
self.await_workflow_success(wf_ex.id)
@ -120,7 +120,7 @@ class DirectWorkflowWithCyclesTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -195,7 +195,7 @@ class DirectWorkflowWithCyclesTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)

View File

@ -104,7 +104,7 @@ class EnvironmentTest(base.EngineTestCase):
@mock.patch.object(r_exe.RemoteExecutor, 'run_action', MOCK_RUN_AT_TARGET)
def _test_subworkflow(self, env):
wf2_ex = self.engine.start_workflow('my_wb.wf2', {}, env=env)
wf2_ex = self.engine.start_workflow('my_wb.wf2', '', {}, env=env)
# Execution of 'wf2'.
self.assertIsNotNone(wf2_ex)
@ -225,6 +225,7 @@ class EnvironmentTest(base.EngineTestCase):
wf_ex = self.engine.start_workflow(
'wf',
'',
{},
env=env,
evaluate_env=True
@ -249,6 +250,7 @@ class EnvironmentTest(base.EngineTestCase):
wf_ex = self.engine.start_workflow(
'wf',
'',
{},
env=env,
evaluate_env=False
@ -297,6 +299,7 @@ class EnvironmentTest(base.EngineTestCase):
parent_wf_ex = self.engine.start_workflow(
'parent_wf',
'',
{},
env=env,
evaluate_env=False
@ -329,6 +332,7 @@ class EnvironmentTest(base.EngineTestCase):
parent_wf_ex = self.engine.start_workflow(
'parent_wf',
'',
{},
env=env,
evaluate_env=True

View File

@ -62,6 +62,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
exc.InputException,
self.engine.start_workflow,
'wf',
'',
{'wrong_param': 'some_value'}
)
@ -87,7 +88,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.assertEqual(states.RUNNING, wf_ex.state)
self.assertIsNotNone(db_api.get_workflow_execution(wf_ex.id))
@ -118,7 +119,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -148,7 +149,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -206,7 +207,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -257,7 +258,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -309,7 +310,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -357,7 +358,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -398,7 +399,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -426,7 +427,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -453,7 +454,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -481,7 +482,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -510,7 +511,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -545,7 +546,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -584,7 +585,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb_text)
wf_ex = self.engine.start_workflow('wb.wf', {})
wf_ex = self.engine.start_workflow('wb.wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -620,7 +621,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -656,7 +657,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -687,7 +688,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -727,7 +728,7 @@ class ErrorHandlingEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)

View File

@ -83,6 +83,7 @@ class ErrorResultTest(base.EngineTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wf',
'',
{
'success_result': None,
'error_result': 2
@ -116,6 +117,7 @@ class ErrorResultTest(base.EngineTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wf',
'',
{
'success_result': None,
'error_result': 3
@ -149,6 +151,7 @@ class ErrorResultTest(base.EngineTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wf',
'',
{
'success_result': 'success',
'error_result': None

View File

@ -123,7 +123,7 @@ class ExecutionFieldsSizeLimitTest(base.EngineTestCase):
wf_service.create_workflows(new_wf)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -137,6 +137,7 @@ class ExecutionFieldsSizeLimitTest(base.EngineTestCase):
exc.SizeLimitExceededException,
self.engine.start_workflow,
'wf',
'',
{}
)
@ -153,6 +154,7 @@ class ExecutionFieldsSizeLimitTest(base.EngineTestCase):
exc.SizeLimitExceededException,
self.engine.start_workflow,
'wf',
'',
{'workflow_input': ''.join('A' for _ in range(1024))}
)
@ -167,7 +169,7 @@ class ExecutionFieldsSizeLimitTest(base.EngineTestCase):
wf_service.create_workflows(new_wf)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.assertEqual(states.ERROR, wf_ex.state)
self.assertIn(
@ -181,6 +183,7 @@ class ExecutionFieldsSizeLimitTest(base.EngineTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wf',
'',
{'action_output_length': 1024}
)
@ -201,7 +204,7 @@ class ExecutionFieldsSizeLimitTest(base.EngineTestCase):
wf_service.create_workflows(new_wf)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -234,6 +237,7 @@ class ExecutionFieldsSizeLimitTest(base.EngineTestCase):
exc.SizeLimitExceededException,
self.engine.start_workflow,
'wf',
'',
{},
'',
env={'param': long_string}
@ -257,6 +261,7 @@ class ExecutionFieldsSizeLimitTest(base.EngineTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'wf',
'',
{
'action_output_length': 80000,
'action_output_dict': True,

View File

@ -69,7 +69,7 @@ class JavaScriptEngineTest(base.EngineTestCase):
wb_service.create_workbook_v2(WORKBOOK)
# Start workflow.
wf_ex = self.engine.start_workflow('test_js.js_test', {'num': 50})
wf_ex = self.engine.start_workflow('test_js.js_test', '', {'num': 50})
self.await_workflow_success(wf_ex.id)
@ -88,7 +88,7 @@ class JavaScriptEngineTest(base.EngineTestCase):
wb_service.create_workbook_v2(WORKBOOK)
# Start workflow.
wf_ex = self.engine.start_workflow('test_js.js_test', {'num': 50})
wf_ex = self.engine.start_workflow('test_js.js_test', '', {'num': 50})
self.await_workflow_success(wf_ex.id)

View File

@ -47,7 +47,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -95,7 +95,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -148,7 +148,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -209,7 +209,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
def _num_of_tasks():
return len(
@ -290,7 +290,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -372,7 +372,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -449,7 +449,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -531,7 +531,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wfs_tasks_join_complex)
# Start workflow.
wf_ex = self.engine.start_workflow('main', {})
wf_ex = self.engine.start_workflow('main', '', {})
self.await_workflow_success(wf_ex.id)
@ -596,7 +596,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('main', {})
wf_ex = self.engine.start_workflow('main', '', {})
self.await_workflow_success(wf_ex.id)
@ -655,7 +655,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('main', {})
wf_ex = self.engine.start_workflow('main', '', {})
self.await_workflow_error(wf_ex.id)
@ -709,7 +709,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('test-join', {})
wf_ex = self.engine.start_workflow('test-join', '', {})
self.await_workflow_success(wf_ex.id)
@ -741,7 +741,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -785,7 +785,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -818,7 +818,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -851,7 +851,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
tasks = db_api.get_task_executions(workflow_execution_id=wf_ex.id)
@ -909,7 +909,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
tasks = db_api.get_task_executions(workflow_execution_id=wf_ex.id)
@ -975,7 +975,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -1037,7 +1037,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -1061,7 +1061,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -1119,7 +1119,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -1195,7 +1195,7 @@ class JoinEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)

View File

@ -52,7 +52,7 @@ class LookupUtilsTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_paused(wf_ex.id)

View File

@ -78,7 +78,7 @@ class NoopTaskEngineTest(base.EngineTestCase):
wf_service.create_workflows(WF)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {'num1': 1, 'num2': 1})
wf_ex = self.engine.start_workflow('wf', '', {'num1': 1, 'num2': 1})
self.await_workflow_success(wf_ex.id)
@ -107,7 +107,7 @@ class NoopTaskEngineTest(base.EngineTestCase):
wf_service.create_workflows(WF)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {'num1': 1, 'num2': 2})
wf_ex = self.engine.start_workflow('wf', '', {'num1': 1, 'num2': 2})
self.await_workflow_success(wf_ex.id)

View File

@ -423,7 +423,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(WAIT_BEFORE_WB)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -443,7 +443,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(WAIT_BEFORE_FROM_VAR)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {'wait_before': 1})
wf_ex = self.engine.start_workflow('wb.wf1', '', {'wait_before': 1})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -471,7 +471,7 @@ class PoliciesTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -488,7 +488,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(WAIT_AFTER_WB)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -506,7 +506,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(WAIT_AFTER_FROM_VAR)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {'wait_after': 2})
wf_ex = self.engine.start_workflow('wb.wf1', '', {'wait_after': 2})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -531,7 +531,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(RETRY_WB)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -561,7 +561,11 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(RETRY_WB_FROM_VAR)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {'count': 3, 'delay': 1})
wf_ex = self.engine.start_workflow(
'wb.wf1',
'',
{'count': 3, 'delay': 1}
)
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -606,7 +610,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(retry_wb)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -649,7 +653,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(retry_wb)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -692,7 +696,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(retry_wb)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -736,7 +740,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(retry_wb)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -777,7 +781,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(retry_wb)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -816,7 +820,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(retry_wb)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -862,7 +866,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(retry_wb)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.main', {})
wf_ex = self.engine.start_workflow('wb.main', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -908,7 +912,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(retry_wb)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -961,7 +965,7 @@ class PoliciesTest(base.EngineTestCase):
"""
wf_service.create_workflows(retry_wf)
wf_ex = self.engine.start_workflow('wf1', {})
wf_ex = self.engine.start_workflow('wf1', '', {})
self.await_workflow_success(wf_ex.id)
@ -984,7 +988,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(TIMEOUT_WB)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -1009,7 +1013,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(TIMEOUT_WB2)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -1036,7 +1040,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(TIMEOUT_FROM_VAR)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {'timeout': 1})
wf_ex = self.engine.start_workflow('wb.wf1', '', {'timeout': 1})
with db_api.transaction():
# Note: We need to reread execution to access related tasks.
@ -1055,7 +1059,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(PAUSE_BEFORE_WB)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
wf_ex = db_api.get_workflow_execution(wf_ex.id)
@ -1096,7 +1100,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(PAUSE_BEFORE_DELAY_WB)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
with db_api.transaction():
wf_ex = db_api.get_workflow_execution(wf_ex.id)
@ -1148,7 +1152,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(CONCURRENCY_WB)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
self.await_workflow_success(wf_ex.id)
@ -1166,7 +1170,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(CONCURRENCY_WB_FROM_VAR)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {'concurrency': 4})
wf_ex = self.engine.start_workflow('wb.wf1', '', {'concurrency': 4})
with db_api.transaction():
wf_ex = db_api.get_workflow_execution(wf_ex.id)
@ -1194,7 +1198,7 @@ class PoliciesTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {'wait_before': '1'})
wf_ex = self.engine.start_workflow('wb.wf1', '', {'wait_before': '1'})
self.assertIn(
'Invalid data type in WaitBeforePolicy',
@ -1219,7 +1223,7 @@ class PoliciesTest(base.EngineTestCase):
wf_service.create_workflows(wf_delayed_state)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)

View File

@ -64,7 +64,7 @@ class EngineProfilerTest(base.EngineTestCase):
self.ctx_serializer.deserialize_context(ctx)
wf_ex = self.engine_client.start_workflow('wf', {})
wf_ex = self.engine_client.start_workflow('wf', '', {})
self.assertIsNotNone(wf_ex)
self.assertEqual(states.RUNNING, wf_ex['state'])
@ -87,7 +87,7 @@ class EngineProfilerTest(base.EngineTestCase):
self.ctx_serializer.deserialize_context({})
wf_ex = self.engine_client.start_workflow('wf', {})
wf_ex = self.engine_client.start_workflow('wf', '', {})
self.assertIsNotNone(wf_ex)
self.assertEqual(states.RUNNING, wf_ex['state'])

View File

@ -141,7 +141,7 @@ class EngineActionRaceConditionTest(base.EngineTestCase):
self.block_action()
wf_ex = self.engine.start_workflow('wf', None)
wf_ex = self.engine.start_workflow('wf', '', None)
with db_api.transaction():
wf_ex = db_api.get_workflow_execution(wf_ex.id)
@ -183,7 +183,7 @@ class EngineActionRaceConditionTest(base.EngineTestCase):
self.block_action()
wf_ex = self.engine.start_workflow('wf', None)
wf_ex = self.engine.start_workflow('wf', '', None)
wf_ex = db_api.get_workflow_execution(wf_ex.id)

View File

@ -72,6 +72,7 @@ class ReverseWorkflowEngineTest(base.EngineTestCase):
wf_ex = self.engine.start_workflow(
'my_wb.wf1',
'',
wf_input,
task_name='task1'
)
@ -79,7 +80,10 @@ class ReverseWorkflowEngineTest(base.EngineTestCase):
# Execution 1.
self.assertIsNotNone(wf_ex)
self.assertDictEqual(wf_input, wf_ex.input)
self.assertDictEqual({'task_name': 'task1'}, wf_ex.params)
self.assertDictEqual(
{'task_name': 'task1', 'namespace': ''},
wf_ex.params
)
# Wait till workflow 'wf1' is completed.
self.await_workflow_success(wf_ex.id)
@ -105,6 +109,7 @@ class ReverseWorkflowEngineTest(base.EngineTestCase):
wf_ex = self.engine.start_workflow(
'my_wb.wf1',
'',
wf_input,
task_name='task2'
)
@ -112,7 +117,10 @@ class ReverseWorkflowEngineTest(base.EngineTestCase):
# Execution 1.
self.assertIsNotNone(wf_ex)
self.assertDictEqual(wf_input, wf_ex.input)
self.assertDictEqual({'task_name': 'task2'}, wf_ex.params)
self.assertDictEqual(
{'task_name': 'task2', 'namespace': ''},
wf_ex.params
)
# Wait till workflow 'wf1' is completed.
self.await_workflow_success(wf_ex.id)
@ -146,6 +154,7 @@ class ReverseWorkflowEngineTest(base.EngineTestCase):
wf_ex = self.engine.start_workflow(
'my_wb.wf1',
'',
wf_input,
task_name='task4'
)

View File

@ -88,7 +88,7 @@ class ReverseWorkflowRerunTest(base.EngineTestCase):
wb_service.create_workbook_v2(SIMPLE_WORKBOOK)
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb1.wf1', {}, task_name='t3')
wf_ex = self.engine.start_workflow('wb1.wf1', '', {}, task_name='t3')
self.await_workflow_error(wf_ex.id)
@ -200,6 +200,7 @@ class ReverseWorkflowRerunTest(base.EngineTestCase):
# Run workflow and fail task.
wf_ex = self.engine.start_workflow(
'wb1.wf1',
'',
{},
task_name='t3',
env=env
@ -340,7 +341,7 @@ class ReverseWorkflowRerunTest(base.EngineTestCase):
wb_service.create_workbook_v2(SIMPLE_WORKBOOK)
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb1.wf1', {}, task_name='t3')
wf_ex = self.engine.start_workflow('wb1.wf1', '', {}, task_name='t3')
self.await_workflow_error(wf_ex.id)

View File

@ -63,7 +63,7 @@ class ReverseWorkflowRerunCancelledTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb_def)
wf1_ex = self.engine.start_workflow('wb1.wf1', {}, task_name='t3')
wf1_ex = self.engine.start_workflow('wb1.wf1', '', {}, task_name='t3')
self.await_workflow_state(wf1_ex.id, states.RUNNING)

View File

@ -72,7 +72,7 @@ class TestSafeRerun(base.EngineTestCase):
# to true.
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -118,7 +118,7 @@ class TestSafeRerun(base.EngineTestCase):
# to true.
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -153,7 +153,7 @@ class TestSafeRerun(base.EngineTestCase):
"""
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)

View File

@ -46,7 +46,7 @@ class ExecutionStateInfoTest(base.EngineTestCase):
wf_service.create_workflows(workflow)
# Start workflow.
wf_ex = self.engine.start_workflow('test_wf', {})
wf_ex = self.engine.start_workflow('test_wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -70,7 +70,7 @@ class ExecutionStateInfoTest(base.EngineTestCase):
wf_service.create_workflows(workflow)
# Start workflow.
wf_ex = self.engine.start_workflow('test_wf', {})
wf_ex = self.engine.start_workflow('test_wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -96,7 +96,7 @@ class ExecutionStateInfoTest(base.EngineTestCase):
wf_service.create_workflows(workflow)
# Start workflow.
wf_ex = self.engine.start_workflow('test_wf', {})
wf_ex = self.engine.start_workflow('test_wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -131,7 +131,7 @@ class ExecutionStateInfoTest(base.EngineTestCase):
wf_service.create_workflows(workflow)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)

View File

@ -105,7 +105,7 @@ class SubworkflowsTest(base.EngineTestCase):
wb_service.create_workbook_v2(WB2)
def test_subworkflow_success(self):
wf2_ex = self.engine.start_workflow('wb1.wf2', None)
wf2_ex = self.engine.start_workflow('wb1.wf2', '', None)
project_id = auth_context.ctx().project_id
@ -113,7 +113,7 @@ class SubworkflowsTest(base.EngineTestCase):
self.assertEqual(project_id, wf2_ex.project_id)
self.assertIsNotNone(wf2_ex)
self.assertDictEqual({}, wf2_ex.input)
self.assertDictEqual({}, wf2_ex.params)
self.assertDictEqual({'namespace': ''}, wf2_ex.params)
self._await(lambda: len(db_api.get_workflow_executions()) == 2, 0.5, 5)
@ -187,7 +187,7 @@ class SubworkflowsTest(base.EngineTestCase):
@mock.patch.object(std_actions.EchoAction, 'run',
mock.MagicMock(side_effect=exc.ActionException))
def test_subworkflow_error(self):
self.engine.start_workflow('wb1.wf2', None)
self.engine.start_workflow('wb1.wf2', '', None)
self._await(lambda: len(db_api.get_workflow_executions()) == 2, 0.5, 5)
@ -205,7 +205,7 @@ class SubworkflowsTest(base.EngineTestCase):
self.await_workflow_error(wf2_ex.id)
def test_subworkflow_yaql_error(self):
wf_ex = self.engine.start_workflow('wb2.wf1', None)
wf_ex = self.engine.start_workflow('wb2.wf1', '', None)
self.await_workflow_error(wf_ex.id)
@ -227,12 +227,15 @@ class SubworkflowsTest(base.EngineTestCase):
def test_subworkflow_environment_inheritance(self):
env = {'key1': 'abc'}
wf2_ex = self.engine.start_workflow('wb1.wf2', None, env=env)
wf2_ex = self.engine.start_workflow('wb1.wf2', '', None, env=env)
# Execution of 'wf2'.
self.assertIsNotNone(wf2_ex)
self.assertDictEqual({}, wf2_ex.input)
self.assertDictEqual({'env': env}, wf2_ex.params)
self.assertDictEqual(
{'env': env, 'namespace': ''},
wf2_ex.params
)
self._await(lambda: len(db_api.get_workflow_executions()) == 2, 0.5, 5)

View File

@ -52,7 +52,7 @@ class TaskCancelTest(base.EngineTestCase):
wf_service.create_workflows(workflow)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_state(wf_ex.id, states.RUNNING)
@ -143,7 +143,7 @@ class TaskCancelTest(base.EngineTestCase):
wb_service.create_workbook_v2(workbook)
wf_ex = self.engine.start_workflow('wb.wf', {})
wf_ex = self.engine.start_workflow('wb.wf', '', {})
self.await_workflow_state(wf_ex.id, states.RUNNING)
@ -219,7 +219,7 @@ class TaskCancelTest(base.EngineTestCase):
wf_service.create_workflows(workflow)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_state(wf_ex.id, states.RUNNING)
@ -308,7 +308,7 @@ class TaskCancelTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb_def)
wf1_ex = self.engine.start_workflow('wb1.wf1', {})
wf1_ex = self.engine.start_workflow('wb1.wf1', '', {})
self.await_workflow_state(wf1_ex.id, states.RUNNING)

View File

@ -63,7 +63,7 @@ class TaskDefaultsDirectWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -106,7 +106,7 @@ class TaskDefaultsReverseWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {}, task_name='task2')
wf_ex = self.engine.start_workflow('wf', '', {}, task_name='task2')
self.await_workflow_error(wf_ex.id)
@ -150,7 +150,7 @@ class TaskDefaultsReverseWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {}, task_name='task2')
wf_ex = self.engine.start_workflow('wf', '', {}, task_name='task2')
self.await_workflow_error(wf_ex.id)
@ -188,7 +188,7 @@ class TaskDefaultsReverseWorkflowEngineTest(base.EngineTestCase):
time_before = dt.datetime.now()
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {}, task_name='task1')
wf_ex = self.engine.start_workflow('wf', '', {}, task_name='task1')
self.await_workflow_success(wf_ex.id)
@ -233,7 +233,7 @@ class TaskDefaultsReverseWorkflowEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {}, task_name='task2')
wf_ex = self.engine.start_workflow('wf', '', {}, task_name='task2')
self.await_workflow_success(wf_ex.id)

View File

@ -67,7 +67,7 @@ class TaskPublishTest(base.EngineTestCase):
wb_service.create_workbook_v2(SIMPLE_WORKBOOK)
# Run workflow and fail task.
wf_ex = self.engine.start_workflow('wb1.wf1', {})
wf_ex = self.engine.start_workflow('wb1.wf1', '', {})
self.await_workflow_error(wf_ex.id)

View File

@ -217,11 +217,11 @@ class TasksFunctionTest(base.EngineTestCase):
def test_tasks_function(self):
wb_service.create_workbook_v2(WORKBOOK_WITH_EXPRESSIONS)
# Start helping workflow executions.
wf1_ex = self.engine.start_workflow('wb.wf1_top_lvl', {})
wf2_ex = self.engine.start_workflow('wb.wf2_top_lvl', {})
wf3_ex = self.engine.start_workflow('wb.wf3_top_lvl', {})
wf4_ex = self.engine.start_workflow('wb.wf4_top_lvl', {})
wf5_ex = self.engine.start_workflow('wb.wf5_top_lvl', {})
wf1_ex = self.engine.start_workflow('wb.wf1_top_lvl', '', {})
wf2_ex = self.engine.start_workflow('wb.wf2_top_lvl', '', {})
wf3_ex = self.engine.start_workflow('wb.wf3_top_lvl', '', {})
wf4_ex = self.engine.start_workflow('wb.wf4_top_lvl', '', {})
wf5_ex = self.engine.start_workflow('wb.wf5_top_lvl', '', {})
self.await_workflow_success(wf1_ex.id)
self.await_workflow_success(wf2_ex.id)
@ -232,6 +232,7 @@ class TasksFunctionTest(base.EngineTestCase):
# Start test workflow execution
execution = self.engine.start_workflow(
'wb.test_tasks_function',
'',
{"wf1_wx_id": wf1_ex.id,
"wf2_wx_id": wf2_ex.id,
"wf3_wx_id": wf3_ex.id,

View File

@ -185,7 +185,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wb_service.create_workbook_v2(WB)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf', WF_INPUT)
wf_ex = self.engine.start_workflow('wb.wf', '', WF_INPUT)
self.await_workflow_success(wf_ex.id)
@ -241,7 +241,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -267,7 +267,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -315,7 +315,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wb1.wf', {})
wf_ex = self.engine.start_workflow('wb1.wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -332,7 +332,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_input.update({'greeting': 'Hello'})
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf', wf_input)
wf_ex = self.engine.start_workflow('wb.wf', '', wf_input)
self.await_workflow_success(wf_ex.id)
@ -360,7 +360,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_input = {'arrayI': ['a', 'b', 'c'], 'arrayJ': [1, 2, 3]}
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf', wf_input)
wf_ex = self.engine.start_workflow('wb.wf', '', wf_input)
self.await_workflow_success(wf_ex.id)
@ -389,7 +389,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wb_service.create_workbook_v2(WB_ACTION_CONTEXT)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf', WF_INPUT_URLS)
wf_ex = self.engine.start_workflow('wb.wf', '', WF_INPUT_URLS)
with db_api.transaction():
wf_ex = db_api.get_workflow_execution(wf_ex.id)
@ -454,7 +454,7 @@ class WithItemsEngineTest(base.EngineTestCase):
# Start workflow.
wf_input = {'names_info': []}
wf_ex = self.engine.start_workflow('wb1.with_items', wf_input)
wf_ex = self.engine.start_workflow('wb1.with_items', '', wf_input)
self.await_workflow_success(wf_ex.id)
@ -490,7 +490,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wb1.with_items', {})
wf_ex = self.engine.start_workflow('wb1.with_items', '', {})
self.await_workflow_success(wf_ex.id)
@ -559,7 +559,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wb1.with_items', {})
wf_ex = self.engine.start_workflow('wb1.with_items', '', {})
self.await_workflow_success(wf_ex.id)
@ -584,7 +584,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wb_service.create_workbook_v2(WB)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf', WF_INPUT_ONE_ITEM)
wf_ex = self.engine.start_workflow('wb.wf', '', WF_INPUT_ONE_ITEM)
self.await_workflow_success(wf_ex.id)
@ -627,7 +627,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_with_concurrency_1)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
with db_api.transaction():
wf_ex = db_api.get_workflow_execution(wf_ex.id)
@ -720,7 +720,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {'concurrency': 2})
wf_ex = self.engine.start_workflow('wf', '', {'concurrency': 2})
self.await_workflow_success(wf_ex.id)
@ -762,7 +762,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_with_concurrency_yaql)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {'concurrency': '2'})
wf_ex = self.engine.start_workflow('wf', '', {'concurrency': '2'})
self.assertIn(
'Invalid data type in ConcurrencyPolicy',
@ -790,7 +790,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_with_concurrency_2)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
with db_api.transaction():
wf_ex = db_api.get_workflow_execution(wf_ex.id)
@ -902,7 +902,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_with_concurrency_2_fail)
# Start workflow.
wf_ex = self.engine.start_workflow('concurrency_test_fail', {})
wf_ex = self.engine.start_workflow('concurrency_test_fail', '', {})
self.await_workflow_success(wf_ex.id)
@ -943,7 +943,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_with_concurrency_3)
# Start workflow.
wf_ex = self.engine.start_workflow('concurrency_test', {})
wf_ex = self.engine.start_workflow('concurrency_test', '', {})
with db_api.transaction():
wf_ex = db_api.get_workflow_execution(wf_ex.id)
@ -1037,7 +1037,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_definition)
# Start workflow.
wf_ex = self.engine.start_workflow('concurrency_test', {})
wf_ex = self.engine.start_workflow('concurrency_test', '', {})
self.await_workflow_success(wf_ex.id)
@ -1079,7 +1079,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('with_items_retry', {})
wf_ex = self.engine.start_workflow('with_items_retry', '', {})
self.await_workflow_success(wf_ex.id)
@ -1124,7 +1124,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -1159,7 +1159,12 @@ class WithItemsEngineTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {}, env={'name': 'Mistral'})
wf_ex = self.engine.start_workflow(
'wf',
'',
{},
env={'name': 'Mistral'}
)
self.await_workflow_success(wf_ex.id)
@ -1209,7 +1214,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wb1.with_items', {})
wf_ex = self.engine.start_workflow('wb1.with_items', '', {})
self.await_workflow_success(wf_ex.id)
@ -1279,7 +1284,7 @@ class WithItemsEngineTest(base.EngineTestCase):
# Start workflow.
names = ["Peter", "Susan", "Edmund", "Lucy", "Aslan", "Caspian"]
wf_ex = self.engine.start_workflow('wb1.main', {'names': names})
wf_ex = self.engine.start_workflow('wb1.main', '', {'names': names})
self.await_workflow_success(wf_ex.id)
@ -1349,7 +1354,7 @@ class WithItemsEngineTest(base.EngineTestCase):
wb_service.create_workbook_v2(wb_text)
# Start workflow.
wf_ex = self.engine.start_workflow('test.with_items_default_bug', {})
wf_ex = self.engine.start_workflow('test.with_items_default_bug')
self.await_workflow_success(wf_ex.id)

View File

@ -40,7 +40,7 @@ class WorkflowCancelTest(base.EngineTestCase):
wf_service.create_workflows(workflow)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.engine.stop_workflow(
wf_ex.id,
@ -85,7 +85,7 @@ class WorkflowCancelTest(base.EngineTestCase):
wf = wf_service.create_workflows(workflow)[0]
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
with db_api.transaction():
db_api.delete_workflow_definition(wf.id)
@ -117,7 +117,7 @@ class WorkflowCancelTest(base.EngineTestCase):
wf_service.create_workflows(workflow)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.engine.pause_workflow(wf_ex.id)
@ -168,7 +168,7 @@ class WorkflowCancelTest(base.EngineTestCase):
wf_service.create_workflows(workflow)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -218,7 +218,7 @@ class WorkflowCancelTest(base.EngineTestCase):
wb_service.create_workbook_v2(workbook)
wf_ex = self.engine.start_workflow('wb.wf', {})
wf_ex = self.engine.start_workflow('wb.wf', '', {})
self.engine.stop_workflow(
wf_ex.id,
@ -284,7 +284,7 @@ class WorkflowCancelTest(base.EngineTestCase):
wb_service.create_workbook_v2(workbook)
self.engine.start_workflow('wb.wf', {})
self.engine.start_workflow('wb.wf', '', {})
with db_api.transaction():
wf_execs = db_api.get_workflow_executions()
@ -351,7 +351,7 @@ class WorkflowCancelTest(base.EngineTestCase):
"""
wb_service.create_workbook_v2(workbook)
wf_ex = self.engine.start_workflow('wb.wf', {})
wf_ex = self.engine.start_workflow('wb.wf', '', {})
self.engine.stop_workflow(
wf_ex.id,
@ -421,7 +421,7 @@ class WorkflowCancelTest(base.EngineTestCase):
wb_service.create_workbook_v2(workbook)
self.engine.start_workflow('wb.wf', {})
self.engine.start_workflow('wb.wf', '', {})
with db_api.transaction():
wf_execs = db_api.get_workflow_executions()
@ -500,7 +500,7 @@ class WorkflowCancelTest(base.EngineTestCase):
wb_service.create_workbook_v2(workbook)
self.engine.start_workflow('wb.wf', {})
self.engine.start_workflow('wb.wf', '', {})
with db_api.transaction():
wf_execs = db_api.get_workflow_executions()
@ -585,7 +585,7 @@ class WorkflowCancelTest(base.EngineTestCase):
wb_service.create_workbook_v2(workbook)
self.engine.start_workflow('wb.wf', {})
self.engine.start_workflow('wb.wf', '', {})
with db_api.transaction():
wf_execs = db_api.get_workflow_executions()

View File

@ -195,7 +195,7 @@ class WorkflowResumeTest(base.EngineTestCase):
wb_service.create_workbook_v2(RESUME_WORKBOOK)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
self.await_workflow_paused(wf_ex.id)
@ -230,6 +230,7 @@ class WorkflowResumeTest(base.EngineTestCase):
# Start workflow.
wf_ex = self.engine.start_workflow(
'resume_reverse.wf',
'',
{},
task_name='task2'
)
@ -265,7 +266,7 @@ class WorkflowResumeTest(base.EngineTestCase):
wb_service.create_workbook_v2(WORKBOOK_TWO_BRANCHES)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
self.await_workflow_paused(wf_ex.id)
@ -295,7 +296,7 @@ class WorkflowResumeTest(base.EngineTestCase):
wb_service.create_workbook_v2(WORKBOOK_TWO_START_TASKS)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
self.await_workflow_paused(wf_ex.id)
@ -332,7 +333,7 @@ class WorkflowResumeTest(base.EngineTestCase):
wb_service.create_workbook_v2(WORKBOOK_DIFFERENT_TASK_STATES)
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
self.await_workflow_paused(wf_ex.id)
@ -381,7 +382,7 @@ class WorkflowResumeTest(base.EngineTestCase):
# Start and pause workflow.
wb_service.create_workbook_v2(WORKBOOK_DIFFERENT_TASK_STATES)
wf_ex = self.engine.start_workflow('wb.wf1', {})
wf_ex = self.engine.start_workflow('wb.wf1', '', {})
self.await_workflow_paused(wf_ex.id)
@ -413,7 +414,7 @@ class WorkflowResumeTest(base.EngineTestCase):
}
# Start workflow.
wf_ex = self.engine.start_workflow('wb.wf1', {}, env=env)
wf_ex = self.engine.start_workflow('wb.wf1', '', {}, env=env)
self.await_workflow_paused(wf_ex.id)

View File

@ -39,7 +39,7 @@ class WorkflowStopTest(base.EngineTestCase):
"""
wf_service.create_workflows(WORKFLOW)
self.exec_id = self.engine.start_workflow('wf', {}).id
self.exec_id = self.engine.start_workflow('wf', '', {}).id
def test_stop_failed(self):
self.engine.stop_workflow(self.exec_id, states.SUCCESS, "Force stop")

View File

@ -51,7 +51,7 @@ class WorkflowVariablesTest(base.EngineTestCase):
wf_service.create_workflows(wf_text)
# Start workflow.
wf_ex = self.engine.start_workflow('wf', {'param2': 'Renat'})
wf_ex = self.engine.start_workflow('wf', '', {'param2': 'Renat'})
self.await_workflow_success(wf_ex.id)

View File

@ -62,7 +62,7 @@ class YAQLFunctionsEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -130,7 +130,7 @@ class YAQLFunctionsEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -165,7 +165,7 @@ class YAQLFunctionsEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -198,7 +198,7 @@ class YAQLFunctionsEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -243,7 +243,7 @@ class YAQLFunctionsEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_error(wf_ex.id)
@ -275,7 +275,7 @@ class YAQLFunctionsEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -300,7 +300,7 @@ class YAQLFunctionsEngineTest(engine_test_base.EngineTestCase):
wf_service.create_workflows(wf_text)
wf_ex = self.engine.start_workflow('wf', {})
wf_ex = self.engine.start_workflow('wf', '', {})
self.await_workflow_success(wf_ex.id)
@ -337,6 +337,7 @@ class YAQLFunctionsEngineTest(engine_test_base.EngineTestCase):
wf_ex = self.engine.start_workflow(
'wf',
'',
{'k1': 'v1'},
param1='blablabla'
)
@ -369,7 +370,10 @@ class YAQLFunctionsEngineTest(engine_test_base.EngineTestCase):
execution['input']
)
self.assertDictEqual({'param1': 'blablabla'}, execution['params'])
self.assertDictEqual(
{'param1': 'blablabla', 'namespace': ''},
execution['params']
)
self.assertEqual(
wf_ex.created_at.isoformat(' '),

View File

@ -87,7 +87,7 @@ class LocalExecutorTestCase(base.ExecutorTestCase):
"""
wb_svc.create_workbook_v2(wb_def)
wf_ex = self.engine.start_workflow('wb1.wf1', {})
wf_ex = self.engine.start_workflow('wb1.wf1', '', {})
self.await_workflow_success(wf_ex.id)
with db_api.transaction():
@ -144,7 +144,7 @@ class LocalExecutorTestCase(base.ExecutorTestCase):
"""
wb_svc.create_workbook_v2(wb_def)
wf_ex = self.engine.start_workflow('wb1.wf1', {})
wf_ex = self.engine.start_workflow('wb1.wf1', '', {})
self.await_workflow_success(wf_ex.id)
with db_api.transaction():

View File

@ -72,8 +72,8 @@ class MistralClientBase(rest_client.RestClient):
self.action_executions = []
self.event_triggers = []
def get_list_obj(self, name):
resp, body = self.get(name)
def get_list_obj(self, url_path):
resp, body = self.get(url_path)
return resp, json.loads(body)

View File

@ -24,21 +24,30 @@ CONF = config.CONF
class MistralClientV2(base.MistralClientBase):
def post_request(self, url, file_name):
def post_request(self, url_path, file_name):
headers = {"headers": "Content-Type:text/plain"}
return self.post(url, base.get_resource(file_name), headers=headers)
return self.post(
url_path,
base.get_resource(file_name),
headers=headers
)
def post_json(self, url, obj, extra_headers={}):
def get_request(self, url_path):
headers = {"headers": "Content-Type:application/json"}
return self.get(url_path, headers=headers)
def post_json(self, url_path, obj, extra_headers={}):
headers = {"Content-Type": "application/json"}
headers = dict(headers, **extra_headers)
return self.post(url, json.dumps(obj), headers=headers)
return self.post(url_path, json.dumps(obj), headers=headers)
def update_request(self, url, file_name):
def update_request(self, url_path, file_name):
headers = {"headers": "Content-Type:text/plain"}
resp, body = self.put(
url,
url_path,
base.get_resource(file_name),
headers=headers
)
@ -64,26 +73,61 @@ class MistralClientV2(base.MistralClientBase):
return resp, json.loads(body)
def create_workflow(self, yaml_file, scope=None):
def create_workflow(self, yaml_file, scope=None, namespace=None):
url_path = 'workflows?'
if scope:
resp, body = self.post_request('workflows?scope=public', yaml_file)
else:
resp, body = self.post_request('workflows', yaml_file)
url_path += 'scope=public&'
if namespace:
url_path += 'namespace=' + namespace
resp, body = self.post_request(url_path, yaml_file)
for wf in json.loads(body)['workflows']:
self.workflows.append(wf['name'])
identifier = wf['id'] if namespace else wf['name']
self.workflows.append(identifier)
return resp, json.loads(body)
def get_workflow(self, wf_identifier, namespace=None):
url_path = 'workflows/' + wf_identifier
if namespace:
url_path += 'namespace=' + namespace
resp, body = self.get_request(url_path)
return resp, json.loads(body)
def update_workflow(self, file_name, namespace=None):
url_path = "workflows?"
if namespace:
url_path += 'namespace=' + namespace
return self.update_request(url_path, file_name=file_name)
def get_action_execution(self, action_execution_id):
return self.get('action_executions/%s' % action_execution_id)
def create_execution(self, identifier, wf_input=None, params=None):
def get_action_executions(self, task_id=None):
url_path = 'action_executions'
if task_id:
url_path += '?task_execution_id=%s' % task_id
return self.get_list_obj(url_path)
def create_execution(self, identifier, wf_namespace=None, wf_input=None,
params=None):
if uuidutils.is_uuid_like(identifier):
body = {"workflow_id": "%s" % identifier}
else:
body = {"workflow_name": "%s" % identifier}
if wf_namespace:
body.update({'workflow_namespace': wf_namespace})
if wf_input:
body.update({'input': json.dumps(wf_input)})
if params:
@ -100,6 +144,23 @@ class MistralClientV2(base.MistralClientBase):
return resp, json.loads(body)
def get_execution(self, execution_id):
return self.get('executions/%s' % execution_id)
def get_executions(self, task_id):
url_path = 'executions'
if task_id:
url_path += '?task_execution_id=%s' % task_id
return self.get_list_obj(url_path)
def get_tasks(self, execution_id=None):
url_path = 'tasks'
if execution_id:
url_path += '?workflow_execution_id=%s' % execution_id
return self.get_list_obj(url_path)
def create_cron_trigger(self, name, wf_name, wf_input=None, pattern=None,
first_time=None, count=None):
post_body = {
@ -133,11 +194,8 @@ class MistralClientV2(base.MistralClientBase):
return [t for t in all_tasks if t['workflow_name'] == wf_name]
def create_action_execution(self, request_body, extra_headers={}):
resp, body = self.post_json(
'action_executions',
request_body,
extra_headers
)
resp, body = self.post_json('action_executions', request_body,
extra_headers)
params = json.loads(request_body.get('params', '{}'))
if params.get('save_result', False):

View File

@ -226,3 +226,31 @@ class ActionExecutionTestsV2(base.TestCase):
self.assertEqual(201, resp.status)
output = json.loads(body['output'])
self.assertEqual(200, output['result']['status'])
@decorators.idempotent_id('9438e195-031c-4502-b216-6d72941ec281')
@decorators.attr(type='sanity')
def test_action_execution_of_workflow_within_namespace(self):
resp, body = self.client.create_workflow('wf_v2.yaml', namespace='abc')
wf_name = body['workflows'][0]['name']
wf_namespace = body['workflows'][0]['namespace']
self.assertEqual(201, resp.status)
resp, body = self.client.create_execution(
wf_name,
wf_namespace=wf_namespace
)
self.assertEqual(201, resp.status)
resp, body = self.client.get_list_obj('tasks')
self.assertEqual(200, resp.status)
task_id = body['tasks'][0]['id']
resp, body = self.client.get_list_obj(
'action_executions?include_output=true&task_execution_id=%s' %
task_id)
self.assertEqual(200, resp.status)
action_execution = body['action_executions'][0]
self.assertEqual(200, resp.status)
action_execution = body['action_executions'][0]
self.assertEqual(wf_namespace, action_execution['workflow_namespace'])

View File

@ -133,9 +133,7 @@ class ActionTestsV2(base.TestCase):
resp, body = self.client.create_action('action_v2.yaml')
self.assertEqual(201, resp.status)
resp, body = self.client.get_list_obj(
'actions?is_system=False'
)
resp, body = self.client.get_list_obj('actions?is_system=False')
self.assertEqual(200, resp.status)
self.assertNotEmpty(body['actions'])
@ -149,9 +147,7 @@ class ActionTestsV2(base.TestCase):
resp, body = self.client.create_action('action_v2.yaml')
self.assertEqual(201, resp.status)
resp, body = self.client.get_list_obj(
'actions?is_system=neq:False'
)
resp, body = self.client.get_list_obj('actions?is_system=neq:False')
self.assertEqual(200, resp.status)
self.assertNotEmpty(body['actions'])
@ -169,8 +165,7 @@ class ActionTestsV2(base.TestCase):
_, body = self.client.get_object('actions', created_acts[0])
time = body['created_at']
resp, body = self.client.get_list_obj(
'actions?created_at=in:' + time.replace(' ', '%20')
)
'actions?created_at=in:' + time.replace(' ', '%20'))
self.assertEqual(200, resp.status)
action_names = [action['name'] for action in body['actions']]

View File

@ -107,7 +107,7 @@ class EventTriggerTestsV2(base.TestCase):
@decorators.attr(type='negative')
@decorators.idempotent_id('56b90a90-9ff3-42f8-a9eb-04a77198710e')
def test_get_nonexistent_event_trigger(self):
fake_id = '123e4567-e89b-12d3-a456-426655440000'
fake_id = '3771c152-d1a7-4a82-8a50-c79d122012dc'
self.assertRaises(exceptions.NotFound,
self.client.get_object,

View File

@ -19,6 +19,8 @@ from tempest.lib import exceptions
from mistral import utils
from mistral_tempest_tests.tests import base
import json
class ExecutionTestsV2(base.TestCase):
@ -72,8 +74,7 @@ class ExecutionTestsV2(base.TestCase):
self.assertIn(exec_id_2, [ex['id'] for ex in body['executions']])
resp, body = self.client.get_list_obj(
'executions?limit=1&sort_keys=workflow_name&sort_dirs=asc'
)
'executions?limit=1&sort_keys=workflow_name&sort_dirs=asc')
self.assertEqual(200, resp.status)
self.assertEqual(1, len(body['executions']))
@ -127,8 +128,8 @@ class ExecutionTestsV2(base.TestCase):
def test_create_execution_for_reverse_wf(self):
resp, body = self.client.create_execution(
self.reverse_wf['name'],
{self.reverse_wf['input']: "Bye"},
{"task_name": "goodbye"})
wf_input={self.reverse_wf['input']: "Bye"},
params={"task_name": "goodbye"})
exec_id = body['id']
self.assertEqual(201, resp.status)
@ -327,3 +328,91 @@ class ExecutionTestsV2(base.TestCase):
'executions',
exec_id
)
@decorators.idempotent_id('a882876b-7565-4f7f-9714-d99032ffaabb')
@decorators.attr(type='sanity')
def test_workflow_execution_of_nested_workflows_within_namespace(self):
low_wf = 'for_wf_namespace/lowest_level_wf.yaml'
middle_wf = 'for_wf_namespace/middle_wf.yaml'
top_wf = 'for_wf_namespace/top_level_wf.yaml'
resp, wf = self.client.create_workflow(low_wf)
self.assertEqual(201, resp.status)
namespace = 'abc'
resp, wf = self.client.create_workflow(low_wf, namespace=namespace)
self.assertEqual(201, resp.status)
resp, wf = self.client.create_workflow(middle_wf)
self.assertEqual(201, resp.status)
resp, wf = self.client.create_workflow(top_wf)
self.assertEqual(201, resp.status)
resp, wf = self.client.create_workflow(top_wf, namespace=namespace)
self.assertEqual(201, resp.status)
wf_name = wf['workflows'][0]['name']
resp, top_execution = self.client.create_execution(wf_name, namespace)
self.assertEqual(201, resp.status)
self.assertEqual('RUNNING', top_execution['state'])
self.assertEqual(wf_name, top_execution['workflow_name'])
self.assertEqual(wf_name, top_execution['workflow_name'])
self.assertEqual(namespace, top_execution['workflow_namespace'])
self.client.wait_execution(top_execution, target_state='SUCCESS')
self.assertEqual(
namespace,
json.loads(top_execution['params'])['namespace']
)
resp, tasks = self.client.get_tasks(top_execution['id'])
top_task = tasks['tasks'][0]
self.assertEqual(wf_name, top_task['workflow_name'])
self.assertEqual(namespace, top_task['workflow_namespace'])
resp, executions = self.client.get_executions(top_task['id'])
middle_execution = executions['executions'][0]
self.assertEqual('middle_wf', middle_execution['workflow_name'])
self.assertEqual('', middle_execution['workflow_namespace'])
self.assertEqual(
namespace,
json.loads(middle_execution['params'])['namespace']
)
resp, tasks = self.client.get_tasks(middle_execution['id'])
middle_task = tasks['tasks'][0]
self.assertEqual('middle_wf', middle_task['workflow_name'])
self.assertEqual('', middle_task['workflow_namespace'])
resp, executions = self.client.get_executions(middle_task['id'])
lowest_execution = executions['executions'][0]
self.assertEqual('lowest_level_wf', lowest_execution['workflow_name'])
self.assertEqual(namespace, lowest_execution['workflow_namespace'])
self.assertEqual(
namespace,
json.loads(lowest_execution['params'])['namespace']
)
resp, tasks = self.client.get_tasks(lowest_execution['id'])
lowest_task = tasks['tasks'][0]
self.assertEqual('lowest_level_wf', lowest_task['workflow_name'])
self.assertEqual(namespace, lowest_task['workflow_namespace'])
resp, action_executions = self.client.get_action_executions(
lowest_task['id']
)
action_execution = action_executions['action_executions'][0]
self.assertEqual('lowest_level_wf', action_execution['workflow_name'])
self.assertEqual(namespace, action_execution['workflow_namespace'])

View File

@ -63,8 +63,7 @@ class TasksTestsV2(base.TestCase):
@decorators.idempotent_id('3230d694-40fd-4094-ad12-024f40a21b94')
def test_get_tasks_of_execution(self):
resp, body = self.client.get_list_obj(
'tasks?workflow_execution_id=%s' % self.execution_id
)
'tasks?workflow_execution_id=%s' % self.execution_id)
self.assertEqual(200, resp.status)
self.assertEqual(

View File

@ -242,6 +242,58 @@ class WorkflowTestsV2(base.TestCase):
self.assertEqual(200, resp.status)
self.assertEqual(name, body['workflows'][0]['name'])
@decorators.attr(type='sanity')
@decorators.idempotent_id('42f5d135-a2b8-4a31-8135-c5ce8c5f1ed5')
def test_workflow_within_namespace(self):
self.useFixture(lockutils.LockFixture('mistral-workflow'))
namespace = 'abc'
resp, body = self.client.create_workflow(
'single_wf.yaml',
namespace=namespace
)
name = body['workflows'][0]['name']
id = body['workflows'][0]['id']
self.assertEqual(201, resp.status)
self.assertEqual(name, body['workflows'][0]['name'])
resp, body = self.client.get_workflow(
id
)
self.assertEqual(namespace, body['namespace'])
resp, body = self.client.update_workflow('single_wf.yaml', namespace)
self.assertEqual(200, resp.status)
self.assertEqual(name, body['workflows'][0]['name'])
self.assertEqual(namespace, body['workflows'][0]['namespace'])
namespace = 'abc2'
resp, body = self.client.create_workflow(
'single_wf.yaml',
namespace=namespace
)
name = body['workflows'][0]['name']
id = body['workflows'][0]['id']
self.assertEqual(201, resp.status)
self.assertEqual(name, body['workflows'][0]['name'])
resp, body = self.client.get_workflow(id)
self.assertEqual(namespace, body['namespace'])
self.assertRaises(exceptions.NotFound, self.client.get_workflow, name)
self.client.create_workflow(
'single_wf.yaml'
)
resp, body = self.client.get_workflow(id)
self.assertEqual(200, resp.status)
@decorators.attr(type='sanity')
@decorators.idempotent_id('02bc1fc3-c31a-4e37-bb3d-eda46818505c')
def test_get_workflow_definition(self):
@ -280,6 +332,15 @@ class WorkflowTestsV2(base.TestCase):
self.assertRaises(exceptions.NotFound, self.client.get_object,
'workflows', 'nonexist')
exception = self.assertRaises(
exceptions.NotFound,
self.client.get_workflow,
'nonexist_wf',
'nonexist_namespace'
)
self.assertIn('nonexist_wf', str(exception))
self.assertIn('nonexist_namespace', str(exception))
@decorators.attr(type='negative')
@decorators.idempotent_id('6b917213-7f11-423a-8fe0-55795dcf0fb2')
def test_double_create_workflows(self):