You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ariatosca.apache.org by em...@apache.org on 2017/03/17 19:38:36 UTC
[08/18] incubator-ariatosca git commit: ARIA-105 Integrate parser and
orchestrator models
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/09f826a1/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/09f826a1/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/09f826a1/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/09f826a1/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..e2602b7 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,9 @@ 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=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 +100,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 +120,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 +154,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/09f826a1/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/09f826a1/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/09f826a1/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/09f826a1/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/09f826a1/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/09f826a1/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/09f826a1/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/09f826a1/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/09f826a1/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
-
-
-@pytest.fixture
-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)
-
-
-@pytest.fixture(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/09f826a1/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
-
-
-@pytest.fixture
-def empty_storage():
- with sql_storage(_empty_storage) as storage:
- yield storage
-
-
-@pytest.fixture
-def service_template_storage():
- with sql_storage(_service_template_storage) as storage:
- yield storage
-
-
-@pytest.fixture
-def service_instance_storage():
- with sql_storage(_service_instance_storage) as storage:
- yield storage
-
-
-@pytest.fixture
-def service_instance_update_storage():
- with sql_storage(_service_instance_update_storage) as storage:
- yield storage
-
-
-@pytest.fixture
-def node_template_storage():
- with sql_storage(_node_template_storage) as storage:
- yield storage
-
-
-@pytest.fixture
-def nodes_storage():
- with sql_storage(_nodes_storage) as storage:
- yield storage
-
-
-@pytest.fixture
-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)