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()
