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/07 11:59:19 UTC

[3/3] incubator-ariatosca git commit: Operation toolbelt unit tests fail spordically

Operation toolbelt unit tests fail spordically


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

Branch: refs/heads/ARIA-160-Operation-toolbelt-unit-tests-fail-spordically
Commit: 912ef164c37376c0e94786dfe09b14547308d84f
Parents: 1cb3086
Author: max-orlov <ma...@gigaspaces.com>
Authored: Wed May 3 12:42:27 2017 +0300
Committer: max-orlov <ma...@gigaspaces.com>
Committed: Sun May 7 14:59:00 2017 +0300

----------------------------------------------------------------------
 aria/orchestrator/workflows/core/task.py     |  5 +-
 tests/helpers.py                             | 38 ++++++++++
 tests/orchestrator/context/test_operation.py | 87 +++++++++++++----------
 tests/orchestrator/context/test_toolbelt.py  | 18 +++--
 4 files changed, 100 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/912ef164/aria/orchestrator/workflows/core/task.py
----------------------------------------------------------------------
diff --git a/aria/orchestrator/workflows/core/task.py b/aria/orchestrator/workflows/core/task.py
index 0e081c2..78159c4 100644
--- a/aria/orchestrator/workflows/core/task.py
+++ b/aria/orchestrator/workflows/core/task.py
@@ -175,10 +175,9 @@ class OperationTask(BaseTask):
         self._update_fields = {}
         try:
             yield
-            task = self.model_task
             for key, value in self._update_fields.items():
-                setattr(task, key, value)
-            self.model_task = task
+                setattr(self.model_task, key, value)
+            self.model_task = self.model_task
         finally:
             self._update_fields = None
 

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/912ef164/tests/helpers.py
----------------------------------------------------------------------
diff --git a/tests/helpers.py b/tests/helpers.py
index 472d696..423e63f 100644
--- a/tests/helpers.py
+++ b/tests/helpers.py
@@ -14,6 +14,8 @@
 # limitations under the License.
 
 import os
+import tempfile
+import json
 
 from . import ROOT_DIR
 from .resources import DIR as RESOURCES_DIR
@@ -29,3 +31,39 @@ def get_resource_uri(*args):
 
 def get_service_template_uri(*args):
     return os.path.join(RESOURCES_DIR, 'service-templates', *args)
+
+
+class FilesystemDataHolder(object):
+    _tmpfile = tempfile.NamedTemporaryFile('w')
+
+    def _load(self):
+        return json.load(open(self._tmpfile.name))
+
+    def _dump(self, value):
+        return json.dump(value, open(self._tmpfile.name, 'w'))
+
+    def __init__(self):
+        self.clear()
+
+    def __setitem__(self, key, value):
+        dict_ = self._load()
+        dict_[key] = value
+        self._dump(dict_)
+
+    def __getitem__(self, item):
+        return self._load()[item]
+
+    def __iter__(self):
+        return iter(self._load())
+
+    def clear(self):
+        self._dump({})
+
+    def get(self, item, default=None):
+        return self._load().get(item, default)
+
+    def setdefault(self, key, value):
+        dict_ = self._load()
+        return_value = dict_.setdefault(key, value)
+        self._dump(dict_)
+        return return_value

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/912ef164/tests/orchestrator/context/test_operation.py
----------------------------------------------------------------------
diff --git a/tests/orchestrator/context/test_operation.py b/tests/orchestrator/context/test_operation.py
index 971e0db..3180d89 100644
--- a/tests/orchestrator/context/test_operation.py
+++ b/tests/orchestrator/context/test_operation.py
@@ -28,14 +28,17 @@ from aria.orchestrator import context
 from aria.orchestrator.workflows import api
 
 import tests
-from tests import mock, storage
+from tests import (
+    mock,
+    storage,
+    helpers
+)
 from . import (
     op_path,
     execute,
 )
 
-global_test_holder = {}
-
+global_test_holder = helpers.FilesystemDataHolder()
 
 @pytest.fixture
 def ctx(tmpdir):
@@ -75,7 +78,7 @@ def test_node_operation_task_execution(ctx, thread_executor):
         node.service,
         interface_name,
         operation_name,
-        operation_kwargs=dict(implementation=op_path(basic_operation, module_path=__name__),
+        operation_kwargs=dict(implementation=op_path(basic_node_operation, module_path=__name__),
                               inputs=inputs)
     )
     node.interfaces[interface.name] = interface
@@ -94,18 +97,11 @@ def test_node_operation_task_execution(ctx, thread_executor):
 
     execute(workflow_func=basic_workflow, workflow_context=ctx, executor=thread_executor)
 
-    operation_context = global_test_holder[api.task.OperationTask.NAME_FORMAT.format(
-        type='node',
-        name=node.name,
-        interface=interface_name,
-        operation=operation_name
-    )]
-
-    assert isinstance(operation_context, context.operation.NodeOperationContext)
+    assert global_test_holder['ctx_name'] == context.operation.NodeOperationContext.__name__
 
     # Task bases assertions
-    assert operation_context.task.actor == node
-    assert operation_context.task.name == api.task.OperationTask.NAME_FORMAT.format(
+    assert global_test_holder['actor_name'] == node.name
+    assert global_test_holder['task_name'] == api.task.OperationTask.NAME_FORMAT.format(
         type='node',
         name=node.name,
         interface=interface_name,
@@ -113,12 +109,12 @@ def test_node_operation_task_execution(ctx, thread_executor):
     )
     operations = interface.operations
     assert len(operations) == 1
-    assert operation_context.task.implementation == operations.values()[0].implementation           # pylint: disable=no-member
-    assert operation_context.task.inputs['putput'].value is True
+    assert global_test_holder['implementation'] == operations.values()[0].implementation             # pylint: disable=no-member
+    assert global_test_holder['inputs']['putput'] is True
 
     # Context based attributes (sugaring)
-    assert operation_context.node_template == node.node_template
-    assert operation_context.node == node
+    assert global_test_holder['template_name'] == node.node_template.name
+    assert global_test_holder['node_name'] == node.name
 
 
 def test_relationship_operation_task_execution(ctx, thread_executor):
@@ -131,7 +127,8 @@ def test_relationship_operation_task_execution(ctx, thread_executor):
         relationship.source_node.service,
         interface_name,
         operation_name,
-        operation_kwargs=dict(implementation=op_path(basic_operation, module_path=__name__),
+        operation_kwargs=dict(implementation=op_path(basic_relationship_operation,
+                                                     module_path=__name__),
                               inputs=inputs),
     )
 
@@ -151,21 +148,14 @@ def test_relationship_operation_task_execution(ctx, thread_executor):
 
     execute(workflow_func=basic_workflow, workflow_context=ctx, executor=thread_executor)
 
-    operation_context = global_test_holder[api.task.OperationTask.NAME_FORMAT.format(
-        type='relationship',
-        name=relationship.name,
-        interface=interface_name,
-        operation=operation_name
-    )]
-
-    assert isinstance(operation_context, context.operation.RelationshipOperationContext)
+    assert global_test_holder['ctx_name'] == context.operation.RelationshipOperationContext.__name__
 
     # Task bases assertions
-    assert operation_context.task.actor == relationship
-    assert interface_name in operation_context.task.name
+    assert global_test_holder['actor_name'] == relationship.name
+    assert interface_name in global_test_holder['task_name']
     operations = interface.operations
-    assert operation_context.task.implementation == operations.values()[0].implementation           # pylint: disable=no-member
-    assert operation_context.task.inputs['putput'].value is True
+    assert global_test_holder['implementation'] == operations.values()[0].implementation           # pylint: disable=no-member
+    assert global_test_holder['inputs']['putput'] is True
 
     # Context based attributes (sugaring)
     dependency_node_template = ctx.model.node_template.get_by_name(
@@ -175,11 +165,11 @@ def test_relationship_operation_task_execution(ctx, thread_executor):
         mock.models.DEPENDENT_NODE_TEMPLATE_NAME)
     dependent_node = ctx.model.node.get_by_name(mock.models.DEPENDENT_NODE_NAME)
 
-    assert operation_context.target_node_template == dependency_node_template
-    assert operation_context.target_node == dependency_node
-    assert operation_context.relationship == relationship
-    assert operation_context.source_node_template == dependent_node_template
-    assert operation_context.source_node == dependent_node
+    assert global_test_holder['target_node_template_name'] == dependency_node_template.name
+    assert global_test_holder['target_node_name'] == dependency_node.name
+    assert global_test_holder['relationship_name'] == relationship.name
+    assert global_test_holder['source_node_template_name'] == dependent_node_template.name
+    assert global_test_holder['source_node_name'] == dependent_node.name
 
 
 def test_invalid_task_operation_id(ctx, thread_executor):
@@ -386,8 +376,29 @@ def logged_operation(ctx, **_):
 
 
 @operation
-def basic_operation(ctx, **_):
-    global_test_holder[ctx.name] = ctx
+def basic_node_operation(ctx, **_):
+    operation_common(ctx)
+    global_test_holder['template_name'] = ctx.node_template.name
+    global_test_holder['node_name'] = ctx.node.name
+
+
+@operation
+def basic_relationship_operation(ctx, **_):
+    operation_common(ctx)
+    global_test_holder['target_node_template_name'] = ctx.target_node_template.name
+    global_test_holder['target_node_name'] = ctx.target_node.name
+    global_test_holder['relationship_name'] = ctx.relationship.name
+    global_test_holder['source_node_template_name'] = ctx.source_node_template.name
+    global_test_holder['source_node_name'] = ctx.source_node.name
+
+
+def operation_common(ctx):
+    global_test_holder['ctx_name'] = ctx.__class__.__name__
+
+    global_test_holder['actor_name'] = ctx.task.actor.name
+    global_test_holder['task_name'] = ctx.task.name
+    global_test_holder['implementation'] = ctx.task.implementation
+    global_test_holder['inputs'] = dict(i.unwrap() for i in ctx.task.inputs.values())
 
 
 @operation

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/912ef164/tests/orchestrator/context/test_toolbelt.py
----------------------------------------------------------------------
diff --git a/tests/orchestrator/context/test_toolbelt.py b/tests/orchestrator/context/test_toolbelt.py
index ecc3ac2..822ac5a 100644
--- a/tests/orchestrator/context/test_toolbelt.py
+++ b/tests/orchestrator/context/test_toolbelt.py
@@ -19,15 +19,18 @@ from aria import workflow, operation
 from aria.orchestrator import context
 from aria.orchestrator.workflows import api
 from aria.orchestrator.workflows.executor import thread
-from aria.orchestrator.context.toolbelt import RelationshipToolBelt
 
-from tests import mock, storage
+from tests import (
+    mock,
+    storage,
+    helpers
+)
 from . import (
     op_path,
     execute,
 )
 
-global_test_holder = {}
+global_test_holder = helpers.FilesystemDataHolder()
 
 
 @pytest.fixture
@@ -85,6 +88,8 @@ def test_host_ip(workflow_context, executor):
                               inputs=inputs)
     )
     dependency_node.interfaces[interface.name] = interface
+    dependency_node.runtime_properties['ip'] = '1.1.1.1'
+
     workflow_context.model.node.update(dependency_node)
 
     @workflow
@@ -131,12 +136,11 @@ def test_relationship_tool_belt(workflow_context, executor):
 
     execute(workflow_func=basic_workflow, workflow_context=workflow_context, executor=executor)
 
-    assert isinstance(global_test_holder.get(api.task.OperationTask.NAME_FORMAT.format(
+    assert global_test_holder.get(api.task.OperationTask.NAME_FORMAT.format(
         type='relationship',
         name=relationship.name,
         interface=interface_name,
-        operation=operation_name
-    )), RelationshipToolBelt)
+        operation=operation_name)) == relationship.source_node.name
 
 
 def test_wrong_model_toolbelt():
@@ -151,7 +155,7 @@ def host_ip(toolbelt, **_):
 
 @operation(toolbelt=True)
 def relationship_operation(ctx, toolbelt, **_):
-    global_test_holder[ctx.name] = toolbelt
+    global_test_holder[ctx.name] = toolbelt._op_context.source_node.name
 
 
 @pytest.fixture(autouse=True)