Repository: incubator-ariatosca
Updated Branches:
  refs/heads/ARIA-9-API-for-operation-context ab4468c6e -> 3a255781c


introduced relationship and node operationtasks


Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/3a255781
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/3a255781
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/3a255781

Branch: refs/heads/ARIA-9-API-for-operation-context
Commit: 3a255781ceb7b80a4e30aeafb097b91b267e8732
Parents: ab4468c
Author: mxmrlv <[email protected]>
Authored: Mon Nov 14 16:05:46 2016 +0200
Committer: mxmrlv <[email protected]>
Committed: Mon Nov 14 16:06:49 2016 +0200

----------------------------------------------------------------------
 aria/workflows/api/task.py                      | 63 +++++++++++++++--
 aria/workflows/builtin/heal.py                  |  2 -
 aria/workflows/builtin/workflows.py             | 74 ++++++--------------
 aria/workflows/core/translation.py              |  4 +-
 tests/context/__init__.py                       |  4 ++
 tests/context/test_operation.py                 | 74 ++++++++++----------
 tests/context/test_toolbelt.py                  | 38 +++++-----
 tests/workflows/api/test_task.py                | 52 ++++++++++----
 .../workflows/builtin/test_execute_operation.py |  2 +-
 tests/workflows/core/test_engine.py             |  6 +-
 tests/workflows/core/test_task.py               |  2 +-
 .../test_task_graph_into_exececution_graph.py   |  7 +-
 12 files changed, 194 insertions(+), 134 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3a255781/aria/workflows/api/task.py
----------------------------------------------------------------------
diff --git a/aria/workflows/api/task.py b/aria/workflows/api/task.py
index ba54b31..8d6c905 100644
--- a/aria/workflows/api/task.py
+++ b/aria/workflows/api/task.py
@@ -52,15 +52,15 @@ class BaseTask(object):
         return self._workflow_context
 
 
-class OperationTask(BaseTask):
+class _OperationTask(BaseTask):
     """
     Represents an operation task in the task_graph
     """
 
     def __init__(self,
                  name,
-                 operation_details,
                  actor,
+                 operation_details,
                  max_attempts=None,
                  retry_interval=None,
                  inputs=None):
@@ -72,9 +72,9 @@ class OperationTask(BaseTask):
         :param inputs: operation inputs.
         """
         assert isinstance(actor, (storage.models.NodeInstance,
-                                               
storage.models.RelationshipInstance))
-        super(OperationTask, self).__init__()
-        self.name = name
+                                  storage.models.RelationshipInstance))
+        super(_OperationTask, self).__init__()
+        self.name = '{name}.{actor.id}'.format(name=name, actor=actor)
         self.operation_details = operation_details
         self.actor = actor
         self.inputs = inputs or {}
@@ -84,6 +84,59 @@ class OperationTask(BaseTask):
                                if retry_interval is None else retry_interval)
 
 
+class NodeOperationTask(_OperationTask):
+    """
+    Represents a node based operation
+    """
+    def __init__(self,
+                 actor,
+                 name,
+                 *args,
+                 **kwargs):
+        """
+        Represents a relationship based operation
+
+        :param actor: the node of which this operation belongs to.
+        :param name: the name of the operation.
+        """
+        assert isinstance(actor, storage.models.NodeInstance)
+        assert 'operation_details' not in kwargs
+        operation_details = actor.node.operations[name]
+        super(NodeOperationTask, self).__init__(name=name,
+                                                actor=actor,
+                                                
operation_details=operation_details,
+                                                *args,
+                                                **kwargs)
+
+
+class RelationshipOperationTask(_OperationTask):
+    """
+    Represents a relationship based operation
+    """
+    def __init__(self,
+                 actor,
+                 name,
+                 target,
+                 *args,
+                 **kwargs):
+        """
+        Represents a relationship based operation
+
+        :param actor: the relationship of which this operation belongs to.
+        :param name: the name of the operation.
+        :param target: whether this is a source or target operation.
+        """
+        assert isinstance(actor, storage.models.RelationshipInstance)
+        assert 'operation_details' not in kwargs
+        side = 'target_operations' if target else 'source_operations'
+        operation_details = getattr(actor.relationship, side)[name]
+        super(RelationshipOperationTask, self).__init__(actor=actor,
+                                                        name=name,
+                                                        
operation_details=operation_details,
+                                                        *args,
+                                                        **kwargs)
+
+
 class WorkflowTask(BaseTask):
     """
     Represents an workflow task in the task_graph

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3a255781/aria/workflows/builtin/heal.py
----------------------------------------------------------------------
diff --git a/aria/workflows/builtin/heal.py b/aria/workflows/builtin/heal.py
index 7174de3..dbfc14e 100644
--- a/aria/workflows/builtin/heal.py
+++ b/aria/workflows/builtin/heal.py
@@ -99,7 +99,6 @@ def heal_uninstall(ctx, graph, failing_node_instances, 
targeted_node_instances):
 
             if target_node_instance in failing_node_instances:
                 dependency = relationship_tasks(
-                    node_instance=node_instance,
                     relationship_instance=relationship_instance,
                     
operation_name='aria.interfaces.relationship_lifecycle.unlink')
                 graph.add_tasks(*dependency)
@@ -152,7 +151,6 @@ def heal_install(ctx, graph, failing_node_instances, 
targeted_node_instances):
 
             if target_node_instance in failing_node_instances:
                 dependent = relationship_tasks(
-                    node_instance=node_instance,
                     relationship_instance=relationship_instance,
                     
operation_name='aria.interfaces.relationship_lifecycle.establish')
                 graph.add_tasks(*dependent)

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3a255781/aria/workflows/builtin/workflows.py
----------------------------------------------------------------------
diff --git a/aria/workflows/builtin/workflows.py 
b/aria/workflows/builtin/workflows.py
index f9117ac..ee75dbb 100644
--- a/aria/workflows/builtin/workflows.py
+++ b/aria/workflows/builtin/workflows.py
@@ -42,21 +42,13 @@ def install_node_instance(graph, node_instance, **kwargs):
     :param node_instance: the node instance to install
     :return:
     """
-    create_node_instance = task.OperationTask(
-        name='aria.interfaces.lifecycle.create.{0}'.format(node_instance.id),
-        
operation_details=node_instance.node.operations['aria.interfaces.lifecycle.create'],
-        actor=node_instance
-    )
-    configure_node_instance = task.OperationTask(
-        
name='aria.interfaces.lifecycle.configure.{0}'.format(node_instance.id),
-        
operation_details=node_instance.node.operations['aria.interfaces.lifecycle.configure'],
-        actor=node_instance
-        )
-    start_node_instance = task.OperationTask(
-        name='aria.interfaces.lifecycle.start.{0}'.format(node_instance.id),
-        
operation_details=node_instance.node.operations['aria.interfaces.lifecycle.start'],
-        actor=node_instance
-    )
+    create_node_instance = task.NodeOperationTask(actor=node_instance,
+                                                  
name='aria.interfaces.lifecycle.create')
+
+    configure_node_instance = task.NodeOperationTask(actor=node_instance,
+                                                     
name='aria.interfaces.lifecycle.configure')
+    start_node_instance = task.NodeOperationTask(actor=node_instance,
+                                                 
name='aria.interfaces.lifecycle.start')
 
     graph.sequence(
         create_node_instance,
@@ -123,16 +115,10 @@ def uninstall_node_instance(graph, node_instance, 
**kwargs):
         :param node_instance: the node instance to uninstall
         :return:
         """
-    stop_node_instance = task.OperationTask(
-        name='aria.interfaces.lifecycle.stop.{0}'.format(node_instance.id),
-        
operation_details=node_instance.node.operations['aria.interfaces.lifecycle.stop'],
-        actor=node_instance,
-    )
-    delete_node_instance = task.OperationTask(
-        name='aria.interfaces.lifecycle.delete.{0}'.format(node_instance.id),
-        
operation_details=node_instance.node.operations['aria.interfaces.lifecycle.delete'],
-        actor=node_instance
-    )
+    stop_node_instance = task.NodeOperationTask(actor=node_instance,
+                                                
name='aria.interfaces.lifecycle.stop')
+    delete_node_instance = task.NodeOperationTask(actor=node_instance,
+                                                  
name='aria.interfaces.lifecycle.delete')
 
     graph.sequence(
         stop_node_instance,
@@ -173,14 +159,9 @@ def execute_operation_on_instance(
     if allow_kwargs_override is not None:
         operation_kwargs['allow_kwargs_override'] = allow_kwargs_override
 
-    task_name = '{node_instance.id}.{operation_name}'.format(
-        node_instance=node_instance,
-        operation_name=operation)
-
-    return task.OperationTask(
-        name=task_name,
-        operation_details=node_instance.node.operations[operation],
+    return task.NodeOperationTask(
         actor=node_instance,
+        name=operation,
         inputs=operation_kwargs)
 
 
@@ -197,19 +178,17 @@ def relationships_tasks(graph, operation_name, 
node_instance):
         key=lambda relationship_instance: 
relationship_instance.relationship.target_id)
 
     sub_tasks = []
-    for index, (_, relationship_group) in enumerate(relationships_groups):
+    for _, (_, relationship_group) in enumerate(relationships_groups):
         for relationship_instance in relationship_group:
             relationship_operations = relationship_tasks(
-                node_instance=node_instance,
                 relationship_instance=relationship_instance,
-                operation_name=operation_name,
-                index=index)
+                operation_name=operation_name)
             sub_tasks.append(relationship_operations)
 
     return graph.sequence(*sub_tasks)
 
 
-def relationship_tasks(node_instance, relationship_instance, operation_name, 
index=None):
+def relationship_tasks(relationship_instance, operation_name):
     """
     Creates a relationship task source and target.
     :param NodeInstance node_instance: the node instance of the relationship
@@ -219,19 +198,10 @@ def relationship_tasks(node_instance, 
relationship_instance, operation_name, ind
     :param index: the relationship index - enables pretty print
     :return:
     """
-    index = index or 
node_instance.relationship_instances.index(relationship_instance)
-    operation_name_template = '{name}.{index}.{{0}}.<{source_id}, 
{target_id}>'.format(
-        name=operation_name,
-        index=index,
-        source_id=node_instance.id,
-        target_id=relationship_instance.target_id,
-    )
-    source_operation = task.OperationTask(
-        name=operation_name_template.format('source'),
-        actor=relationship_instance,
-        
operation_details=relationship_instance.relationship.source_operations[operation_name])
-    target_operation = task.OperationTask(
-        name=operation_name_template.format('target'),
-        actor=relationship_instance,
-        
operation_details=relationship_instance.relationship.target_operations[operation_name])
+    source_operation = 
task.RelationshipOperationTask(actor=relationship_instance,
+                                                      name=operation_name,
+                                                      target=False)
+    target_operation = 
task.RelationshipOperationTask(actor=relationship_instance,
+                                                      name=operation_name,
+                                                      target=True)
     return source_operation, target_operation

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3a255781/aria/workflows/core/translation.py
----------------------------------------------------------------------
diff --git a/aria/workflows/core/translation.py 
b/aria/workflows/core/translation.py
index b6cbdad..8e55e14 100644
--- a/aria/workflows/core/translation.py
+++ b/aria/workflows/core/translation.py
@@ -47,7 +47,7 @@ def build_execution_graph(
             dependencies,
             default=[start_task])
 
-        if isinstance(api_task, api.task.OperationTask):
+        if isinstance(api_task, api.task._OperationTask):
             # Add the task an the dependencies
             operation_task = core_task.OperationTask(api_task)
             _add_task_and_dependencies(execution_graph, operation_task, 
operation_dependencies)
@@ -86,7 +86,7 @@ def _get_tasks_from_dependencies(execution_graph, 
dependencies, default=()):
     Returns task list from dependencies.
     """
     return [execution_graph.node[dependency.id
-                                 if isinstance(dependency, 
(api.task.OperationTask,
+                                 if isinstance(dependency, 
(api.task._OperationTask,
                                                             api.task.StubTask))
                                  else _end_graph_suffix(dependency.id)]['task']
             for dependency in dependencies] or default

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3a255781/tests/context/__init__.py
----------------------------------------------------------------------
diff --git a/tests/context/__init__.py b/tests/context/__init__.py
index bb0fa61..99cda92 100644
--- a/tests/context/__init__.py
+++ b/tests/context/__init__.py
@@ -27,6 +27,10 @@ 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/3a255781/tests/context/test_operation.py
----------------------------------------------------------------------
diff --git a/tests/context/test_operation.py b/tests/context/test_operation.py
index 1d3430b..40283fc 100644
--- a/tests/context/test_operation.py
+++ b/tests/context/test_operation.py
@@ -28,13 +28,14 @@ from aria.workflows.executor import thread
 from .. import mock
 from . import (
     op_path,
+    op_name,
     execute,
     global_test_holder,
 )
 
 
 @pytest.fixture
-def workflow_context():
+def ctx():
     return mock.context.simple()
 
 
@@ -47,34 +48,34 @@ def executor():
         result.close()
 
 
-def test_node_operation_task_execution(workflow_context, executor):
-    node = mock.models.get_dependency_node()
-    node_instance = mock.models.get_dependency_node_instance(node)
-    workflow_context.model.node.store(node)
-    workflow_context.model.node_instance.store(node_instance)
+def test_node_operation_task_execution(ctx, executor):
+    operation_name = 'aria.interfaces.lifecycle.create'
 
-    node_instance = \
-        
workflow_context.model.node_instance.get(mock.models.DEPENDENCY_NODE_INSTANCE_ID)
-    name = 'op_name'
-    operation_details = {
+    node = mock.models.get_dependency_node()
+    node.operations[operation_name] = {
         'operation': op_path(my_operation, 
module_path=sys.modules[__name__].__name__)
+
     }
+    node_instance = mock.models.get_dependency_node_instance(node)
+    ctx.model.node.store(node)
+    ctx.model.node_instance.store(node_instance)
+
+    node_instance = 
ctx.model.node_instance.get(mock.models.DEPENDENCY_NODE_INSTANCE_ID)
     inputs = {'putput': True}
 
     @workflow
     def basic_workflow(graph, **_):
         graph.add_tasks(
-            api.task.OperationTask(
-                name=name,
-                operation_details=operation_details,
+            api.task.NodeOperationTask(
+                name=operation_name,
                 actor=node_instance,
                 inputs=inputs
             )
         )
 
-    execute(workflow_func=basic_workflow, workflow_context=workflow_context, 
executor=executor)
+    execute(workflow_func=basic_workflow, workflow_context=ctx, 
executor=executor)
 
-    operation_value = global_test_holder[name]
+    operation_value = global_test_holder[op_name(node_instance, 
operation_name)]
 
     assert isinstance(operation_value, context.operation.NodeOperationContext)
 
@@ -84,8 +85,8 @@ def test_node_operation_task_execution(workflow_context, 
executor):
 
     # Task bases assertions
     assert operation_value.task.actor == node_instance
-    assert operation_value.task.name == name
-    assert operation_value.task.operation_details == operation_details
+    assert operation_value.task.name == op_name(node_instance, operation_name)
+    assert operation_value.task.operation_details == 
node.operations[operation_name]
     assert operation_value.task.inputs == inputs
 
     # Context based attributes (sugaring)
@@ -93,10 +94,15 @@ def test_node_operation_task_execution(workflow_context, 
executor):
     assert operation_value.node_instance == node_instance
 
 
-def test_relationship_operation_task_execution(workflow_context, executor):
+def test_relationship_operation_task_execution(ctx, executor):
+    operation_name = 'aria.interfaces.relationship_lifecycle.postconfigure'
+
     dependency_node = mock.models.get_dependency_node()
     dependency_node_instance = mock.models.get_dependency_node_instance()
     relationship = mock.models.get_relationship(target=dependency_node)
+    relationship.source_operations[operation_name] = {
+        'operation': op_path(my_operation, 
module_path=sys.modules[__name__].__name__)
+    }
     relationship_instance = mock.models.get_relationship_instance(
         target_instance=dependency_node_instance,
         relationship=relationship)
@@ -104,33 +110,29 @@ def 
test_relationship_operation_task_execution(workflow_context, executor):
     dependent_node_instance = mock.models.get_dependent_node_instance(
         relationship_instance=relationship_instance,
         dependent_node=dependency_node)
-    workflow_context.model.node.store(dependency_node)
-    workflow_context.model.node_instance.store(dependency_node_instance)
-    workflow_context.model.relationship.store(relationship)
-    workflow_context.model.relationship_instance.store(relationship_instance)
-    workflow_context.model.node.store(dependent_node)
-    workflow_context.model.node_instance.store(dependent_node_instance)
-
-    name = 'op_name'
-    operation_details = {
-        'operation': op_path(my_operation, 
module_path=sys.modules[__name__].__name__)
-    }
+    ctx.model.node.store(dependency_node)
+    ctx.model.node_instance.store(dependency_node_instance)
+    ctx.model.relationship.store(relationship)
+    ctx.model.relationship_instance.store(relationship_instance)
+    ctx.model.node.store(dependent_node)
+    ctx.model.node_instance.store(dependent_node_instance)
+
     inputs = {'putput': True}
 
     @workflow
     def basic_workflow(graph, **_):
         graph.add_tasks(
-            api.task.OperationTask(
-                name=name,
-                operation_details=operation_details,
+            api.task.RelationshipOperationTask(
                 actor=relationship_instance,
+                name=operation_name,
+                target=False,
                 inputs=inputs
             )
         )
 
-    execute(workflow_func=basic_workflow, workflow_context=workflow_context, 
executor=executor)
+    execute(workflow_func=basic_workflow, workflow_context=ctx, 
executor=executor)
 
-    operation_value = global_test_holder[name]
+    operation_value = global_test_holder[op_name(relationship_instance, 
operation_name)]
 
     assert isinstance(operation_value, 
context.operation.RelationshipOperationContext)
 
@@ -140,8 +142,8 @@ def 
test_relationship_operation_task_execution(workflow_context, executor):
 
     # Task bases assertions
     assert operation_value.task.actor == relationship_instance
-    assert operation_value.task.name == name
-    assert operation_value.task.operation_details == operation_details
+    assert operation_value.task.name == op_name(relationship_instance, 
operation_name)
+    assert operation_value.task.operation_details == 
relationship.source_operations[operation_name]
     assert operation_value.task.inputs == inputs
 
     # Context based attributes (sugaring)

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3a255781/tests/context/test_toolbelt.py
----------------------------------------------------------------------
diff --git a/tests/context/test_toolbelt.py b/tests/context/test_toolbelt.py
index c71eb65..0208738 100644
--- a/tests/context/test_toolbelt.py
+++ b/tests/context/test_toolbelt.py
@@ -25,6 +25,7 @@ from aria.context.toolbelt import _RelationshipToolBelt, 
_NodeToolBelt
 from .. import mock
 from . import (
     op_path,
+    op_name,
     execute,
     global_test_holder,
 )
@@ -45,9 +46,14 @@ def executor():
 
 
 def test_operation_tool_belt(workflow_context, executor):
-
+    operation_name = 'aria.interfaces.lifecycle.create'
     dependency_node = mock.models.get_dependency_node()
-    dependency_node_instance = mock.models.get_dependency_node_instance()
+    dependency_node.operations[operation_name] = {
+        'operation': op_path(node_operation, 
module_path=sys.modules[__name__].__name__)
+
+    }
+    dependency_node_instance = mock.models.get_dependency_node_instance(
+        dependency_node=dependency_node)
     relationship = mock.models.get_relationship(target=dependency_node)
     relationship_instance = mock.models.get_relationship_instance(
         target_instance=dependency_node_instance, relationship=relationship)
@@ -61,34 +67,36 @@ def test_operation_tool_belt(workflow_context, executor):
     workflow_context.model.node.store(dependent_node)
     workflow_context.model.node_instance.store(dependent_node_instance)
 
-    name = 'op_name'
-    operation_details = {'operation': op_path(node_operation,
-                                              
module_path=sys.modules[__name__].__name__)}
     inputs = {'putput': True}
 
     @workflow
     def basic_workflow(graph, **_):
         graph.add_tasks(
-            api.task.OperationTask(
-                name=name,
-                operation_details=operation_details,
+            api.task.NodeOperationTask(
                 actor=dependency_node_instance,
+                name=operation_name,
                 inputs=inputs
             )
         )
 
     execute(workflow_func=basic_workflow, workflow_context=workflow_context, 
executor=executor)
 
-    assert isinstance(global_test_holder.get(name), _NodeToolBelt)
+    assert isinstance(global_test_holder.get(op_name(dependency_node_instance, 
operation_name)),
+                      _NodeToolBelt)
     assert list(global_test_holder.get('relationships_to_me', [])) == 
list([relationship_instance])
     assert global_test_holder.get('ip') == 
dependency_node_instance.runtime_properties.get('ip')
 
 
 def test_relationship_tool_belt(workflow_context, executor):
+    operation_name = 'aria.interfaces.relationship_lifecycle.postconfigure'
+
     dependency_node = mock.models.get_dependency_node()
     dependency_node_instance = \
         
mock.models.get_dependency_node_instance(dependency_node=dependency_node)
     relationship = mock.models.get_relationship(target=dependency_node)
+    relationship.source_operations[operation_name] = {
+        'operation': op_path(relationship_operation, 
module_path=sys.modules[__name__].__name__)
+    }
     relationship_instance = \
         
mock.models.get_relationship_instance(target_instance=dependency_node_instance,
                                               relationship=relationship)
@@ -103,25 +111,23 @@ def test_relationship_tool_belt(workflow_context, 
executor):
     workflow_context.model.node.store(dependent_node)
     workflow_context.model.node_instance.store(dependent_node_instance)
 
-    name = 'op_name'
-    operation_details = {'operation': op_path(relationship_operation,
-                                              
module_path=sys.modules[__name__].__name__)}
     inputs = {'putput': True}
 
     @workflow
     def basic_workflow(graph, **_):
         graph.add_tasks(
-            api.task.OperationTask(
-                name=name,
-                operation_details=operation_details,
+            api.task.RelationshipOperationTask(
                 actor=relationship_instance,
+                name=operation_name,
+                target=False,
                 inputs=inputs
             )
         )
 
     execute(workflow_func=basic_workflow, workflow_context=workflow_context, 
executor=executor)
 
-    assert isinstance(global_test_holder.get(name), _RelationshipToolBelt)
+    assert isinstance(global_test_holder.get(op_name(relationship_instance, 
operation_name)),
+                      _RelationshipToolBelt)
 
 
 def test_wrong_model_toolbelt():

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3a255781/tests/workflows/api/test_task.py
----------------------------------------------------------------------
diff --git a/tests/workflows/api/test_task.py b/tests/workflows/api/test_task.py
index f198b30..9a910f9 100644
--- a/tests/workflows/api/test_task.py
+++ b/tests/workflows/api/test_task.py
@@ -60,35 +60,63 @@ def ctx():
 
 class TestOperationTask(object):
 
-    def test_operation_task_creation(self):
+    def test_node_operation_task_creation(self):
         workflow_context = mock.context.simple()
 
-        name = 'task_name'
+        operation_name = 'aria.interfaces.lifecycle.create'
         op_details = {'operation_details': True}
-        node_instance = mock.models.get_dependency_node_instance()
+        node = mock.models.get_dependency_node()
+        node.operations[operation_name] = op_details
+        node_instance = 
mock.models.get_dependency_node_instance(dependency_node=node)
         inputs = {'inputs': True}
         max_attempts = 10
         retry_interval = 10
 
         with context.workflow.current.push(workflow_context):
-            api_task = api.task.OperationTask(name=name,
-                                              operation_details=op_details,
-                                              actor=node_instance,
-                                              inputs=inputs,
-                                              max_attempts=max_attempts,
-                                              retry_interval=retry_interval)
-
-        assert api_task.name == name
+            api_task = api.task.NodeOperationTask(name=operation_name,
+                                                  actor=node_instance,
+                                                  inputs=inputs,
+                                                  max_attempts=max_attempts,
+                                                  
retry_interval=retry_interval)
+
+        assert api_task.name == '{0}.{1}'.format(operation_name, 
node_instance.id)
         assert api_task.operation_details == op_details
         assert api_task.actor == node_instance
         assert api_task.inputs == inputs
         assert api_task.retry_interval == retry_interval
         assert api_task.max_attempts == max_attempts
 
+    def test_relationship_operation_task_creation(self):
+        workflow_context = mock.context.simple()
+
+        operation_name = 'aria.interfaces.relationship_lifecycle.preconfigure'
+        op_details = {'operation_details': True}
+        relationship = mock.models.get_relationship()
+        relationship.source_operations[operation_name] = op_details
+        relationship_instance = 
mock.models.get_relationship_instance(relationship=relationship)
+        inputs = {'inputs': True}
+        max_attempts = 10
+        retry_interval = 10
+
+        with context.workflow.current.push(workflow_context):
+            api_task = api.task.RelationshipOperationTask(name=operation_name,
+                                                          
actor=relationship_instance,
+                                                          target=False,
+                                                          inputs=inputs,
+                                                          
max_attempts=max_attempts,
+                                                          
retry_interval=retry_interval)
+
+        assert api_task.name == '{0}.{1}'.format(operation_name, 
relationship_instance.id)
+        assert api_task.operation_details == op_details
+        assert api_task.actor == relationship_instance
+        assert api_task.inputs == inputs
+        assert api_task.retry_interval == retry_interval
+        assert api_task.max_attempts == max_attempts
+
     def test_operation_task_default_values(self):
         workflow_context = mock.context.simple()
         with context.workflow.current.push(workflow_context):
-            model_task = api.task.OperationTask(
+            model_task = api.task._OperationTask(
                 name='stub',
                 operation_details={},
                 actor=mock.models.get_dependency_node_instance())

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3a255781/tests/workflows/builtin/test_execute_operation.py
----------------------------------------------------------------------
diff --git a/tests/workflows/builtin/test_execute_operation.py 
b/tests/workflows/builtin/test_execute_operation.py
index 9409686..0bd59ed 100644
--- a/tests/workflows/builtin/test_execute_operation.py
+++ b/tests/workflows/builtin/test_execute_operation.py
@@ -46,6 +46,6 @@ def test_execute_operation(ctx):
     )
 
     assert len(execute_tasks) == 1
-    assert execute_tasks[0].name == '{0}.{1}'.format(node_instance_id, 
operation_name)
+    assert execute_tasks[0].name == '{0}.{1}'.format(operation_name, 
node_instance_id)
 
 # TODO: add more scenarios

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3a255781/tests/workflows/core/test_engine.py
----------------------------------------------------------------------
diff --git a/tests/workflows/core/test_engine.py 
b/tests/workflows/core/test_engine.py
index d878ad3..0474d8d 100644
--- a/tests/workflows/core/test_engine.py
+++ b/tests/workflows/core/test_engine.py
@@ -61,7 +61,7 @@ class BaseTest(object):
 
     @staticmethod
     def _op(func, ctx, inputs=None, max_attempts=None, retry_interval=None):
-        return api.task.OperationTask(
+        return api.task._OperationTask(
             name='task',
             operation_details={'operation': 
'tests.workflows.core.test_engine.{name}'.format(
                 name=func.__name__)},
@@ -113,9 +113,7 @@ class BaseTest(object):
 
     @pytest.fixture(scope='function')
     def executor(self):
-        from aria.workflows.executor.blocking import 
CurrentThreadBlockingExecutor
-        result = CurrentThreadBlockingExecutor()
-        # result = thread.ThreadExecutor()
+        result = thread.ThreadExecutor()
         try:
             yield result
         finally:

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3a255781/tests/workflows/core/test_task.py
----------------------------------------------------------------------
diff --git a/tests/workflows/core/test_task.py 
b/tests/workflows/core/test_task.py
index e268e44..13ff915 100644
--- a/tests/workflows/core/test_task.py
+++ b/tests/workflows/core/test_task.py
@@ -52,7 +52,7 @@ class TestOperationTask(object):
 
     def _create_operation_task(self, ctx, node_instance):
         with workflow_context.current.push(ctx):
-            api_task = api.task.OperationTask(
+            api_task = api.task._OperationTask(
                 name='ripe',
                 operation_details={'operations': 
'aria.tests.workflows.core.test_task.foo'},
                 actor=node_instance,

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3a255781/tests/workflows/core/test_task_graph_into_exececution_graph.py
----------------------------------------------------------------------
diff --git a/tests/workflows/core/test_task_graph_into_exececution_graph.py 
b/tests/workflows/core/test_task_graph_into_exececution_graph.py
index fda36cd..2384788 100644
--- a/tests/workflows/core/test_task_graph_into_exececution_graph.py
+++ b/tests/workflows/core/test_task_graph_into_exececution_graph.py
@@ -22,6 +22,7 @@ from ... import mock
 
 
 def test_task_graph_into_execution_graph():
+    operation_name = 'aria.interfaces.lifecycle.create'
     task_context = mock.context.simple()
     node = mock.models.get_dependency_node()
     node_instance = mock.models.get_dependency_node_instance()
@@ -37,11 +38,11 @@ def test_task_graph_into_execution_graph():
 
     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('test_simple_before_task', 
{}, node_instance)
-        simple_after_task = api.task.OperationTask('test_simple_after_task', 
{}, node_instance)
+        simple_before_task = api.task.NodeOperationTask(node_instance, 
operation_name)
+        simple_after_task = api.task.NodeOperationTask(node_instance, 
operation_name)
 
         inner_task_graph = api.task.WorkflowTask(sub_workflow, 
name='test_inner_task_graph')
-        inner_task = api.task.OperationTask('test_inner_task', {}, 
node_instance)
+        inner_task = api.task.NodeOperationTask(node_instance, operation_name)
         inner_task_graph.add_tasks(inner_task)
 
     test_task_graph.add_tasks(simple_before_task)

Reply via email to