deleted different attributes from operation context

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

Branch: refs/heads/ARIA-9-API-for-operation-context
Commit: 1f67ebcba3117817b6d200f2782406e685958831
Parents: 84d4840
Author: mxmrlv <[email protected]>
Authored: Sun Nov 13 15:43:26 2016 +0200
Committer: mxmrlv <[email protected]>
Committed: Sun Nov 13 15:43:26 2016 +0200

----------------------------------------------------------------------
 aria/context/__init__.py    |  2 +-
 aria/context/operation.py   | 23 +++++---------
 aria/context/toolbelt.py    | 57 ++++++++++++++++++++++++++--------
 aria/decorators.py          | 10 +++---
 aria/workflows/api/task.py  |  7 ++++-
 aria/workflows/core/task.py |  2 +-
 tests/context/operation.py  | 12 ++++---
 tests/context/toolbelt.py   | 67 ++++++++++++++++++++++++++++++++++------
 tests/mock/models.py        |  2 +-
 9 files changed, 132 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1f67ebcb/aria/context/__init__.py
----------------------------------------------------------------------
diff --git a/aria/context/__init__.py b/aria/context/__init__.py
index fa5fbda..ad89b13 100644
--- a/aria/context/__init__.py
+++ b/aria/context/__init__.py
@@ -18,4 +18,4 @@ Provides contexts to workflow and operation
 """
 
 from . import workflow, operation
-from .toolbelt import tool_belt
+from .toolbelt import toolbelt

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1f67ebcb/aria/context/operation.py
----------------------------------------------------------------------
diff --git a/aria/context/operation.py b/aria/context/operation.py
index 908287d..3508a3d 100644
--- a/aria/context/operation.py
+++ b/aria/context/operation.py
@@ -26,7 +26,7 @@ class BaseOperationContext(BaseContext):
     Context object used during operation creation and execution
     """
 
-    def __init__(self, name, workflow_context, task_context, **kwargs):
+    def __init__(self, name, workflow_context, task, **kwargs):
         super(BaseOperationContext, self).__init__(
             name=name,
             model_storage=workflow_context.model,
@@ -37,7 +37,8 @@ class BaseOperationContext(BaseContext):
             parameters=workflow_context.parameters,
             **kwargs)
         self._workflow_context = workflow_context
-        self._task_model = task_context
+        self._task_model = task
+        self._operation_container = self.task.operation_container
 
     def __repr__(self):
         details = ', '.join(
@@ -46,27 +47,19 @@ class BaseOperationContext(BaseContext):
         return '{name}({0})'.format(details, name=self.name)
 
     @property
-    def workflow(self):
-        return self._workflow_context
-
-    @property
     def task(self):
         return self._task_model
 
-    @property
-    def operation_container(self):
-        return self.task.operation_container
-
 
 class NodeOperationContext(BaseOperationContext):
 
     @property
     def node(self):
-        return self.operation_container.node
+        return self._operation_container.node
 
     @property
     def node_instance(self):
-        return self.operation_container
+        return self._operation_container
 
 
 class RelationshipOperationContext(BaseOperationContext):
@@ -85,12 +78,12 @@ class RelationshipOperationContext(BaseOperationContext):
 
     @property
     def target_node_instance(self):
-        return self.model.node_instance.get(self.operation_container.target_id)
+        return 
self.model.node_instance.get(self._operation_container.target_id)
 
     @property
     def relationship(self):
-        return self.operation_container.relationship
+        return self._operation_container.relationship
 
     @property
     def relationship_instance(self):
-        return self.operation_container
+        return self._operation_container

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1f67ebcb/aria/context/toolbelt.py
----------------------------------------------------------------------
diff --git a/aria/context/toolbelt.py b/aria/context/toolbelt.py
index 59e4d3c..3dfe713 100644
--- a/aria/context/toolbelt.py
+++ b/aria/context/toolbelt.py
@@ -17,12 +17,28 @@ from contextlib import contextmanager
 from . import operation
 
 
-class _ToolBelt(object):
+class _Toolbelt(object):
 
     def __init__(self):
         self._op_context = None
         self._workflow_context = None
 
+    @contextmanager
+    def use(self, operation_context):
+        assert isinstance(operation_context, operation.BaseOperationContext)
+        _op_context = self._op_context
+        _workflow_context = self._workflow_context
+
+        self._op_context = operation_context
+        self._workflow_context = operation_context._workflow_context
+        try:
+            yield self
+        finally:
+            self._op_context = _op_context
+            self._workflow_context = _workflow_context
+
+
+class _OperationToolBelt(_Toolbelt):
     @property
     def node_instances_connected_to_me(self):
         assert isinstance(self._op_context, operation.NodeOperationContext)
@@ -39,18 +55,33 @@ class _ToolBelt(object):
                 if relationship_instance.target_id == 
self._op_context.node_instance.id:
                     yield relationship_instance
 
-    @contextmanager
-    def use(self, operation_context):
-        assert isinstance(operation_context, operation.BaseOperationContext)
-        self._op_context = operation_context
-        self._workflow_context = operation_context.workflow
-        try:
-            yield self
-        finally:
-            self._op_context = None
-            self._workflow_context = None
+    @property
+    def host_ip(self):
+        assert isinstance(self._op_context, operation.NodeOperationContext)
+        host_id = self._op_context._operation_container.host_id
+        host_instance = self._workflow_context.model.node_instance.get(host_id)
+        return host_instance.runtime_properties.get('ip')
+
+
+class _RelationshipToolBelt(_Toolbelt):
+
+    @property
+    def source_node(self):
+        return self.source_node_instance.node
+
+    @property
+    def source_node_instance(self):
+        for node_instance in self._workflow_context.node_instances:
+            if self._op_context._operation_container in 
node_instance.relationship_instances:
+                return node_instance
+
 
-_toolbelt = _ToolBelt()
+_operation_toolbelt = _OperationToolBelt()
+_relationship_toolbelt = _RelationshipToolBelt()
 
 
-tool_belt = _toolbelt.use
+def toolbelt(operation_context):
+    if isinstance(operation_context, operation.NodeOperationContext):
+        return _operation_toolbelt.use(operation_context)
+    elif isinstance(operation_context, operation.RelationshipOperationContext):
+        return _relationship_toolbelt.use(operation_context)

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1f67ebcb/aria/decorators.py
----------------------------------------------------------------------
diff --git a/aria/decorators.py b/aria/decorators.py
index d826c2d..219f3c4 100644
--- a/aria/decorators.py
+++ b/aria/decorators.py
@@ -50,18 +50,18 @@ def workflow(func=None, suffix_template=''):
     return _wrapper
 
 
-def operation(func=None, tool_belt=False, suffix_template=''):
+def operation(func=None, toolbelt=False, suffix_template=''):
     """
     Operation decorator
     """
     if func is None:
-        return partial(operation, suffix_template=suffix_template, 
tool_belt=tool_belt)
+        return partial(operation, suffix_template=suffix_template, 
toolbelt=toolbelt)
 
     @wraps(func)
     def _wrapper(**func_kwargs):
-        with context.tool_belt(func_kwargs.get('ctx')) as tb:
-            if tool_belt:
-                func_kwargs.setdefault('tool_belt', tb)
+        with context.toolbelt(func_kwargs.get('ctx')) as tb:
+            if toolbelt:
+                func_kwargs.setdefault('toolbelt', tb)
             validate_function_arguments(func, func_kwargs)
             return func(**func_kwargs)
     return _wrapper

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1f67ebcb/aria/workflows/api/task.py
----------------------------------------------------------------------
diff --git a/aria/workflows/api/task.py b/aria/workflows/api/task.py
index 7f5430a..a983dce 100644
--- a/aria/workflows/api/task.py
+++ b/aria/workflows/api/task.py
@@ -18,7 +18,10 @@ Provides the tasks to be enterd into the task graph
 """
 from uuid import uuid4
 
-from ... import context
+from ... import (
+    context,
+    storage,
+)
 
 
 class BaseTask(object):
@@ -66,6 +69,8 @@ class OperationTask(BaseTask):
         :param operation_container: the operation host on which this operation 
is registered.
         :param inputs: operation inputs.
         """
+        assert isinstance(operation_container, (storage.models.NodeInstance,
+                                                
storage.models.RelationshipInstance))
         super(OperationTask, self).__init__()
         self.name = name
         self.operation_details = operation_details

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1f67ebcb/aria/workflows/core/task.py
----------------------------------------------------------------------
diff --git a/aria/workflows/core/task.py b/aria/workflows/core/task.py
index 075ef8a..41a9968 100644
--- a/aria/workflows/core/task.py
+++ b/aria/workflows/core/task.py
@@ -124,7 +124,7 @@ class OperationTask(BaseTask):
 
         self._ctx = context_class(name=api_task.name,
                                   workflow_context=self.workflow_context,
-                                  task_context=operation_task)
+                                  task=operation_task)
 
         self.workflow_context.model.task.store(operation_task)
         self._task_id = operation_task.id

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1f67ebcb/tests/context/operation.py
----------------------------------------------------------------------
diff --git a/tests/context/operation.py b/tests/context/operation.py
index 7422ce6..d98b248 100644
--- a/tests/context/operation.py
+++ b/tests/context/operation.py
@@ -15,7 +15,7 @@
 
 import sys
 
-from aria import workflow, operation
+from aria import workflow, operation, context
 from aria.workflows import api
 
 from .. import mock
@@ -30,7 +30,7 @@ def test_node_operation_task_execution(workflow_context, 
executor):
 
     node_instance = 
workflow_context.model.node_instance.get(mock.models.DEPENDENCY_NODE_INSTANCE_ID)
     name = 'op_name'
-    operation_details = {'operation': op_path(foo, 
module_path=sys.modules[__name__].__name__)}
+    operation_details = {'operation': op_path(my_operation, 
module_path=sys.modules[__name__].__name__)}
     inputs = {'putput': True}
 
     @workflow
@@ -48,6 +48,8 @@ def test_node_operation_task_execution(workflow_context, 
executor):
 
     operation_value = global_test_holder[name]
 
+    assert isinstance(operation_value, context.operation.NodeOperationContext)
+
     # operation container based attributes
     for key, value in node_instance.fields_dict.items():
         assert getattr(operation_value.operation_container, key) == value
@@ -80,7 +82,7 @@ def 
test_relationship_operation_task_execution(workflow_context, executor):
     workflow_context.model.node_instance.store(dependent_node_instance)
 
     name = 'op_name'
-    operation_details = {'operation': op_path(foo, 
module_path=sys.modules[__name__].__name__)}
+    operation_details = {'operation': op_path(my_operation, 
module_path=sys.modules[__name__].__name__)}
     inputs = {'putput': True}
 
     @workflow
@@ -98,6 +100,8 @@ def 
test_relationship_operation_task_execution(workflow_context, executor):
 
     operation_value = global_test_holder[name]
 
+    assert isinstance(operation_value, 
context.operation.RelationshipOperationContext)
+
     # operation container based attributes
     for key, value in relationship_instance.fields_dict.items():
         assert getattr(operation_value.operation_container, key) == value
@@ -116,6 +120,6 @@ def 
test_relationship_operation_task_execution(workflow_context, executor):
 
 
 @operation
-def foo(ctx, **_):
+def my_operation(ctx, **_):
     global_test_holder[ctx.name] = ctx
 

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1f67ebcb/tests/context/toolbelt.py
----------------------------------------------------------------------
diff --git a/tests/context/toolbelt.py b/tests/context/toolbelt.py
index b46fcad..2cc5f90 100644
--- a/tests/context/toolbelt.py
+++ b/tests/context/toolbelt.py
@@ -16,7 +16,7 @@
 import sys
 
 from aria.workflows import api
-from aria import workflow, operation
+from aria import workflow, operation, context
 
 from .. import mock
 from . import op_path, execute, executor, workflow_context, global_test_holder
@@ -39,9 +39,9 @@ def test_operation_tool_belt(workflow_context, executor):
     workflow_context.model.node.store(dependent_node)
     workflow_context.model.node_instance.store(dependent_node_instance)
 
-    node_instance = 
workflow_context.model.node_instance.get(mock.models.DEPENDENCY_NODE_INSTANCE_ID)
     name = 'op_name'
-    operation_details = {'operation': op_path(foo, 
module_path=sys.modules[__name__].__name__)}
+    operation_details = {'operation': op_path(node_operation,
+                                              
module_path=sys.modules[__name__].__name__)}
     inputs = {'putput': True}
 
     @workflow
@@ -50,7 +50,7 @@ def test_operation_tool_belt(workflow_context, executor):
             api.task.OperationTask(
                 name=name,
                 operation_details=operation_details,
-                operation_container=node_instance,
+                operation_container=dependency_node_instance,
                 inputs=inputs
             )
         )
@@ -59,11 +59,60 @@ def test_operation_tool_belt(workflow_context, executor):
 
     assert list(global_test_holder.get('connected_to_me', [])) == 
list([dependent_node_instance])
     assert list(global_test_holder.get('relationships_to_me', [])) == 
list([relationship_instance])
+    assert global_test_holder.get('ip') == 
dependency_node_instance.runtime_properties.get('ip')
 
 
-@operation(tool_belt=True)
-def foo(ctx, tool_belt, **_):
-    global_test_holder['connected_to_me'] = 
list(tool_belt.node_instances_connected_to_me)
-    global_test_holder['relationships_to_me'] = 
list(tool_belt.relationships_to_me)
-    global_test_holder[ctx.name] = tool_belt
+def test_relationship_tool_belt(workflow_context, executor):
+    dependency_node = mock.models.get_dependency_node()
+    dependency_node_instance = \
+        
mock.models.get_dependency_node_instance(dependency_node=dependency_node)
+    relationship = mock.models.get_relationship(target=dependency_node)
+    relationship_instance = \
+        
mock.models.get_relationship_instance(target_instance=dependency_node_instance,
+                                              relationship=relationship)
+    dependent_node = mock.models.get_dependent_node(relationship=relationship)
+    dependent_node_instance = \
+        
mock.models.get_dependent_node_instance(relationship_instance=relationship_instance,
+                                                dependent_node=dependent_node)
+    workflow_context.model.node.store(dependency_node)
+    workflow_context.model.node_instance.store(dependency_node_instance)
+    workflow_context.model.relationship.store(relationship)
+    workflow_context.model.relationship_instance.store(relationship_instance)
+    workflow_context.model.node.store(dependent_node)
+    workflow_context.model.node_instance.store(dependent_node_instance)
+
+    name = 'op_name'
+    operation_details = {'operation': op_path(relationship_operation,
+                                              
module_path=sys.modules[__name__].__name__)}
+    inputs = {'putput': True}
+
+    @workflow
+    def basic_workflow(graph, **_):
+        graph.add_tasks(
+            api.task.OperationTask(
+                name=name,
+                operation_details=operation_details,
+                operation_container=relationship_instance,
+                inputs=inputs
+            )
+        )
+
+    execute(workflow_func=basic_workflow, workflow_context=workflow_context, 
executor=executor)
+
+    assert global_test_holder.get('relationship_source_node') == dependent_node
+    assert global_test_holder.get('relationship_source_node_instance') == 
dependent_node_instance
+
+
+@operation(toolbelt=True)
+def node_operation(toolbelt, **_):
+    global_test_holder['connected_to_me'] = 
list(toolbelt.node_instances_connected_to_me)
+    global_test_holder['relationships_to_me'] = 
list(toolbelt.relationships_to_me)
+    global_test_holder['ip'] = toolbelt.host_ip
+
+
+@operation(toolbelt=True)
+def relationship_operation(toolbelt, **_):
+    global_test_holder['relationship_source_node'] = toolbelt.source_node
+    global_test_holder['relationship_source_node_instance'] = 
toolbelt.source_node_instance
+
 

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1f67ebcb/tests/mock/models.py
----------------------------------------------------------------------
diff --git a/tests/mock/models.py b/tests/mock/models.py
index 66a902d..d0a9b2f 100644
--- a/tests/mock/models.py
+++ b/tests/mock/models.py
@@ -53,7 +53,7 @@ def get_dependency_node_instance(dependency_node=None):
         id=DEPENDENCY_NODE_INSTANCE_ID,
         host_id=DEPENDENCY_NODE_INSTANCE_ID,
         deployment_id=DEPLOYMENT_ID,
-        runtime_properties={},
+        runtime_properties={'ip': '1.1.1.1'},
         version=None,
         relationship_instances=[],
         node=dependency_node or get_dependency_node()

Reply via email to