http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/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 b2b67fc..6f97952 100644 --- a/tests/orchestrator/workflows/core/test_engine.py +++ b/tests/orchestrator/workflows/core/test_engine.py @@ -23,7 +23,7 @@ from aria.orchestrator import ( workflow, operation, ) -from aria.storage.modeling import model +from aria.modeling import models from aria.orchestrator.workflows import ( api, exceptions, @@ -60,15 +60,19 @@ class BaseTest(object): max_attempts=None, retry_interval=None, ignore_failure=None): - node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) - node.interfaces = [mock.models.get_interface( - 'aria.interfaces.lifecycle.create', + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface = mock.models.create_interface( + node.service, + 'aria.interfaces.lifecycle', + 'create', operation_kwargs=dict(implementation='{name}.{func.__name__}'.format(name=__name__, func=func)) - )] - return api.task.OperationTask.node( - instance=node, - name='aria.interfaces.lifecycle.create', + ) + node.interfaces[interface.name] = interface + return api.task.OperationTask.for_node( + node=node, + interface_name='aria.interfaces.lifecycle', + operation_name='create', inputs=inputs, max_attempts=max_attempts, retry_interval=retry_interval, @@ -147,7 +151,7 @@ class TestEngine(BaseTest): execution = workflow_context.execution assert execution.started_at <= execution.ended_at <= datetime.utcnow() assert execution.error is None - assert execution.status == model.Execution.TERMINATED + assert execution.status == models.Execution.TERMINATED def test_single_task_successful_execution(self, workflow_context, executor): @workflow @@ -176,7 +180,7 @@ class TestEngine(BaseTest): execution = workflow_context.execution assert execution.started_at <= execution.ended_at <= datetime.utcnow() assert execution.error is not None - assert execution.status == model.Execution.FAILED + assert execution.status == models.Execution.FAILED def test_two_tasks_execution_order(self, workflow_context, executor): @workflow @@ -241,7 +245,7 @@ class TestCancel(BaseTest): execution = workflow_context.execution assert execution.started_at <= execution.ended_at <= datetime.utcnow() assert execution.error is None - assert execution.status == model.Execution.CANCELLED + assert execution.status == models.Execution.CANCELLED def test_cancel_pending_execution(self, workflow_context, executor): @workflow @@ -252,7 +256,7 @@ class TestCancel(BaseTest): executor=executor) eng.cancel_execution() execution = workflow_context.execution - assert execution.status == model.Execution.CANCELLED + assert execution.status == models.Execution.CANCELLED class TestRetries(BaseTest):
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/orchestrator/workflows/core/test_task.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/core/test_task.py b/tests/orchestrator/workflows/core/test_task.py index 26564c5..f3ce92f 100644 --- a/tests/orchestrator/workflows/core/test_task.py +++ b/tests/orchestrator/workflows/core/test_task.py @@ -19,6 +19,7 @@ from datetime import ( import pytest +from aria.modeling import models from aria.orchestrator.context import workflow as workflow_context from aria.orchestrator.workflows import ( api, @@ -28,8 +29,10 @@ from aria.orchestrator.workflows import ( from tests import mock, storage -OP_NAME = 'tosca.interfaces.node.lifecycle.Standard.create' -RELATIONSHIP_OP_NAME = 'tosca.interfaces.relationship.Configure.pre_configure' +NODE_INTERFACE_NAME = 'Standard' +NODE_OPERATION_NAME = 'create' +RELATIONSHIP_INTERFACE_NAME = 'Configure' +RELATIONSHIP_OPERATION_NAME = 'pre_configure' @pytest.fixture @@ -37,15 +40,22 @@ def ctx(tmpdir): context = mock.context.simple(str(tmpdir)) relationship = context.model.relationship.list()[0] - relationship.interfaces = [ - mock.models.get_interface(RELATIONSHIP_OP_NAME, edge='source'), - mock.models.get_interface(RELATIONSHIP_OP_NAME, edge='target') - ] + interface = mock.models.create_interface( + relationship.source_node.service, + RELATIONSHIP_INTERFACE_NAME, + RELATIONSHIP_OPERATION_NAME + ) + relationship.interfaces[interface.name] = interface context.model.relationship.update(relationship) - dependent_node = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) - dependent_node.interfaces = [mock.models.get_interface(OP_NAME)] - context.model.node.update(dependent_node) + node = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface = mock.models.create_interface( + node.service, + NODE_INTERFACE_NAME, + NODE_OPERATION_NAME + ) + node.interfaces[interface.name] = interface + context.model.node.update(node) yield context storage.release_sqlite_storage(context.model) @@ -55,39 +65,49 @@ class TestOperationTask(object): def _create_node_operation_task(self, ctx, node): with workflow_context.current.push(ctx): - api_task = api.task.OperationTask.node( - instance=node, - name='tosca.interfaces.node.lifecycle.Standard.create') + api_task = api.task.OperationTask.for_node( + node=node, + interface_name=NODE_INTERFACE_NAME, + operation_name=NODE_OPERATION_NAME) core_task = core.task.OperationTask(api_task=api_task) return api_task, core_task - def _create_relationship_operation_task(self, ctx, relationship, operation_name, edge): + def _create_relationship_operation_task(self, ctx, relationship, runs_on): with workflow_context.current.push(ctx): - api_task = api.task.OperationTask.relationship( - instance=relationship, name=operation_name, edge=edge) + api_task = api.task.OperationTask.for_relationship( + relationship=relationship, + interface_name=RELATIONSHIP_INTERFACE_NAME, + operation_name=RELATIONSHIP_OPERATION_NAME, + runs_on=runs_on) core_task = core.task.OperationTask(api_task=api_task) return api_task, core_task def test_node_operation_task_creation(self, ctx): - storage_plugin = mock.models.get_plugin(package_name='p1', package_version='0.1') - storage_plugin_other = mock.models.get_plugin(package_name='p0', package_version='0.0') - ctx.model.plugin.put(storage_plugin_other) + storage_plugin = mock.models.create_plugin( + package_name='p1', package_version='0.1') + storage_plugin_specification = mock.models.create_plugin_specification( + package_name='p1', package_version='0.1') + storage_plugin_specification_other = mock.models.create_plugin( + package_name='p0', package_version='0.0') ctx.model.plugin.put(storage_plugin) - node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + ctx.model.plugin_specification.put(storage_plugin_specification_other) + ctx.model.plugin_specification.put(storage_plugin_specification) + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) node_template = node.node_template - plugin_name = 'plugin1' - node_template.plugins = [{'name': 'plugin1', - 'package_name': 'p1', - 'package_version': '0.1'}] - node.interfaces = [mock.models.get_interface( - 'tosca.interfaces.node.lifecycle.Standard.create', - operation_kwargs=dict(plugin='plugin1') - )] + node_template.plugin_specifications[storage_plugin_specification.name] = \ + storage_plugin_specification + interface = mock.models.create_interface( + node.service, + NODE_INTERFACE_NAME, + NODE_OPERATION_NAME, + operation_kwargs=dict(plugin_specification=storage_plugin_specification) + ) + node.interfaces[interface.name] = interface ctx.model.node_template.update(node_template) ctx.model.node.update(node) api_task, core_task = self._create_node_operation_task(ctx, node) storage_task = ctx.model.task.get_by_name(core_task.name) - assert storage_task.plugin_name == plugin_name + assert storage_task.plugin is storage_plugin assert storage_task.execution_name == ctx.execution.name assert storage_task.runs_on == core_task.context.node assert core_task.model_task == storage_task @@ -101,17 +121,17 @@ class TestOperationTask(object): relationship = ctx.model.relationship.list()[0] ctx.model.relationship.update(relationship) _, core_task = self._create_relationship_operation_task( - ctx, relationship, RELATIONSHIP_OP_NAME, 'source') + ctx, relationship, models.Task.RUNS_ON_SOURCE) assert core_task.model_task.runs_on == relationship.source_node def test_target_relationship_operation_task_creation(self, ctx): relationship = ctx.model.relationship.list()[0] _, core_task = self._create_relationship_operation_task( - ctx, relationship, RELATIONSHIP_OP_NAME, 'target') + ctx, relationship, models.Task.RUNS_ON_TARGET) assert core_task.model_task.runs_on == relationship.target_node def test_operation_task_edit_locked_attribute(self, ctx): - node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) _, core_task = self._create_node_operation_task(ctx, node) now = datetime.utcnow() @@ -127,7 +147,7 @@ class TestOperationTask(object): core_task.due_at = now def test_operation_task_edit_attributes(self, ctx): - node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) _, core_task = self._create_node_operation_task(ctx, node) future_time = datetime.utcnow() + timedelta(seconds=3) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py b/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py index 167004e..0a95d43 100644 --- a/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py +++ b/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py @@ -23,10 +23,16 @@ from tests import storage def test_task_graph_into_execution_graph(tmpdir): - operation_name = 'tosca.interfaces.node.lifecycle.Standard.create' + interface_name = 'Standard' + operation_name = 'create' task_context = mock.context.simple(str(tmpdir)) - node = task_context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) - node.interfaces = [mock.models.get_interface(operation_name)] + node = task_context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface = mock.models.create_interface( + node.service, + interface_name, + operation_name + ) + node.interfaces[interface.name] = interface task_context.model.node.update(node) def sub_workflow(name, **_): @@ -34,14 +40,17 @@ def test_task_graph_into_execution_graph(tmpdir): with context.workflow.current.push(task_context): test_task_graph = api.task.WorkflowTask(sub_workflow, name='test_task_graph') - simple_before_task = api.task.OperationTask.node(instance=node, - name=operation_name) - simple_after_task = api.task.OperationTask.node(instance=node, - name=operation_name) + simple_before_task = api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name) + simple_after_task = api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name) inner_task_graph = api.task.WorkflowTask(sub_workflow, name='test_inner_task_graph') - inner_task = api.task.OperationTask.node(instance=node, - name=operation_name) + inner_task = api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name) inner_task_graph.add_tasks(inner_task) test_task_graph.add_tasks(simple_before_task) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/orchestrator/workflows/executor/test_executor.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_executor.py b/tests/orchestrator/workflows/executor/test_executor.py index 8da801e..0a2280d 100644 --- a/tests/orchestrator/workflows/executor/test_executor.py +++ b/tests/orchestrator/workflows/executor/test_executor.py @@ -28,7 +28,7 @@ except ImportError: _celery = None app = None -from aria.storage.modeling import model +from aria.modeling import models from aria.orchestrator import events from aria.orchestrator.workflows.executor import ( thread, @@ -43,7 +43,8 @@ def test_execute(executor): expected_value = 'value' successful_task = MockTask(mock_successful_task) failing_task = MockTask(mock_failing_task) - task_with_inputs = MockTask(mock_task_with_input, inputs=dict(input='value')) + task_with_inputs = MockTask(mock_task_with_input, inputs={'input': models.Parameter.wrap( + 'input', 'value')}) for task in [successful_task, failing_task, task_with_inputs]: executor.execute(task) @@ -98,14 +99,15 @@ class MockContext(object): class MockTask(object): - INFINITE_RETRIES = model.Task.INFINITE_RETRIES + INFINITE_RETRIES = models.Task.INFINITE_RETRIES def __init__(self, func, inputs=None): self.states = [] self.exception = None self.id = str(uuid.uuid4()) name = func.__name__ - implementation = 'tests.orchestrator.workflows.executor.test_executor.{name}'.format( + implementation = '{module}.{name}'.format( + module=__name__, name=name) self.implementation = implementation self.logger = logging.getLogger() @@ -117,7 +119,7 @@ class MockTask(object): self.plugin_fk = None self.ignore_failure = False - for state in model.Task.STATES: + for state in models.Task.STATES: setattr(self, state.upper(), state) @contextmanager @@ -151,6 +153,7 @@ def register_signals(): def failure_handler(task, exception, *args, **kwargs): task.states.append('failure') task.exception = exception + events.start_task_signal.connect(start_handler) events.on_success_task_signal.connect(success_handler) events.on_failure_task_signal.connect(failure_handler) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/orchestrator/workflows/executor/test_process_executor.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_process_executor.py b/tests/orchestrator/workflows/executor/test_process_executor.py index 2d43261..3cd1c47 100644 --- a/tests/orchestrator/workflows/executor/test_process_executor.py +++ b/tests/orchestrator/workflows/executor/test_process_executor.py @@ -22,8 +22,8 @@ from contextlib import contextmanager import pytest from aria import application_model_storage +from aria.modeling import models as aria_models from aria.storage import sql_mapi -from aria.storage.modeling import model as aria_model from aria.orchestrator import ( events, plugin @@ -126,7 +126,7 @@ class MockContext(object): class MockTask(object): - INFINITE_RETRIES = aria_model.Task.INFINITE_RETRIES + INFINITE_RETRIES = aria_models.Task.INFINITE_RETRIES def __init__(self, plugin, implementation): self.id = str(uuid.uuid4()) @@ -141,7 +141,7 @@ class MockTask(object): self.plugin = plugin self.ignore_failure = False - for state in aria_model.Task.STATES: + for state in aria_models.Task.STATES: setattr(self, state.upper(), state) @contextmanager http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/orchestrator/workflows/executor/test_process_executor_concurrent_modifications.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_process_executor_concurrent_modifications.py b/tests/orchestrator/workflows/executor/test_process_executor_concurrent_modifications.py index ad3cb76..6d0eb5b 100644 --- a/tests/orchestrator/workflows/executor/test_process_executor_concurrent_modifications.py +++ b/tests/orchestrator/workflows/executor/test_process_executor_concurrent_modifications.py @@ -71,9 +71,9 @@ def _test_update_and_refresh(ctx, lock_files, key, first_value, second_value): def _test(context, executor, lock_files, func, expected_failure): def _node(ctx): - return ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + return ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) - op_name = mock.operations.NODE_OPERATIONS_INSTALL[0] + interface_name, operation_name = mock.operations.NODE_OPERATIONS_INSTALL[0] key = 'key' first_value = 'value1' @@ -86,17 +86,26 @@ def _test(context, executor, lock_files, func, expected_failure): } node = _node(context) - node.interfaces = [mock.models.get_interface( - op_name, + interface = mock.models.create_interface( + node.service, + interface_name, + operation_name, operation_kwargs=dict(implementation='{0}.{1}'.format(__name__, func.__name__)) - )] + ) + node.interfaces[interface.name] = interface context.model.node.update(node) @workflow def mock_workflow(graph, **_): graph.add_tasks( - api.task.OperationTask.node(instance=node, name=op_name, inputs=inputs), - api.task.OperationTask.node(instance=node, name=op_name, inputs=inputs) + api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name, + inputs=inputs), + api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name, + inputs=inputs) ) signal = events.on_failure_task_signal http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/orchestrator/workflows/executor/test_process_executor_extension.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_process_executor_extension.py b/tests/orchestrator/workflows/executor/test_process_executor_extension.py index ac95554..1c4cda6 100644 --- a/tests/orchestrator/workflows/executor/test_process_executor_extension.py +++ b/tests/orchestrator/workflows/executor/test_process_executor_extension.py @@ -29,27 +29,34 @@ from tests import storage def test_decorate_extension(context, executor): inputs = {'input1': 1, 'input2': 2} - def get_node_instance(ctx): - return ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + def get_node(ctx): + return ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) @workflow def mock_workflow(ctx, graph): - node_instance = get_node_instance(ctx) - op = 'test.op' - node_instance.interfaces = [mock.models.get_interface( - op, + node = get_node(ctx) + interface_name = 'test_interface' + operation_name = 'operation' + interface = mock.models.create_interface( + ctx.service, + interface_name, + operation_name, operation_kwargs=dict(implementation='{0}.{1}'.format(__name__, _mock_operation.__name__)) - )] - task = api.task.OperationTask.node(instance=node_instance, name=op, inputs=inputs) + ) + node.interfaces[interface.name] = interface + task = api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name, + inputs=inputs) graph.add_tasks(task) return graph graph = mock_workflow(ctx=context) # pylint: disable=no-value-for-parameter eng = engine.Engine(executor=executor, workflow_context=context, tasks_graph=graph) eng.execute() - out = get_node_instance(context).runtime_properties['out'] - assert out['wrapper_inputs'] == inputs - assert out['function_inputs'] == inputs + out = get_node(context).runtime_properties['out'] + assert out['wrapper_inputs'] == dict((k, v.value) for k, v in inputs.iteritems()) + assert out['function_inputs'] == dict((k, v.value) for k, v in inputs.iteritems()) @extension.process_executor http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py b/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py index d3b3300..a3957c3 100644 --- a/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py +++ b/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py @@ -45,7 +45,7 @@ def test_track_changes_of_failed_operation(context, executor): def _assert_tracked_changes_are_applied(context): - instance = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + instance = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) assert instance.runtime_properties == _TEST_RUNTIME_PROPERTIES @@ -67,15 +67,15 @@ def test_apply_tracked_changes_during_an_operation(context, executor): } expected_initial = context.model.node.get_by_name( - mock.models.DEPENDENCY_NODE_INSTANCE_NAME).runtime_properties + mock.models.DEPENDENCY_NODE_NAME).runtime_properties out = _run_workflow(context=context, executor=executor, op_func=_mock_updating_operation, inputs=inputs) expected_after_update = expected_initial.copy() - expected_after_update.update(inputs['committed']) + expected_after_update.update(inputs['committed'].value) # pylint: disable=no-member expected_after_change = expected_after_update.copy() - expected_after_change.update(inputs['changed_but_refreshed']) + expected_after_change.update(inputs['changed_but_refreshed'].value) # pylint: disable=no-member expected_after_refresh = expected_after_update assert out['initial'] == expected_initial @@ -87,19 +87,27 @@ def test_apply_tracked_changes_during_an_operation(context, executor): def _run_workflow(context, executor, op_func, inputs=None): @workflow def mock_workflow(ctx, graph): - node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) - node.interfaces = [mock.models.get_interface( - 'test.op', operation_kwargs=dict(implementation=_operation_mapping(op_func)))] - task = api.task.OperationTask.node(instance=node, - name='test.op', - inputs=inputs or {}) + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface_name = 'test_interface' + operation_name = 'operation' + interface = mock.models.create_interface( + ctx.service, + interface_name, + operation_name, + operation_kwargs=dict(implementation=_operation_mapping(op_func)) + ) + node.interfaces[interface.name] = interface + task = api.task.OperationTask.for_node(node=node, + interface_name=interface_name, + operation_name=operation_name, + inputs=inputs or {}) graph.add_tasks(task) return graph graph = mock_workflow(ctx=context) # pylint: disable=no-value-for-parameter eng = engine.Engine(executor=executor, workflow_context=context, tasks_graph=graph) eng.execute() return context.model.node.get_by_name( - mock.models.DEPENDENCY_NODE_INSTANCE_NAME).runtime_properties.get('out') + mock.models.DEPENDENCY_NODE_NAME).runtime_properties.get('out') @operation http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/parser/utils.py ---------------------------------------------------------------------- diff --git a/tests/parser/utils.py b/tests/parser/utils.py index 994aac6..8460de8 100644 --- a/tests/parser/utils.py +++ b/tests/parser/utils.py @@ -21,10 +21,10 @@ from aria.parser.consumption import ( ConsumerChain, Read, Validate, - Model, + ServiceTemplate, Types, Inputs, - Instance + ServiceInstance ) from aria.utils.imports import import_fullname @@ -66,14 +66,14 @@ def create_consumer(context, consumer_class_name): dumper = None elif consumer_class_name == 'presentation': dumper = consumer.consumers[0] - elif consumer_class_name == 'model': - consumer.append(Model) + elif consumer_class_name == 'template': + consumer.append(ServiceTemplate) elif consumer_class_name == 'types': - consumer.append(Model, Types) + consumer.append(ServiceTemplate, Types) elif consumer_class_name == 'instance': - consumer.append(Model, Inputs, Instance) + consumer.append(ServiceTemplate, Inputs, ServiceInstance) else: - consumer.append(Model, Inputs, Instance) + consumer.append(ServiceTemplate, Inputs, ServiceInstance) consumer.append(import_fullname(consumer_class_name)) if dumper is None: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/resources/service-templates/tosca-simple-1.0/node-cellar/workflows.py ---------------------------------------------------------------------- diff --git a/tests/resources/service-templates/tosca-simple-1.0/node-cellar/workflows.py b/tests/resources/service-templates/tosca-simple-1.0/node-cellar/workflows.py index fff78bf..94ee824 100644 --- a/tests/resources/service-templates/tosca-simple-1.0/node-cellar/workflows.py +++ b/tests/resources/service-templates/tosca-simple-1.0/node-cellar/workflows.py @@ -1,6 +1,12 @@ from aria import workflow from aria.orchestrator.workflows.api.task import OperationTask +from aria.orchestrator.workflows.exceptions import TaskException + + +INTERFACE_NAME = 'Maintenance' +ENABLE_OPERATION_NAME = 'enable' +DISABLE_OPERATION_NAME = 'disable' @workflow @@ -9,8 +15,11 @@ def maintenance(ctx, graph, enabled): Custom workflow to call the operations on the Maintenance interface. """ - operation = 'Maintenance.enable' if enabled else 'Maintenance.disable' - for node in ctx.model.node.iter(): - for interface in node.interfaces.filter_by(name='Maintenance', type_name='Maintenance'): - graph.add_tasks(OperationTask.node(instance=node, name=operation)) + try: + graph.add_tasks(OperationTask.for_node(node=node, + interface_name=INTERFACE_NAME, + operation_name=ENABLE_OPERATION_NAME if enabled + else DISABLE_OPERATION_NAME)) + except TaskException: + pass http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/storage/__init__.py ---------------------------------------------------------------------- diff --git a/tests/storage/__init__.py b/tests/storage/__init__.py index f95bdb2..c5d7678 100644 --- a/tests/storage/__init__.py +++ b/tests/storage/__init__.py @@ -19,27 +19,11 @@ from tempfile import mkdtemp from sqlalchemy import ( create_engine, orm, - Column, - Text, - Integer, pool, MetaData ) - -from aria.storage.modeling import ( - model, - structure, - type as aria_type -) - - -class MockModel(structure.ModelMixin, model.aria_declarative_base): #pylint: disable=abstract-method - __tablename__ = 'mock_model' - model_dict = Column(aria_type.Dict) - model_list = Column(aria_type.List) - value = Column(Integer) - name = Column(Text) +from aria.modeling import models class TestFileSystem(object): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/storage/test_instrumentation.py ---------------------------------------------------------------------- diff --git a/tests/storage/test_instrumentation.py b/tests/storage/test_instrumentation.py index 7f0eb02..673103e 100644 --- a/tests/storage/test_instrumentation.py +++ b/tests/storage/test_instrumentation.py @@ -16,18 +16,19 @@ import pytest from sqlalchemy import Column, Text, Integer, event +from aria.modeling import ( + mixins, + types as modeling_types, + models +) +from aria.modeling.exceptions import ValueFormatException from aria.storage import ( ModelStorage, sql_mapi, - instrumentation, - exceptions, -) -from aria.storage.modeling import ( - model, - type as aria_type, - structure, + instrumentation ) -from ..storage import release_sqlite_storage, init_inmemory_model_storage + +from . import release_sqlite_storage, init_inmemory_model_storage STUB = instrumentation._STUB Value = instrumentation._Value @@ -280,8 +281,8 @@ class TestInstrumentation(object): def test_track_changes_to_strict_dict(self, storage): model_kwargs = dict(strict_dict={'key': 'value'}, strict_list=['item']) - mode_instance = StrictMockModel(**model_kwargs) - storage.strict_mock_model.put(mode_instance) + model_instance = StrictMockModel(**model_kwargs) + storage.strict_mock_model.put(model_instance) instrument = self._track_changes({ StrictMockModel.strict_dict: dict, @@ -290,28 +291,28 @@ class TestInstrumentation(object): assert not instrument.tracked_changes - storage_model_instance = storage.strict_mock_model.get(mode_instance.id) + storage_model_instance = storage.strict_mock_model.get(model_instance.id) - with pytest.raises(exceptions.StorageError): + with pytest.raises(ValueFormatException): storage_model_instance.strict_dict = {1: 1} - with pytest.raises(exceptions.StorageError): + with pytest.raises(ValueFormatException): storage_model_instance.strict_dict = {'hello': 1} - with pytest.raises(exceptions.StorageError): + with pytest.raises(ValueFormatException): storage_model_instance.strict_dict = {1: 'hello'} storage_model_instance.strict_dict = {'hello': 'world'} assert storage_model_instance.strict_dict == {'hello': 'world'} - with pytest.raises(exceptions.StorageError): + with pytest.raises(ValueFormatException): storage_model_instance.strict_list = [1] storage_model_instance.strict_list = ['hello'] assert storage_model_instance.strict_list == ['hello'] assert instrument.tracked_changes == { 'strict_mock_model': { - mode_instance.id: { + model_instance.id: { 'strict_dict': Value(STUB, {'hello': 'world'}), 'strict_list': Value(STUB, ['hello']), } @@ -336,27 +337,27 @@ def storage(): release_sqlite_storage(result) -class _MockModel(structure.ModelMixin): +class _MockModel(mixins.ModelMixin): name = Column(Text) - dict1 = Column(aria_type.Dict) - dict2 = Column(aria_type.Dict) - list1 = Column(aria_type.List) - list2 = Column(aria_type.List) + dict1 = Column(modeling_types.Dict) + dict2 = Column(modeling_types.Dict) + list1 = Column(modeling_types.List) + list2 = Column(modeling_types.List) int1 = Column(Integer) int2 = Column(Integer) string2 = Column(Text) -class MockModel1(_MockModel, model.aria_declarative_base): +class MockModel1(_MockModel, models.aria_declarative_base): __tablename__ = 'mock_model_1' -class MockModel2(_MockModel, model.aria_declarative_base): +class MockModel2(_MockModel, models.aria_declarative_base): __tablename__ = 'mock_model_2' -class StrictMockModel(structure.ModelMixin, model.aria_declarative_base): +class StrictMockModel(mixins.ModelMixin, models.aria_declarative_base): __tablename__ = 'strict_mock_model' - strict_dict = Column(aria_type.StrictDict(basestring, basestring)) - strict_list = Column(aria_type.StrictList(basestring)) + strict_dict = Column(modeling_types.StrictDict(basestring, basestring)) + strict_list = Column(modeling_types.StrictList(basestring)) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/storage/test_model_storage.py ---------------------------------------------------------------------- diff --git a/tests/storage/test_model_storage.py b/tests/storage/test_model_storage.py deleted file mode 100644 index f88080a..0000000 --- a/tests/storage/test_model_storage.py +++ /dev/null @@ -1,103 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import pytest - -from aria.storage import ( - ModelStorage, - exceptions, - sql_mapi, - modeling, -) -from aria import application_model_storage -from ..storage import release_sqlite_storage, init_inmemory_model_storage - -from . import MockModel - - [email protected] -def storage(): - base_storage = ModelStorage(sql_mapi.SQLAlchemyModelAPI, - initiator=init_inmemory_model_storage) - base_storage.register(MockModel) - yield base_storage - release_sqlite_storage(base_storage) - - [email protected](scope='module', autouse=True) -def module_cleanup(): - modeling.model.aria_declarative_base.metadata.remove(MockModel.__table__) #pylint: disable=no-member - - -def test_storage_base(storage): - with pytest.raises(AttributeError): - storage.non_existent_attribute() - - -def test_model_storage(storage): - mock_model = MockModel(value=0, name='model_name') - storage.mock_model.put(mock_model) - - assert storage.mock_model.get_by_name('model_name') == mock_model - - assert [mm_from_storage for mm_from_storage in storage.mock_model.iter()] == [mock_model] - assert [mm_from_storage for mm_from_storage in storage.mock_model] == [mock_model] - - storage.mock_model.delete(mock_model) - with pytest.raises(exceptions.StorageError): - storage.mock_model.get(mock_model.id) - - -def test_application_storage_factory(): - storage = application_model_storage(sql_mapi.SQLAlchemyModelAPI, - initiator=init_inmemory_model_storage) - - assert storage.parameter - assert storage.mapping_template - assert storage.substitution_template - assert storage.service_template - assert storage.node_template - assert storage.group_template - assert storage.interface_template - assert storage.operation_template - assert storage.artifact_template - assert storage.policy_template - assert storage.group_policy_template - assert storage.group_policy_trigger_template - assert storage.requirement_template - assert storage.capability_template - - assert storage.mapping - assert storage.substitution - assert storage.service_instance - assert storage.node - assert storage.group - assert storage.interface - assert storage.operation - assert storage.capability - assert storage.artifact - assert storage.policy - assert storage.group_policy - assert storage.group_policy_trigger - assert storage.relationship - - assert storage.execution - assert storage.service_instance_update - assert storage.service_instance_update_step - assert storage.service_instance_modification - assert storage.plugin - assert storage.task - - release_sqlite_storage(storage) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/9841ca4a/tests/storage/test_models.py ---------------------------------------------------------------------- diff --git a/tests/storage/test_models.py b/tests/storage/test_models.py deleted file mode 100644 index 81b4122..0000000 --- a/tests/storage/test_models.py +++ /dev/null @@ -1,875 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -from datetime import datetime -from contextlib import contextmanager - -import pytest - -from aria import application_model_storage -from aria.storage import ( - exceptions, - sql_mapi, -) -from aria.storage.modeling.model import ( - ServiceTemplate, - ServiceInstance, - ServiceInstanceUpdate, - ServiceInstanceUpdateStep, - ServiceInstanceModification, - Execution, - Task, - Plugin, - Relationship, - NodeTemplate, - Node, - Parameter -) - -from tests import mock -from ..storage import release_sqlite_storage, init_inmemory_model_storage - - -@contextmanager -def sql_storage(storage_func): - storage = None - try: - storage = storage_func() - yield storage - finally: - if storage: - release_sqlite_storage(storage) - - -def _empty_storage(): - return application_model_storage(sql_mapi.SQLAlchemyModelAPI, - initiator=init_inmemory_model_storage) - - -def _service_template_storage(): - storage = _empty_storage() - service_template = mock.models.get_blueprint() - storage.service_template.put(service_template) - return storage - - -def _service_instance_storage(): - storage = _service_template_storage() - service_instance = mock.models.get_deployment( - storage.service_template.get_by_name(mock.models.BLUEPRINT_NAME)) - storage.service_instance.put(service_instance) - return storage - - -def _service_instance_update_storage(): - storage = _service_instance_storage() - service_instance_update = ServiceInstanceUpdate( - service_instance=storage.service_instance.list()[0], - created_at=now, - service_instance_plan={}, - ) - storage.service_instance_update.put(service_instance_update) - return storage - - -def _node_template_storage(): - storage = _service_instance_storage() - node_template = mock.models.get_dependency_node(storage.service_instance.list()[0]) - storage.node_template.put(node_template) - return storage - - -def _nodes_storage(): - storage = _node_template_storage() - service_instance = storage.service_instance.get_by_name(mock.models.DEPLOYMENT_NAME) - - dependency_node_template = storage.node_template.get_by_name(mock.models.DEPENDENCY_NODE_NAME) - dependency_node = mock.models.get_dependency_node_instance(dependency_node_template, - service_instance) - - req_template, cap_template = mock.models.get_relationship(dependency_node) - storage.requirement_template.put(req_template) - storage.capability_template.put(cap_template) - - dependent_node_template = mock.models.get_dependent_node(service_instance, - req_template, - cap_template) - dependent_node = mock.models.get_dependent_node_instance(dependent_node_template, - service_instance) - storage.node.put(dependency_node) - storage.node.put(dependent_node) - return storage - - -def _execution_storage(): - storage = _service_instance_storage() - execution = mock.models.get_execution(storage.service_instance.list()[0]) - plugin = mock.models.get_plugin() - storage.execution.put(execution) - storage.plugin.put(plugin) - return storage - - [email protected] -def empty_storage(): - with sql_storage(_empty_storage) as storage: - yield storage - - [email protected] -def service_template_storage(): - with sql_storage(_service_template_storage) as storage: - yield storage - - [email protected] -def service_instance_storage(): - with sql_storage(_service_instance_storage) as storage: - yield storage - - [email protected] -def service_instance_update_storage(): - with sql_storage(_service_instance_update_storage) as storage: - yield storage - - [email protected] -def node_template_storage(): - with sql_storage(_node_template_storage) as storage: - yield storage - - [email protected] -def nodes_storage(): - with sql_storage(_nodes_storage) as storage: - yield storage - - [email protected] -def execution_storage(): - with sql_storage(_execution_storage) as storage: - yield storage - - -m_cls = type('MockClass') -now = datetime.utcnow() - - -def _test_model(is_valid, storage, model_cls, model_kwargs): - if is_valid: - model = model_cls(**model_kwargs) - getattr(storage, model_cls.__modelname__).put(model) - return model - else: - with pytest.raises((exceptions.StorageError, TypeError),): - getattr(storage, model_cls.__modelname__).put(model_cls(**model_kwargs)) - - -class TestServiceTemplate(object): - - @pytest.mark.parametrize( - 'is_valid, plan, description, created_at, updated_at, main_file_name', - [ - (False, None, 'description', now, now, '/path'), - (False, {}, {}, now, now, '/path'), - (False, {}, 'description', 'error', now, '/path'), - (False, {}, 'description', now, 'error', '/path'), - (False, {}, 'description', now, now, {}), - (True, {}, 'description', now, now, '/path'), - ] - ) - def test_blueprint_model_creation(self, empty_storage, is_valid, plan, description, created_at, - updated_at, main_file_name): - _test_model(is_valid=is_valid, - storage=empty_storage, - model_cls=ServiceTemplate, - model_kwargs=dict( - plan=plan, - description=description, - created_at=created_at, - updated_at=updated_at, - main_file_name=main_file_name) - ) - - -class TestServiceInstance(object): - - @pytest.mark.parametrize( - 'is_valid, name, created_at, description, inputs, permalink, policy_triggers, ' - 'policy_types, outputs, scaling_groups, updated_at, workflows', - [ - (False, m_cls, now, 'desc', [], 'perlnk', {}, {}, [], {}, now, {}), - (False, 'name', m_cls, 'desc', [], 'perlnk', {}, {}, [], {}, now, {}), - (False, 'name', now, m_cls, [], 'perlnk', {}, {}, [], {}, now, {}), - (False, 'name', now, 'desc', [], m_cls, {}, {}, [], {}, now, {}), - (False, 'name', now, 'desc', [], 'perlnk', m_cls, {}, [], {}, now, {}), - (False, 'name', now, 'desc', [], 'perlnk', {}, m_cls, [], {}, now, {}), - (False, 'name', now, 'desc', [], 'perlnk', {}, {}, m_cls, {}, now, {}), - (False, 'name', now, 'desc', [], 'perlnk', {}, {}, [], m_cls, now, {}), - (False, 'name', now, 'desc', [], 'perlnk', {}, {}, [], {}, m_cls, {}), - (False, 'name', now, 'desc', [], 'perlnk', {}, {}, [], {}, now, m_cls), - - (True, 'name', now, 'desc', [], 'perlnk', {}, {}, [], {}, now, {}), - (True, None, now, 'desc', [], 'perlnk', {}, {}, [], {}, now, {}), - (True, 'name', now, 'desc', [], 'perlnk', {}, {}, [], {}, now, {}), - (True, 'name', now, None, [], 'perlnk', {}, {}, [], {}, now, {}), - (True, 'name', now, 'desc', [], 'perlnk', {}, {}, [], {}, now, {}), - (True, 'name', now, 'desc', [], None, {}, {}, [], {}, now, {}), - (True, 'name', now, 'desc', [], 'perlnk', None, {}, [], {}, now, {}), - (True, 'name', now, 'desc', [], 'perlnk', {}, None, [], {}, now, {}), - (True, 'name', now, 'desc', [], 'perlnk', {}, {}, [], None, now, {}), - (True, 'name', now, 'desc', [], 'perlnk', {}, {}, [], {}, None, {}), - (True, 'name', now, 'desc', [], 'perlnk', {}, {}, [], {}, now, None), - ] - ) - def test_deployment_model_creation(self, service_instance_storage, is_valid, name, created_at, - description, inputs, permalink, policy_triggers, - policy_types, outputs, scaling_groups, updated_at, - workflows): - service_instance = _test_model( - is_valid=is_valid, - storage=service_instance_storage, - model_cls=ServiceInstance, - model_kwargs=dict( - name=name, - service_template=service_instance_storage.service_template.list()[0], - created_at=created_at, - description=description, - inputs=inputs, - permalink=permalink, - policy_triggers=policy_triggers, - policy_types=policy_types, - outputs=outputs, - scaling_groups=scaling_groups, - updated_at=updated_at, - workflows=workflows - )) - if is_valid: - assert service_instance.service_template == \ - service_instance_storage.service_template.list()[0] - - -class TestExecution(object): - - @pytest.mark.parametrize( - 'is_valid, created_at, started_at, ended_at, error, is_system_workflow, parameters, ' - 'status, workflow_name', - [ - (False, m_cls, now, now, 'error', False, {}, Execution.STARTED, 'wf_name'), - (False, now, m_cls, now, 'error', False, {}, Execution.STARTED, 'wf_name'), - (False, now, now, m_cls, 'error', False, {}, Execution.STARTED, 'wf_name'), - (False, now, now, now, m_cls, False, {}, Execution.STARTED, 'wf_name'), - (False, now, now, now, 'error', False, m_cls, Execution.STARTED, 'wf_name'), - (False, now, now, now, 'error', False, {}, m_cls, 'wf_name'), - (False, now, now, now, 'error', False, {}, Execution.STARTED, m_cls), - - (True, now, now, now, 'error', False, {}, Execution.STARTED, 'wf_name'), - (True, now, None, now, 'error', False, {}, Execution.STARTED, 'wf_name'), - (True, now, now, None, 'error', False, {}, Execution.STARTED, 'wf_name'), - (True, now, now, now, None, False, {}, Execution.STARTED, 'wf_name'), - (True, now, now, now, 'error', False, None, Execution.STARTED, 'wf_name'), - ] - ) - def test_execution_model_creation(self, service_instance_storage, is_valid, created_at, - started_at, ended_at, error, is_system_workflow, parameters, - status, workflow_name): - execution = _test_model( - is_valid=is_valid, - storage=service_instance_storage, - model_cls=Execution, - model_kwargs=dict( - service_instance=service_instance_storage.service_instance.list()[0], - created_at=created_at, - started_at=started_at, - ended_at=ended_at, - error=error, - is_system_workflow=is_system_workflow, - parameters=parameters, - status=status, - workflow_name=workflow_name, - )) - if is_valid: - assert execution.service_instance == service_instance_storage.service_instance.list()[0] - assert execution.service_template == service_instance_storage.service_template.list()[0] - - def test_execution_status_transition(self): - def create_execution(status): - execution = Execution( - id='e_id', - workflow_name='w_name', - status=status, - parameters={}, - created_at=now, - ) - return execution - - valid_transitions = { - Execution.PENDING: [Execution.STARTED, - Execution.CANCELLED, - Execution.PENDING], - Execution.STARTED: [Execution.FAILED, - Execution.TERMINATED, - Execution.CANCELLED, - Execution.CANCELLING, - Execution.STARTED], - Execution.CANCELLING: [Execution.FAILED, - Execution.TERMINATED, - Execution.CANCELLED, - Execution.CANCELLING], - Execution.FAILED: [Execution.FAILED], - Execution.TERMINATED: [Execution.TERMINATED], - Execution.CANCELLED: [Execution.CANCELLED] - } - - invalid_transitions = { - Execution.PENDING: [Execution.FAILED, - Execution.TERMINATED, - Execution.CANCELLING], - Execution.STARTED: [Execution.PENDING], - Execution.CANCELLING: [Execution.PENDING, - Execution.STARTED], - Execution.FAILED: [Execution.PENDING, - Execution.STARTED, - Execution.TERMINATED, - Execution.CANCELLED, - Execution.CANCELLING], - Execution.TERMINATED: [Execution.PENDING, - Execution.STARTED, - Execution.FAILED, - Execution.CANCELLED, - Execution.CANCELLING], - Execution.CANCELLED: [Execution.PENDING, - Execution.STARTED, - Execution.FAILED, - Execution.TERMINATED, - Execution.CANCELLING], - } - - for current_status, valid_transitioned_statues in valid_transitions.items(): - for transitioned_status in valid_transitioned_statues: - execution = create_execution(current_status) - execution.status = transitioned_status - - for current_status, invalid_transitioned_statues in invalid_transitions.items(): - for transitioned_status in invalid_transitioned_statues: - execution = create_execution(current_status) - with pytest.raises(ValueError): - execution.status = transitioned_status - - -class TestServiceInstanceUpdate(object): - @pytest.mark.parametrize( - 'is_valid, created_at, deployment_plan, service_instance_update_node_instances, ' - 'service_instance_update_service_instance, service_instance_update_nodes, ' - 'modified_entity_ids, state', - [ - (False, m_cls, {}, {}, {}, [], {}, 'state'), - (False, now, m_cls, {}, {}, [], {}, 'state'), - (False, now, {}, m_cls, {}, [], {}, 'state'), - (False, now, {}, {}, m_cls, [], {}, 'state'), - (False, now, {}, {}, {}, m_cls, {}, 'state'), - (False, now, {}, {}, {}, [], m_cls, 'state'), - (False, now, {}, {}, {}, [], {}, m_cls), - - (True, now, {}, {}, {}, [], {}, 'state'), - (True, now, {}, None, {}, [], {}, 'state'), - (True, now, {}, {}, None, [], {}, 'state'), - (True, now, {}, {}, {}, None, {}, 'state'), - (True, now, {}, {}, {}, [], None, 'state'), - (True, now, {}, {}, {}, [], {}, None), - ] - ) - def test_service_instance_update_model_creation( - self, service_instance_storage, is_valid, created_at, deployment_plan, - service_instance_update_node_instances, service_instance_update_service_instance, - service_instance_update_nodes, modified_entity_ids, state): - service_instance_update = _test_model( - is_valid=is_valid, - storage=service_instance_storage, - model_cls=ServiceInstanceUpdate, - model_kwargs=dict( - service_instance=service_instance_storage.service_instance.list()[0], - created_at=created_at, - service_instance_plan=deployment_plan, - service_instance_update_node_instances=service_instance_update_node_instances, - service_instance_update_service_instance=service_instance_update_service_instance, - service_instance_update_nodes=service_instance_update_nodes, - modified_entity_ids=modified_entity_ids, - state=state, - )) - if is_valid: - assert service_instance_update.service_instance == \ - service_instance_storage.service_instance.list()[0] - - -class TestServiceInstanceUpdateStep(object): - - @pytest.mark.parametrize( - 'is_valid, action, entity_id, entity_type', - [ - (False, m_cls, 'id', ServiceInstanceUpdateStep.ENTITY_TYPES.NODE), - (False, ServiceInstanceUpdateStep.ACTION_TYPES.ADD, m_cls, - ServiceInstanceUpdateStep.ENTITY_TYPES.NODE), - (False, ServiceInstanceUpdateStep.ACTION_TYPES.ADD, 'id', m_cls), - - (True, ServiceInstanceUpdateStep.ACTION_TYPES.ADD, 'id', - ServiceInstanceUpdateStep.ENTITY_TYPES.NODE) - ] - ) - def test_deployment_update_step_model_creation(self, service_instance_update_storage, is_valid, - action, entity_id, entity_type): - service_instance_update_step = _test_model( - is_valid=is_valid, - storage=service_instance_update_storage, - model_cls=ServiceInstanceUpdateStep, - model_kwargs=dict( - service_instance_update= - service_instance_update_storage.service_instance_update.list()[0], - action=action, - entity_id=entity_id, - entity_type=entity_type - )) - if is_valid: - assert service_instance_update_step.service_instance_update == \ - service_instance_update_storage.service_instance_update.list()[0] - - def test_deployment_update_step_order(self): - add_node = ServiceInstanceUpdateStep( - id='add_step', - action='add', - entity_type='node', - entity_id='node_id') - - modify_node = ServiceInstanceUpdateStep( - id='modify_step', - action='modify', - entity_type='node', - entity_id='node_id') - - remove_node = ServiceInstanceUpdateStep( - id='remove_step', - action='remove', - entity_type='node', - entity_id='node_id') - - for step in (add_node, modify_node, remove_node): - assert hash((step.id, step.entity_id)) == hash(step) - - assert remove_node < modify_node < add_node - assert not remove_node > modify_node > add_node - - add_rel = ServiceInstanceUpdateStep( - id='add_step', - action='add', - entity_type='relationship', - entity_id='relationship_id') - - remove_rel = ServiceInstanceUpdateStep( - id='remove_step', - action='remove', - entity_type='relationship', - entity_id='relationship_id') - - assert remove_rel < remove_node < add_node < add_rel - assert not add_node < None - - -class TestDeploymentModification(object): - @pytest.mark.parametrize( - 'is_valid, context, created_at, ended_at, modified_node_templates, nodes, status', - [ - (False, m_cls, now, now, {}, {}, ServiceInstanceModification.STARTED), - (False, {}, m_cls, now, {}, {}, ServiceInstanceModification.STARTED), - (False, {}, now, m_cls, {}, {}, ServiceInstanceModification.STARTED), - (False, {}, now, now, m_cls, {}, ServiceInstanceModification.STARTED), - (False, {}, now, now, {}, m_cls, ServiceInstanceModification.STARTED), - (False, {}, now, now, {}, {}, m_cls), - - (True, {}, now, now, {}, {}, ServiceInstanceModification.STARTED), - (True, {}, now, None, {}, {}, ServiceInstanceModification.STARTED), - (True, {}, now, now, None, {}, ServiceInstanceModification.STARTED), - (True, {}, now, now, {}, None, ServiceInstanceModification.STARTED), - ] - ) - def test_deployment_modification_model_creation( - self, service_instance_storage, is_valid, context, created_at, ended_at, - modified_node_templates, nodes, status): - deployment_modification = _test_model( - is_valid=is_valid, - storage=service_instance_storage, - model_cls=ServiceInstanceModification, - model_kwargs=dict( - service_instance=service_instance_storage.service_instance.list()[0], - context=context, - created_at=created_at, - ended_at=ended_at, - modified_nodes=modified_node_templates, - node_instances=nodes, - status=status, - )) - if is_valid: - assert deployment_modification.service_instance == \ - service_instance_storage.service_instance.list()[0] - - -class TestNodeTemplate(object): - @pytest.mark.parametrize( - 'is_valid, name, default_instances, max_instances, min_instances, plugins, properties, ' - 'type_name, type_hierarchy', - [ - (False, m_cls, 1, 1, 1, [], [], 'type', []), - (False, 'name', m_cls, 1, 1, [], [], 'type', []), - (False, 'name', 1, m_cls, 1, [], [], 'type', []), - (False, 'name', 1, 1, m_cls, [], [], 'type', []), - (False, 'name', 1, 1, 1, m_cls, [], 'type', []), - (False, 'name', 1, 1, 1, [], [], m_cls, []), - (False, 'name', 1, 1, 1, [], [], 'type', m_cls), - # - (True, 'name', 1, 1, 1, [], [], 'type', []), - (True, 'name', 1, 1, 1, None, [], 'type', []), - (True, 'name', 1, 1, 1, [], [], 'type', None), - ] - ) - def test_node_model_creation(self, service_instance_storage, is_valid, name, - default_instances, max_instances, min_instances, plugins, - properties, type_name, type_hierarchy): - node_template = _test_model( - is_valid=is_valid, - storage=service_instance_storage, - model_cls=NodeTemplate, - model_kwargs=dict( - name=name, - default_instances=default_instances, - max_instances=max_instances, - min_instances=min_instances, - plugins=plugins, - properties=properties, - type_name=type_name, - type_hierarchy=type_hierarchy, - service_template=service_instance_storage.service_template.list()[0] - )) - if is_valid: - assert node_template.service_template == \ - service_instance_storage.service_template.list()[0] - - -class TestNode(object): - @pytest.mark.parametrize( - 'is_valid, name, runtime_properties, scaling_groups, state, version', - [ - (False, m_cls, {}, [], 'state', 1), - (False, 'name', m_cls, [], 'state', 1), - (False, 'name', {}, m_cls, 'state', 1), - (False, 'name', {}, [], m_cls, 1), - (False, m_cls, {}, [], 'state', m_cls), - - (True, 'name', {}, [], 'state', 1), - (True, None, {}, [], 'state', 1), - (True, 'name', None, [], 'state', 1), - (True, 'name', {}, None, 'state', 1), - (True, 'name', {}, [], 'state', None), - ] - ) - def test_node_instance_model_creation(self, node_template_storage, is_valid, name, - runtime_properties, scaling_groups, state, version): - node_instance = _test_model( - is_valid=is_valid, - storage=node_template_storage, - model_cls=Node, - model_kwargs=dict( - node_template=node_template_storage.node_template.list()[0], - name=name, - runtime_properties=runtime_properties, - scaling_groups=scaling_groups, - state=state, - version=version, - service_instance=node_template_storage.service_instance.list()[0] - )) - if is_valid: - assert node_instance.node_template == node_template_storage.node_template.list()[0] - assert node_instance.service_instance == \ - node_template_storage.service_instance.list()[0] - - -class TestNodeInstanceIP(object): - - ip = '1.1.1.1' - - def test_ip_on_none_hosted_node_instance(self, service_instance_storage): - node_template = self._node_template(service_instance_storage, ip='not considered') - node = self._node(service_instance_storage, - node_template, - is_host=False, - ip='not considered') - assert node.ip is None - - def test_property_ip_on_host_node_instance(self, service_instance_storage): - node_template = self._node_template(service_instance_storage, ip=self.ip) - node = self._node(service_instance_storage, node_template, is_host=True, ip=None) - assert node.ip == self.ip - - def test_runtime_property_ip_on_host_node_instance(self, service_instance_storage): - node_template = self._node_template(service_instance_storage, ip='not considered') - node = self._node(service_instance_storage, node_template, is_host=True, ip=self.ip) - assert node.ip == self.ip - - def test_no_ip_configured_on_host_node_instance(self, service_instance_storage): - node_template = self._node_template(service_instance_storage, ip=None) - node = self._node(service_instance_storage, node_template, is_host=True, ip=None) - assert node.ip is None - - def test_runtime_property_on_hosted_node_instance(self, service_instance_storage): - host_node_template = self._node_template(service_instance_storage, ip=None) - host_node = self._node(service_instance_storage, - host_node_template, - is_host=True, - ip=self.ip) - node_template = self._node_template(service_instance_storage, ip=None) - node = self._node(service_instance_storage, - node_template, - is_host=False, - ip=None, - host_fk=host_node.id) - assert node.ip == self.ip - - def _node_template(self, storage, ip): - kwargs = dict( - name='node_template', - default_instances=1, - max_instances=1, - min_instances=1, - type_name='', - service_template=storage.service_template.list()[0] - ) - if ip: - kwargs['properties'] = [Parameter(name='ip', type='str', str_value=str(ip))] - node = NodeTemplate(**kwargs) - storage.node_template.put(node) - return node - - def _node(self, storage, node, is_host, ip, host_fk=None): - kwargs = dict( - name='node', - node_template=node, - runtime_properties={}, - state='', - service_instance=storage.service_instance.list()[0] - ) - if ip: - kwargs['runtime_properties']['ip'] = ip - if is_host: - kwargs['host_fk'] = 1 - elif host_fk: - kwargs['host_fk'] = host_fk - node_instance = Node(**kwargs) - storage.node.put(node_instance) - return node_instance - - -class TestRelationshipInstance(object): - @pytest.mark.parametrize( - 'is_valid, source_requirement_index, target_node_id, target_capability_name, type_name, ' - 'template_name, type_hierarchy, source_position, target_position', - [ - (False, m_cls, 'target_node_id', 'target_cap_name', 'type_name', 'template_name', [], 0, - 0), - (False, 0, m_cls, 'target_cap_name', 'type_name', 'template_name', [], 0, 0), - (False, 0, 'target_node_id', m_cls, 'type_name', 'template_name', [], 0, 0), - (False, 0, 'target_node_id', 'target_cap_name', m_cls, 'template_name', [], 0, 0), - (False, 0, 'target_node_id', 'target_cap_name', 'type_name', m_cls, [], 0, 0), - (False, 0, 'target_node_id', 'target_cap_name', 'type_name', 'template_name', m_cls, 0, - 0), - (False, 0, 'target_node_id', 'target_cap_name', 'type_name', 'template_name', [], m_cls, - 0), - (False, 0, 'target_node_id', 'target_cap_name', 'type_name', 'template_name', [], 0, - m_cls), - - (True, 0, 'target_node_id', 'target_cap_name', 'type_name', 'template_name', [], 0, 0), - (True, None, 'target_node_id', 'target_cap_name', 'type_name', 'template_name', [], 0, - 0), - (True, 0, None, 'target_cap_name', 'type_name', 'template_name', [], 0, 0), - (True, 0, 'target_node_id', None, 'type_name', 'template_name', [], 0, 0), - (True, 0, 'target_node_id', 'target_cap_name', None, 'template_name', [], 0, 0), - (True, 0, 'target_node_id', 'target_cap_name', 'type_name', None, [], 0, 0), - (True, 0, 'target_node_id', 'target_cap_name', 'type_name', 'template_name', [], None, - 0), - (True, 0, 'target_node_id', 'target_cap_name', 'type_name', 'template_name', [], 0, - None), - - ] - ) - def test_relationship(self, nodes_storage, is_valid, source_requirement_index, target_node_id, - target_capability_name, type_name, template_name, type_hierarchy, - source_position, target_position): - _test_model(is_valid=is_valid, - storage=nodes_storage, - model_cls=Relationship, - model_kwargs=dict( - source_requirement_index=source_requirement_index, - target_node_id=target_node_id, - target_capability_name=target_capability_name, - type_name=type_name, - template_name=template_name, - type_hierarchy=type_hierarchy, - source_position=source_position, - target_position=target_position - )) - - -class TestPlugin(object): - @pytest.mark.parametrize( - 'is_valid, archive_name, distribution, distribution_release, ' - 'distribution_version, package_name, package_source, ' - 'package_version, supported_platform, supported_py_versions, uploaded_at, wheels', - [ - (False, m_cls, 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', 'pak_ver', - 'sup_plat', [], now, []), - (False, 'arc_name', m_cls, 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', 'pak_ver', - 'sup_plat', [], now, []), - (False, 'arc_name', 'dis_name', m_cls, 'dis_ver', 'pak_name', 'pak_src', 'pak_ver', - 'sup_plat', [], now, []), - (False, 'arc_name', 'dis_name', 'dis_rel', m_cls, 'pak_name', 'pak_src', 'pak_ver', - 'sup_plat', [], now, []), - (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', m_cls, 'pak_src', 'pak_ver', - 'sup_plat', [], now, []), - (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', m_cls, 'pak_ver', - 'sup_plat', [], now, []), - (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', m_cls, - 'sup_plat', [], now, []), - (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', - 'pak_ver', m_cls, [], now, []), - (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', - 'pak_ver', 'sup_plat', m_cls, now, []), - (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', - 'pak_ver', 'sup_plat', [], m_cls, []), - (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', - 'pak_ver', 'sup_plat', [], now, m_cls), - - (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', 'pak_ver', - 'sup_plat', [], now, []), - (True, 'arc_name', None, 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', 'pak_ver', - 'sup_plat', [], now, []), - (True, 'arc_name', 'dis_name', None, 'dis_ver', 'pak_name', 'pak_src', 'pak_ver', - 'sup_plat', [], now, []), - (True, 'arc_name', 'dis_name', 'dis_rel', None, 'pak_name', 'pak_src', 'pak_ver', - 'sup_plat', [], now, []), - (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', - 'pak_ver', 'sup_plat', [], now, []), - (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', None, 'pak_ver', - 'sup_plat', [], now, []), - (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', None, - 'sup_plat', [], now, []), - (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', - 'pak_ver', None, [], now, []), - (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', - 'pak_ver', 'sup_plat', None, now, []), - (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', - 'pak_ver', 'sup_plat', [], now, []), - ] - ) - def test_plugin_model_creation(self, empty_storage, is_valid, archive_name, distribution, - distribution_release, distribution_version, - package_name, package_source, package_version, - supported_platform, supported_py_versions, uploaded_at, wheels): - _test_model(is_valid=is_valid, - storage=empty_storage, - model_cls=Plugin, - model_kwargs=dict( - archive_name=archive_name, - distribution=distribution, - distribution_release=distribution_release, - distribution_version=distribution_version, - package_name=package_name, - package_source=package_source, - package_version=package_version, - supported_platform=supported_platform, - supported_py_versions=supported_py_versions, - uploaded_at=uploaded_at, - wheels=wheels, - )) - - -class TestTask(object): - - @pytest.mark.parametrize( - 'is_valid, status, due_at, started_at, ended_at, max_attempts, retry_count, ' - 'retry_interval, ignore_failure, name, operation_mapping, inputs, plugin_id', - [ - (False, m_cls, now, now, now, 1, 1, 1, True, 'name', 'map', {}, '1'), - (False, Task.STARTED, m_cls, now, now, 1, 1, 1, True, 'name', 'map', {}, '1'), - (False, Task.STARTED, now, m_cls, now, 1, 1, 1, True, 'name', 'map', {}, '1'), - (False, Task.STARTED, now, now, m_cls, 1, 1, 1, True, 'name', 'map', {}, '1'), - (False, Task.STARTED, now, now, now, m_cls, 1, 1, True, 'name', 'map', {}, '1'), - (False, Task.STARTED, now, now, now, 1, m_cls, 1, True, 'name', 'map', {}, '1'), - (False, Task.STARTED, now, now, now, 1, 1, m_cls, True, 'name', 'map', {}, '1'), - (False, Task.STARTED, now, now, now, 1, 1, 1, True, m_cls, 'map', {}, '1'), - (False, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', m_cls, {}, '1'), - (False, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', 'map', m_cls, '1'), - (False, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', 'map', {}, m_cls), - - (True, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', 'map', {}, '1'), - (True, Task.STARTED, None, now, now, 1, 1, 1, True, 'name', 'map', {}, '1'), - (True, Task.STARTED, now, None, now, 1, 1, 1, True, 'name', 'map', {}, '1'), - (True, Task.STARTED, now, now, None, 1, 1, 1, True, 'name', 'map', {}, '1'), - (True, Task.STARTED, now, now, now, 1, None, 1, True, 'name', 'map', {}, '1'), - (True, Task.STARTED, now, now, now, 1, 1, None, True, 'name', 'map', {}, '1'), - (True, Task.STARTED, now, now, now, 1, 1, 1, None, 'name', 'map', {}, '1'), - (True, Task.STARTED, now, now, now, 1, 1, 1, True, None, 'map', {}, '1'), - (True, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', None, {}, '1'), - (True, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', 'map', None, '1'), - (True, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', 'map', {}, None), - ] - ) - def test_task_model_creation(self, execution_storage, is_valid, status, due_at, started_at, - ended_at, max_attempts, retry_count, retry_interval, - ignore_failure, name, operation_mapping, inputs, plugin_id): - task = _test_model( - is_valid=is_valid, - storage=execution_storage, - model_cls=Task, - model_kwargs=dict( - status=status, - execution=execution_storage.execution.list()[0], - due_at=due_at, - started_at=started_at, - ended_at=ended_at, - max_attempts=max_attempts, - retry_count=retry_count, - retry_interval=retry_interval, - ignore_failure=ignore_failure, - name=name, - implementation=operation_mapping, - inputs=inputs, - plugin_fk=plugin_id, - )) - if is_valid: - assert task.execution == execution_storage.execution.list()[0] - if task.plugin: - assert task.plugin == execution_storage.plugin.list()[0] - - def test_task_max_attempts_validation(self): - def create_task(max_attempts): - Task(execution_fk='eid', - name='name', - implementation='', - inputs={}, - max_attempts=max_attempts) - create_task(max_attempts=1) - create_task(max_attempts=2) - create_task(max_attempts=Task.INFINITE_RETRIES) - with pytest.raises(ValueError): - create_task(max_attempts=0) - with pytest.raises(ValueError): - create_task(max_attempts=-2)
