ARIA-160 Operation toolbelt unit tests fail spordically Inroduced a filesystem based data holder
Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/45c158ef Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/45c158ef Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/45c158ef Branch: refs/heads/ARIA-208-Missing-back-refrences-for-models Commit: 45c158eff0d7ea97be0937cba9009522733948ae Parents: 1cb3086 Author: max-orlov <[email protected]> Authored: Wed May 3 12:42:27 2017 +0300 Committer: max-orlov <[email protected]> Committed: Sun May 7 14:59:29 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/45c158ef/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/45c158ef/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/45c158ef/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/45c158ef/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)
