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 15:20:07 UTC
incubator-ariatosca git commit:
ARIA-120-Builtin-workflows-relationship-operations-execution-order [Forced
Update!]
Repository: incubator-ariatosca
Updated Branches:
refs/heads/ARIA-120-Builtin-workflows-relationship-operations-execution-order dec48d7fc -> e69d3b1e4 (forced update)
ARIA-120-Builtin-workflows-relationship-operations-execution-order
Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/e69d3b1e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/e69d3b1e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/e69d3b1e
Branch: refs/heads/ARIA-120-Builtin-workflows-relationship-operations-execution-order
Commit: e69d3b1e474d85df0ab4109bec2c23557ff5b2a5
Parents: 95177d0
Author: max-orlov <ma...@gigaspaces.com>
Authored: Mon Mar 13 16:35:10 2017 +0200
Committer: max-orlov <ma...@gigaspaces.com>
Committed: Tue Mar 14 17:19:46 2017 +0200
----------------------------------------------------------------------
aria/orchestrator/workflows/api/task.py | 3 +
aria/orchestrator/workflows/builtin/utils.py | 71 +++++++++++---
.../orchestrator/workflows/builtin/workflows.py | 90 ++++--------------
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, 271 insertions(+), 144 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/e69d3b1e/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/e69d3b1e/aria/orchestrator/workflows/builtin/utils.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/builtin/utils.py b/aria/orchestrator/workflows/builtin/utils.py
index c9dbc6b..0c3304e 100644
--- a/aria/orchestrator/workflows/builtin/utils.py
+++ b/aria/orchestrator/workflows/builtin/utils.py
@@ -12,11 +12,12 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
+from itertools import groupby
from ..api.task import OperationTask
-def create_node_task(operation_name, node):
+def create_node_task(node, operation_name):
"""
Returns a new operation task if the operation exists in the node, otherwise returns None.
"""
@@ -27,21 +28,58 @@ def create_node_task(operation_name, node):
return None
-def create_relationship_tasks(operation_name, runs_on, node):
+def create_relationships_tasks(node, source_operation_name=None, target_operation_name=None):
"""
- Returns a list of operation tasks for each outbound relationship of the node if the operation
- exists there.
+ Creates a relationship task (source and target) for all of a node_instance relationships.
+ :param basestring source_operation_name: the relationship operation name.
+ :param source_operation_name:
+ :param target_operation_name:
+ :param NodeInstance node: the source_node
+ :return:
"""
+ relationships_groups = groupby(node.outbound_relationships,
+ key=lambda relationship: relationship.target_node.id)
- sequence = []
- for relationship in node.outbound_relationships:
- if _has_operation(relationship.interfaces, operation_name):
- sequence.append(
- OperationTask.relationship(instance=relationship,
- name=operation_name,
- edge='source',
- runs_on=runs_on))
- return sequence
+ sub_tasks = []
+ for _, (_, relationship_group) in enumerate(relationships_groups):
+ for relationship in relationship_group:
+ relationship_operations = relationship_tasks(
+ relationship=relationship,
+ source_operation_name=source_operation_name,
+ target_operation_name=target_operation_name)
+ sub_tasks.append(relationship_operations)
+
+ return sub_tasks
+
+
+def relationship_tasks(relationship, source_operation_name=None, target_operation_name=None):
+ """
+ Creates a relationship task source and target.
+ :param Relationship relationship: the relationship instance itself
+ :param source_operation_name:
+ :param target_operation_name:
+
+ :return:
+ """
+ operations = []
+ 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,
+ edge=OperationTask.TARGET_OPERATION):
+ operations.append(
+ OperationTask.relationship(instance=relationship,
+ name=target_operation_name,
+ edge=OperationTask.TARGET_OPERATION)
+ )
+
+ return operations
def create_node_task_dependencies(graph, tasks_and_nodes, reverse=False):
@@ -69,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/e69d3b1e/aria/orchestrator/workflows/builtin/workflows.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/builtin/workflows.py b/aria/orchestrator/workflows/builtin/workflows.py
index 180b4e9..037442c 100644
--- a/aria/orchestrator/workflows/builtin/workflows.py
+++ b/aria/orchestrator/workflows/builtin/workflows.py
@@ -17,7 +17,7 @@
A set of builtin workflows.
"""
-from .utils import (create_node_task, create_relationship_tasks)
+from .utils import (create_node_task, create_relationships_tasks)
from ... import workflow
@@ -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',
@@ -66,40 +68,17 @@ __all__ = (
@workflow(suffix_template='{node.id}')
def install_node(graph, node, **kwargs):
- sequence = []
-
# Create
- sequence.append(
- create_node_task(
- NORMATIVE_CREATE,
- node))
+ sequence = [create_node_task(node, NORMATIVE_CREATE)]
# Configure
- sequence += \
- create_relationship_tasks(
- NORMATIVE_PRE_CONFIGURE_SOURCE,
- 'source',
- node)
- sequence += \
- create_relationship_tasks(
- NORMATIVE_PRE_CONFIGURE_TARGET,
- 'target',
- node)
- sequence.append(
- create_node_task(
- NORMATIVE_CONFIGURE,
- node))
- sequence += \
- create_relationship_tasks(
- NORMATIVE_POST_CONFIGURE_SOURCE,
- 'source',
- node)
- sequence += \
- create_relationship_tasks(
- NORMATIVE_POST_CONFIGURE_TARGET,
- 'target',
- node)
-
+ sequence += create_relationships_tasks(node,
+ NORMATIVE_PRE_CONFIGURE_SOURCE,
+ NORMATIVE_PRE_CONFIGURE_TARGET)
+ sequence.append(create_node_task(node, NORMATIVE_CONFIGURE))
+ sequence += create_relationships_tasks(node,
+ NORMATIVE_POST_CONFIGURE_SOURCE,
+ NORMATIVE_POST_CONFIGURE_TARGET)
# Start
sequence += _create_start_tasks(node)
@@ -112,10 +91,7 @@ def uninstall_node(graph, node, **kwargs):
sequence = _create_stop_tasks(node)
# Delete
- sequence.append(
- create_node_task(
- NORMATIVE_DELETE,
- node))
+ sequence.append(create_node_task(node, NORMATIVE_DELETE))
graph.sequence(*sequence)
@@ -131,43 +107,15 @@ def stop_node(graph, node, **kwargs):
def _create_start_tasks(node):
- sequence = []
- sequence.append(
- create_node_task(
- NORMATIVE_START,
- node))
- sequence += \
- create_relationship_tasks(
- NORMATIVE_ADD_SOURCE,
- 'source',
- node)
- sequence += \
- create_relationship_tasks(
- NORMATIVE_ADD_TARGET,
- 'target',
- node)
- sequence += \
- create_relationship_tasks(
- NORMATIVE_TARGET_CHANGED,
- 'target',
- node)
+ sequence = [create_node_task(node, NORMATIVE_START)]
+ sequence += create_relationships_tasks(node, NORMATIVE_ADD_SOURCE, NORMATIVE_ADD_TARGET)
+ sequence += create_relationships_tasks(node, target_operation_name=NORMATIVE_TARGET_CHANGED)
return sequence
def _create_stop_tasks(node):
- sequence = []
- sequence += \
- create_relationship_tasks(
- NORMATIVE_REMOVE_TARGET,
- 'target',
- node)
- sequence += \
- create_relationship_tasks(
- NORMATIVE_TARGET_CHANGED,
- 'target',
- node)
- sequence.append(
- create_node_task(
- NORMATIVE_STOP,
- node))
+ 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/e69d3b1e/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/e69d3b1e/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/e69d3b1e/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/e69d3b1e/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/e69d3b1e/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/e69d3b1e/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/e69d3b1e/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/e69d3b1e/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