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 <[email protected]> Authored: Mon Mar 13 16:35:10 2017 +0200 Committer: max-orlov <[email protected]> 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 + + [email protected] +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
