You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ariatosca.apache.org by mx...@apache.org on 2017/03/14 14:58:05 UTC

incubator-ariatosca git commit: fixed builtin tests and testing for several relationships are now in place

Repository: incubator-ariatosca
Updated Branches:
  refs/heads/ARIA-120-Builtin-workflows-relationship-operations-execution-order 6ff078adc -> dec48d7fc


fixed builtin tests and testing for several relationships are now in place


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

Branch: refs/heads/ARIA-120-Builtin-workflows-relationship-operations-execution-order
Commit: dec48d7fc488b246c5ae7098663063b53fcc833c
Parents: 6ff078a
Author: max-orlov <ma...@gigaspaces.com>
Authored: Tue Mar 14 16:57:45 2017 +0200
Committer: max-orlov <ma...@gigaspaces.com>
Committed: Tue Mar 14 16:57:45 2017 +0200

----------------------------------------------------------------------
 aria/orchestrator/workflows/api/task.py         |  3 +
 aria/orchestrator/workflows/builtin/utils.py    | 15 ++-
 .../orchestrator/workflows/builtin/workflows.py |  9 +-
 tests/mock/context.py                           |  5 +-
 tests/mock/models.py                            | 97 ++++++++++++++++----
 tests/mock/topology.py                          | 45 +++++++--
 .../orchestrator/workflows/builtin/__init__.py  | 54 ++++++++---
 .../orchestrator/workflows/builtin/test_heal.py |  4 +-
 .../workflows/builtin/test_install.py           | 15 +--
 .../workflows/builtin/test_uninstall.py         | 15 +--
 tests/storage/test_models.py                    | 16 ++--
 11 files changed, 213 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dec48d7f/aria/orchestrator/workflows/api/task.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/api/task.py b/aria/orchestrator/workflows/api/task.py
index 6a00844..c18ccd9 100644
--- a/aria/orchestrator/workflows/api/task.py
+++ b/aria/orchestrator/workflows/api/task.py
@@ -92,6 +92,9 @@ class OperationTask(BaseTask):
                                if ignore_failure is None else ignore_failure)
         self.runs_on = runs_on
 
+    def __repr__(self):
+        return self.name
+
     @classmethod
     def _merge_inputs(cls, operation_inputs, additional_inputs=None):
         final_inputs = dict((p.name, p.as_raw['value']) for p in operation_inputs)

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dec48d7f/aria/orchestrator/workflows/builtin/utils.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/builtin/utils.py b/aria/orchestrator/workflows/builtin/utils.py
index 78f2d37..0c3304e 100644
--- a/aria/orchestrator/workflows/builtin/utils.py
+++ b/aria/orchestrator/workflows/builtin/utils.py
@@ -62,13 +62,17 @@ def relationship_tasks(relationship, source_operation_name=None, target_operatio
     :return:
     """
     operations = []
-    if source_operation_name and _has_operation(relationship.interfaces, source_operation_name):
+    if source_operation_name and _has_operation(relationship.interfaces,
+                                                source_operation_name,
+                                                edge=OperationTask.SOURCE_OPERATION):
         operations.append(
             OperationTask.relationship(instance=relationship,
                                        name=source_operation_name,
                                        edge=OperationTask.SOURCE_OPERATION)
         )
-    if target_operation_name and _has_operation(relationship.interfaces, target_operation_name):
+    if target_operation_name and _has_operation(relationship.interfaces,
+                                                target_operation_name,
+                                                edge=OperationTask.TARGET_OPERATION):
         operations.append(
             OperationTask.relationship(instance=relationship,
                                        name=target_operation_name,
@@ -103,8 +107,11 @@ def create_node_task_dependencies(graph, tasks_and_nodes, reverse=False):
                 graph.add_dependency(task, dependencies)
 
 
-def _has_operation(interfaces, operation_name):
-    for interface in interfaces:
+def _has_operation(interfaces, operation_name, edge=None):
+    interfaces_filters = {}
+    if edge:
+        interfaces_filters['edge'] = edge
+    for interface in interfaces.filter_by(**interfaces_filters):
         if interface.operations.filter_by(name=operation_name).count() == 1:
             return True
     return False

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dec48d7f/aria/orchestrator/workflows/builtin/workflows.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/builtin/workflows.py b/aria/orchestrator/workflows/builtin/workflows.py
index cc99a1a..037442c 100644
--- a/aria/orchestrator/workflows/builtin/workflows.py
+++ b/aria/orchestrator/workflows/builtin/workflows.py
@@ -37,6 +37,7 @@ NORMATIVE_POST_CONFIGURE_TARGET = NORMATIVE_CONFIGURE_INTERFACE + '.post_configu
 
 NORMATIVE_ADD_SOURCE = NORMATIVE_CONFIGURE_INTERFACE + '.add_source'
 NORMATIVE_ADD_TARGET = NORMATIVE_CONFIGURE_INTERFACE + '.add_target'
+NORMATIVE_REMOVE_SOURCE = NORMATIVE_CONFIGURE_INTERFACE + '.remove_source'
 NORMATIVE_REMOVE_TARGET = NORMATIVE_CONFIGURE_INTERFACE + '.remove_target'
 NORMATIVE_TARGET_CHANGED = NORMATIVE_CONFIGURE_INTERFACE + '.target_changed'
 
@@ -55,6 +56,7 @@ __all__ = (
     'NORMATIVE_POST_CONFIGURE_TARGET',
     'NORMATIVE_ADD_SOURCE',
     'NORMATIVE_ADD_TARGET',
+    'NORMATIVE_REMOVE_SOURCE',
     'NORMATIVE_REMOVE_TARGET',
     'NORMATIVE_TARGET_CHANGED',
     'install_node',
@@ -112,7 +114,8 @@ def _create_start_tasks(node):
 
 
 def _create_stop_tasks(node):
-    sequence = create_relationships_tasks(node, target_operation_name=NORMATIVE_REMOVE_TARGET)
-    sequence += create_relationships_tasks(node, target_operation_name=NORMATIVE_TARGET_CHANGED)
-    sequence.append(create_node_task(node, NORMATIVE_STOP))
+    sequence = [create_node_task(node, NORMATIVE_STOP)]
+    sequence += create_relationships_tasks(node,
+                                           source_operation_name=NORMATIVE_REMOVE_SOURCE,
+                                           target_operation_name=NORMATIVE_REMOVE_TARGET)
     return sequence

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dec48d7f/tests/mock/context.py
----------------------------------------------------------------------
diff --git a/tests/mock/context.py b/tests/mock/context.py
index cf1a32d..acc073d 100644
--- a/tests/mock/context.py
+++ b/tests/mock/context.py
@@ -27,9 +27,10 @@ from ..storage import init_inmemory_model_storage
 from .topology import create_simple_topology_two_nodes
 
 
-def simple(tmpdir, inmemory=False, context_kwargs=None):
+def simple(tmpdir, inmemory=False, context_kwargs=None, topology=None):
     initiator = init_inmemory_model_storage if inmemory else None
     initiator_kwargs = {} if inmemory else dict(base_dir=tmpdir)
+    topology = topology or create_simple_topology_two_nodes
 
     model_storage = aria.application_model_storage(
         sql_mapi.SQLAlchemyModelAPI, initiator=initiator, initiator_kwargs=initiator_kwargs)
@@ -38,7 +39,7 @@ def simple(tmpdir, inmemory=False, context_kwargs=None):
         api_kwargs=dict(directory=os.path.join(tmpdir, 'resources'))
     )
 
-    service_instance_id = create_simple_topology_two_nodes(model_storage)
+    service_instance_id = topology(model_storage)
 
     final_kwargs = dict(
         name='simple_context',

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dec48d7f/tests/mock/models.py
----------------------------------------------------------------------
diff --git a/tests/mock/models.py b/tests/mock/models.py
index 301fc01..908c1d3 100644
--- a/tests/mock/models.py
+++ b/tests/mock/models.py
@@ -16,7 +16,26 @@
 from datetime import datetime
 
 from aria.storage.modeling import model
-from . import operations
+from aria.orchestrator import decorators
+from aria.orchestrator.workflows.builtin.workflows import (
+    NORMATIVE_STANDARD_INTERFACE,
+    NORMATIVE_CREATE,
+    NORMATIVE_START,
+    NORMATIVE_STOP,
+    NORMATIVE_DELETE,
+    NORMATIVE_CONFIGURE,
+
+    NORMATIVE_CONFIGURE_INTERFACE,
+    NORMATIVE_PRE_CONFIGURE_SOURCE,
+    NORMATIVE_PRE_CONFIGURE_TARGET,
+    NORMATIVE_POST_CONFIGURE_SOURCE,
+    NORMATIVE_POST_CONFIGURE_TARGET,
+
+    NORMATIVE_ADD_SOURCE,
+    NORMATIVE_ADD_TARGET,
+    NORMATIVE_REMOVE_TARGET,
+    NORMATIVE_REMOVE_SOURCE
+)
 
 DEPLOYMENT_NAME = 'test_deployment_id'
 BLUEPRINT_NAME = 'test_blueprint_id'
@@ -33,9 +52,9 @@ RELATIONSHIP_NAME = 'relationship'
 RELATIONSHIP_INSTANCE_NAME = 'relationship_instance'
 
 
-def get_dependency_node(deployment):
+def get_dependency_node(name, deployment):
     return model.NodeTemplate(
-        name=DEPENDENCY_NODE_NAME,
+        name=name,
         type_name='test_node_type',
         type_hierarchy=[],
         default_instances=1,
@@ -45,16 +64,19 @@ def get_dependency_node(deployment):
     )
 
 
-def get_dependency_node_instance(dependency_node, deployment):
-    return model.Node(
-        name=DEPENDENCY_NODE_INSTANCE_NAME,
+def get_dependency_node_instance(name, dependency_node, deployment):
+    node = model.Node(
+        name=name,
         service_instance=deployment,
         runtime_properties={'ip': '1.1.1.1'},
         node_template=dependency_node,
         state='',
-        scaling_groups=[]
+        scaling_groups=[],
+        interfaces=get_standard_interfaces(),
     )
 
+    return node
+
 
 def get_relationship(target):
     requirement_template = model.RequirementTemplate(target_node_template_name=target.name)
@@ -67,17 +89,14 @@ def get_relationship_instance(source_instance, target_instance):
     return model.Relationship(
         target_node=target_instance,
         source_node=source_instance,
+        interfaces=get_configure_interfaces()
     )
 
 
-def get_dependent_node(deployment, requirement_template, capability_template):
-    operation_templates = [model.OperationTemplate(implementation=op,
-                                                   service_template=deployment.service_template)
-                           for op in operations.NODE_OPERATIONS]
-    interface_template = model.InterfaceTemplate(operation_templates=operation_templates)
-
+def get_dependent_node(name, deployment, requirement_template, capability_template):
+    interface_template = get_interface_template('op_name')
     return model.NodeTemplate(
-        name=DEPENDENT_NODE_NAME,
+        name=name,
         type_name='test_node_type',
         type_hierarchy=[],
         default_instances=1,
@@ -90,14 +109,15 @@ def get_dependent_node(deployment, requirement_template, capability_template):
     )
 
 
-def get_dependent_node_instance(dependent_node, deployment):
+def get_dependent_node_instance(name, dependent_node, deployment):
     return model.Node(
-        name=DEPENDENT_NODE_INSTANCE_NAME,
+        name=name,
         service_instance=deployment,
         runtime_properties={},
         node_template=dependent_node,
         state='',
         scaling_groups=[],
+        interfaces=get_standard_interfaces()
     )
 
 
@@ -178,3 +198,48 @@ def get_interface(operation_name,
                            name=interface_name,
                            edge=edge,
                            **(interface_kwargs or {}))
+
+
+def get_standard_interfaces():
+    ops = [
+        model.Operation(name=op_name,
+                        implementation='{0}.{1}'.format(__file__, mock_operation.__name__))
+        for op_name in [NORMATIVE_CREATE, NORMATIVE_CONFIGURE, NORMATIVE_START,
+                        NORMATIVE_STOP, NORMATIVE_DELETE]
+        ]
+    return [model.Interface(name=NORMATIVE_STANDARD_INTERFACE, operations=ops)]
+
+
+def get_configure_interfaces():
+    source_operations = [
+        model.Operation(name=op_name,
+                        implementation='{0}.{1}'.format(__file__, mock_operation.__name__))
+        for op_name in [NORMATIVE_PRE_CONFIGURE_SOURCE,
+                        NORMATIVE_POST_CONFIGURE_SOURCE,
+                        NORMATIVE_ADD_SOURCE,
+                        NORMATIVE_REMOVE_SOURCE]
+        ]
+    source_interface = model.Interface(
+        name=NORMATIVE_CONFIGURE_INTERFACE,
+        operations=source_operations,
+        edge='source'
+    )
+    target_operations = [
+        model.Operation(name=op_name,
+                        implementation='{0}.{1}'.format(__file__, mock_operation.__name__))
+        for op_name in [NORMATIVE_PRE_CONFIGURE_TARGET,
+                        NORMATIVE_POST_CONFIGURE_TARGET,
+                        NORMATIVE_ADD_TARGET,
+                        NORMATIVE_REMOVE_TARGET]
+        ]
+    target_interface = model.Interface(
+        name=NORMATIVE_CONFIGURE_INTERFACE,
+        operations=target_operations,
+        edge='target'
+    )
+    return source_interface, target_interface
+
+
+@decorators.operation
+def mock_operation(*args, **kwargs):
+    pass

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dec48d7f/tests/mock/topology.py
----------------------------------------------------------------------
diff --git a/tests/mock/topology.py b/tests/mock/topology.py
index d3e8b7b..4ae243b 100644
--- a/tests/mock/topology.py
+++ b/tests/mock/topology.py
@@ -25,7 +25,8 @@ def create_simple_topology_single_node(model_storage, create_operation):
     service_instance = models.get_deployment(service_template)
     model_storage.service_instance.put(service_instance)
 
-    node_template = models.get_dependency_node(service_instance)
+    node_template = models.get_dependency_node(
+        models.DEPENDENCY_NODE_NAME, service_instance)
     node_template.interface_templates = [models.get_interface_template(
         'tosca.interfaces.node.lifecycle.Standard.create',
         operation_kwargs=dict(
@@ -36,7 +37,8 @@ def create_simple_topology_single_node(model_storage, create_operation):
     )]
     model_storage.node_template.put(node_template)
 
-    node = models.get_dependency_node_instance(node_template, service_instance)
+    node = models.get_dependency_node_instance(
+        models.DEPENDENCY_NODE_INSTANCE_NAME, node_template, service_instance)
     node.interfaces = [models.get_interface(
         'tosca.interfaces.node.lifecycle.Standard.create',
         operation_kwargs=dict(
@@ -56,12 +58,12 @@ def create_simple_topology_two_nodes(model_storage):
     #################################################################################
     # Creating a simple deployment with node -> node as a graph
 
-    dependency_node = models.get_dependency_node(deployment)
+    dependency_node = models.get_dependency_node(models.DEPENDENCY_NODE_NAME, deployment)
     model_storage.node_template.put(dependency_node)
     storage_dependency_node = model_storage.node_template.get(dependency_node.id)
 
-    dependency_node_instance = models.get_dependency_node_instance(storage_dependency_node,
-                                                                   deployment)
+    dependency_node_instance = models.get_dependency_node_instance(
+        models.DEPENDENCY_NODE_INSTANCE_NAME, storage_dependency_node, deployment)
     model_storage.node.put(dependency_node_instance)
     storage_dependency_node_instance = model_storage.node.get(dependency_node_instance.id)
 
@@ -69,11 +71,13 @@ def create_simple_topology_two_nodes(model_storage):
     model_storage.requirement_template.put(req_template)
     model_storage.capability_template.put(cap_template)
 
-    dependent_node = models.get_dependent_node(deployment, req_template, cap_template)
+    dependent_node = models.get_dependent_node(
+        models.DEPENDENT_NODE_NAME, deployment, req_template, cap_template)
     model_storage.node_template.put(dependent_node)
     storage_dependent_node = model_storage.node_template.get(dependent_node.id)
 
-    dependent_node_instance = models.get_dependent_node_instance(storage_dependent_node, deployment)
+    dependent_node_instance = models.get_dependent_node_instance(
+        models.DEPENDENT_NODE_INSTANCE_NAME, storage_dependent_node, deployment)
     model_storage.node.put(dependent_node_instance)
     storage_dependent_node_instance = model_storage.node.get(dependent_node_instance.id)
 
@@ -84,3 +88,30 @@ def create_simple_topology_two_nodes(model_storage):
     model_storage.relationship.put(relationship_instance)
 
     return deployment.id
+
+
+def create_simple_topology_three_nodes(model_storage):
+    #################################################################################
+    # Creating a simple deployment with the following topology:
+    #               node1    ---->|
+    #                             | -> node0
+    #               node2    ---->|
+    # meaning node0 has two relationships to node1 and node 2 (one each).
+
+    service_instance_id = create_simple_topology_two_nodes(model_storage)
+    service_instance = model_storage.service_instance.get(service_instance_id)
+    third_node_template = models.get_dependency_node('another_dependency_node_template',
+                                                     service_instance)
+    model_storage.node_template.put(third_node_template)
+    third_node = models.get_dependency_node_instance('another_dependency_node',
+                                                     third_node_template,
+                                                     service_instance)
+    model_storage.node.put(third_node)
+
+    new_relationship = models.get_relationship_instance(
+        source_instance=model_storage.node.get_by_name(models.DEPENDENT_NODE_INSTANCE_NAME),
+        target_instance=third_node,
+    )
+    model_storage.relationship.put(new_relationship)
+
+    return service_instance_id

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dec48d7f/tests/orchestrator/workflows/builtin/__init__.py
----------------------------------------------------------------------
diff --git a/tests/orchestrator/workflows/builtin/__init__.py b/tests/orchestrator/workflows/builtin/__init__.py
index 9f60e55..b53040c 100644
--- a/tests/orchestrator/workflows/builtin/__init__.py
+++ b/tests/orchestrator/workflows/builtin/__init__.py
@@ -13,18 +13,50 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from tests import mock
+from aria.orchestrator.workflows.builtin import workflows
 
 
-def assert_node_install_operations(operations, with_relationships=False):
-    all_operations = mock.operations.OPERATIONS_INSTALL if with_relationships else \
-                     mock.operations.NODE_OPERATIONS_INSTALL
-    for i, operation in enumerate(operations):
-        assert operation.name.startswith(all_operations[i] + '.')
+def _assert_relationships(operations, expected_op_full_name, relationships=0):
+    """
 
+    :param operations: and iterable of operations
+    :param expected_op_full_name: Note that source/target doesn't really matter since they are
+    dropped
+    :param relationships: the number of relationships
+    :return:
+    """
+    expected_op_name = expected_op_full_name.rsplit('_', 1)[0]
+    for _ in xrange(relationships):
+        # Since the target and source operations start of the same way, we only need to retrieve the
+        # suffix once
+        operation = next(operations)
+        op_name, index1 = operation.name.rsplit('.', 1)
+        op_name, edge1 = op_name.rsplit('_', 1)
+        assert op_name == expected_op_name
 
-def assert_node_uninstall_operations(operations, with_relationships=False):
-    all_operations = mock.operations.OPERATIONS_UNINSTALL if with_relationships else \
-                     mock.operations.NODE_OPERATIONS_UNINSTALL
-    for i, operation in enumerate(operations):
-        assert operation.name.startswith(all_operations[i] + '.')
+        operation = next(operations)
+        op_name, index2 = operation.name.rsplit('.', 1)
+        op_name, edge2 = op_name.rsplit('_', 1)
+        assert op_name == expected_op_name
+
+        assert index1 == index2
+        assert edge1 != edge2
+
+
+def assert_node_install_operations(operations, relationships=0):
+    operations = iter(operations)
+
+    assert next(operations).name.startswith(workflows.NORMATIVE_CREATE)
+    _assert_relationships(operations, workflows.NORMATIVE_PRE_CONFIGURE_SOURCE, relationships)
+    assert next(operations).name.startswith(workflows.NORMATIVE_CONFIGURE)
+    _assert_relationships(operations, workflows.NORMATIVE_POST_CONFIGURE_SOURCE, relationships)
+    assert next(operations).name.startswith(workflows.NORMATIVE_START)
+    _assert_relationships(operations, workflows.NORMATIVE_ADD_SOURCE, relationships)
+
+
+def assert_node_uninstall_operations(operations, relationships=0):
+    operations = iter(operations)
+
+    assert next(operations).name.startswith(workflows.NORMATIVE_STOP)
+    _assert_relationships(operations, workflows.NORMATIVE_REMOVE_SOURCE, relationships)
+    assert next(operations).name.startswith(workflows.NORMATIVE_DELETE)

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dec48d7f/tests/orchestrator/workflows/builtin/test_heal.py
----------------------------------------------------------------------
diff --git a/tests/orchestrator/workflows/builtin/test_heal.py b/tests/orchestrator/workflows/builtin/test_heal.py
index b553049..1e31ed7 100644
--- a/tests/orchestrator/workflows/builtin/test_heal.py
+++ b/tests/orchestrator/workflows/builtin/test_heal.py
@@ -57,8 +57,8 @@ def test_heal_dependent_node(ctx):
         list(dependent_node_subgraph_install.topological_order(reverse=True))
     assert isinstance(dependency_node_subgraph_install, task.StubTask)
 
-    assert_node_uninstall_operations(dependent_node_uninstall_tasks, with_relationships=True)
-    assert_node_install_operations(dependent_node_install_tasks, with_relationships=True)
+    assert_node_uninstall_operations(dependent_node_uninstall_tasks, relationships=1)
+    assert_node_install_operations(dependent_node_install_tasks, relationships=1)
 
 
 @pytest.mark.skip(reason='heal is not implemented for now')

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dec48d7f/tests/orchestrator/workflows/builtin/test_install.py
----------------------------------------------------------------------
diff --git a/tests/orchestrator/workflows/builtin/test_install.py b/tests/orchestrator/workflows/builtin/test_install.py
index 1791719..1a4e1f9 100644
--- a/tests/orchestrator/workflows/builtin/test_install.py
+++ b/tests/orchestrator/workflows/builtin/test_install.py
@@ -25,7 +25,8 @@ from . import assert_node_install_operations
 
 @pytest.fixture
 def ctx(tmpdir):
-    context = mock.context.simple(str(tmpdir))
+    context = mock.context.simple(str(tmpdir),
+                                  topology=mock.topology.create_simple_topology_three_nodes)
     yield context
     storage.release_sqlite_storage(context.model)
 
@@ -34,10 +35,12 @@ def test_install(ctx):
 
     install_tasks = list(task.WorkflowTask(install, ctx=ctx).topological_order(True))
 
-    assert len(install_tasks) == 2
-    dependency_node_subgraph, dependent_node_subgraph = install_tasks
+    assert len(install_tasks) == 3
+    dependency_node_subgraph1, dependency_node_subgraph2, dependent_node_subgraph = install_tasks
     dependent_node_tasks = list(dependent_node_subgraph.topological_order(reverse=True))
-    dependency_node_tasks = list(dependency_node_subgraph.topological_order(reverse=True))
+    dependency_node1_tasks = list(dependency_node_subgraph1.topological_order(reverse=True))
+    dependency_node2_tasks = list(dependency_node_subgraph2.topological_order(reverse=True))
 
-    assert_node_install_operations(dependency_node_tasks)
-    assert_node_install_operations(dependent_node_tasks, with_relationships=True)
+    assert_node_install_operations(dependency_node1_tasks)
+    assert_node_install_operations(dependency_node2_tasks)
+    assert_node_install_operations(dependent_node_tasks, relationships=2)

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dec48d7f/tests/orchestrator/workflows/builtin/test_uninstall.py
----------------------------------------------------------------------
diff --git a/tests/orchestrator/workflows/builtin/test_uninstall.py b/tests/orchestrator/workflows/builtin/test_uninstall.py
index 791291f..aa04c38 100644
--- a/tests/orchestrator/workflows/builtin/test_uninstall.py
+++ b/tests/orchestrator/workflows/builtin/test_uninstall.py
@@ -26,7 +26,8 @@ from . import assert_node_uninstall_operations
 
 @pytest.fixture
 def ctx(tmpdir):
-    context = mock.context.simple(str(tmpdir))
+    context = mock.context.simple(str(tmpdir),
+                                  topology=mock.topology.create_simple_topology_three_nodes)
     yield context
     storage.release_sqlite_storage(context.model)
 
@@ -35,10 +36,12 @@ def test_uninstall(ctx):
 
     uninstall_tasks = list(task.WorkflowTask(uninstall, ctx=ctx).topological_order(True))
 
-    assert len(uninstall_tasks) == 2
-    dependent_node_subgraph, dependency_node_subgraph = uninstall_tasks
+    assert len(uninstall_tasks) == 3
+    dependent_node_subgraph, dependency_node_subgraph1, dependency_node_subgraph2 = uninstall_tasks
     dependent_node_tasks = list(dependent_node_subgraph.topological_order(reverse=True))
-    dependency_node_tasks = list(dependency_node_subgraph.topological_order(reverse=True))
+    dependency_node1_tasks = list(dependency_node_subgraph1.topological_order(reverse=True))
+    dependency_node2_tasks = list(dependency_node_subgraph2.topological_order(reverse=True))
 
-    assert_node_uninstall_operations(operations=dependency_node_tasks)
-    assert_node_uninstall_operations(operations=dependent_node_tasks, with_relationships=True)
+    assert_node_uninstall_operations(operations=dependency_node1_tasks)
+    assert_node_uninstall_operations(operations=dependency_node2_tasks)
+    assert_node_uninstall_operations(operations=dependent_node_tasks, relationships=2)

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/dec48d7f/tests/storage/test_models.py
----------------------------------------------------------------------
diff --git a/tests/storage/test_models.py b/tests/storage/test_models.py
index 81b4122..b544e7b 100644
--- a/tests/storage/test_models.py
+++ b/tests/storage/test_models.py
@@ -85,7 +85,8 @@ def _service_instance_update_storage():
 
 def _node_template_storage():
     storage = _service_instance_storage()
-    node_template = mock.models.get_dependency_node(storage.service_instance.list()[0])
+    node_template = mock.models.get_dependency_node(mock.models.DEPENDENCY_NODE_NAME,
+                                                    storage.service_instance.list()[0])
     storage.node_template.put(node_template)
     return storage
 
@@ -95,18 +96,17 @@ def _nodes_storage():
     service_instance = storage.service_instance.get_by_name(mock.models.DEPLOYMENT_NAME)
 
     dependency_node_template = storage.node_template.get_by_name(mock.models.DEPENDENCY_NODE_NAME)
-    dependency_node = mock.models.get_dependency_node_instance(dependency_node_template,
-                                                               service_instance)
+    dependency_node = mock.models.get_dependency_node_instance(
+        mock.models.DEPENDENCY_NODE_INSTANCE_NAME, dependency_node_template, service_instance)
 
     req_template, cap_template = mock.models.get_relationship(dependency_node)
     storage.requirement_template.put(req_template)
     storage.capability_template.put(cap_template)
 
-    dependent_node_template = mock.models.get_dependent_node(service_instance,
-                                                             req_template,
-                                                             cap_template)
-    dependent_node = mock.models.get_dependent_node_instance(dependent_node_template,
-                                                             service_instance)
+    dependent_node_template = mock.models.get_dependent_node(
+        mock.models.DEPENDENT_NODE_NAME, service_instance, req_template, cap_template)
+    dependent_node = mock.models.get_dependent_node_instance(
+        mock.models.DEPENDENT_NODE_INSTANCE_NAME, dependent_node_template, service_instance)
     storage.node.put(dependency_node)
     storage.node.put(dependent_node)
     return storage