Fixed many tests
Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/dd99f0fb Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/dd99f0fb Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/dd99f0fb Branch: refs/heads/ARIA-105-integrate-modeling Commit: dd99f0fbc15bb9550ccae15ffbe5cf4a419848f4 Parents: 5ceb14c Author: Tal Liron <[email protected]> Authored: Mon Mar 6 19:35:53 2017 -0600 Committer: Tal Liron <[email protected]> Committed: Mon Mar 6 19:35:53 2017 -0600 ---------------------------------------------------------------------- aria/modeling/misc.py | 2 +- aria/modeling/orchestration.py | 9 +- aria/orchestrator/context/operation.py | 4 +- aria/orchestrator/workflows/api/task.py | 19 ++- .../workflows/builtin/execute_operation.py | 31 +++-- aria/orchestrator/workflows/executor/celery.py | 2 +- aria/orchestrator/workflows/executor/process.py | 2 +- tests/mock/models.py | 23 ++-- tests/mock/operations.py | 46 +++---- tests/mock/topology.py | 6 +- tests/orchestrator/context/__init__.py | 4 - tests/orchestrator/context/test_operation.py | 115 ++++++++++------ .../context/test_resource_render.py | 2 +- tests/orchestrator/context/test_serialize.py | 23 ++-- tests/orchestrator/context/test_toolbelt.py | 61 +++++---- tests/orchestrator/context/test_workflow.py | 10 +- tests/orchestrator/workflows/api/test_task.py | 135 +++++++++++-------- .../workflows/builtin/test_execute_operation.py | 27 ++-- .../orchestrator/workflows/core/test_engine.py | 14 +- tests/orchestrator/workflows/core/test_task.py | 76 ++++++----- .../test_task_graph_into_exececution_graph.py | 27 ++-- .../workflows/executor/test_executor.py | 8 +- .../executor/test_process_executor_extension.py | 25 ++-- .../test_process_executor_tracked_changes.py | 26 ++-- 24 files changed, 418 insertions(+), 279 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/aria/modeling/misc.py ---------------------------------------------------------------------- diff --git a/aria/modeling/misc.py b/aria/modeling/misc.py index b61a787..0bb5cda 100644 --- a/aria/modeling/misc.py +++ b/aria/modeling/misc.py @@ -79,7 +79,7 @@ class ParameterBase(TemplateModelMixin): logging.getLogger('aria').warn('Could not pickle parameter of type "{0}": {1}' .format(self.type_name, value)) self._value = pickle.dumps(str(value)) - + def instantiate(self, context, container): from . import models return models.Parameter(name=self.name, http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/aria/modeling/orchestration.py ---------------------------------------------------------------------- diff --git a/aria/modeling/orchestration.py b/aria/modeling/orchestration.py index 8428b69..d9d9908 100644 --- a/aria/modeling/orchestration.py +++ b/aria/modeling/orchestration.py @@ -154,7 +154,8 @@ class ServiceUpdateBase(ModelMixin): __tablename__ = 'service_update' - _private_fields = ['execution_fk', 'service_fk'] + _private_fields = ['execution_fk', + 'service_fk'] created_at = Column(DateTime, nullable=False, index=True) service_plan = Column(Dict, nullable=False) @@ -212,10 +213,10 @@ class ServiceUpdateStepBase(ModelMixin): _action_types = namedtuple('ACTION_TYPES', 'ADD, REMOVE, MODIFY') ACTION_TYPES = _action_types(ADD='add', REMOVE='remove', MODIFY='modify') + _entity_types = namedtuple( 'ENTITY_TYPES', - 'NODE, RELATIONSHIP, PROPERTY, OPERATION, WORKFLOW, OUTPUT, DESCRIPTION, GROUP, ' - 'POLICY_TYPE, POLICY_TRIGGER, PLUGIN') + 'NODE, RELATIONSHIP, PROPERTY, OPERATION, WORKFLOW, OUTPUT, DESCRIPTION, GROUP, PLUGIN') ENTITY_TYPES = _entity_types( NODE='node', RELATIONSHIP='relationship', @@ -225,8 +226,6 @@ class ServiceUpdateStepBase(ModelMixin): OUTPUT='output', DESCRIPTION='description', GROUP='group', - POLICY_TYPE='policy_type', - POLICY_TRIGGER='policy_trigger', PLUGIN='plugin' ) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/aria/orchestrator/context/operation.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/context/operation.py b/aria/orchestrator/context/operation.py index 41093c9..e1a041f 100644 --- a/aria/orchestrator/context/operation.py +++ b/aria/orchestrator/context/operation.py @@ -66,11 +66,11 @@ class BaseOperationContext(BaseContext): """ A work directory that is unique to the plugin and the deployment id """ - if not self.task.plugin_name: + if self.task.plugin is None: return None plugin_workdir = '{0}/plugins/{1}/{2}'.format(self._workdir, self.service.id, - self.task.plugin_name) + self.task.plugin.name) file.makedirs(plugin_workdir) return plugin_workdir http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/aria/orchestrator/workflows/api/task.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/api/task.py b/aria/orchestrator/workflows/api/task.py index d90b2b1..f1812b1 100644 --- a/aria/orchestrator/workflows/api/task.py +++ b/aria/orchestrator/workflows/api/task.py @@ -20,6 +20,7 @@ Provides the tasks to be entered into the task graph from ....modeling import models from ....utils.collections import OrderedDict from ....utils.uuid import generate_uuid +from ....utils.formatting import full_type_name from ... import context from .. import exceptions @@ -60,6 +61,8 @@ class OperationTask(BaseTask): SOURCE_OPERATION = 'source' TARGET_OPERATION = 'target' + + NAME_FORMAT = '{type}:{id}->{interface}/{operation}' def __init__(self, name, @@ -94,8 +97,8 @@ class OperationTask(BaseTask): for k, v in inputs.iteritems(): if not isinstance(v, models.Parameter): inputs[k] = models.Parameter(name=k, - type_name='string', - value=str(v) if v is not None else None) + type_name=full_type_name(v), + value=v) self.name = name self.actor = actor @@ -130,7 +133,10 @@ class OperationTask(BaseTask): return cls( actor=node, - name='{0}.{1}'.format(interface_name, operation_name), + name=cls.NAME_FORMAT.format(type='node', + id=node.id, + interface=interface_name, + operation=operation_name), plugin=operation.plugin, implementation=operation.implementation, inputs=cls._merge_inputs(operation.inputs, inputs), @@ -161,7 +167,10 @@ class OperationTask(BaseTask): return cls( actor=relationship, - name='{0}.{1}'.format(interface_name, operation_name), + name=cls.NAME_FORMAT.format(type='relationship', + id=relationship.id, + interface=interface_name, + operation=operation_name), plugin=operation.plugin, implementation=operation.implementation, inputs=cls._merge_inputs(operation.inputs, inputs), @@ -186,7 +195,7 @@ class OperationTask(BaseTask): class WorkflowTask(BaseTask): """ - Represents an workflow task in the task_graph + Represents a workflow task in the task graph """ def __init__(self, workflow_func, **kwargs): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/aria/orchestrator/workflows/builtin/execute_operation.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/builtin/execute_operation.py b/aria/orchestrator/workflows/builtin/execute_operation.py index 7b07fc2..e7c2085 100644 --- a/aria/orchestrator/workflows/builtin/execute_operation.py +++ b/aria/orchestrator/workflows/builtin/execute_operation.py @@ -25,7 +25,8 @@ from ... import workflow def execute_operation( ctx, graph, - operation, + interface_name, + operation_name, operation_kwargs, allow_kwargs_override, run_by_dependency_order, @@ -69,7 +70,8 @@ def execute_operation( graph.add_tasks( _create_node_instance_task( node=node, - operation=operation, + interface_name=interface_name, + operation_name=operation_name, operation_kwargs=operation_kwargs, allow_kwargs_override=allow_kwargs_override ) @@ -87,25 +89,26 @@ def execute_operation( def _filter_node_instances(context, node_template_ids=(), node_ids=(), type_names=()): - def _is_node_by_id(node_id): - return not node_template_ids or node_id in node_template_ids + def _is_node_template_by_id(node_template_id): + return not node_template_ids or node_template_id in node_template_ids - def _is_node_instance_by_id(node_instance_id): - return not node_ids or node_instance_id in node_ids + def _is_node_by_id(node_id): + return not node_ids or node_id in node_ids - def _is_node_by_type(node_type_hierarchy): - return not type_names or node_type_hierarchy in type_names + def _is_node_by_type(node_type): + return not node_type.name in type_names for node in context.nodes: - if all((_is_node_by_id(node.node_template.id), - _is_node_instance_by_id(node.id), - _is_node_by_type(node.node_template.type_hierarchy))): + if all((_is_node_template_by_id(node.node_template.id), + _is_node_by_id(node.id), + _is_node_by_type(node.node_template.type))): yield node def _create_node_instance_task( node, - operation, + interface_name, + operation_name, operation_kwargs, allow_kwargs_override): """ @@ -122,6 +125,6 @@ def _create_node_instance_task( return OperationTask.for_node( node=node, - interface_name=None, # TODO - operation_name=operation, + interface_name=interface_name, + operation_name=operation_name, inputs=operation_kwargs) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/aria/orchestrator/workflows/executor/celery.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/executor/celery.py b/aria/orchestrator/workflows/executor/celery.py index 8a096b5..baa0375 100644 --- a/aria/orchestrator/workflows/executor/celery.py +++ b/aria/orchestrator/workflows/executor/celery.py @@ -44,7 +44,7 @@ class CeleryExecutor(BaseExecutor): def execute(self, task): self._tasks[task.id] = task - inputs = task.inputs.copy() + inputs = dict((k, v.value) for k, v in task.inputs.iteritems()) inputs['ctx'] = task.context self._results[task.id] = self._app.send_task( task.operation_mapping, http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/aria/orchestrator/workflows/executor/process.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/executor/process.py b/aria/orchestrator/workflows/executor/process.py index a1f0bee..9be834d 100644 --- a/aria/orchestrator/workflows/executor/process.py +++ b/aria/orchestrator/workflows/executor/process.py @@ -191,7 +191,7 @@ class ProcessExecutor(base.BaseExecutor): return { 'task_id': task.id, 'implementation': task.implementation, - 'operation_inputs': task.inputs, + 'operation_inputs': dict((k, v.value) for k, v in task.inputs.iteritems()), 'port': self._server_port, 'context': task.context.serialization_dict, } http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/mock/models.py ---------------------------------------------------------------------- diff --git a/tests/mock/models.py b/tests/mock/models.py index 3ccd97e..78e9373 100644 --- a/tests/mock/models.py +++ b/tests/mock/models.py @@ -63,16 +63,17 @@ def create_service(service_template): def create_dependency_node_template(service_template): - the_type = service_template.node_types.get_descendant('test_node_type') + node_type = service_template.node_types.get_descendant('test_node_type') + capability_type = service_template.capability_types.get_descendant('test_capability_type') capability_template = models.CapabilityTemplate( name='capability', - type=service_template.capability_types.get_descendant('test_capability_type') + type=capability_type ) node_template = models.NodeTemplate( name=DEPENDENCY_NODE_TEMPLATE_NAME, - type=the_type, + type=node_type, capability_templates=_dictify(capability_template), default_instances=1, min_instances=1, @@ -89,7 +90,7 @@ def create_dependent_node_template(service_template, dependency_node_template): operation_templates = dict((op, models.OperationTemplate( name=op, implementation='test')) - for op in operations.NODE_OPERATIONS) + for _, op in operations.NODE_OPERATIONS) interface_template = models.InterfaceTemplate( type=service_template.interface_types.get_descendant('test_interface_type'), operation_templates=operation_templates) @@ -148,10 +149,9 @@ def create_relationship(source, target): ) -def create_interface_template(service_template, operation_name, operation_kwargs=None, - interface_kwargs=None): +def create_interface_template(service_template, interface_name, operation_name, + operation_kwargs=None, interface_kwargs=None): the_type = service_template.interface_types.get_descendant('test_interface_type') - interface_name, operation_name = operation_name.rsplit('.', 1) operation_template = models.OperationTemplate( name=operation_name, **(operation_kwargs or {}) @@ -164,10 +164,13 @@ def create_interface_template(service_template, operation_name, operation_kwargs ) -def create_interface(service, operation_name, operation_kwargs=None, interface_kwargs=None): +def create_interface(service, interface_name, operation_name, operation_kwargs=None, + interface_kwargs=None): the_type = service.service_template.interface_types.get_descendant('test_interface_type') - interface_name, operation_name = operation_name.rsplit('.', 1) - operation = models.Operation(name=operation_name, **(operation_kwargs or {})) + operation = models.Operation( + name=operation_name, + **(operation_kwargs or {}) + ) return models.Interface( type=the_type, operations=_dictify(operation), http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/mock/operations.py ---------------------------------------------------------------------- diff --git a/tests/mock/operations.py b/tests/mock/operations.py index 5495f6a..c752a8e 100644 --- a/tests/mock/operations.py +++ b/tests/mock/operations.py @@ -14,46 +14,46 @@ # limitations under the License. NODE_OPERATIONS_INSTALL = [ - 'tosca.interfaces.node.lifecycle.Standard.create', - 'tosca.interfaces.node.lifecycle.Standard.configure', - 'tosca.interfaces.node.lifecycle.Standard.start', + ('Standard', 'create'), + ('Standard', 'configure'), + ('Standard', 'start') ] NODE_OPERATIONS_UNINSTALL = [ - 'tosca.interfaces.node.lifecycle.Standard.stop', - 'tosca.interfaces.node.lifecycle.Standard.delete', + ('Standard', 'stop'), + ('Standard', 'delete') ] NODE_OPERATIONS = NODE_OPERATIONS_INSTALL + NODE_OPERATIONS_UNINSTALL RELATIONSHIP_OPERATIONS_INSTALL = [ - 'tosca.interfaces.relationship.Configure.pre_configure_source', - 'tosca.interfaces.relationship.Configure.pre_configure_target', - 'tosca.interfaces.relationship.Configure.add_source', - 'tosca.interfaces.relationship.Configure.add_target', + ('Configure', 'pre_configure_source'), + ('Configure', 'pre_configure_target'), + ('Configure', 'add_source'), + ('Configure', 'add_target') ] RELATIONSHIP_OPERATIONS_UNINSTALL = [ - 'tosca.interfaces.relationship.Configure.remove_target', - 'tosca.interfaces.relationship.Configure.target_changed', + ('Configure', 'remove_target'), + ('Configure', 'target_changed') ] RELATIONSHIP_OPERATIONS = RELATIONSHIP_OPERATIONS_INSTALL + RELATIONSHIP_OPERATIONS_UNINSTALL OPERATIONS_INSTALL = [ - 'tosca.interfaces.node.lifecycle.Standard.create', - 'tosca.interfaces.relationship.Configure.pre_configure_source', - 'tosca.interfaces.relationship.Configure.pre_configure_target', - 'tosca.interfaces.node.lifecycle.Standard.configure', - 'tosca.interfaces.node.lifecycle.Standard.start', - 'tosca.interfaces.relationship.Configure.add_source', - 'tosca.interfaces.relationship.Configure.add_target', - 'tosca.interfaces.relationship.Configure.target_changed', + ('Standard', 'create'), + ('Configure', 'pre_configure_source'), + ('Configure', 'pre_configure_target'), + ('Standard', 'configure'), + ('Standard', 'start'), + ('Configure', 'add_source'), + ('Configure', 'add_target'), + ('Configure', 'target_changed') ] OPERATIONS_UNINSTALL = [ - 'tosca.interfaces.relationship.Configure.remove_target', - 'tosca.interfaces.relationship.Configure.target_changed', - 'tosca.interfaces.node.lifecycle.Standard.stop', - 'tosca.interfaces.node.lifecycle.Standard.delete', + ('Configure', 'remove_target'), + ('Configure', 'target_changed'), + ('Standard', 'stop'), + ('Standard', 'delete') ] http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/mock/topology.py ---------------------------------------------------------------------- diff --git a/tests/mock/topology.py b/tests/mock/topology.py index b702783..c7d8087 100644 --- a/tests/mock/topology.py +++ b/tests/mock/topology.py @@ -20,13 +20,12 @@ from . import models def create_simple_topology_single_node(model_storage, create_operation): service_template = models.create_service_template() - service = models.create_service(service_template) node_template = models.create_dependency_node_template(service_template) interface_template = models.create_interface_template( service_template, - 'Standard.create', + 'Standard', 'create', operation_kwargs=dict( implementation=create_operation, inputs={'key': aria_models.Parameter(name='key', value='create', type_name='string'), @@ -37,7 +36,7 @@ def create_simple_topology_single_node(model_storage, create_operation): node = models.create_dependency_node(node_template, service) interface = models.create_interface( service, - 'Standard.create', + 'Standard', 'create', operation_kwargs=dict( implementation=create_operation, inputs={'key': aria_models.Parameter(name='key', value='create', type_name='string'), @@ -51,7 +50,6 @@ def create_simple_topology_single_node(model_storage, create_operation): def create_simple_topology_two_nodes(model_storage): service_template = models.create_service_template() - service = models.create_service(service_template) # Creating a simple service with node -> node as a graph http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/context/__init__.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/context/__init__.py b/tests/orchestrator/context/__init__.py index ea0fea9..4fde0a7 100644 --- a/tests/orchestrator/context/__init__.py +++ b/tests/orchestrator/context/__init__.py @@ -23,10 +23,6 @@ def op_path(func, module_path=None): return '{0}.{1}'.format(module_path, func.__name__) -def op_name(actor, operation_name): - return '{name}.{actor.id}'.format(name=operation_name, actor=actor) - - def execute(workflow_func, workflow_context, executor): graph = workflow_func(ctx=workflow_context) eng = engine.Engine(executor=executor, workflow_context=workflow_context, tasks_graph=graph) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/context/test_operation.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/context/test_operation.py b/tests/orchestrator/context/test_operation.py index b460b9f..ce3bd84 100644 --- a/tests/orchestrator/context/test_operation.py +++ b/tests/orchestrator/context/test_operation.py @@ -28,7 +28,6 @@ from aria.orchestrator.workflows.executor import thread from tests import mock, storage from . import ( op_path, - op_name, execute, ) @@ -56,11 +55,13 @@ def executor(): def test_node_operation_task_execution(ctx, executor): - operation_name = 'aria.interfaces.lifecycle.create' + interface_name = 'Standard' + operation_name = 'create' node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) interface = mock.models.create_interface( node.service, + interface_name, operation_name, operation_kwargs=dict(implementation=op_path(my_operation, module_path=__name__)) ) @@ -72,8 +73,8 @@ def test_node_operation_task_execution(ctx, executor): def basic_workflow(graph, **_): graph.add_tasks( api.task.OperationTask.for_node( - interface_name='aria.interfaces.lifecycle', - operation_name='create', + interface_name=interface_name, + operation_name=operation_name, node=node, inputs=inputs ) @@ -81,17 +82,27 @@ def test_node_operation_task_execution(ctx, executor): execute(workflow_func=basic_workflow, workflow_context=ctx, executor=executor) - operation_context = global_test_holder[op_name(node, operation_name)] + operation_context = global_test_holder[api.task.OperationTask.NAME_FORMAT.format( + type='node', + id=node.id, + interface=interface_name, + operation=operation_name + )] assert isinstance(operation_context, context.operation.NodeOperationContext) # Task bases assertions assert operation_context.task.actor == node - assert operation_context.task.name == op_name(node, operation_name) - operations = interface.operations.filter_by(name=operation_name) # pylint: disable=no-member - assert operations.count() == 1 - assert operation_context.task.implementation == operations[0].implementation - assert operation_context.task.inputs == inputs + assert operation_context.task.name == api.task.OperationTask.NAME_FORMAT.format( + type='node', + id=node.id, + interface=interface_name, + operation=operation_name + ) + operations = interface.operations + assert len(operations) == 1 + assert operation_context.task.implementation == operations.values()[0].implementation + assert operation_context.task.inputs['putput'].value is True # Context based attributes (sugaring) assert operation_context.node_template == node.node_template @@ -99,12 +110,14 @@ def test_node_operation_task_execution(ctx, executor): def test_relationship_operation_task_execution(ctx, executor): - operation_name = 'aria.interfaces.relationship_lifecycle.post_configure' - relationship = ctx.model.relationship.list()[0] + interface_name = 'Configure' + operation_name = 'post_configure' + relationship = ctx.model.relationship.list()[0] interface = mock.models.create_interface( relationship.source_node.service, - operation_name=operation_name, + interface_name, + operation_name, operation_kwargs=dict(implementation=op_path(my_operation, module_path=__name__)), ) @@ -117,30 +130,36 @@ def test_relationship_operation_task_execution(ctx, executor): graph.add_tasks( api.task.OperationTask.for_relationship( relationship=relationship, - interface_name='aria.interfaces.relationship_lifecycle', - operation_name='post_configure', + interface_name=interface_name, + operation_name=operation_name, inputs=inputs ) ) execute(workflow_func=basic_workflow, workflow_context=ctx, executor=executor) - operation_context = global_test_holder[op_name(relationship, - operation_name)] + operation_context = global_test_holder[api.task.OperationTask.NAME_FORMAT.format( + type='relationship', + id=relationship.id, + interface=interface_name, + operation=operation_name + )] assert isinstance(operation_context, context.operation.RelationshipOperationContext) # Task bases assertions assert operation_context.task.actor == relationship - assert operation_context.task.name.startswith(operation_name) - operation = interface.operations.filter_by(name=operation_name) # pylint: disable=no-member - assert operation_context.task.implementation == operation.all()[0].implementation - assert operation_context.task.inputs == inputs + assert interface_name in operation_context.task.name + operations = interface.operations + assert operation_context.task.implementation == operations.values()[0].implementation + assert operation_context.task.inputs['putput'].value is True # Context based attributes (sugaring) - dependency_node_template = ctx.model.node_template.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + dependency_node_template = ctx.model.node_template.get_by_name( + mock.models.DEPENDENCY_NODE_TEMPLATE_NAME) dependency_node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) - dependent_node_template = ctx.model.node_template.get_by_name(mock.models.DEPENDENT_NODE_NAME) + dependent_node_template = ctx.model.node_template.get_by_name( + mock.models.DEPENDENT_NODE_TEMPLATE_NAME) dependent_node = ctx.model.node.get_by_name(mock.models.DEPENDENT_NODE_NAME) assert operation_context.target_node_template == dependency_node_template @@ -158,42 +177,59 @@ def test_invalid_task_operation_id(ctx, executor): :param executor: :return: """ - operation_name = 'aria.interfaces.lifecycle.create' + interface_name = 'Standard' + operation_name = 'create' + other_node, node = ctx.model.node.list() assert other_node.id == 1 assert node.id == 2 interface = mock.models.create_interface( + node.service, + interface_name=interface_name, operation_name=operation_name, operation_kwargs=dict(implementation=op_path(get_node_id, module_path=__name__)) ) - node.interfaces = [interface] + node.interfaces[interface.name] = interface ctx.model.node.update(node) @workflow def basic_workflow(graph, **_): graph.add_tasks( - api.task.OperationTask.for_node(name=operation_name, node=node) + api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name) ) execute(workflow_func=basic_workflow, workflow_context=ctx, executor=executor) - op_node_id = global_test_holder[op_name(node, operation_name)] + op_node_id = global_test_holder[api.task.OperationTask.NAME_FORMAT.format( + type='node', + id=node.id, + interface=interface_name, + operation=operation_name + )] assert op_node_id == node.id assert op_node_id != other_node.id def test_plugin_workdir(ctx, executor, tmpdir): - op = 'test.op' - plugin_name = 'mock_plugin' + interface_name = 'Standard' + operation_name = 'create' + + plugin = mock.models.create_plugin() + plugin.name = 'mock_plugin' node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) - node.interfaces = [mock.models.create_interface( - op, + interface = mock.models.create_interface( + node.service, + interface_name, + operation_name, operation_kwargs=dict( implementation='{0}.{1}'.format(__name__, _test_plugin_workdir.__name__), - plugin=plugin_name) - )] - node.plugins = [{'name': plugin_name}] + plugin=plugin) + ) + node.interfaces[interface.name] = interface + node.plugins = [plugin] ctx.model.node.update(node) filename = 'test_file' @@ -202,12 +238,15 @@ def test_plugin_workdir(ctx, executor, tmpdir): @workflow def basic_workflow(graph, **_): - graph.add_tasks(api.task.OperationTask.for_node( - name=op, node=node, inputs=inputs)) + graph.add_tasks(api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name, + inputs=inputs) + ) execute(workflow_func=basic_workflow, workflow_context=ctx, executor=executor) - expected_file = tmpdir.join('workdir', 'plugins', str(ctx.service_instance.id), - plugin_name, + expected_file = tmpdir.join('workdir', 'plugins', str(ctx.service.id), + plugin.name, filename) assert expected_file.read() == content http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/context/test_resource_render.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/context/test_resource_render.py b/tests/orchestrator/context/test_resource_render.py index b924909..696e9b3 100644 --- a/tests/orchestrator/context/test_resource_render.py +++ b/tests/orchestrator/context/test_resource_render.py @@ -17,7 +17,7 @@ import pytest from tests import mock, storage -_IMPLICIT_CTX_TEMPLATE = '{{ctx.service_instance.name}}' +_IMPLICIT_CTX_TEMPLATE = '{{ctx.service.name}}' _IMPLICIT_CTX_TEMPLATE_PATH = 'implicit-ctx.template' _VARIABLES_TEMPLATE = '{{variable}}' _VARIABLES_TEMPLATE_PATH = 'variables.template' http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/context/test_serialize.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/context/test_serialize.py b/tests/orchestrator/context/test_serialize.py index ed6d724..9e5a0b4 100644 --- a/tests/orchestrator/context/test_serialize.py +++ b/tests/orchestrator/context/test_serialize.py @@ -42,14 +42,17 @@ def test_serialize_operation_context(context, executor, tmpdir): @workflow def _mock_workflow(ctx, graph): - node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) - plugin_name = 'mock_plugin' - node.interfaces = [mock.models.get_interface( - 'test.op', - operation_kwargs=dict(implementation=_operation_mapping(), plugin=plugin_name) - )] - node.plugins = [{'name': plugin_name}] - task = api.task.OperationTask.node(instance=node, name='test.op') + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + plugin = mock.models.create_plugin() + interface = mock.models.create_interface( + node.service, + 'test', + 'op', + operation_kwargs=dict(implementation=_operation_mapping(), plugin=plugin) + ) + node.interfaces[interface.name] = interface + node.plugins = [plugin] + task = api.task.OperationTask.for_node(node=node, interface_name='test', operation_name='op') graph.add_tasks(task) return graph @@ -61,12 +64,12 @@ def _mock_operation(ctx): # a correct ctx.task.operation_mapping tells us we kept the correct task_id assert ctx.task.implementation == _operation_mapping() # a correct ctx.node.name tells us we kept the correct actor_id - assert ctx.node.name == mock.models.DEPENDENCY_NODE_INSTANCE_NAME + assert ctx.node.name == mock.models.DEPENDENCY_NODE_NAME # a correct ctx.name tells us we kept the correct name assert ctx.name is not None assert ctx.name == ctx.task.name # a correct ctx.deployment.name tells us we kept the correct deployment_id - assert ctx.service_instance.name == mock.models.SERVICE_NAME + assert ctx.service.name == mock.models.SERVICE_NAME # Here we test that the resource storage was properly re-created test_file_content = ctx.resource.blueprint.read(TEST_FILE_ENTRY_ID, TEST_FILE_NAME) assert test_file_content == TEST_FILE_CONTENT http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/context/test_toolbelt.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/context/test_toolbelt.py b/tests/orchestrator/context/test_toolbelt.py index 28bd3d3..f04fd4b 100644 --- a/tests/orchestrator/context/test_toolbelt.py +++ b/tests/orchestrator/context/test_toolbelt.py @@ -24,7 +24,6 @@ from aria.orchestrator.context.toolbelt import RelationshipToolBelt from tests import mock, storage from . import ( op_path, - op_name, execute, ) @@ -49,22 +48,22 @@ def executor(): def _get_elements(workflow_context): dependency_node_template = workflow_context.model.node_template.get_by_name( - mock.models.DEPENDENCY_NODE_NAME) + mock.models.DEPENDENCY_NODE_TEMPLATE_NAME) dependency_node_template.host = dependency_node_template workflow_context.model.node.update(dependency_node_template) dependency_node = workflow_context.model.node.get_by_name( - mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + mock.models.DEPENDENCY_NODE_NAME) dependency_node.host_fk = dependency_node.id workflow_context.model.node.update(dependency_node) dependent_node_template = workflow_context.model.node_template.get_by_name( - mock.models.DEPENDENT_NODE_NAME) + mock.models.DEPENDENT_NODE_TEMPLATE_NAME) dependent_node_template.host = dependency_node_template workflow_context.model.node_template.update(dependent_node_template) dependent_node = workflow_context.model.node.get_by_name( - mock.models.DEPENDENT_NODE_INSTANCE_NAME) + mock.models.DEPENDENT_NODE_NAME) dependent_node.host = dependent_node workflow_context.model.node.update(dependent_node) @@ -74,21 +73,26 @@ def _get_elements(workflow_context): def test_host_ip(workflow_context, executor): - operation_name = 'aria.interfaces.lifecycle.create' + interface_name = 'Standard' + operation_name = 'create' _, dependency_node, _, _, _ = _get_elements(workflow_context) - dependency_node.interfaces = [mock.models.get_interface( - operation_name, + interface = mock.models.create_interface( + dependency_node.service, + interface_name=interface_name, + operation_name=operation_name, operation_kwargs=dict(implementation=op_path(host_ip, module_path=__name__)) - )] + ) + dependency_node.interfaces[interface.name] = interface workflow_context.model.node.update(dependency_node) inputs = {'putput': True} @workflow def basic_workflow(graph, **_): graph.add_tasks( - api.task.OperationTask.node( - instance=dependency_node, - name=operation_name, + api.task.OperationTask.for_node( + node=dependency_node, + interface_name=interface_name, + operation_name=operation_name, inputs=inputs ) ) @@ -99,15 +103,16 @@ def test_host_ip(workflow_context, executor): def test_relationship_tool_belt(workflow_context, executor): - operation_name = 'aria.interfaces.relationship_lifecycle.post_configure' + interface_name = 'Configure' + operation_name = 'post_configure' _, _, _, _, relationship = _get_elements(workflow_context) - relationship.interfaces = [ - mock.models.get_interface( - operation_name, - operation_kwargs=dict( - implementation=op_path(relationship_operation, module_path=__name__)), - edge='source') - ] + interface = mock.models.create_interface( + relationship.source_node.service, + interface_name=interface_name, + operation_name=operation_name, + operation_kwargs=dict(implementation=op_path(relationship_operation, module_path=__name__)) + ) + relationship.interfaces[interface.name] = interface workflow_context.model.relationship.update(relationship) inputs = {'putput': True} @@ -115,18 +120,22 @@ def test_relationship_tool_belt(workflow_context, executor): @workflow def basic_workflow(graph, **_): graph.add_tasks( - api.task.OperationTask.relationship( - instance=relationship, - name=operation_name, - edge='source', + api.task.OperationTask.for_relationship( + relationship=relationship, + interface_name=interface_name, + operation_name=operation_name, inputs=inputs ) ) execute(workflow_func=basic_workflow, workflow_context=workflow_context, executor=executor) - assert isinstance(global_test_holder.get(op_name(relationship, operation_name)), - RelationshipToolBelt) + assert isinstance(global_test_holder.get(api.task.OperationTask.NAME_FORMAT.format( + type='relationship', + id=relationship.id, + interface=interface_name, + operation=operation_name + )), RelationshipToolBelt) def test_wrong_model_toolbelt(): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/context/test_workflow.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/context/test_workflow.py b/tests/orchestrator/context/test_workflow.py index 049b787..fa1f387 100644 --- a/tests/orchestrator/context/test_workflow.py +++ b/tests/orchestrator/context/test_workflow.py @@ -29,7 +29,7 @@ class TestWorkflowContext(object): def test_execution_creation_on_workflow_context_creation(self, storage): ctx = self._create_ctx(storage) execution = storage.execution.get(ctx.execution.id) # pylint: disable=no-member - assert execution.service_instance == storage.service_instance.get_by_name( + assert execution.service == storage.service.get_by_name( models.SERVICE_NAME) assert execution.workflow_name == models.WORKFLOW_NAME assert execution.service_template == storage.service_template.get_by_name( @@ -53,7 +53,7 @@ class TestWorkflowContext(object): name='simple_context', model_storage=storage, resource_storage=None, - service_instance_id=storage.service_instance.get_by_name(models.SERVICE_NAME).id, + service_id=storage.service.get_by_name(models.SERVICE_NAME).id, workflow_name=models.WORKFLOW_NAME, task_max_attempts=models.TASK_MAX_ATTEMPTS, task_retry_interval=models.TASK_RETRY_INTERVAL @@ -64,8 +64,8 @@ class TestWorkflowContext(object): def storage(): workflow_storage = application_model_storage( sql_mapi.SQLAlchemyModelAPI, initiator=test_storage.init_inmemory_model_storage) - workflow_storage.service_template.put(models.get_service_template()) - blueprint = workflow_storage.service_template.get_by_name(models.SERVICE_TEMPLATE_NAME) - workflow_storage.service_instance.put(models.get_service(blueprint)) + workflow_storage.service_template.put(models.create_service_template()) + service_template = workflow_storage.service_template.get_by_name(models.SERVICE_TEMPLATE_NAME) + workflow_storage.service.put(models.create_service(service_template)) yield workflow_storage test_storage.release_sqlite_storage(workflow_storage) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/workflows/api/test_task.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/api/test_task.py b/tests/orchestrator/workflows/api/test_task.py index a9b6a7a..4f5671b 100644 --- a/tests/orchestrator/workflows/api/test_task.py +++ b/tests/orchestrator/workflows/api/test_task.py @@ -19,6 +19,7 @@ import pytest from aria.orchestrator import context from aria.orchestrator.workflows import api from aria.modeling import models + from tests import mock, storage @@ -30,7 +31,7 @@ def ctx(tmpdir): :return: """ simple_context = mock.context.simple(str(tmpdir), inmemory=False) - simple_context.model.execution.put(mock.models.get_execution(simple_context.service_instance)) + simple_context.model.execution.put(mock.models.create_execution(simple_context.service)) yield simple_context storage.release_sqlite_storage(simple_context.model) @@ -38,18 +39,23 @@ def ctx(tmpdir): class TestOperationTask(object): def test_node_operation_task_creation(self, ctx): - operation_name = 'aria.interfaces.lifecycle.create' - interface = mock.models.get_interface( + interface_name = 'test_interface' + operation_name = 'create' + + plugin = mock.models.create_plugin('package', '0.1') + plugin.name = 'test_plugin' + + interface = mock.models.create_interface( + ctx.service, + interface_name, operation_name, - operation_kwargs=dict(plugin='plugin', implementation='op_path')) - - node = ctx.model.node.get_by_name(mock.models.DEPENDENT_NODE_INSTANCE_NAME) - node.interfaces = [interface] - node.plugins = [{'name': 'plugin', - 'package_name': 'package', - 'package_version': '0.1'}] - ctx.model.node_template.update(node) - inputs = {'name': True} + operation_kwargs=dict(plugin=plugin, implementation='op_path')) + + node = ctx.model.node.get_by_name(mock.models.DEPENDENT_NODE_NAME) + node.interfaces = {interface.name: interface} + node.plugins = [plugin] + ctx.model.node.update(node) + inputs = {'test_input': True} max_attempts = 10 retry_interval = 10 ignore_failure = True @@ -57,113 +63,132 @@ class TestOperationTask(object): with context.workflow.current.push(ctx): api_task = api.task.OperationTask.for_node( node=node, - name=operation_name, + interface_name=interface_name, + operation_name=operation_name, inputs=inputs, max_attempts=max_attempts, retry_interval=retry_interval, ignore_failure=ignore_failure) - assert api_task.name == '{0}.{1}'.format(operation_name, node.id) + assert api_task.name == api.task.OperationTask.NAME_FORMAT.format( + type='node', + id=node.id, + interface=interface_name, + operation=operation_name + ) assert api_task.implementation == 'op_path' assert api_task.actor == node - assert api_task.inputs == inputs + assert api_task.inputs['test_input'].value is True assert api_task.retry_interval == retry_interval assert api_task.max_attempts == max_attempts assert api_task.ignore_failure == ignore_failure - assert api_task.plugin == {'name': 'plugin', - 'package_name': 'package', - 'package_version': '0.1'} + assert api_task.plugin.name == 'test_plugin' assert api_task.runs_on == models.Task.RUNS_ON_NODE def test_source_relationship_operation_task_creation(self, ctx): - operation_name = 'aria.interfaces.relationship_lifecycle.preconfigure' + interface_name = 'test_interface' + operation_name = 'preconfigure' + + plugin = mock.models.create_plugin('package', '0.1') + plugin.name = 'test_plugin' - interface = mock.models.get_interface( + interface = mock.models.create_interface( + ctx.service, + interface_name, operation_name, - operation_kwargs=dict(implementation='op_path', plugin='plugin'), - edge='source' + operation_kwargs=dict(plugin=plugin, implementation='op_path') ) relationship = ctx.model.relationship.list()[0] - relationship.interfaces = [interface] - relationship.source_node.plugins = [{'name': 'plugin', - 'package_name': 'package', - 'package_version': '0.1'}] - inputs = {'name': True} + relationship.interfaces[interface.name] = interface + relationship.source_node.plugins = [plugin] + inputs = {'test_input': True} max_attempts = 10 retry_interval = 10 with context.workflow.current.push(ctx): api_task = api.task.OperationTask.for_relationship( relationship=relationship, - name=operation_name, - edge='source', + interface_name=interface_name, + operation_name=operation_name, inputs=inputs, max_attempts=max_attempts, retry_interval=retry_interval) - assert api_task.name == '{0}.{1}'.format(operation_name, relationship.id) + assert api_task.name == api.task.OperationTask.NAME_FORMAT.format( + type='relationship', + id=relationship.id, + interface=interface_name, + operation=operation_name + ) assert api_task.implementation == 'op_path' assert api_task.actor == relationship - assert api_task.inputs == inputs + assert api_task.inputs['test_input'].value is True assert api_task.retry_interval == retry_interval assert api_task.max_attempts == max_attempts - assert api_task.plugin == {'name': 'plugin', - 'package_name': 'package', - 'package_version': '0.1'} + assert api_task.plugin.name == 'test_plugin' assert api_task.runs_on == models.Task.RUNS_ON_SOURCE def test_target_relationship_operation_task_creation(self, ctx): - operation_name = 'aria.interfaces.relationship_lifecycle.preconfigure' - interface = mock.models.get_interface( + interface_name = 'test_interface' + operation_name = 'preconfigure' + + plugin = mock.models.create_plugin('package', '0.1') + plugin.name = 'test_plugin' + + interface = mock.models.create_interface( + ctx.service, + interface_name, operation_name, - operation_kwargs=dict(implementation='op_path', plugin='plugin'), - edge='target' + operation_kwargs=dict(plugin=plugin, implementation='op_path') ) relationship = ctx.model.relationship.list()[0] - relationship.interfaces = [interface] - relationship.target_node.plugins = [{'name': 'plugin', - 'package_name': 'package', - 'package_version': '0.1'}] - inputs = {'name': True} + relationship.interfaces[interface.name] = interface + relationship.target_node.plugins = [plugin] + inputs = {'test_input': True} max_attempts = 10 retry_interval = 10 with context.workflow.current.push(ctx): api_task = api.task.OperationTask.for_relationship( relationship=relationship, - name=operation_name, - edge='target', + interface_name=interface_name, + operation_name=operation_name, inputs=inputs, max_attempts=max_attempts, - retry_interval=retry_interval) + retry_interval=retry_interval, + runs_on=models.Task.RUNS_ON_TARGET) - assert api_task.name == '{0}.{1}'.format(operation_name, relationship.id) + assert api_task.name == api.task.OperationTask.NAME_FORMAT.format( + type='relationship', + id=relationship.id, + interface=interface_name, + operation=operation_name + ) assert api_task.implementation == 'op_path' assert api_task.actor == relationship - assert api_task.inputs == inputs + assert api_task.inputs['test_input'].value is True assert api_task.retry_interval == retry_interval assert api_task.max_attempts == max_attempts - assert api_task.plugin == {'name': 'plugin', - 'package_name': 'package', - 'package_version': '0.1'} + assert api_task.plugin.name == 'test_plugin' assert api_task.runs_on == models.Task.RUNS_ON_TARGET def test_operation_task_default_values(self, ctx): - dependency_node_instance = ctx.model.node.get_by_name( - mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + dependency_node = ctx.model.node.get_by_name( + mock.models.DEPENDENCY_NODE_NAME) + with context.workflow.current.push(ctx): task = api.task.OperationTask( name='stub', implementation='', - actor=dependency_node_instance) + actor=dependency_node) assert task.inputs == {} assert task.retry_interval == ctx._task_retry_interval assert task.max_attempts == ctx._task_max_attempts assert task.ignore_failure == ctx._task_ignore_failure - assert task.plugin == {} + assert task.plugin is None assert task.runs_on is None http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/workflows/builtin/test_execute_operation.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/builtin/test_execute_operation.py b/tests/orchestrator/workflows/builtin/test_execute_operation.py index cc9a8a8..0e5a506 100644 --- a/tests/orchestrator/workflows/builtin/test_execute_operation.py +++ b/tests/orchestrator/workflows/builtin/test_execute_operation.py @@ -18,28 +18,33 @@ import pytest from aria.orchestrator.workflows.api import task from aria.orchestrator.workflows.builtin.execute_operation import execute_operation -from tests import mock -from tests import storage +from tests import mock, storage @pytest.fixture def ctx(tmpdir): - context = mock.context.simple(str(tmpdir)) + context = mock.context.simple(str(tmpdir), inmemory=False) yield context storage.release_sqlite_storage(context.model) def test_execute_operation(ctx): - node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) - node.interfaces = [mock.models.get_interface(mock.operations.NODE_OPERATIONS_INSTALL[0])] + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface_name, operation_name = mock.operations.NODE_OPERATIONS_INSTALL[0] + interface = mock.models.create_interface( + ctx.service, + interface_name, + operation_name + ) + node.interfaces[interface.name] = interface ctx.model.node.update(node) - operation_name = mock.operations.NODE_OPERATIONS_INSTALL[0] execute_tasks = list( task.WorkflowTask( execute_operation, ctx=ctx, - operation=operation_name, + interface_name=interface_name, + operation_name=operation_name, operation_kwargs={}, allow_kwargs_override=False, run_by_dependency_order=False, @@ -50,8 +55,12 @@ def test_execute_operation(ctx): ) assert len(execute_tasks) == 1 - assert execute_tasks[0].name == '{0}.{1}'.format(operation_name, node.id) - + assert execute_tasks[0].name == task.OperationTask.NAME_FORMAT.format( + type='node', + id=node.id, + interface=interface_name, + operation=operation_name + ) # TODO: add more scenarios http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/workflows/core/test_engine.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/core/test_engine.py b/tests/orchestrator/workflows/core/test_engine.py index 8c5511a..6f97952 100644 --- a/tests/orchestrator/workflows/core/test_engine.py +++ b/tests/orchestrator/workflows/core/test_engine.py @@ -60,15 +60,19 @@ class BaseTest(object): max_attempts=None, retry_interval=None, ignore_failure=None): - node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) - node.interfaces = [mock.models.get_interface( - 'aria.interfaces.lifecycle.create', + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface = mock.models.create_interface( + node.service, + 'aria.interfaces.lifecycle', + 'create', operation_kwargs=dict(implementation='{name}.{func.__name__}'.format(name=__name__, func=func)) - )] + ) + node.interfaces[interface.name] = interface return api.task.OperationTask.for_node( node=node, - name='aria.interfaces.lifecycle.create', + interface_name='aria.interfaces.lifecycle', + operation_name='create', inputs=inputs, max_attempts=max_attempts, retry_interval=retry_interval, http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/workflows/core/test_task.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/core/test_task.py b/tests/orchestrator/workflows/core/test_task.py index 26564c5..d03597d 100644 --- a/tests/orchestrator/workflows/core/test_task.py +++ b/tests/orchestrator/workflows/core/test_task.py @@ -19,6 +19,7 @@ from datetime import ( import pytest +from aria.modeling import models from aria.orchestrator.context import workflow as workflow_context from aria.orchestrator.workflows import ( api, @@ -28,8 +29,10 @@ from aria.orchestrator.workflows import ( from tests import mock, storage -OP_NAME = 'tosca.interfaces.node.lifecycle.Standard.create' -RELATIONSHIP_OP_NAME = 'tosca.interfaces.relationship.Configure.pre_configure' +NODE_INTERFACE_NAME = 'Standard' +NODE_OPERATION_NAME = 'create' +RELATIONSHIP_INTERFACE_NAME = 'Configure' +RELATIONSHIP_OPERATION_NAME = 'pre_configure' @pytest.fixture @@ -37,15 +40,22 @@ def ctx(tmpdir): context = mock.context.simple(str(tmpdir)) relationship = context.model.relationship.list()[0] - relationship.interfaces = [ - mock.models.get_interface(RELATIONSHIP_OP_NAME, edge='source'), - mock.models.get_interface(RELATIONSHIP_OP_NAME, edge='target') - ] + interface = mock.models.create_interface( + relationship.source_node.service, + RELATIONSHIP_INTERFACE_NAME, + RELATIONSHIP_OPERATION_NAME + ) + relationship.interfaces[interface.name] = interface context.model.relationship.update(relationship) - dependent_node = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) - dependent_node.interfaces = [mock.models.get_interface(OP_NAME)] - context.model.node.update(dependent_node) + node = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface = mock.models.create_interface( + node.service, + NODE_INTERFACE_NAME, + NODE_OPERATION_NAME + ) + node.interfaces[interface.name] = interface + context.model.node.update(node) yield context storage.release_sqlite_storage(context.model) @@ -55,39 +65,43 @@ class TestOperationTask(object): def _create_node_operation_task(self, ctx, node): with workflow_context.current.push(ctx): - api_task = api.task.OperationTask.node( - instance=node, - name='tosca.interfaces.node.lifecycle.Standard.create') + api_task = api.task.OperationTask.for_node( + node=node, + interface_name=NODE_INTERFACE_NAME, + operation_name=NODE_OPERATION_NAME) core_task = core.task.OperationTask(api_task=api_task) return api_task, core_task - def _create_relationship_operation_task(self, ctx, relationship, operation_name, edge): + def _create_relationship_operation_task(self, ctx, relationship, runs_on): with workflow_context.current.push(ctx): - api_task = api.task.OperationTask.relationship( - instance=relationship, name=operation_name, edge=edge) + api_task = api.task.OperationTask.for_relationship( + relationship=relationship, + interface_name=RELATIONSHIP_INTERFACE_NAME, + operation_name=RELATIONSHIP_OPERATION_NAME, + runs_on=runs_on) core_task = core.task.OperationTask(api_task=api_task) return api_task, core_task def test_node_operation_task_creation(self, ctx): - storage_plugin = mock.models.get_plugin(package_name='p1', package_version='0.1') - storage_plugin_other = mock.models.get_plugin(package_name='p0', package_version='0.0') + storage_plugin = mock.models.create_plugin(package_name='p1', package_version='0.1') + storage_plugin_other = mock.models.create_plugin(package_name='p0', package_version='0.0') ctx.model.plugin.put(storage_plugin_other) ctx.model.plugin.put(storage_plugin) - node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) node_template = node.node_template - plugin_name = 'plugin1' - node_template.plugins = [{'name': 'plugin1', - 'package_name': 'p1', - 'package_version': '0.1'}] - node.interfaces = [mock.models.get_interface( - 'tosca.interfaces.node.lifecycle.Standard.create', - operation_kwargs=dict(plugin='plugin1') - )] + node_template.plugins = [storage_plugin] + interface = mock.models.create_interface( + node.service, + NODE_INTERFACE_NAME, + NODE_OPERATION_NAME, + operation_kwargs=dict(plugin=storage_plugin) + ) + node.interfaces[interface.name] = interface ctx.model.node_template.update(node_template) ctx.model.node.update(node) api_task, core_task = self._create_node_operation_task(ctx, node) storage_task = ctx.model.task.get_by_name(core_task.name) - assert storage_task.plugin_name == plugin_name + assert storage_task.plugin is storage_plugin assert storage_task.execution_name == ctx.execution.name assert storage_task.runs_on == core_task.context.node assert core_task.model_task == storage_task @@ -101,17 +115,17 @@ class TestOperationTask(object): relationship = ctx.model.relationship.list()[0] ctx.model.relationship.update(relationship) _, core_task = self._create_relationship_operation_task( - ctx, relationship, RELATIONSHIP_OP_NAME, 'source') + ctx, relationship, models.Task.RUNS_ON_SOURCE) assert core_task.model_task.runs_on == relationship.source_node def test_target_relationship_operation_task_creation(self, ctx): relationship = ctx.model.relationship.list()[0] _, core_task = self._create_relationship_operation_task( - ctx, relationship, RELATIONSHIP_OP_NAME, 'target') + ctx, relationship, models.Task.RUNS_ON_TARGET) assert core_task.model_task.runs_on == relationship.target_node def test_operation_task_edit_locked_attribute(self, ctx): - node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) _, core_task = self._create_node_operation_task(ctx, node) now = datetime.utcnow() @@ -127,7 +141,7 @@ class TestOperationTask(object): core_task.due_at = now def test_operation_task_edit_attributes(self, ctx): - node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) _, core_task = self._create_node_operation_task(ctx, node) future_time = datetime.utcnow() + timedelta(seconds=3) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py b/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py index 167004e..0a95d43 100644 --- a/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py +++ b/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py @@ -23,10 +23,16 @@ from tests import storage def test_task_graph_into_execution_graph(tmpdir): - operation_name = 'tosca.interfaces.node.lifecycle.Standard.create' + interface_name = 'Standard' + operation_name = 'create' task_context = mock.context.simple(str(tmpdir)) - node = task_context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) - node.interfaces = [mock.models.get_interface(operation_name)] + node = task_context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface = mock.models.create_interface( + node.service, + interface_name, + operation_name + ) + node.interfaces[interface.name] = interface task_context.model.node.update(node) def sub_workflow(name, **_): @@ -34,14 +40,17 @@ def test_task_graph_into_execution_graph(tmpdir): with context.workflow.current.push(task_context): test_task_graph = api.task.WorkflowTask(sub_workflow, name='test_task_graph') - simple_before_task = api.task.OperationTask.node(instance=node, - name=operation_name) - simple_after_task = api.task.OperationTask.node(instance=node, - name=operation_name) + simple_before_task = api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name) + simple_after_task = api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name) inner_task_graph = api.task.WorkflowTask(sub_workflow, name='test_inner_task_graph') - inner_task = api.task.OperationTask.node(instance=node, - name=operation_name) + inner_task = api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name) inner_task_graph.add_tasks(inner_task) test_task_graph.add_tasks(simple_before_task) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/workflows/executor/test_executor.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_executor.py b/tests/orchestrator/workflows/executor/test_executor.py index 2421fa9..0e96ba3 100644 --- a/tests/orchestrator/workflows/executor/test_executor.py +++ b/tests/orchestrator/workflows/executor/test_executor.py @@ -43,7 +43,9 @@ def test_execute(executor): expected_value = 'value' successful_task = MockTask(mock_successful_task) failing_task = MockTask(mock_failing_task) - task_with_inputs = MockTask(mock_task_with_input, inputs=dict(input='value')) + #task_with_inputs = MockTask(mock_task_with_input, inputs=dict(input='value')) + task_with_inputs = MockTask(mock_task_with_input, inputs={'input': models.Parameter( + name='input', type_name='string', value='value')}) for task in [successful_task, failing_task, task_with_inputs]: executor.execute(task) @@ -105,7 +107,8 @@ class MockTask(object): self.exception = None self.id = str(uuid.uuid4()) name = func.__name__ - implementation = 'tests.orchestrator.workflows.executor.test_executor.{name}'.format( + implementation = '{module}.{name}'.format( + module=__name__, name=name) self.implementation = implementation self.logger = logging.getLogger() @@ -151,6 +154,7 @@ def register_signals(): def failure_handler(task, exception, *args, **kwargs): task.states.append('failure') task.exception = exception + events.start_task_signal.connect(start_handler) events.on_success_task_signal.connect(success_handler) events.on_failure_task_signal.connect(failure_handler) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/workflows/executor/test_process_executor_extension.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_process_executor_extension.py b/tests/orchestrator/workflows/executor/test_process_executor_extension.py index ac95554..0988fae 100644 --- a/tests/orchestrator/workflows/executor/test_process_executor_extension.py +++ b/tests/orchestrator/workflows/executor/test_process_executor_extension.py @@ -29,25 +29,32 @@ from tests import storage def test_decorate_extension(context, executor): inputs = {'input1': 1, 'input2': 2} - def get_node_instance(ctx): - return ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + def get_node(ctx): + return ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) @workflow def mock_workflow(ctx, graph): - node_instance = get_node_instance(ctx) - op = 'test.op' - node_instance.interfaces = [mock.models.get_interface( - op, + node = get_node(ctx) + interface_name = 'test_interface' + operation_name = 'operation' + interface = mock.models.create_interface( + ctx.service, + interface_name, + operation_name, operation_kwargs=dict(implementation='{0}.{1}'.format(__name__, _mock_operation.__name__)) - )] - task = api.task.OperationTask.node(instance=node_instance, name=op, inputs=inputs) + ) + node.interfaces[interface.name] = interface + task = api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name, + inputs=inputs) graph.add_tasks(task) return graph graph = mock_workflow(ctx=context) # pylint: disable=no-value-for-parameter eng = engine.Engine(executor=executor, workflow_context=context, tasks_graph=graph) eng.execute() - out = get_node_instance(context).runtime_properties['out'] + out = get_node(context).runtime_properties['out'] assert out['wrapper_inputs'] == inputs assert out['function_inputs'] == inputs http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dd99f0fb/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py b/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py index d3b3300..d84a153 100644 --- a/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py +++ b/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py @@ -45,7 +45,7 @@ def test_track_changes_of_failed_operation(context, executor): def _assert_tracked_changes_are_applied(context): - instance = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + instance = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) assert instance.runtime_properties == _TEST_RUNTIME_PROPERTIES @@ -67,7 +67,7 @@ def test_apply_tracked_changes_during_an_operation(context, executor): } expected_initial = context.model.node.get_by_name( - mock.models.DEPENDENCY_NODE_INSTANCE_NAME).runtime_properties + mock.models.DEPENDENCY_NODE_NAME).runtime_properties out = _run_workflow(context=context, executor=executor, op_func=_mock_updating_operation, inputs=inputs) @@ -87,19 +87,27 @@ def test_apply_tracked_changes_during_an_operation(context, executor): def _run_workflow(context, executor, op_func, inputs=None): @workflow def mock_workflow(ctx, graph): - node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) - node.interfaces = [mock.models.get_interface( - 'test.op', operation_kwargs=dict(implementation=_operation_mapping(op_func)))] - task = api.task.OperationTask.node(instance=node, - name='test.op', - inputs=inputs or {}) + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface_name = 'test_interface' + operation_name = 'operation' + interface = mock.models.create_interface( + ctx.service, + interface_name, + operation_name, + operation_kwargs=dict(implementation=_operation_mapping(op_func)) + ) + node.interfaces[interface.name] = interface + task = api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name, + inputs=inputs or {}) graph.add_tasks(task) return graph graph = mock_workflow(ctx=context) # pylint: disable=no-value-for-parameter eng = engine.Engine(executor=executor, workflow_context=context, tasks_graph=graph) eng.execute() return context.model.node.get_by_name( - mock.models.DEPENDENCY_NODE_INSTANCE_NAME).runtime_properties.get('out') + mock.models.DEPENDENCY_NODE_NAME).runtime_properties.get('out') @operation
