Repository: incubator-ariatosca Updated Branches: refs/heads/ARIA-3-api-for-creating-workflows 137e80cb3 -> 21c99ee66
ARIA-5-Adapt-workflow-API-users-to-modified-API(review fixups) Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/21c99ee6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/21c99ee6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/21c99ee6 Branch: refs/heads/ARIA-3-api-for-creating-workflows Commit: 21c99ee6644207d2e4a1beb9b2e1957cd488f414 Parents: 137e80c Author: mxmrlv <mxm...@gmail.com> Authored: Wed Oct 26 17:16:05 2016 +0300 Committer: mxmrlv <mxm...@gmail.com> Committed: Wed Oct 26 17:16:05 2016 +0300 ---------------------------------------------------------------------- aria/workflows/api/task_graph.py | 20 +++---- aria/workflows/builtin/heal.py | 16 +++--- aria/workflows/builtin/workflows.py | 60 ++++++++++++-------- tests/workflows/builtin/__init__.py | 20 +++---- .../workflows/builtin/test_execute_operation.py | 6 +- tests/workflows/builtin/test_heal.py | 46 +++++++++------ tests/workflows/builtin/test_install.py | 13 +++-- tests/workflows/builtin/test_uninstall.py | 13 +++-- 8 files changed, 109 insertions(+), 85 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/21c99ee6/aria/workflows/api/task_graph.py ---------------------------------------------------------------------- diff --git a/aria/workflows/api/task_graph.py b/aria/workflows/api/task_graph.py index 9c138e0..f645580 100644 --- a/aria/workflows/api/task_graph.py +++ b/aria/workflows/api/task_graph.py @@ -44,6 +44,14 @@ class TaskGraph(object): return '{name}(id={self._id}, name={self.name}, graph={self._graph!r})'.format( name=self.__class__.__name__, self=self) + @property + def id(self): + """ + Represents the id of the graph + :return: graph id + """ + return self._id + # graph traversal methods @property @@ -55,14 +63,6 @@ class TaskGraph(object): for _, data in self._graph.nodes_iter(data=True): yield data['task'] - @property - def id(self): - """ - Represents the id of the graph - :return: graph id - """ - return self._id - def topological_order(self, reverse=False): """ Returns topological sort on the graph @@ -228,7 +228,7 @@ class TaskGraph(object): :return: The sequence object :rtype: _TasksSequence """ - all_items = [item] + list(items) + all_items = [item] + [i for i in items if i] prev_item = None for an_item in all_items: @@ -254,7 +254,7 @@ class TaskGraph(object): :return: The parallel object :rtype: _TasksParallel """ - all_items = [item] + list(items) + all_items = [item] + [i for i in items if i] for an_item in all_items: if not isinstance(an_item, TaskGraph._TasksArrangement) and not self.has_task(an_item): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/21c99ee6/aria/workflows/builtin/heal.py ---------------------------------------------------------------------- diff --git a/aria/workflows/builtin/heal.py b/aria/workflows/builtin/heal.py index b9c7f8e..78a8312 100644 --- a/aria/workflows/builtin/heal.py +++ b/aria/workflows/builtin/heal.py @@ -94,11 +94,12 @@ def heal_uninstall(context, graph, failing_node_instances, targeted_node_instanc graph.add_dependency(target_node_instance_subgraph, node_instance_sub_workflow) if target_node_instance in failing_node_instances: - dependency = graph.parallel(*relationship_tasks( + dependency = relationship_tasks( + graph=graph, node_instance=node_instance, relationship_instance=relationship_instance, context=context, - operation_name='aria.interfaces.relationship_lifecycle.unlink')) + operation_name='aria.interfaces.relationship_lifecycle.unlink') graph.add_dependency(node_instance_sub_workflow, dependency) @@ -137,15 +138,16 @@ def heal_install(context, graph, failing_node_instances, targeted_node_instances for relationship_instance in node_instance.relationship_instances: target_node_instance = context.model.node_instance.get(relationship_instance.target_id) - target_node_instance_subgraph = node_instance_sub_workflows[target_node_instance.id] - graph.add_dependency(node_instance_sub_workflow, target_node_instance_subgraph) + target_node_instance_subworkflow = node_instance_sub_workflows[target_node_instance.id] + graph.add_dependency(node_instance_sub_workflow, target_node_instance_subworkflow) if target_node_instance in failing_node_instances: - dependent = graph.parallel(*relationship_tasks( + dependent = relationship_tasks( + graph=graph, node_instance=node_instance, relationship_instance=relationship_instance, context=context, - operation_name='aria.interfaces.relationship_lifecycle.establish')) + operation_name='aria.interfaces.relationship_lifecycle.establish') graph.add_dependency(dependent, node_instance_sub_workflow) @@ -164,4 +166,4 @@ def _get_contained_subgraph(context, host_node_instance): for node_instance in contained_instances: result.extend(_get_contained_subgraph(context, node_instance)) - return result + return set(result) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/21c99ee6/aria/workflows/builtin/workflows.py ---------------------------------------------------------------------- diff --git a/aria/workflows/builtin/workflows.py b/aria/workflows/builtin/workflows.py index 5fc9ec8..3763f5c 100644 --- a/aria/workflows/builtin/workflows.py +++ b/aria/workflows/builtin/workflows.py @@ -57,21 +57,17 @@ def install_node_instance(context, graph, node_instance): 'aria.interfaces.lifecycle.start'], node_instance=node_instance ) - preconfigure_operations = preconfigure_relationship(context, node_instance) - postconfigure_operations = postconfigure_relationship(context, node_instance) - establish_operations = establish_relationship(context, node_instance) - install_sequence = [create_node_instance] - install_sequence.extend(preconfigure_operations) - install_sequence.append(configure_node_instance) - install_sequence.extend(postconfigure_operations) - install_sequence.append(start_node_instance) - install_sequence.extend(establish_operations) + graph.sequence(create_node_instance, + preconfigure_relationship(graph, context, node_instance), + configure_node_instance, + postconfigure_relationship(graph, context, node_instance), + start_node_instance, + establish_relationship(graph, context, node_instance) + ) - graph.sequence(*install_sequence) - -def preconfigure_relationship(context, node_instance): +def preconfigure_relationship(graph, context, node_instance): """ :param context: @@ -80,12 +76,13 @@ def preconfigure_relationship(context, node_instance): :return: """ return relationships_tasks( + graph=graph, operation_name='aria.interfaces.relationship_lifecycle.preconfigure', context=context, node_instance=node_instance) -def postconfigure_relationship(context, node_instance): +def postconfigure_relationship(graph, context, node_instance): """ :param context: @@ -94,12 +91,13 @@ def postconfigure_relationship(context, node_instance): :return: """ return relationships_tasks( + graph=graph, operation_name='aria.interfaces.relationship_lifecycle.postconfigure', context=context, node_instance=node_instance) -def establish_relationship(context, node_instance): +def establish_relationship(graph, context, node_instance): """ :param context: @@ -108,6 +106,7 @@ def establish_relationship(context, node_instance): :return: """ return relationships_tasks( + graph=graph, operation_name='aria.interfaces.relationship_lifecycle.establish', context=context, node_instance=node_instance) @@ -136,15 +135,15 @@ def uninstall_node_instance(graph, context, node_instance): 'aria.interfaces.lifecycle.delete'], node_instance=node_instance ) - unlink_operations = unlink_relationship(context, node_instance) - uninstall_sequence = [stop_node_instance] - uninstall_sequence.extend(unlink_operations) - uninstall_sequence.append(delete_node_instance) + graph.sequence( + stop_node_instance, + unlink_relationship(graph, context, node_instance), + delete_node_instance + ) - graph.sequence(*uninstall_sequence) -def unlink_relationship(context, node_instance): +def unlink_relationship(graph, context, node_instance): """ :param context: @@ -153,6 +152,7 @@ def unlink_relationship(context, node_instance): :return: """ return relationships_tasks( + graph=graph, operation_name='aria.interfaces.relationship_lifecycle.unlink', context=context, node_instance=node_instance @@ -194,7 +194,10 @@ def execute_operation_on_instance( ) -def relationships_tasks(operation_name, context, node_instance): +def relationships_tasks(graph, + operation_name, + context, + node_instance): """ Creates a relationship task (source and target) for all of a node_instance relationships. :param basestring operation_name: the relationship operation name. @@ -210,16 +213,23 @@ def relationships_tasks(operation_name, context, node_instance): for index, (_, relationship_group) in enumerate(relationships_groups): for relationship_instance in relationship_group: relationship_operations = relationship_tasks( + graph=graph, node_instance=node_instance, relationship_instance=relationship_instance, context=context, operation_name=operation_name, index=index) - sub_tasks.extend(relationship_operations) - return sub_tasks + sub_tasks.append(relationship_operations) + + return graph.sequence(*sub_tasks) if sub_tasks else sub_tasks -def relationship_tasks(node_instance, relationship_instance, context, operation_name, index=None): +def relationship_tasks(graph, + node_instance, + relationship_instance, + context, + operation_name, + index=None): """ Creates a relationship task source and target. :param NodeInstance node_instance: the node instance of the relationship @@ -246,4 +256,4 @@ def relationship_tasks(node_instance, relationship_instance, context, operation_ node_instance=context.model.node_instance.get(relationship_instance.target_id), operation_details=relationship_instance.relationship.target_operations[ operation_name]) - return source_operation, target_operation + return graph.parallel(source_operation, target_operation) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/21c99ee6/tests/workflows/builtin/__init__.py ---------------------------------------------------------------------- diff --git a/tests/workflows/builtin/__init__.py b/tests/workflows/builtin/__init__.py index d73d6ee..7ea045e 100644 --- a/tests/workflows/builtin/__init__.py +++ b/tests/workflows/builtin/__init__.py @@ -140,18 +140,18 @@ def simple_context(): return wf_context -def assert_node_install_operations(operations, with_operations=False): - if with_operations: +def assert_node_install_operations(operations, with_relationships=False): + if with_relationships: all_operations = [ 'aria.interfaces.lifecycle.create', - 'aria.interfaces.relationship_lifecycle.preconfigure.0.source', - 'aria.interfaces.relationship_lifecycle.preconfigure.0.target', + 'aria.interfaces.relationship_lifecycle.preconfigure', + 'aria.interfaces.relationship_lifecycle.preconfigure', 'aria.interfaces.lifecycle.configure', - 'aria.interfaces.relationship_lifecycle.postconfigure.0.source', - 'aria.interfaces.relationship_lifecycle.postconfigure.0.target', + 'aria.interfaces.relationship_lifecycle.postconfigure', + 'aria.interfaces.relationship_lifecycle.postconfigure', 'aria.interfaces.lifecycle.start', - 'aria.interfaces.relationship_lifecycle.establish.0.source', - 'aria.interfaces.relationship_lifecycle.establish.0.target', + 'aria.interfaces.relationship_lifecycle.establish', + 'aria.interfaces.relationship_lifecycle.establish', ] for i, operation in enumerate(operations): @@ -165,8 +165,8 @@ def assert_node_uninstall_operations(operations, with_relationships=False): if with_relationships: all_operations = [ 'aria.interfaces.lifecycle.stop', - 'aria.interfaces.relationship_lifecycle.unlink.0.source', - 'aria.interfaces.relationship_lifecycle.unlink.0.target', + 'aria.interfaces.relationship_lifecycle.unlink', + 'aria.interfaces.relationship_lifecycle.unlink', 'aria.interfaces.lifecycle.delete', ] http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/21c99ee6/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 457a569..8593e80 100644 --- a/tests/workflows/builtin/test_execute_operation.py +++ b/tests/workflows/builtin/test_execute_operation.py @@ -28,7 +28,7 @@ def context(): def test_execute_operation(context): operation_name = NODE_OPERATIONS_INSTALL[0] node_instance_id = 'dependency_node_instance' - execute_operations = list(execute_operation( + execute_tasks = list(execute_operation( context=context, operation=operation_name, operation_kwargs={}, @@ -39,7 +39,7 @@ def test_execute_operation(context): node_instance_ids=[node_instance_id] ).topological_order()) - assert len(execute_operations) == 1 - assert execute_operations[0].name == '{0}.{1}'.format(node_instance_id, operation_name) + assert len(execute_tasks) == 1 + assert execute_tasks[0].name == '{0}.{1}'.format(node_instance_id, operation_name) # TODO: add more scenarios http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/21c99ee6/tests/workflows/builtin/test_heal.py ---------------------------------------------------------------------- diff --git a/tests/workflows/builtin/test_heal.py b/tests/workflows/builtin/test_heal.py index 8cea941..be003c7 100644 --- a/tests/workflows/builtin/test_heal.py +++ b/tests/workflows/builtin/test_heal.py @@ -29,52 +29,62 @@ def context(): def test_heal_dependent_node(context): heal_graph = heal(context=context, node_instance_id='dependent_node_instance') + + assert len(list(heal_graph.tasks)) == 2 uninstall_subgraph, install_subgraph = list(heal_graph.topological_order(reverse=True)) + + assert len(list(uninstall_subgraph.tasks)) == 2 dependent_node_subgraph_uninstall, dependency_node_subgraph_uninstall = \ list(uninstall_subgraph.topological_order(reverse=True)) + + assert len(list(install_subgraph.tasks)) == 2 dependency_node_subgraph_install, dependent_node_subgraph_install = \ list(install_subgraph.topological_order(reverse=True)) - dependent_node_uninstall_operations = \ + dependent_node_uninstall_tasks = \ list(dependent_node_subgraph_uninstall.topological_order(reverse=True)) - dependency_node_uninstall_operations = \ + dependency_node_uninstall_tasks = \ list(dependency_node_subgraph_uninstall.topological_order(reverse=True)) - dependent_node_install_operations = \ + dependent_node_install_tasks = \ list(dependent_node_subgraph_install.topological_order(reverse=True)) - dependency_node_install_operations = \ + dependency_node_install_tasks = \ list(dependency_node_subgraph_install.topological_order(reverse=True)) - assert_node_uninstall_operations(dependent_node_uninstall_operations, with_relationships=True) - assert len(dependency_node_uninstall_operations) == 0 + assert_node_uninstall_operations(dependent_node_uninstall_tasks, with_relationships=True) + assert len(dependency_node_uninstall_tasks) == 0 - assert len(dependency_node_install_operations) == 0 - assert_node_install_operations(dependent_node_install_operations, with_operations=True) + assert len(dependency_node_install_tasks) == 0 + assert_node_install_operations(dependent_node_install_tasks, with_relationships=True) def test_heal_dependency_node(context): heal_graph = heal(context=context, node_instance_id='dependency_node_instance') + # both subgraphs should contain un\install for both the dependent and the dependency + assert len(list(heal_graph.tasks)) == 2 uninstall_subgraph, install_subgraph = list(heal_graph.topological_order(reverse=True)) - uninstall_operations = list(uninstall_subgraph.topological_order(reverse=True)) - unlink_source, unlink_target = uninstall_operations[:2] - dependent_node_subgraph_uninstall, dependency_node_subgraph_uninstall = uninstall_operations[2:] + uninstall_tasks = list(uninstall_subgraph.topological_order(reverse=True)) + assert len(uninstall_tasks) == 4 + unlink_source, unlink_target = uninstall_tasks[:2] + dependent_node_subgraph_uninstall, dependency_node_subgraph_uninstall = uninstall_tasks[2:] - install_operations = list(install_subgraph.topological_order(reverse=True)) - dependency_node_subgraph_install, dependent_node_subgraph_install = install_operations[:2] - establish_source, establish_target = install_operations[2:] + install_tasks = list(install_subgraph.topological_order(reverse=True)) + assert len(install_tasks) == 4 + dependency_node_subgraph_install, dependent_node_subgraph_install = install_tasks[:2] + establish_source, establish_target = install_tasks[2:] assert len(list(dependent_node_subgraph_uninstall.tasks)) == 0 - dependency_node_uninstall_operations = \ + dependency_node_uninstall_tasks = \ list(dependency_node_subgraph_uninstall.topological_order(reverse=True)) assert len(list(dependent_node_subgraph_install.tasks)) == 0 - dependency_node_install_operations = \ + dependency_node_install_tasks = \ list(dependency_node_subgraph_install.topological_order(reverse=True)) assert unlink_source.name.startswith('aria.interfaces.relationship_lifecycle.unlink') assert unlink_target.name.startswith('aria.interfaces.relationship_lifecycle.unlink') - assert_node_uninstall_operations(dependency_node_uninstall_operations) + assert_node_uninstall_operations(dependency_node_uninstall_tasks) - assert_node_install_operations(dependency_node_install_operations) + assert_node_install_operations(dependency_node_install_tasks) assert establish_source.name.startswith('aria.interfaces.relationship_lifecycle.establish') assert establish_target.name.startswith('aria.interfaces.relationship_lifecycle.establish') http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/21c99ee6/tests/workflows/builtin/test_install.py ---------------------------------------------------------------------- diff --git a/tests/workflows/builtin/test_install.py b/tests/workflows/builtin/test_install.py index 4cbc1dc..16cd1b8 100644 --- a/tests/workflows/builtin/test_install.py +++ b/tests/workflows/builtin/test_install.py @@ -26,11 +26,12 @@ def context(): def test_install(context): - install_operations = install(context=context).topological_order(reverse=True) + install_tasks = list(install(context=context).topological_order(reverse=True)) - dependency_node_subgraph, dependent_node_subgraph = list(install_operations) - dependent_node_operations = list(dependent_node_subgraph.topological_order(reverse=True)) - dependency_node_operations = list(dependency_node_subgraph.topological_order(reverse=True)) + assert len(install_tasks) == 2 + dependency_node_subgraph, 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)) - assert_node_install_operations(dependency_node_operations) - assert_node_install_operations(dependent_node_operations, with_operations=True) + assert_node_install_operations(dependency_node_tasks) + assert_node_install_operations(dependent_node_tasks, with_relationships=True) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/21c99ee6/tests/workflows/builtin/test_uninstall.py ---------------------------------------------------------------------- diff --git a/tests/workflows/builtin/test_uninstall.py b/tests/workflows/builtin/test_uninstall.py index ed4666d..c983fe3 100644 --- a/tests/workflows/builtin/test_uninstall.py +++ b/tests/workflows/builtin/test_uninstall.py @@ -26,11 +26,12 @@ def context(): def test_uninstall(context): - uninstall_operations = uninstall(context=context).topological_order(reverse=True) + uninstall_tasks = list(uninstall(context=context).topological_order(reverse=True)) - dependent_node_subgraph, dependency_node_subgraph = list(uninstall_operations) - dependent_node_operations = list(dependent_node_subgraph.topological_order(reverse=True)) - dependency_node_operations = list(dependency_node_subgraph.topological_order(reverse=True)) + assert len(uninstall_tasks) == 2 + dependent_node_subgraph, dependency_node_subgraph = uninstall_tasks + dependent_node_tasks = list(dependent_node_subgraph.topological_order(reverse=True)) + dependency_node_tasks = list(dependency_node_subgraph.topological_order(reverse=True)) - assert_node_uninstall_operations(operations=dependency_node_operations) - assert_node_uninstall_operations(operations=dependent_node_operations, with_relationships=True) + assert_node_uninstall_operations(operations=dependency_node_tasks) + assert_node_uninstall_operations(operations=dependent_node_tasks, with_relationships=True)