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/05/03 17:05:04 UTC

incubator-ariatosca git commit: reverted the 'safe' behavior back to a function

Repository: incubator-ariatosca
Updated Branches:
  refs/heads/ARIA-163-Update-node-state-for-stub-tasks c56ab97ac -> 1303f0925


reverted the 'safe' behavior back to a function


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

Branch: refs/heads/ARIA-163-Update-node-state-for-stub-tasks
Commit: 1303f0925a03f07b3e70685174a8a22ea8864005
Parents: c56ab97
Author: max-orlov <ma...@gigaspaces.com>
Authored: Wed May 3 20:04:59 2017 +0300
Committer: max-orlov <ma...@gigaspaces.com>
Committed: Wed May 3 20:04:59 2017 +0300

----------------------------------------------------------------------
 aria/orchestrator/workflows/api/task.py         | 66 +++++++++++++-------
 .../orchestrator/workflows/builtin/workflows.py | 10 +--
 aria/orchestrator/workflows/core/translation.py |  2 +-
 aria/orchestrator/workflows/events_logging.py   |  9 +--
 .../orchestrator/workflows/core/test_engine.py  | 32 +++++-----
 5 files changed, 68 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1303f092/aria/orchestrator/workflows/api/task.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/api/task.py b/aria/orchestrator/workflows/api/task.py
index 889a86a..523a52f 100644
--- a/aria/orchestrator/workflows/api/task.py
+++ b/aria/orchestrator/workflows/api/task.py
@@ -92,43 +92,44 @@ class OperationTask(BaseTask):
                                                      name=actor.name,
                                                      interface=self.interface_name,
                                                      operation=self.operation_name)
-        if self.is_empty:
+        # Creating OperationTask directly should raise an error when there is no
+        # interface/operation.
+        if self.has_implementation is False:
             self.plugin = None
             self.inputs = {}
             self.implementation = None
-        else:
+        elif self.has_implementation is True:
             operation = self.actor.interfaces[self.interface_name].operations[self.operation_name]
             self.plugin = operation.plugin
             self.inputs = modeling_utils.create_inputs(inputs or {}, operation.inputs)
             self.implementation = operation.implementation
+        else:
+            raise exceptions.OperationNotFoundException(
+                'Could not find operation "{self.operation_name}" on interface '
+                '"{self.interface_name}" for {actor_type} "{actor.name}"'.format(
+                    self=self,
+                    actor_type=type(actor).__name__.lower(),
+                    actor=actor)
+            )
 
     def __repr__(self):
         return self.name
 
-    # def __new__(cls, actor, interface_name, operation_name, *args, **kwargs):
-    #     """
-    #     Returns a new operation task if the operation exists in the node, otherwise returns None.
-    #     """
-    #     try:
-    #         cls.is_empty(actor, interface_name, operation_name)
-    #         return super(OperationTask, cls).__new__(cls)
-    #     except exceptions.OperationNotFoundException:
-    #         return None
-
     @property
-    def is_empty(self):
+    def has_implementation(self):
         interface = self.actor.interfaces.get(self.interface_name)
         if interface:
             operation = interface.operations.get(self.operation_name)
             if operation:
                 return operation.implementation is None
 
-        raise exceptions.OperationNotFoundException(
-            'Could not find operation "{0}" on interface "{1}" for {2} "{3}"'
-            .format(self.operation_name,
-                    self.interface_name,
-                    type(self.actor).__name__.lower(),
-                    self.actor.name))
+
+def operation_exists(actor, interface_name, operation_name):
+    interface = actor.interfaces.get(interface_name)
+    if interface:
+        operation = interface.operations.get(operation_name)
+        if operation:
+            return operation.implementation is None
 
 
 class WorkflowTask(BaseTask):
@@ -161,6 +162,27 @@ class WorkflowTask(BaseTask):
             return super(WorkflowTask, self).__getattribute__(item)
 
 
+def create_task(actor, interface_name, operation_name, **kwargs):
+    """
+    This helper function enables safe creation of OperationTask, if the supplied interface and 
+    operation have no implementation, None is returned.
+    :param node: 
+    :param interface_name: 
+    :param operation_name: 
+    :param kwargs: 
+    :return: 
+    """
+    try:
+        return OperationTask(
+            actor,
+            interface_name=interface_name,
+            operation_name=operation_name,
+            **kwargs
+        )
+    except exceptions.OperationNotFoundException:
+        return None
+
+
 def create_relationships_tasks(
         node, interface_name, source_operation_name=None, target_operation_name=None, **kwargs):
     """
@@ -180,7 +202,7 @@ def create_relationships_tasks(
             source_operation_name=source_operation_name,
             target_operation_name=target_operation_name,
             **kwargs)
-        sub_tasks.append(relationship_operations)
+        sub_tasks.append(r for r in relationship_operations)
     return sub_tasks
 
 
@@ -197,7 +219,7 @@ def create_relationship_tasks(relationship, interface_name, source_operation_nam
     operations = []
     if source_operation_name:
         operations.append(
-            OperationTask(
+            create_task(
                 relationship,
                 interface_name=interface_name,
                 operation_name=source_operation_name,
@@ -206,7 +228,7 @@ def create_relationship_tasks(relationship, interface_name, source_operation_nam
         )
     if target_operation_name:
         operations.append(
-            OperationTask(
+            create_task(
                 relationship,
                 interface_name=interface_name,
                 operation_name=target_operation_name,

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1303f092/aria/orchestrator/workflows/builtin/workflows.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/builtin/workflows.py b/aria/orchestrator/workflows/builtin/workflows.py
index 1fc9eed..b286e98 100644
--- a/aria/orchestrator/workflows/builtin/workflows.py
+++ b/aria/orchestrator/workflows/builtin/workflows.py
@@ -69,14 +69,14 @@ __all__ = (
 @workflow(suffix_template='{node.name}')
 def install_node(graph, node, **kwargs):
     # Create
-    sequence = [task.OperationTask(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_CREATE)]
+    sequence = [task.create_task(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_CREATE)]
 
     # Configure
     sequence += task.create_relationships_tasks(node,
                                                 NORMATIVE_CONFIGURE_INTERFACE,
                                                 NORMATIVE_PRE_CONFIGURE_SOURCE,
                                                 NORMATIVE_PRE_CONFIGURE_TARGET)
-    sequence.append(task.OperationTask(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_CONFIGURE))
+    sequence.append(task.create_task(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_CONFIGURE))
     sequence += task.create_relationships_tasks(node,
                                                 NORMATIVE_CONFIGURE_INTERFACE,
                                                 NORMATIVE_POST_CONFIGURE_SOURCE,
@@ -93,7 +93,7 @@ def uninstall_node(graph, node, **kwargs):
     sequence = _create_stop_tasks(node)
 
     # Delete
-    sequence.append(task.OperationTask(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_DELETE))
+    sequence.append(task.create_task(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_DELETE))
 
     graph.sequence(*sequence)
 
@@ -109,7 +109,7 @@ def stop_node(graph, node, **kwargs):
 
 
 def _create_start_tasks(node):
-    sequence = [task.OperationTask(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_START)]
+    sequence = [task.create_task(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_START)]
     sequence += task.create_relationships_tasks(node,
                                                 NORMATIVE_CONFIGURE_INTERFACE,
                                                 NORMATIVE_ADD_SOURCE, NORMATIVE_ADD_TARGET)
@@ -117,7 +117,7 @@ def _create_start_tasks(node):
 
 
 def _create_stop_tasks(node):
-    sequence = [task.OperationTask(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_STOP)]
+    sequence = [task.create_task(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_STOP)]
     sequence += task.create_relationships_tasks(node,
                                                 NORMATIVE_CONFIGURE_INTERFACE,
                                                 NORMATIVE_REMOVE_SOURCE, NORMATIVE_REMOVE_TARGET)

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1303f092/aria/orchestrator/workflows/core/translation.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/core/translation.py b/aria/orchestrator/workflows/core/translation.py
index d764024..7362d5a 100644
--- a/aria/orchestrator/workflows/core/translation.py
+++ b/aria/orchestrator/workflows/core/translation.py
@@ -49,7 +49,7 @@ def build_execution_graph(
             default=[start_task])
 
         if isinstance(api_task, api.task.OperationTask):
-            if api_task.is_empty:
+            if api_task.has_implementation:
                 operation_task = core_task.OperationTask(api_task)
             else:
                 operation_task = core_task.OperationTask(api_task, executor=default_executor)

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1303f092/aria/orchestrator/workflows/events_logging.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/events_logging.py b/aria/orchestrator/workflows/events_logging.py
index b031146..9913012 100644
--- a/aria/orchestrator/workflows/events_logging.py
+++ b/aria/orchestrator/workflows/events_logging.py
@@ -36,12 +36,9 @@ def _get_task_name(task):
 @events.start_task_signal.connect
 def _start_task_handler(task, **kwargs):
     # If the task has not implementation this is an empty task.
-    if task.implementation:
-        task.context.logger.debug('{name} {task.interface_name}.{task.operation_name} has no '
-                                  'implementation'.format(name=_get_task_name(task), task=task))
-    else:
-        task.context.logger.info('{name} {task.interface_name}.{task.operation_name} started...'
-                                 .format(name=_get_task_name(task), task=task))
+    suffix = 'started...' if task.implementation else 'has no implementation'
+    task.context.logger.debug('{name} {task.interface_name}.{task.operation_name} {suffix}'
+                              .format(name=_get_task_name(task), task=task, suffix=suffix))
 
 
 @events.on_success_task_signal.connect

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1303f092/tests/orchestrator/workflows/core/test_engine.py
----------------------------------------------------------------------
diff --git a/tests/orchestrator/workflows/core/test_engine.py b/tests/orchestrator/workflows/core/test_engine.py
index c9911dc..2a5dd8c 100644
--- a/tests/orchestrator/workflows/core/test_engine.py
+++ b/tests/orchestrator/workflows/core/test_engine.py
@@ -60,36 +60,34 @@ class BaseTest(object):
             inputs=None,
             max_attempts=None,
             retry_interval=None,
-            ignore_failure=None,
-            is_stub=False):
+            ignore_failure=None):
         node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME)
+        interface_name = 'aria.interfaces.lifecycle'
 
-        if not is_stub:
+        if func:
             operation_kwargs = dict(implementation='{name}.{func.__name__}'.format(
                 name=__name__, func=func))
             if inputs:
                 # the operation has to declare the inputs before those may be passed
                 operation_kwargs['inputs'] = inputs
 
-            interface = mock.models.create_interface(
-                node.service,
-                'aria.interfaces.lifecycle',
-                'create',
-                operation_kwargs=operation_kwargs
-            )
+            operation_name = 'create'
+            interface = mock.models.create_interface(node.service, interface_name, operation_name,
+                                                     operation_kwargs=operation_kwargs)
         else:
-            interface = mock.models.create_interface(
-                node.service,
-                'aria.interfaces.lifecycle',
-                'create',
-            )
+            operation_name = 'configure'
+            interface = mock.models.create_interface(node.service, interface_name, operation_name)
 
-        node.interfaces[interface.name] = interface
+        if interface.name not in node.interfaces:
+            node.interfaces[interface.name] = interface
+        else:
+            node.interfaces[interface.name].operations[operation_name] = \
+                interface.operations[operation_name]
 
         return api.task.OperationTask(
             node,
             interface_name='aria.interfaces.lifecycle',
-            operation_name='create',
+            operation_name=operation_name,
             inputs=inputs or {},
             max_attempts=max_attempts,
             retry_interval=retry_interval,
@@ -218,7 +216,7 @@ class TestEngine(BaseTest):
         @workflow
         def sub_workflow(ctx, graph):
             op1 = self._op(ctx, func=mock_ordered_task, inputs={'counter': 1})
-            op2 = self._op(ctx, is_stub=True)
+            op2 = self._op(ctx)
             op3 = self._op(ctx, func=mock_ordered_task, inputs={'counter': 2})
             graph.sequence(op1, op2, op3)