Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id D7230200C04 for ; Tue, 24 Jan 2017 14:59:19 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id D5A8A160B3D; Tue, 24 Jan 2017 13:59:19 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 62FBA160B31 for ; Tue, 24 Jan 2017 14:59:18 +0100 (CET) Received: (qmail 46901 invoked by uid 500); 24 Jan 2017 13:59:17 -0000 Mailing-List: contact dev-help@ariatosca.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ariatosca.incubator.apache.org Delivered-To: mailing list dev@ariatosca.incubator.apache.org Received: (qmail 46890 invoked by uid 99); 24 Jan 2017 13:59:17 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 24 Jan 2017 13:59:17 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id 282AAC1FE6 for ; Tue, 24 Jan 2017 13:59:17 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -6.218 X-Spam-Level: X-Spam-Status: No, score=-6.218 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-2.999, URIBL_BLOCKED=0.001] autolearn=disabled Received: from mx1-lw-us.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id KMQMcILJqazq for ; Tue, 24 Jan 2017 13:59:14 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with SMTP id 7DC495F3BF for ; Tue, 24 Jan 2017 13:59:08 +0000 (UTC) Received: (qmail 42828 invoked by uid 99); 24 Jan 2017 13:57:53 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 24 Jan 2017 13:57:53 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id C1CA5DFA6D; Tue, 24 Jan 2017 13:57:53 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: dankilman@apache.org To: dev@ariatosca.incubator.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: incubator-ariatosca git commit: ARIA-72 Rework built-in workflows to match TOSCA normative lifecycle Date: Tue, 24 Jan 2017 13:57:53 +0000 (UTC) archived-at: Tue, 24 Jan 2017 13:59:20 -0000 Repository: incubator-ariatosca Updated Branches: refs/heads/master 0382b229c -> db9ae9c70 ARIA-72 Rework built-in workflows to match TOSCA normative lifecycle Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/db9ae9c7 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/db9ae9c7 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/db9ae9c7 Branch: refs/heads/master Commit: db9ae9c70ae0703cb3f357bf53b95d1a351a8ab0 Parents: 0382b22 Author: Tal Liron Authored: Tue Jan 24 09:52:36 2017 +0200 Committer: Tal Liron Committed: Tue Jan 24 15:48:42 2017 +0200 ---------------------------------------------------------------------- aria/orchestrator/workflows/builtin/__init__.py | 12 +- .../workflows/builtin/execute_operation.py | 30 +- aria/orchestrator/workflows/builtin/heal.py | 4 +- aria/orchestrator/workflows/builtin/install.py | 42 +-- aria/orchestrator/workflows/builtin/start.py | 28 ++ aria/orchestrator/workflows/builtin/stop.py | 28 ++ .../orchestrator/workflows/builtin/uninstall.py | 41 +-- aria/orchestrator/workflows/builtin/utils.py | 70 +++++ .../orchestrator/workflows/builtin/workflows.py | 280 +++++++------------ tests/mock/operations.py | 48 +++- .../orchestrator/workflows/builtin/__init__.py | 39 +-- .../orchestrator/workflows/builtin/test_heal.py | 2 + tests/orchestrator/workflows/core/test_task.py | 6 +- .../test_task_graph_into_exececution_graph.py | 2 +- 14 files changed, 342 insertions(+), 290 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/aria/orchestrator/workflows/builtin/__init__.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/builtin/__init__.py b/aria/orchestrator/workflows/builtin/__init__.py index 0449a8e..d43a962 100644 --- a/aria/orchestrator/workflows/builtin/__init__.py +++ b/aria/orchestrator/workflows/builtin/__init__.py @@ -19,13 +19,17 @@ A set of builtin workflows from .install import install from .uninstall import uninstall -from .execute_operation import execute_operation -from .heal import heal +from .start import start +from .stop import stop + + +BUILTIN_WORKFLOWS = ('install', 'uninstall', 'start', 'stop') __all__ = [ + 'BUILTIN_WORKFLOWS', 'install', 'uninstall', - 'execute_operation', - 'heal', + 'start', + 'stop' ] http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/aria/orchestrator/workflows/builtin/execute_operation.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/builtin/execute_operation.py b/aria/orchestrator/workflows/builtin/execute_operation.py index ddbb8e7..e76993d 100644 --- a/aria/orchestrator/workflows/builtin/execute_operation.py +++ b/aria/orchestrator/workflows/builtin/execute_operation.py @@ -17,9 +17,8 @@ Builtin execute_operation workflow """ -from aria import workflow - -from .workflows import execute_operation_on_instance +from ..api.task import OperationTask +from ... import workflow @workflow @@ -68,7 +67,7 @@ def execute_operation( # registering actual tasks to sequences for node_instance in filtered_node_instances: graph.add_tasks( - execute_operation_on_instance( + _create_node_instance_task( node_instance=node_instance, operation=operation, operation_kwargs=operation_kwargs, @@ -102,3 +101,26 @@ def _filter_node_instances(context, node_ids=(), node_instance_ids=(), type_name _is_node_instance_by_id(node_instance.id), _is_node_by_type(node_instance.node.type_hierarchy))): yield node_instance + + +def _create_node_instance_task( + node_instance, + operation, + operation_kwargs, + allow_kwargs_override): + """ + A workflow which executes a single operation + :param node_instance: the node instance to install + :param basestring operation: the operation name + :param dict operation_kwargs: + :param bool allow_kwargs_override: + :return: + """ + + if allow_kwargs_override is not None: + operation_kwargs['allow_kwargs_override'] = allow_kwargs_override + + return OperationTask.node_instance( + instance=node_instance, + name=operation, + inputs=operation_kwargs) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/aria/orchestrator/workflows/builtin/heal.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/builtin/heal.py b/aria/orchestrator/workflows/builtin/heal.py index 21da2ed..87ac492 100644 --- a/aria/orchestrator/workflows/builtin/heal.py +++ b/aria/orchestrator/workflows/builtin/heal.py @@ -13,13 +13,15 @@ # See the License for the specific language governing permissions and # limitations under the License. +# pylint: skip-file + """ Builtin heal workflow """ from aria import workflow -from .workflows import relationship_tasks, install_node_instance, uninstall_node_instance +from .workflows import (install_node_instance, uninstall_node_instance) from ..api import task http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/aria/orchestrator/workflows/builtin/install.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/builtin/install.py b/aria/orchestrator/workflows/builtin/install.py index eb5b4e8..81d1da2 100644 --- a/aria/orchestrator/workflows/builtin/install.py +++ b/aria/orchestrator/workflows/builtin/install.py @@ -17,38 +17,18 @@ Builtin install workflow """ -from aria import workflow - from .workflows import install_node_instance -from ..api import task +from .utils import create_node_instance_task_dependencies +from ..api.task import WorkflowTask +from ... import workflow @workflow -def install(ctx, graph, node_instances=(), node_instance_sub_workflows=None): - """ - The install workflow - :param WorkflowContext ctx: the workflow context - :param TaskGraph graph: the graph which will describe the workflow. - :param node_instances: the node instances on which to run the workflow - :param dict node_instance_sub_workflows: a dictionary of subworkflows with id as key and - TaskGraph (or OperationContext) as value - :return: - """ - node_instance_sub_workflows = node_instance_sub_workflows or {} - node_instances = node_instances or list(ctx.node_instances) - - # create install sub workflow for every node instance - for node_instance in node_instances: - node_instance_sub_workflow = task.WorkflowTask(install_node_instance, - node_instance=node_instance) - node_instance_sub_workflows[node_instance.id] = node_instance_sub_workflow - graph.add_tasks(node_instance_sub_workflow) - - # create dependencies between the node instance sub workflow - for node_instance in node_instances: - node_instance_sub_workflow = node_instance_sub_workflows[node_instance.id] - if node_instance.outbound_relationship_instances: - dependencies = [ - node_instance_sub_workflows[relationship_instance.target_node_instance.id] - for relationship_instance in node_instance.outbound_relationship_instances] - graph.add_dependency(node_instance_sub_workflow, dependencies) +def install(ctx, graph): + tasks_and_node_instances = [] + for node_instance in ctx.model.node_instance.iter(): + tasks_and_node_instances.append(( + WorkflowTask(install_node_instance, node_instance=node_instance), + node_instance)) + graph.add_tasks([task for task, _ in tasks_and_node_instances]) + create_node_instance_task_dependencies(graph, tasks_and_node_instances) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/aria/orchestrator/workflows/builtin/start.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/builtin/start.py b/aria/orchestrator/workflows/builtin/start.py new file mode 100644 index 0000000..a044d73 --- /dev/null +++ b/aria/orchestrator/workflows/builtin/start.py @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# 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. + +""" +Builtin start workflow +""" + +from .workflows import start_node_instance +from ..api.task import WorkflowTask +from ... import workflow + + +@workflow +def start(ctx, graph): + for node_instance in ctx.model.node_instance.iter(): + graph.add_tasks(WorkflowTask(start_node_instance, node_instance=node_instance)) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/aria/orchestrator/workflows/builtin/stop.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/builtin/stop.py b/aria/orchestrator/workflows/builtin/stop.py new file mode 100644 index 0000000..584c0d3 --- /dev/null +++ b/aria/orchestrator/workflows/builtin/stop.py @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# 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. + +""" +Builtin stop workflow +""" + +from .workflows import stop_node_instance +from ..api.task import WorkflowTask +from ... import workflow + + +@workflow +def stop(ctx, graph): + for node_instance in ctx.model.node_instance.iter(): + graph.add_tasks(WorkflowTask(stop_node_instance, node_instance=node_instance)) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/aria/orchestrator/workflows/builtin/uninstall.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/builtin/uninstall.py b/aria/orchestrator/workflows/builtin/uninstall.py index db1c0cc..bfcc9ec 100644 --- a/aria/orchestrator/workflows/builtin/uninstall.py +++ b/aria/orchestrator/workflows/builtin/uninstall.py @@ -17,37 +17,18 @@ Builtin uninstall workflow """ -from aria import workflow - from .workflows import uninstall_node_instance -from ..api import task +from .utils import create_node_instance_task_dependencies +from ..api.task import WorkflowTask +from ... import workflow @workflow -def uninstall(ctx, graph, node_instances=(), node_instance_sub_workflows=None): - """ - The uninstall workflow - :param WorkflowContext ctx: the workflow context - :param TaskGraph graph: the graph which will describe the workflow. - :param node_instances: the node instances on which to run the workflow - :param dict node_instance_sub_workflows: a dictionary of subworkflows with id as key and - TaskGraph (or OperationContext) as value - :return: - """ - node_instance_sub_workflows = node_instance_sub_workflows or {} - node_instances = node_instances or list(ctx.node_instances) - - # create install sub workflow for every node instance - for node_instance in node_instances: - node_instance_sub_workflow = task.WorkflowTask(uninstall_node_instance, - node_instance=node_instance) - node_instance_sub_workflows[node_instance.id] = node_instance_sub_workflow - graph.add_tasks(node_instance_sub_workflow) - - # create dependencies between the node instance sub workflow - for node_instance in node_instances: - node_instance_sub_workflow = node_instance_sub_workflows[node_instance.id] - for relationship_instance in reversed(node_instance.outbound_relationship_instances): - target_id = relationship_instance.target_node_instance.id - graph.add_dependency(node_instance_sub_workflows[target_id], - node_instance_sub_workflow) +def uninstall(ctx, graph): + tasks_and_node_instances = [] + for node_instance in ctx.model.node_instance.iter(): + tasks_and_node_instances.append(( + WorkflowTask(uninstall_node_instance, node_instance=node_instance), + node_instance)) + graph.add_tasks([task for task, _ in tasks_and_node_instances]) + create_node_instance_task_dependencies(graph, tasks_and_node_instances, reverse=True) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/aria/orchestrator/workflows/builtin/utils.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/builtin/utils.py b/aria/orchestrator/workflows/builtin/utils.py new file mode 100644 index 0000000..8b7a8bc --- /dev/null +++ b/aria/orchestrator/workflows/builtin/utils.py @@ -0,0 +1,70 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# 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 ..api.task import OperationTask + + +def create_node_instance_task(operation_name, node_instance): + """ + Returns a new operation task if the operation exists in the node instance, otherwise returns + None. + """ + + if operation_name in node_instance.node.operations: + return OperationTask.node_instance(instance=node_instance, + name=operation_name) + return None + + +def create_relationship_instance_tasks(operation_name, operations_attr, node_instance): + """ + Returns a list of operation tasks for each outbound relationship of the node instance if + the operation exists there. + """ + + sequence = [] + for relationship_instance in node_instance.outbound_relationship_instances: + if operation_name in getattr(relationship_instance.relationship, operations_attr): + sequence.append( + OperationTask.relationship_instance(instance=relationship_instance, + name=operation_name, + operation_end=operations_attr)) + return sequence + + +def create_node_instance_task_dependencies(graph, tasks_and_node_instances, reverse=False): + """ + Creates dependencies between tasks if there is an outbound relationship between their node + instances. + """ + + def get_task(node_instance_id): + for task, node_instance in tasks_and_node_instances: + if node_instance.id == node_instance_id: + return task + return None + + for task, node_instance in tasks_and_node_instances: + dependencies = [] + for relationship_instance in node_instance.outbound_relationship_instances: + dependency = get_task(relationship_instance.target_node_instance.id) + if dependency: + dependencies.append(dependency) + if dependencies: + if reverse: + for dependency in dependencies: + graph.add_dependency(dependency, task) + else: + graph.add_dependency(task, dependencies) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/aria/orchestrator/workflows/builtin/workflows.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/builtin/workflows.py b/aria/orchestrator/workflows/builtin/workflows.py index 4f765b3..c2fbded 100644 --- a/aria/orchestrator/workflows/builtin/workflows.py +++ b/aria/orchestrator/workflows/builtin/workflows.py @@ -17,190 +17,122 @@ A set of builtin workflows. """ -from itertools import groupby - -from aria import workflow - -from ..api import task +from .utils import (create_node_instance_task, create_relationship_instance_tasks) +from ... import workflow __all__ = ( 'install_node_instance', 'uninstall_node_instance', - 'execute_operation_on_instance', + 'start_node_instance', + 'stop_node_instance', ) -# Install node instance workflow and sub workflows - @workflow(suffix_template='{node_instance.id}') def install_node_instance(graph, node_instance, **kwargs): - """ - A workflow which installs a node instance. - :param TaskGraph graph: the tasks graph of which to edit - :param node_instance: the node instance to install - :return: - """ - create_node_instance = task.OperationTask.node_instance( - instance=node_instance, - name='aria.interfaces.lifecycle.create') - - configure_node_instance = task.OperationTask.node_instance( - instance=node_instance, - name='aria.interfaces.lifecycle.configure') - start_node_instance = task.OperationTask.node_instance( - instance=node_instance, - name='aria.interfaces.lifecycle.start') - - graph.sequence( - create_node_instance, - preconfigure_relationship(graph, node_instance), - configure_node_instance, - postconfigure_relationship(graph, node_instance), - start_node_instance, - establish_relationship(graph, node_instance) - ) - - return graph - - -def preconfigure_relationship(graph, node_instance, **kwargs): - """ - - :param graph: - :param node_instance: - :return: - """ - return relationships_tasks( - graph=graph, - operation_name='aria.interfaces.relationship_lifecycle.preconfigure', - node_instance=node_instance) - - -def postconfigure_relationship(graph, node_instance, **kwargs): - """ - - :param graph: - :param node_instance: - :return: - """ - return relationships_tasks( - graph=graph, - operation_name='aria.interfaces.relationship_lifecycle.postconfigure', - node_instance=node_instance) - - -def establish_relationship(graph, node_instance, **kwargs): - """ - - :param graph: - :param node_instance: - :return: - """ - return relationships_tasks( - graph=graph, - operation_name='aria.interfaces.relationship_lifecycle.establish', - node_instance=node_instance) - - -# Uninstall node instance workflow and subworkflows + sequence = [] + + # Create + sequence.append( + create_node_instance_task( + 'tosca.interfaces.node.lifecycle.Standard.create', + node_instance)) + + # Configure + sequence += \ + create_relationship_instance_tasks( + 'tosca.interfaces.relationship.Configure.pre_configure_source', + 'source_operations', + node_instance) + sequence += \ + create_relationship_instance_tasks( + 'tosca.interfaces.relationship.Configure.pre_configure_target', + 'target_operations', + node_instance) + sequence.append( + create_node_instance_task( + 'tosca.interfaces.node.lifecycle.Standard.configure', + node_instance)) + sequence += \ + create_relationship_instance_tasks( + 'tosca.interfaces.relationship.Configure.post_configure_source', + 'source_operations', + node_instance) + sequence += \ + create_relationship_instance_tasks( + 'tosca.interfaces.relationship.Configure.post_configure_target', + 'target_operations', + node_instance) + + # Start + sequence += _create_start_tasks(node_instance) + + graph.sequence(*sequence) + @workflow(suffix_template='{node_instance.id}') def uninstall_node_instance(graph, node_instance, **kwargs): - """ - A workflow which uninstalls a node instance. - :param TaskGraph graph: the tasks graph of which to edit - :param node_instance: the node instance to uninstall - :return: - """ - stop_node_instance = task.OperationTask.node_instance( - instance=node_instance, - name='aria.interfaces.lifecycle.stop') - delete_node_instance = task.OperationTask.node_instance( - instance=node_instance, - name='aria.interfaces.lifecycle.delete') - - graph.sequence( - stop_node_instance, - unlink_relationship(graph, node_instance), - delete_node_instance - ) - - -def unlink_relationship(graph, node_instance): - """ - - :param graph: - :param node_instance: - :return: - """ - return relationships_tasks( - graph=graph, - operation_name='aria.interfaces.relationship_lifecycle.unlink', - node_instance=node_instance - ) - - -def execute_operation_on_instance( - node_instance, - operation, - operation_kwargs, - allow_kwargs_override): - """ - A workflow which executes a single operation - :param node_instance: the node instance to install - :param basestring operation: the operation name - :param dict operation_kwargs: - :param bool allow_kwargs_override: - :return: - """ - - if allow_kwargs_override is not None: - operation_kwargs['allow_kwargs_override'] = allow_kwargs_override - - return task.OperationTask.node_instance( - instance=node_instance, - name=operation, - inputs=operation_kwargs) - - -def relationships_tasks(graph, operation_name, node_instance): - """ - Creates a relationship task (source and target) for all of a node_instance relationships. - :param basestring operation_name: the relationship operation name. - :param WorkflowContext context: - :param NodeInstance node_instance: - :return: - """ - relationships_groups = groupby( - node_instance.outbound_relationship_instances, - key=lambda relationship_instance: relationship_instance.target_node_instance.id) - - sub_tasks = [] - for _, (_, relationship_group) in enumerate(relationships_groups): - for relationship_instance in relationship_group: - relationship_operations = relationship_tasks( - relationship_instance=relationship_instance, - operation_name=operation_name) - sub_tasks.append(relationship_operations) - - return graph.sequence(*sub_tasks) - - -def relationship_tasks(relationship_instance, operation_name): - """ - Creates a relationship task source and target. - :param RelationshipInstance relationship_instance: the relationship instance itself - :param operation_name: - :return: - """ - source_operation = task.OperationTask.relationship_instance( - instance=relationship_instance, - name=operation_name, - operation_end=task.OperationTask.SOURCE_OPERATION) - target_operation = task.OperationTask.relationship_instance( - instance=relationship_instance, - name=operation_name, - operation_end=task.OperationTask.TARGET_OPERATION) - - return source_operation, target_operation + # Stop + sequence = _create_stop_tasks(node_instance) + + # Delete + sequence.append( + create_node_instance_task( + 'tosca.interfaces.node.lifecycle.Standard.delete', + node_instance)) + + graph.sequence(*sequence) + + +@workflow(suffix_template='{node_instance.id}') +def start_node_instance(graph, node_instance, **kwargs): + graph.sequence(*_create_start_tasks(node_instance)) + + +@workflow(suffix_template='{node_instance.id}') +def stop_node_instance(graph, node_instance, **kwargs): + graph.sequence(*_create_stop_tasks(node_instance)) + + +def _create_start_tasks(node_instance): + sequence = [] + sequence.append( + create_node_instance_task( + 'tosca.interfaces.node.lifecycle.Standard.start', + node_instance)) + sequence += \ + create_relationship_instance_tasks( + 'tosca.interfaces.relationship.Configure.add_source', + 'source_operations', + node_instance) + sequence += \ + create_relationship_instance_tasks( + 'tosca.interfaces.relationship.Configure.add_target', + 'target_operations', + node_instance) + sequence += \ + create_relationship_instance_tasks( + 'tosca.interfaces.relationship.Configure.target_changed', + 'target_operations', + node_instance) + return sequence + + +def _create_stop_tasks(node_instance): + sequence = [] + sequence += \ + create_relationship_instance_tasks( + 'tosca.interfaces.relationship.Configure.remove_target', + 'target_operations', + node_instance) + sequence += \ + create_relationship_instance_tasks( + 'tosca.interfaces.relationship.Configure.target_changed', + 'target_operations', + node_instance) + sequence.append( + create_node_instance_task( + 'tosca.interfaces.node.lifecycle.Standard.stop', + node_instance)) + return sequence http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/tests/mock/operations.py ---------------------------------------------------------------------- diff --git a/tests/mock/operations.py b/tests/mock/operations.py index 407061f..5495f6a 100644 --- a/tests/mock/operations.py +++ b/tests/mock/operations.py @@ -14,20 +14,46 @@ # limitations under the License. NODE_OPERATIONS_INSTALL = [ - 'aria.interfaces.lifecycle.create', - 'aria.interfaces.lifecycle.configure', - 'aria.interfaces.lifecycle.start', - ] + 'tosca.interfaces.node.lifecycle.Standard.create', + 'tosca.interfaces.node.lifecycle.Standard.configure', + 'tosca.interfaces.node.lifecycle.Standard.start', +] + NODE_OPERATIONS_UNINSTALL = [ - 'aria.interfaces.lifecycle.stop', - 'aria.interfaces.lifecycle.delete', + 'tosca.interfaces.node.lifecycle.Standard.stop', + 'tosca.interfaces.node.lifecycle.Standard.delete', ] + NODE_OPERATIONS = NODE_OPERATIONS_INSTALL + NODE_OPERATIONS_UNINSTALL RELATIONSHIP_OPERATIONS_INSTALL = [ - 'aria.interfaces.relationship_lifecycle.preconfigure', - 'aria.interfaces.relationship_lifecycle.postconfigure', - 'aria.interfaces.relationship_lifecycle.establish', - ] -RELATIONSHIP_OPERATIONS_UNINSTALL = ['aria.interfaces.relationship_lifecycle.unlink'] + 'tosca.interfaces.relationship.Configure.pre_configure_source', + 'tosca.interfaces.relationship.Configure.pre_configure_target', + 'tosca.interfaces.relationship.Configure.add_source', + 'tosca.interfaces.relationship.Configure.add_target', +] + +RELATIONSHIP_OPERATIONS_UNINSTALL = [ + 'tosca.interfaces.relationship.Configure.remove_target', + 'tosca.interfaces.relationship.Configure.target_changed', +] + RELATIONSHIP_OPERATIONS = RELATIONSHIP_OPERATIONS_INSTALL + RELATIONSHIP_OPERATIONS_UNINSTALL + +OPERATIONS_INSTALL = [ + 'tosca.interfaces.node.lifecycle.Standard.create', + 'tosca.interfaces.relationship.Configure.pre_configure_source', + 'tosca.interfaces.relationship.Configure.pre_configure_target', + 'tosca.interfaces.node.lifecycle.Standard.configure', + 'tosca.interfaces.node.lifecycle.Standard.start', + 'tosca.interfaces.relationship.Configure.add_source', + 'tosca.interfaces.relationship.Configure.add_target', + 'tosca.interfaces.relationship.Configure.target_changed', +] + +OPERATIONS_UNINSTALL = [ + 'tosca.interfaces.relationship.Configure.remove_target', + 'tosca.interfaces.relationship.Configure.target_changed', + 'tosca.interfaces.node.lifecycle.Standard.stop', + 'tosca.interfaces.node.lifecycle.Standard.delete', +] http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/tests/orchestrator/workflows/builtin/__init__.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/builtin/__init__.py b/tests/orchestrator/workflows/builtin/__init__.py index 26ba82f..9f60e55 100644 --- a/tests/orchestrator/workflows/builtin/__init__.py +++ b/tests/orchestrator/workflows/builtin/__init__.py @@ -17,37 +17,14 @@ from tests import mock def assert_node_install_operations(operations, with_relationships=False): - if with_relationships: - all_operations = [ - 'aria.interfaces.lifecycle.create', - 'aria.interfaces.relationship_lifecycle.preconfigure', - 'aria.interfaces.relationship_lifecycle.preconfigure', - 'aria.interfaces.lifecycle.configure', - 'aria.interfaces.relationship_lifecycle.postconfigure', - 'aria.interfaces.relationship_lifecycle.postconfigure', - 'aria.interfaces.lifecycle.start', - 'aria.interfaces.relationship_lifecycle.establish', - 'aria.interfaces.relationship_lifecycle.establish', - ] - - for i, operation in enumerate(operations): - assert operation.name.startswith(all_operations[i]) - else: - for i, operation in enumerate(operations): - assert operation.name.startswith(mock.operations.NODE_OPERATIONS_INSTALL[i]) + 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_node_uninstall_operations(operations, with_relationships=False): - if with_relationships: - all_operations = [ - 'aria.interfaces.lifecycle.stop', - 'aria.interfaces.relationship_lifecycle.unlink', - 'aria.interfaces.relationship_lifecycle.unlink', - 'aria.interfaces.lifecycle.delete', - ] - - for i, operation in enumerate(operations): - assert operation.name.startswith(all_operations[i]) - else: - for i, operation in enumerate(operations): - assert operation.name.startswith(mock.operations.NODE_OPERATIONS_UNINSTALL[i]) + 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] + '.') http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/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 ad281fd..b470790 100644 --- a/tests/orchestrator/workflows/builtin/test_heal.py +++ b/tests/orchestrator/workflows/builtin/test_heal.py @@ -31,6 +31,7 @@ def ctx(tmpdir): storage.release_sqlite_storage(context.model) +@pytest.mark.skip(reason='heal is not implemented for now') def test_heal_dependent_node(ctx): dependent_node_instance = \ ctx.model.node_instance.get_by_name(mock.models.DEPENDENT_NODE_INSTANCE_NAME) @@ -60,6 +61,7 @@ def test_heal_dependent_node(ctx): assert_node_install_operations(dependent_node_install_tasks, with_relationships=True) +@pytest.mark.skip(reason='heal is not implemented for now') def test_heal_dependency_node(ctx): dependency_node_instance = \ ctx.model.node_instance.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/tests/orchestrator/workflows/core/test_task.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/core/test_task.py b/tests/orchestrator/workflows/core/test_task.py index 34088f5..061a3f2 100644 --- a/tests/orchestrator/workflows/core/test_task.py +++ b/tests/orchestrator/workflows/core/test_task.py @@ -42,7 +42,7 @@ class TestOperationTask(object): with workflow_context.current.push(ctx): api_task = api.task.OperationTask.node_instance( instance=node_instance, - name='aria.interfaces.lifecycle.create') + name='tosca.interfaces.node.lifecycle.Standard.create') core_task = core.task.OperationTask(api_task=api_task) return api_task, core_task @@ -50,7 +50,7 @@ class TestOperationTask(object): with workflow_context.current.push(ctx): api_task = api.task.OperationTask.relationship_instance( instance=relationship_instance, - name='aria.interfaces.relationship_lifecycle.preconfigure', + name='tosca.interfaces.relationship.Configure.pre_configure_source', operation_end=operation_end) core_task = core.task.OperationTask(api_task=api_task) return api_task, core_task @@ -67,7 +67,7 @@ class TestOperationTask(object): node.plugins = [{'name': plugin_name, 'package_name': 'p1', 'package_version': '0.1'}] - node.operations['aria.interfaces.lifecycle.create'] = {'plugin': plugin_name} + node.operations['tosca.interfaces.node.lifecycle.Standard.create'] = {'plugin': plugin_name} api_task, core_task = self._create_node_operation_task(ctx, node_instance) storage_task = ctx.model.task.get_by_name(core_task.name) assert storage_task.plugin_name == plugin_name http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/db9ae9c7/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py b/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py index 18540f4..cd37bde 100644 --- a/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py +++ b/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py @@ -23,7 +23,7 @@ from tests import storage def test_task_graph_into_execution_graph(): - operation_name = 'aria.interfaces.lifecycle.create' + operation_name = 'tosca.interfaces.node.lifecycle.Standard.create' task_context = mock.context.simple(storage.get_sqlite_api_kwargs()) node_instance = \ task_context.model.node_instance.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME)