http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/__init__.py ---------------------------------------------------------------------- diff --git a/tests/workflows/__init__.py b/tests/workflows/__init__.py deleted file mode 100644 index fe04b2f..0000000 --- a/tests/workflows/__init__.py +++ /dev/null @@ -1,16 +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 . import api, builtin, core
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/api/__init__.py ---------------------------------------------------------------------- diff --git a/tests/workflows/api/__init__.py b/tests/workflows/api/__init__.py deleted file mode 100644 index ae1e83e..0000000 --- a/tests/workflows/api/__init__.py +++ /dev/null @@ -1,14 +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. http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/api/test_task.py ---------------------------------------------------------------------- diff --git a/tests/workflows/api/test_task.py b/tests/workflows/api/test_task.py deleted file mode 100644 index 58f9760..0000000 --- a/tests/workflows/api/test_task.py +++ /dev/null @@ -1,150 +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 import context -from aria.workflows import api - -from ... import mock - - -@pytest.fixture() -def ctx(): - """ - Create the following graph in storage: - dependency_node <------ dependent_node - :return: - """ - simple_context = mock.context.simple() - dependency_node = mock.models.get_dependency_node() - dependency_node_instance = mock.models.get_dependency_node_instance( - dependency_node=dependency_node) - - relationship = mock.models.get_relationship(dependency_node) - relationship_instance = mock.models.get_relationship_instance( - relationship=relationship, - target_instance=dependency_node_instance - ) - - dependent_node = mock.models.get_dependent_node(relationship) - dependent_node_instance = mock.models.get_dependent_node_instance( - dependent_node=dependent_node, - relationship_instance=relationship_instance - ) - - simple_context.model.node.store(dependent_node) - simple_context.model.node.store(dependency_node) - simple_context.model.node_instance.store(dependent_node_instance) - simple_context.model.node_instance.store(dependency_node_instance) - simple_context.model.relationship.store(relationship) - simple_context.model.relationship_instance.store(relationship_instance) - simple_context.model.execution.store(mock.models.get_execution()) - simple_context.model.deployment.store(mock.models.get_deployment()) - - return simple_context - - -class TestOperationTask(object): - - def test_node_operation_task_creation(self): - workflow_context = mock.context.simple() - - operation_name = 'aria.interfaces.lifecycle.create' - op_details = {'operation': True} - node = mock.models.get_dependency_node() - node.operations[operation_name] = op_details - node_instance = mock.models.get_dependency_node_instance(dependency_node=node) - inputs = {'inputs': True} - max_attempts = 10 - retry_interval = 10 - ignore_failure = True - - with context.workflow.current.push(workflow_context): - api_task = api.task.OperationTask.node_instance( - name=operation_name, - instance=node_instance, - inputs=inputs, - max_attempts=max_attempts, - retry_interval=retry_interval, - ignore_failure=ignore_failure) - - assert api_task.name == '{0}.{1}'.format(operation_name, node_instance.id) - assert api_task.operation_mapping is True - assert api_task.actor == node_instance - assert api_task.inputs == inputs - assert api_task.retry_interval == retry_interval - assert api_task.max_attempts == max_attempts - assert api_task.ignore_failure == ignore_failure - - def test_relationship_operation_task_creation(self): - workflow_context = mock.context.simple() - - operation_name = 'aria.interfaces.relationship_lifecycle.preconfigure' - op_details = {'operation': True} - relationship = mock.models.get_relationship() - relationship.source_operations[operation_name] = op_details - relationship_instance = mock.models.get_relationship_instance(relationship=relationship) - inputs = {'inputs': True} - max_attempts = 10 - retry_interval = 10 - - with context.workflow.current.push(workflow_context): - api_task = api.task.OperationTask.relationship_instance( - name=operation_name, - instance=relationship_instance, - operation_end=api.task.OperationTask.SOURCE_OPERATION, - inputs=inputs, - max_attempts=max_attempts, - retry_interval=retry_interval) - - assert api_task.name == '{0}.{1}'.format(operation_name, relationship_instance.id) - assert api_task.operation_mapping is True - assert api_task.actor == relationship_instance - assert api_task.inputs == inputs - assert api_task.retry_interval == retry_interval - assert api_task.max_attempts == max_attempts - - def test_operation_task_default_values(self): - workflow_context = mock.context.simple(task_ignore_failure=True) - with context.workflow.current.push(workflow_context): - model_task = api.task.OperationTask( - name='stub', - operation_mapping='', - actor=mock.models.get_dependency_node_instance()) - - assert model_task.inputs == {} - assert model_task.retry_interval == workflow_context._task_retry_interval - assert model_task.max_attempts == workflow_context._task_max_attempts - assert model_task.ignore_failure == workflow_context._task_ignore_failure - - -class TestWorkflowTask(object): - - def test_workflow_task_creation(self, ctx): - - workspace = {} - - mock_class = type('mock_class', (object,), {'test_attribute': True}) - - def sub_workflow(**kwargs): - workspace.update(kwargs) - return mock_class - - with context.workflow.current.push(ctx): - workflow_task = api.task.WorkflowTask(sub_workflow, kwarg='workflow_kwarg') - assert workflow_task.graph is mock_class - assert workflow_task.test_attribute is True http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/api/test_task_graph.py ---------------------------------------------------------------------- diff --git a/tests/workflows/api/test_task_graph.py b/tests/workflows/api/test_task_graph.py deleted file mode 100644 index 0ec0b0e..0000000 --- a/tests/workflows/api/test_task_graph.py +++ /dev/null @@ -1,745 +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.workflows.api import task_graph, task - - -class MockTask(task.BaseTask): - def __init__(self): - super(MockTask, self).__init__(ctx={}) - - -@pytest.fixture -def graph(): - return task_graph.TaskGraph(name='mock-graph') - - -class TestTaskGraphTasks(object): - - def test_add_task(self, graph): - task = MockTask() - add_result = graph.add_tasks(task) - assert add_result == [task] - tasks = [t for t in graph.tasks] - assert len(tasks) == 1 - assert tasks[0] == task - - def test_add_empty_group(self, graph): - result = graph.add_tasks([]) - assert result == [] - - def test_add_group(self, graph): - tasks = [MockTask(), MockTask(), MockTask()] - added_tasks = graph.add_tasks(*tasks) - assert added_tasks == tasks - - def test_add_partially_existing_group(self, graph): - task = MockTask() - graph.add_tasks(task) - tasks = [MockTask(), task, MockTask()] - added_tasks = graph.add_tasks(*tasks) - assert added_tasks == [tasks[0], tasks[2]] - - def test_add_recursively_group(self, graph): - recursive_group = [MockTask(), MockTask()] - tasks = [MockTask(), recursive_group, MockTask()] - added_tasks = graph.add_tasks(tasks) - assert added_tasks == [tasks[0], recursive_group[0], recursive_group[1], tasks[2]] - - def test_add_existing_task(self, graph): - task = MockTask() - graph.add_tasks(task) - # adding a task already in graph - should have no effect, and return False - add_result = graph.add_tasks(task) - assert add_result == [] - tasks = [t for t in graph.tasks] - assert len(tasks) == 1 - assert tasks[0] == task - - def test_remove_task(self, graph): - task = MockTask() - other_task = MockTask() - graph.add_tasks(task) - graph.add_tasks(other_task) - graph.remove_tasks(other_task) - tasks = [t for t in graph.tasks] - assert len(tasks) == 1 - assert tasks[0] == task - - def test_remove_tasks_with_dependency(self, graph): - task = MockTask() - dependent_task = MockTask() - graph.add_tasks(task) - graph.add_tasks(dependent_task) - graph.add_dependency(dependent_task, task) - remove_result = graph.remove_tasks(dependent_task) - assert remove_result == [dependent_task] - tasks = [t for t in graph.tasks] - assert len(tasks) == 1 - assert tasks[0] == task - # asserting no dependencies are left for the dependent task - assert len(list(graph.get_dependencies(task))) == 0 - - def test_remove_empty_group(self, graph): - result = graph.remove_tasks([]) - assert result == [] - - def test_remove_group(self, graph): - tasks = [MockTask(), MockTask(), MockTask()] - graph.add_tasks(*tasks) - removed_tasks = graph.remove_tasks(*tasks) - assert removed_tasks == tasks - - def test_remove_partially_existing_group(self, graph): - task = MockTask() - graph.add_tasks(task) - tasks = [MockTask(), task, MockTask()] - removed_tasks = graph.remove_tasks(*tasks) - assert removed_tasks == [task] - - def test_remove_recursively_group(self, graph): - recursive_group = [MockTask(), MockTask()] - tasks = [MockTask(), recursive_group, MockTask()] - graph.add_tasks(tasks) - removed_tasks = graph.remove_tasks(tasks) - assert removed_tasks == [tasks[0], recursive_group[0], recursive_group[1], tasks[2]] - - def test_remove_nonexistent_task(self, graph): - task = MockTask() - task_not_in_graph = MockTask() - graph.add_tasks(task) - # removing a task not in graph - should have no effect, and return False - remove_result = graph.remove_tasks(task_not_in_graph) - assert remove_result == [] - tasks = [t for t in graph.tasks] - assert len(tasks) == 1 - assert tasks[0] == task - - def test_has_task(self, graph): - task = MockTask() - graph.add_tasks(task) - assert graph.has_tasks(task) is True - - def test_has_nonexistent_task(self, graph): - task = MockTask() - task_not_in_graph = MockTask() - graph.add_tasks(task) - assert graph.has_tasks(task_not_in_graph) is False - - def test_has_empty_group(self, graph): - # the "empty task" is in the graph - assert graph.has_tasks([]) is True - - def test_has_group(self, graph): - tasks = [MockTask(), MockTask(), MockTask()] - graph.add_tasks(*tasks) - assert graph.has_tasks(*tasks) is True - - def test_has_partially_existing_group(self, graph): - task = MockTask() - graph.add_tasks(task) - tasks = [MockTask(), task, MockTask()] - assert graph.has_tasks(tasks) is False - - def test_has_recursively_group(self, graph): - recursive_group = [MockTask(), MockTask()] - tasks = [MockTask(), recursive_group, MockTask()] - graph.add_tasks(tasks) - assert graph.has_tasks(tasks) is True - - def test_get_task(self, graph): - task = MockTask() - graph.add_tasks(task) - assert graph.get_task(task.id) == task - - def test_get_nonexistent_task(self, graph): - task = MockTask() - task_not_in_graph = MockTask() - graph.add_tasks(task) - with pytest.raises(task_graph.TaskNotInGraphError): - graph.get_task(task_not_in_graph.id) - - -class TestTaskGraphGraphTraversal(object): - - def test_tasks_iteration(self, graph): - task = MockTask() - other_task = MockTask() - graph.add_tasks(task) - graph.add_tasks(other_task) - tasks = [t for t in graph.tasks] - assert set(tasks) == set([task, other_task]) - - def test_get_dependents(self, graph): - task = MockTask() - dependent_task_1 = MockTask() - dependent_task_2 = MockTask() - transitively_dependent_task = MockTask() - - graph.add_tasks(task) - graph.add_tasks(dependent_task_1) - graph.add_tasks(dependent_task_2) - graph.add_tasks(transitively_dependent_task) - - graph.add_dependency(dependent_task_1, task) - graph.add_dependency(dependent_task_2, task) - graph.add_dependency(transitively_dependent_task, dependent_task_2) - - dependent_tasks = list(graph.get_dependents(task)) - # transitively_dependent_task not expected to appear in the result - assert set(dependent_tasks) == set([dependent_task_1, dependent_task_2]) - - def test_get_task_empty_dependents(self, graph): - task = MockTask() - other_task = MockTask() - graph.add_tasks(task) - graph.add_tasks(other_task) - dependent_tasks = list(graph.get_dependents(task)) - assert len(dependent_tasks) == 0 - - def test_get_nonexistent_task_dependents(self, graph): - task = MockTask() - task_not_in_graph = MockTask() - graph.add_tasks(task) - with pytest.raises(task_graph.TaskNotInGraphError): - list(graph.get_dependents(task_not_in_graph)) - - def test_get_dependencies(self, graph): - task = MockTask() - dependency_task_1 = MockTask() - dependency_task_2 = MockTask() - transitively_dependency_task = MockTask() - - graph.add_tasks(task) - graph.add_tasks(dependency_task_1) - graph.add_tasks(dependency_task_2) - graph.add_tasks(transitively_dependency_task) - - graph.add_dependency(task, dependency_task_1) - graph.add_dependency(task, dependency_task_2) - graph.add_dependency(dependency_task_2, transitively_dependency_task) - - dependency_tasks = list(graph.get_dependencies(task)) - # transitively_dependency_task not expected to appear in the result - assert set(dependency_tasks) == set([dependency_task_1, dependency_task_2]) - - def test_get_task_empty_dependencies(self, graph): - task = MockTask() - other_task = MockTask() - graph.add_tasks(task) - graph.add_tasks(other_task) - dependency_tasks = list(graph.get_dependencies(task)) - assert len(dependency_tasks) == 0 - - def test_get_nonexistent_task_dependencies(self, graph): - task = MockTask() - task_not_in_graph = MockTask() - graph.add_tasks(task) - with pytest.raises(task_graph.TaskNotInGraphError): - list(graph.get_dependencies(task_not_in_graph)) - - -class TestTaskGraphDependencies(object): - - def test_add_dependency(self, graph): - task = MockTask() - dependency_task = MockTask() - unrelated_task = MockTask() - graph.add_tasks(task) - graph.add_tasks(dependency_task) - graph.add_tasks(unrelated_task) - graph.add_dependency(task, dependency_task) - add_result = graph.has_dependency(task, dependency_task) - assert add_result is True - dependency_tasks = list(graph.get_dependencies(task)) - assert len(dependency_tasks) == 1 - assert dependency_tasks[0] == dependency_task - - def test_add_existing_dependency(self, graph): - task = MockTask() - dependency_task = MockTask() - graph.add_tasks(task) - graph.add_tasks(dependency_task) - graph.add_dependency(task, dependency_task) - add_result = graph.has_dependency(task, dependency_task) - # adding a dependency already in graph - should have no effect, and return False - assert add_result is True - graph.add_dependency(task, dependency_task) - add_result = graph.has_dependency(task, dependency_task) - assert add_result is True - dependency_tasks = list(graph.get_dependencies(task)) - assert len(dependency_tasks) == 1 - assert dependency_tasks[0] == dependency_task - - def test_add_dependency_nonexistent_dependent(self, graph): - task = MockTask() - task_not_in_graph = MockTask() - graph.add_tasks(task) - with pytest.raises(task_graph.TaskNotInGraphError): - graph.add_dependency(task_not_in_graph, task) - - def test_add_dependency_nonexistent_dependency(self, graph): - task = MockTask() - task_not_in_graph = MockTask() - graph.add_tasks(task) - with pytest.raises(task_graph.TaskNotInGraphError): - graph.add_dependency(task, task_not_in_graph) - - def test_add_dependency_empty_dependent(self, graph): - task = MockTask() - graph.add_tasks(task) - # expecting add_dependency result to be False - no dependency has been created - assert set(graph.tasks) == set((task,)) - - def test_add_dependency_empty_dependency(self, graph): - task = MockTask() - graph.add_tasks(task) - # expecting add_dependency result to be False - no dependency has been created - assert set(graph.tasks) == set((task,)) - - def test_add_dependency_dependent_group(self, graph): - task = MockTask() - group_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(task) - graph.add_tasks(*group_tasks) - graph.add_dependency(group_tasks, task) - assert graph.has_dependency(group_tasks[0], task) is True - assert graph.has_dependency(group_tasks[1], task) is True - assert graph.has_dependency(group_tasks[2], task) is True - - def test_add_dependency_dependency_group(self, graph): - task = MockTask() - group_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(task) - graph.add_tasks(*group_tasks) - graph.add_dependency(task, group_tasks) - assert graph.has_dependency(task, group_tasks[0]) is True - assert graph.has_dependency(task, group_tasks[1]) is True - assert graph.has_dependency(task, group_tasks[2]) is True - - def test_add_dependency_between_groups(self, graph): - group_1_tasks = [MockTask() for _ in xrange(3)] - group_2_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(*group_1_tasks) - graph.add_tasks(*group_2_tasks) - graph.add_dependency(group_1_tasks, group_2_tasks) - for group_2_task in group_2_tasks: - assert graph.has_dependency(group_1_tasks[0], group_2_task) is True - assert graph.has_dependency(group_1_tasks[1], group_2_task) is True - assert graph.has_dependency(group_1_tasks[2], group_2_task) is True - - def test_add_dependency_dependency_group_with_some_existing_dependencies(self, graph): - task = MockTask() - group_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(task) - graph.add_tasks(*group_tasks) - # adding a dependency on a specific task manually, - # before adding a dependency on the whole parallel - graph.add_dependency(task, group_tasks[1]) - graph.add_dependency(task, group_tasks) - assert graph.has_dependency(task, group_tasks[0]) is True - assert graph.has_dependency(task, group_tasks[1]) is True - assert graph.has_dependency(task, group_tasks[2]) is True - - def test_add_existing_dependency_between_groups(self, graph): - group_1_tasks = [MockTask() for _ in xrange(3)] - group_2_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(*group_1_tasks) - graph.add_tasks(*group_2_tasks) - graph.add_dependency(group_1_tasks, group_2_tasks) - add_result = graph.has_dependency(group_1_tasks, group_2_tasks) - assert add_result is True - # adding a dependency already in graph - should have no effect, and return False - graph.add_dependency(group_1_tasks, group_2_tasks) - add_result = graph.has_dependency(group_1_tasks, group_2_tasks) - assert add_result is True - for group_2_task in group_2_tasks: - assert graph.has_dependency(group_1_tasks[0], group_2_task) is True - assert graph.has_dependency(group_1_tasks[1], group_2_task) is True - assert graph.has_dependency(group_1_tasks[2], group_2_task) is True - - def test_has_dependency(self, graph): - task = MockTask() - dependency_task = MockTask() - graph.add_tasks(task) - graph.add_tasks(dependency_task) - graph.add_dependency(task, dependency_task) - assert graph.has_dependency(task, dependency_task) is True - - def test_has_nonexistent_dependency(self, graph): - task = MockTask() - other_task = MockTask() - graph.add_tasks(task) - graph.add_tasks(other_task) - assert graph.has_dependency(task, other_task) is False - - def test_has_dependency_nonexistent_dependent(self, graph): - task = MockTask() - task_not_in_graph = MockTask() - graph.add_tasks(task) - with pytest.raises(task_graph.TaskNotInGraphError): - graph.has_dependency(task_not_in_graph, task) - - def test_has_dependency_nonexistent_dependency(self, graph): - task = MockTask() - task_not_in_graph = MockTask() - graph.add_tasks(task) - with pytest.raises(task_graph.TaskNotInGraphError): - graph.has_dependency(task, task_not_in_graph) - - def test_has_dependency_empty_dependent(self, graph): - task = MockTask() - graph.add_tasks(task) - # expecting has_dependency result to be False - dependency in an empty form - assert graph.has_dependency([], task) is False - - def test_has_dependency_empty_dependency(self, graph): - task = MockTask() - graph.add_tasks(task) - # expecting has_dependency result to be True - dependency in an empty form - assert graph.has_dependency(task, []) is False - - def test_has_dependency_dependent_group(self, graph): - task = MockTask() - group_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(task) - graph.add_tasks(*group_tasks) - assert graph.has_dependency(group_tasks, task) is False - graph.add_dependency(group_tasks, task) - assert graph.has_dependency(group_tasks, task) is True - - def test_has_dependency_dependency_parallel(self, graph): - task = MockTask() - group_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(task) - graph.add_tasks(*group_tasks) - assert graph.has_dependency(task, group_tasks) is False - graph.add_dependency(task, group_tasks) - assert graph.has_dependency(task, group_tasks) is True - - def test_has_dependency_between_groups(self, graph): - group_1_tasks = [MockTask() for _ in xrange(3)] - group_2_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(*group_1_tasks) - graph.add_tasks(*group_2_tasks) - assert graph.has_dependency(group_2_tasks, group_1_tasks) is False - graph.add_dependency(group_2_tasks, group_1_tasks) - assert graph.has_dependency(group_2_tasks, group_1_tasks) is True - - def test_has_dependency_dependency_parallel_with_some_existing_dependencies(self, graph): - task = MockTask() - parallel_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(task) - parallel = graph.add_tasks(*parallel_tasks) - graph.add_dependency(task, parallel_tasks[1]) - # only a partial dependency exists - has_dependency is expected to return False - assert graph.has_dependency(task, parallel) is False - - def test_has_nonexistent_dependency_between_groups(self, graph): - group_1_tasks = [MockTask() for _ in xrange(3)] - group_2_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(*group_1_tasks) - graph.add_tasks(*group_2_tasks) - assert graph.has_dependency(group_1_tasks, group_2_tasks) is False - - def test_remove_dependency(self, graph): - task = MockTask() - dependency_task = MockTask() - another_dependent_task = MockTask() - graph.add_tasks(task) - graph.add_tasks(dependency_task) - graph.add_tasks(another_dependent_task) - graph.add_dependency(task, dependency_task) - graph.add_dependency(another_dependent_task, dependency_task) - - graph.remove_dependency(task, dependency_task) - remove_result = graph.has_dependency(task, dependency_task) - assert remove_result is False - assert graph.has_dependency(task, dependency_task) is False - assert graph.has_dependency(another_dependent_task, dependency_task) is True - - def test_remove_nonexistent_dependency(self, graph): - task = MockTask() - dependency_task = MockTask() - graph.add_tasks(task) - graph.add_tasks(dependency_task) - # removing a dependency not in graph - should have no effect, and return False - graph.remove_dependency(task, dependency_task) - remove_result = graph.has_dependency(task, dependency_task) - assert remove_result is False - tasks = [t for t in graph.tasks] - assert set(tasks) == set([task, dependency_task]) - - def test_remove_dependency_nonexistent_dependent(self, graph): - task = MockTask() - task_not_in_graph = MockTask() - graph.add_tasks(task) - with pytest.raises(task_graph.TaskNotInGraphError): - graph.remove_dependency(task_not_in_graph, task) - - def test_remove_dependency_nonexistent_dependency(self, graph): - # in this test the dependency *task* is not in the graph, not just the dependency itself - task = MockTask() - task_not_in_graph = MockTask() - graph.add_tasks(task) - with pytest.raises(task_graph.TaskNotInGraphError): - graph.remove_dependency(task, task_not_in_graph) - - def test_remove_dependency_empty_dependent(self, graph): - task = MockTask() - graph.add_tasks(task) - # expecting remove_dependency result to be False - no dependency has been created - graph.remove_dependency([], task) - assert set(graph.tasks) == set((task,)) - - def test_remove_dependency_empty_dependency(self, graph): - task = MockTask() - graph.add_tasks(task) - # expecting remove_dependency result to be False - no dependency has been created - graph.remove_dependency(task, []) - assert set(graph.tasks) == set((task,)) - - def test_remove_dependency_dependent_group(self, graph): - task = MockTask() - group_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(task) - graph.add_tasks(*group_tasks) - graph.add_dependency(group_tasks, task) - graph.remove_dependency(group_tasks, task) - remove_result = graph.has_dependency(group_tasks, task) - assert remove_result is False - assert graph.has_dependency(group_tasks[0], task) is False - assert graph.has_dependency(group_tasks[1], task) is False - assert graph.has_dependency(group_tasks[2], task) is False - - def test_remove_dependency_dependency_group(self, graph): - task = MockTask() - group_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(task) - graph.add_tasks(*group_tasks) - graph.add_dependency(task, group_tasks) - graph.remove_dependency(task, group_tasks) - remove_result = graph.has_dependency(task, group_tasks) - assert remove_result is False - assert graph.has_dependency(task, group_tasks[0]) is False - assert graph.has_dependency(task, group_tasks[1]) is False - assert graph.has_dependency(task, group_tasks[2]) is False - - def test_remove_dependency_between_groups(self, graph): - group_1_tasks = [MockTask() for _ in xrange(3)] - group_2_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(*group_1_tasks) - graph.add_tasks(*group_2_tasks) - graph.add_dependency(group_2_tasks, group_1_tasks) - graph.remove_dependency(group_2_tasks, group_1_tasks) - remove_result = graph.has_dependency(group_2_tasks, group_1_tasks) - assert remove_result is False - for group_2_task in group_2_tasks: - assert graph.has_dependency(group_2_task, group_1_tasks[0]) is False - assert graph.has_dependency(group_2_task, group_1_tasks[1]) is False - assert graph.has_dependency(group_2_task, group_1_tasks[2]) is False - - def test_remove_dependency_dependency_group_with_some_existing_dependencies(self, graph): - task = MockTask() - group_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(task) - graph.add_tasks(*group_tasks) - graph.add_dependency(task, group_tasks[1]) - graph.remove_dependency(task, group_tasks) - remove_result = graph.has_dependency(task, group_tasks) - # only a partial dependency exists - remove_dependency is expected to return False - assert remove_result is False - # no dependencies are expected to have changed - assert graph.has_dependency(task, group_tasks[0]) is False - assert graph.has_dependency(task, group_tasks[1]) is True - assert graph.has_dependency(task, group_tasks[2]) is False - - def test_remove_nonexistent_dependency_between_groups(self, graph): - group_1_tasks = [MockTask() for _ in xrange(3)] - group_2_tasks = [MockTask() for _ in xrange(3)] - graph.add_tasks(*group_1_tasks) - graph.add_tasks(*group_2_tasks) - # removing a dependency not in graph - should have no effect, and return False - graph.remove_dependency(group_2_tasks, group_1_tasks) - remove_result = graph.has_dependency(group_2_tasks, group_1_tasks) - assert remove_result is False - - # nested tests - - def test_group_with_nested_sequence(self, graph): - all_tasks = [MockTask() for _ in xrange(5)] - graph.add_tasks(all_tasks[0], - graph.sequence(all_tasks[1], all_tasks[2], all_tasks[3]), - all_tasks[4]) - assert set(graph.tasks) == set(all_tasks) - - # tasks[2] and tasks[3] should each have a single dependency; the rest should have none - assert len(list(graph.get_dependencies(all_tasks[0]))) == 0 - assert len(list(graph.get_dependencies(all_tasks[1]))) == 0 - assert set(graph.get_dependencies(all_tasks[2])) == set([all_tasks[1]]) - assert set(graph.get_dependencies(all_tasks[3])) == set([all_tasks[2]]) - assert len(list(graph.get_dependencies(all_tasks[4]))) == 0 - - def test_group_with_nested_group(self, graph): - tasks = [MockTask() for _ in xrange(5)] - graph.add_tasks(tasks[0], (tasks[1], tasks[2], tasks[3]), tasks[4]) - graph_tasks = [t for t in graph.tasks] - assert set(graph_tasks) == set(tasks) - # none of the tasks should have any dependencies - for i in xrange(len(tasks)): - assert len(list(graph.get_dependencies(tasks[i]))) == 0 - - def test_group_with_recursively_nested_group(self, graph): - recursively_nested_tasks = [MockTask(), MockTask(), MockTask()] - nested_tasks = [MockTask(), MockTask(), MockTask(), recursively_nested_tasks] - tasks = [MockTask(), MockTask(), MockTask(), nested_tasks] - graph.add_tasks(*tasks) - - assert set(graph.tasks) == set(tasks[:3] + nested_tasks[:3] + recursively_nested_tasks) - for tasks_list in [tasks, nested_tasks, recursively_nested_tasks]: - for i in xrange(len(tasks_list[:3])): - assert len(list(graph.get_dependencies(tasks_list[i]))) == 0 - - def test_group_with_recursively_nested_group_and_interdependencies(self, graph): - recursively_nested_tasks = [MockTask(), MockTask(), MockTask()] - nested_tasks = [MockTask(), MockTask(), MockTask(), recursively_nested_tasks] - tasks = [MockTask(), MockTask(), MockTask(), nested_tasks] - graph.add_tasks(*tasks) - - graph.add_dependency(tasks[2], nested_tasks[2]) - graph.add_dependency(nested_tasks[1], recursively_nested_tasks[0]) - graph.add_dependency(recursively_nested_tasks[1], tasks[0]) - - assert set(graph.tasks) == set(tasks[:3] + nested_tasks[:3] + recursively_nested_tasks) - assert set(graph.get_dependencies(tasks[0])) == set() - assert set(graph.get_dependencies(tasks[1])) == set() - assert set(graph.get_dependencies(tasks[2])) == set([nested_tasks[2]]) - - assert set(graph.get_dependencies(nested_tasks[0])) == set() - assert set(graph.get_dependencies(nested_tasks[1])) == set([recursively_nested_tasks[0]]) - assert set(graph.get_dependencies(nested_tasks[2])) == set() - - assert set(graph.get_dependencies(recursively_nested_tasks[0])) == set() - assert set(graph.get_dependencies(recursively_nested_tasks[1])) == set([tasks[0]]) - assert set(graph.get_dependencies(recursively_nested_tasks[2])) == set() - - -class TestTaskGraphSequence(object): - - def test_sequence(self, graph): - tasks = [MockTask(), MockTask(), MockTask()] - graph.sequence(*tasks) - graph_tasks = [t for t in graph.tasks] - assert set(graph_tasks) == set(tasks) - assert len(list(graph.get_dependencies(tasks[0]))) == 0 - assert set(graph.get_dependencies(tasks[1])) == set([tasks[0]]) - assert set(graph.get_dependencies(tasks[2])) == set([tasks[1]]) - - def test_sequence_with_some_tasks_and_dependencies_already_in_graph(self, graph): - # tests both that tasks which werent previously in graph get inserted, and - # that existing tasks don't get re-added to graph - tasks = [MockTask(), MockTask(), MockTask()] - # insert some tasks and dependencies to the graph - graph.add_tasks(tasks[1]) - graph.add_tasks(tasks[2]) - graph.add_dependency(tasks[2], tasks[1]) - - graph.sequence(*tasks) - graph_tasks = [t for t in graph.tasks] - assert set(graph_tasks) == set(tasks) - assert len(list(graph.get_dependencies(tasks[0]))) == 0 - assert set(graph.get_dependencies(tasks[1])) == set([tasks[0]]) - assert set(graph.get_dependencies(tasks[2])) == set([tasks[1]]) - - def test_sequence_with_nested_sequence(self, graph): - tasks = [MockTask() for _ in xrange(5)] - graph.sequence(tasks[0], graph.sequence(tasks[1], tasks[2], tasks[3]), tasks[4]) - graph_tasks = [t for t in graph.tasks] - assert set(graph_tasks) == set(tasks) - # first task should have no dependencies - assert len(list(graph.get_dependencies(tasks[0]))) == 0 - assert len(list(graph.get_dependencies(tasks[1]))) == 1 - assert len(list(graph.get_dependencies(tasks[2]))) == 2 - assert len(list(graph.get_dependencies(tasks[3]))) == 2 - assert len(list(graph.get_dependencies(tasks[4]))) == 3 - - def test_sequence_with_nested_group(self, graph): - tasks = [MockTask() for _ in xrange(5)] - graph.sequence(tasks[0], (tasks[1], tasks[2], tasks[3]), tasks[4]) - graph_tasks = [t for t in graph.tasks] - assert set(graph_tasks) == set(tasks) - # first task should have no dependencies - assert len(list(graph.get_dependencies(tasks[0]))) == 0 - # rest of the tasks (except last) should have a single dependency - the first task - for i in xrange(1, 4): - assert set(graph.get_dependencies(tasks[i])) == set([tasks[0]]) - # last task should have have a dependency on all tasks except for the first one - assert set(graph.get_dependencies(tasks[4])) == set([tasks[1], tasks[2], tasks[3]]) - - def test_sequence_with_recursively_nested_group(self, graph): - recursively_nested_group = [MockTask(), MockTask()] - nested_group = [MockTask(), recursively_nested_group, MockTask()] - sequence_tasks = [MockTask(), nested_group, MockTask()] - - graph.sequence(*sequence_tasks) - graph_tasks = [t for t in graph.tasks] - assert set(graph_tasks) == set([sequence_tasks[0], nested_group[0], - recursively_nested_group[0], recursively_nested_group[1], - nested_group[2], sequence_tasks[2]]) - - assert list(graph.get_dependencies(nested_group[0])) == [sequence_tasks[0]] - assert list(graph.get_dependencies(recursively_nested_group[0])) == [sequence_tasks[0]] - assert list(graph.get_dependencies(recursively_nested_group[1])) == [sequence_tasks[0]] - assert list(graph.get_dependencies(nested_group[2])) == [sequence_tasks[0]] - - assert list(graph.get_dependents(nested_group[0])) == [sequence_tasks[2]] - assert list(graph.get_dependents(recursively_nested_group[0])) == [sequence_tasks[2]] - assert list(graph.get_dependents(recursively_nested_group[1])) == [sequence_tasks[2]] - assert list(graph.get_dependents(nested_group[2])) == [sequence_tasks[2]] - - def test_sequence_with_empty_group(self, graph): - tasks = [MockTask(), [], MockTask()] - graph.sequence(*tasks) - graph_tasks = set([t for t in graph.tasks]) - assert graph_tasks == set([tasks[0], tasks[2]]) - assert list(graph.get_dependents(tasks[0])) == [tasks[2]] - assert list(graph.get_dependencies(tasks[2])) == [tasks[0]] - - def test_sequence_with_recursively_nested_sequence_and_interdependencies(self, graph): - recursively_nested_tasks = list(graph.sequence(MockTask(), MockTask(), MockTask())) - nested_tasks = list(graph.sequence(MockTask(), - MockTask(), - MockTask(), - recursively_nested_tasks)) - tasks = [MockTask(), MockTask(), MockTask(), nested_tasks] - graph.sequence(*tasks) - - assert set(graph.tasks) == set(tasks[:3] + nested_tasks[:3] + recursively_nested_tasks) - assert set(graph.get_dependencies(tasks[0])) == set() - for i in xrange(1, len(tasks[:-1])): - assert set(graph.get_dependencies(tasks[i])) == set([tasks[i - 1]]) - - assert set(graph.get_dependencies(nested_tasks[0])) == set([tasks[2]]) - for i in xrange(1, len(nested_tasks[:-1])): - assert set(graph.get_dependencies(nested_tasks[i])) == \ - set([tasks[2], nested_tasks[i-1]]) - - assert set(graph.get_dependencies(recursively_nested_tasks[0])) == \ - set([tasks[2], nested_tasks[2]]) - for i in xrange(1, len(recursively_nested_tasks[:-1])): - assert set(graph.get_dependencies(recursively_nested_tasks[i])) == \ - set([tasks[2], nested_tasks[2], recursively_nested_tasks[i-1]]) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/builtin/__init__.py ---------------------------------------------------------------------- diff --git a/tests/workflows/builtin/__init__.py b/tests/workflows/builtin/__init__.py deleted file mode 100644 index c82c024..0000000 --- a/tests/workflows/builtin/__init__.py +++ /dev/null @@ -1,86 +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 ... import mock - -def assert_node_install_operations(operations, with_relationships=False): - if with_relationships: - all_operations = [ - 'aria.interfaces.lifecycle.create', - 'aria.interfaces.relationship_lifecycle.preconfigure', - 'aria.interfaces.relationship_lifecycle.preconfigure', - 'aria.interfaces.lifecycle.configure', - 'aria.interfaces.relationship_lifecycle.postconfigure', - 'aria.interfaces.relationship_lifecycle.postconfigure', - 'aria.interfaces.lifecycle.start', - 'aria.interfaces.relationship_lifecycle.establish', - 'aria.interfaces.relationship_lifecycle.establish', - ] - - for i, operation in enumerate(operations): - assert operation.name.startswith(all_operations[i]) - else: - for i, operation in enumerate(operations): - assert operation.name.startswith(mock.operations.NODE_OPERATIONS_INSTALL[i]) - - -def assert_node_uninstall_operations(operations, with_relationships=False): - if with_relationships: - all_operations = [ - 'aria.interfaces.lifecycle.stop', - 'aria.interfaces.relationship_lifecycle.unlink', - 'aria.interfaces.relationship_lifecycle.unlink', - 'aria.interfaces.lifecycle.delete', - ] - - for i, operation in enumerate(operations): - assert operation.name.startswith(all_operations[i]) - else: - for i, operation in enumerate(operations): - assert operation.name.startswith(mock.operations.NODE_OPERATIONS_UNINSTALL[i]) - - -def ctx_with_basic_graph(): - """ - Create the following graph in storage: - dependency_node <------ dependent_node - :return: - """ - simple_context = mock.context.simple() - dependency_node = mock.models.get_dependency_node() - dependency_node_instance = mock.models.get_dependency_node_instance( - dependency_node=dependency_node) - - relationship = mock.models.get_relationship(dependency_node) - relationship_instance = mock.models.get_relationship_instance( - relationship=relationship, - target_instance=dependency_node_instance - ) - - dependent_node = mock.models.get_dependent_node(relationship) - dependent_node_instance = mock.models.get_dependent_node_instance( - dependent_node=dependent_node, - relationship_instance=relationship_instance - ) - - simple_context.model.node.store(dependent_node) - simple_context.model.node.store(dependency_node) - simple_context.model.node_instance.store(dependent_node_instance) - simple_context.model.node_instance.store(dependency_node_instance) - simple_context.model.relationship.store(relationship) - simple_context.model.relationship_instance.store(relationship_instance) - - return simple_context http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/builtin/test_execute_operation.py ---------------------------------------------------------------------- diff --git a/tests/workflows/builtin/test_execute_operation.py b/tests/workflows/builtin/test_execute_operation.py deleted file mode 100644 index 0bd59ed..0000000 --- a/tests/workflows/builtin/test_execute_operation.py +++ /dev/null @@ -1,51 +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.workflows.api import task -from aria.workflows.builtin.execute_operation import execute_operation - -from ... import mock -from . import ctx_with_basic_graph - - -@pytest.fixture -def ctx(): - return ctx_with_basic_graph() - - -def test_execute_operation(ctx): - operation_name = mock.operations.NODE_OPERATIONS_INSTALL[0] - node_instance_id = 'dependency_node_instance' - - execute_tasks = list( - task.WorkflowTask( - execute_operation, - ctx=ctx, - operation=operation_name, - operation_kwargs={}, - allow_kwargs_override=False, - run_by_dependency_order=False, - type_names=[], - node_ids=[], - node_instance_ids=[node_instance_id] - ).topological_order() - ) - - assert len(execute_tasks) == 1 - assert execute_tasks[0].name == '{0}.{1}'.format(operation_name, node_instance_id) - -# TODO: add more scenarios http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/builtin/test_heal.py ---------------------------------------------------------------------- diff --git a/tests/workflows/builtin/test_heal.py b/tests/workflows/builtin/test_heal.py deleted file mode 100644 index edffe2c..0000000 --- a/tests/workflows/builtin/test_heal.py +++ /dev/null @@ -1,88 +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.workflows.api import task -from aria.workflows.builtin.heal import heal - -from . import (assert_node_install_operations, - assert_node_uninstall_operations, - ctx_with_basic_graph) - - -@pytest.fixture -def ctx(): - return ctx_with_basic_graph() - - -def test_heal_dependent_node(ctx): - heal_graph = task.WorkflowTask(heal, ctx=ctx, node_instance_id='dependent_node_instance') - - assert len(list(heal_graph.tasks)) == 2 - uninstall_subgraph, install_subgraph = list(heal_graph.topological_order(reverse=True)) - - assert len(list(uninstall_subgraph.tasks)) == 2 - dependent_node_subgraph_uninstall, dependency_node_subgraph_uninstall = \ - list(uninstall_subgraph.topological_order(reverse=True)) - - assert len(list(install_subgraph.tasks)) == 2 - dependency_node_subgraph_install, dependent_node_subgraph_install = \ - list(install_subgraph.topological_order(reverse=True)) - - dependent_node_uninstall_tasks = \ - list(dependent_node_subgraph_uninstall.topological_order(reverse=True)) - assert isinstance(dependency_node_subgraph_uninstall, task.StubTask) - dependent_node_install_tasks = \ - list(dependent_node_subgraph_install.topological_order(reverse=True)) - assert isinstance(dependency_node_subgraph_install, task.StubTask) - - assert_node_uninstall_operations(dependent_node_uninstall_tasks, with_relationships=True) - assert_node_install_operations(dependent_node_install_tasks, with_relationships=True) - - -def test_heal_dependency_node(ctx): - heal_graph = task.WorkflowTask(heal, ctx=ctx, node_instance_id='dependency_node_instance') - # both subgraphs should contain un\install for both the dependent and the dependency - assert len(list(heal_graph.tasks)) == 2 - uninstall_subgraph, install_subgraph = list(heal_graph.topological_order(reverse=True)) - - uninstall_tasks = list(uninstall_subgraph.topological_order(reverse=True)) - assert len(uninstall_tasks) == 4 - unlink_source, unlink_target = uninstall_tasks[:2] - dependent_node_subgraph_uninstall, dependency_node_subgraph_uninstall = uninstall_tasks[2:] - - install_tasks = list(install_subgraph.topological_order(reverse=True)) - assert len(install_tasks) == 4 - dependency_node_subgraph_install, dependent_node_subgraph_install = install_tasks[:2] - establish_source, establish_target = install_tasks[2:] - - assert isinstance(dependent_node_subgraph_uninstall, task.StubTask) - dependency_node_uninstall_tasks = \ - list(dependency_node_subgraph_uninstall.topological_order(reverse=True)) - assert isinstance(dependent_node_subgraph_install, task.StubTask) - dependency_node_install_tasks = \ - list(dependency_node_subgraph_install.topological_order(reverse=True)) - - assert unlink_source.name.startswith('aria.interfaces.relationship_lifecycle.unlink') - assert unlink_target.name.startswith('aria.interfaces.relationship_lifecycle.unlink') - assert_node_uninstall_operations(dependency_node_uninstall_tasks) - - assert_node_install_operations(dependency_node_install_tasks) - assert establish_source.name.startswith('aria.interfaces.relationship_lifecycle.establish') - assert establish_target.name.startswith('aria.interfaces.relationship_lifecycle.establish') - - -# TODO: add tests for contained in scenario http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/builtin/test_install.py ---------------------------------------------------------------------- diff --git a/tests/workflows/builtin/test_install.py b/tests/workflows/builtin/test_install.py deleted file mode 100644 index 29212e3..0000000 --- a/tests/workflows/builtin/test_install.py +++ /dev/null @@ -1,39 +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.workflows.builtin.install import install -from aria.workflows.api import task - -from . import (assert_node_install_operations, - ctx_with_basic_graph) - - -@pytest.fixture -def ctx(): - return ctx_with_basic_graph() - - -def test_install(ctx): - install_tasks = list(task.WorkflowTask(install, ctx=ctx).topological_order(True)) - - assert len(install_tasks) == 2 - dependency_node_subgraph, dependent_node_subgraph = install_tasks - dependent_node_tasks = list(dependent_node_subgraph.topological_order(reverse=True)) - dependency_node_tasks = list(dependency_node_subgraph.topological_order(reverse=True)) - - assert_node_install_operations(dependency_node_tasks) - assert_node_install_operations(dependent_node_tasks, with_relationships=True) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/builtin/test_uninstall.py ---------------------------------------------------------------------- diff --git a/tests/workflows/builtin/test_uninstall.py b/tests/workflows/builtin/test_uninstall.py deleted file mode 100644 index 2d00673..0000000 --- a/tests/workflows/builtin/test_uninstall.py +++ /dev/null @@ -1,39 +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.workflows.api import task -from aria.workflows.builtin.uninstall import uninstall - -from . import (assert_node_uninstall_operations, - ctx_with_basic_graph) - - -@pytest.fixture -def ctx(): - return ctx_with_basic_graph() - - -def test_uninstall(ctx): - uninstall_tasks = list(task.WorkflowTask(uninstall, ctx=ctx).topological_order(True)) - - assert len(uninstall_tasks) == 2 - dependent_node_subgraph, dependency_node_subgraph = uninstall_tasks - dependent_node_tasks = list(dependent_node_subgraph.topological_order(reverse=True)) - dependency_node_tasks = list(dependency_node_subgraph.topological_order(reverse=True)) - - assert_node_uninstall_operations(operations=dependency_node_tasks) - assert_node_uninstall_operations(operations=dependent_node_tasks, with_relationships=True) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/core/__init__.py ---------------------------------------------------------------------- diff --git a/tests/workflows/core/__init__.py b/tests/workflows/core/__init__.py deleted file mode 100644 index ae1e83e..0000000 --- a/tests/workflows/core/__init__.py +++ /dev/null @@ -1,14 +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. http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/core/test_engine.py ---------------------------------------------------------------------- diff --git a/tests/workflows/core/test_engine.py b/tests/workflows/core/test_engine.py deleted file mode 100644 index 9e12c0b..0000000 --- a/tests/workflows/core/test_engine.py +++ /dev/null @@ -1,433 +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 time -import threading -from datetime import datetime - -import pytest - -import aria -from aria import ( - events, - workflow, - operation, - context -) -from aria.storage import models -from aria.workflows import ( - api, - exceptions, -) -from aria.workflows.core import engine -from aria.workflows.executor import thread - - -import tests.storage -from tests import mock - - -global_test_holder = {} - - -class BaseTest(object): - - @classmethod - def _execute(cls, workflow_func, workflow_context, executor): - eng = cls._engine(workflow_func=workflow_func, - workflow_context=workflow_context, - executor=executor) - eng.execute() - return eng - - @staticmethod - def _engine(workflow_func, workflow_context, executor): - graph = workflow_func(ctx=workflow_context) - return engine.Engine(executor=executor, - workflow_context=workflow_context, - tasks_graph=graph) - - @staticmethod - def _op(func, ctx, - inputs=None, - max_attempts=None, - retry_interval=None, - ignore_failure=None): - node_instance = ctx.model.node_instance.get('dependency_node_instance') - node_instance.node.operations['aria.interfaces.lifecycle.create'] = { - 'operation': 'tests.workflows.core.test_engine.{name}'.format(name=func.__name__) - } - ctx.model.node_instance.store(node_instance) - return api.task.OperationTask.node_instance( - instance=node_instance, - name='aria.interfaces.lifecycle.create', - inputs=inputs, - max_attempts=max_attempts, - retry_interval=retry_interval, - ignore_failure=ignore_failure - ) - - @pytest.fixture(scope='function', autouse=True) - def globals_cleanup(self): - try: - yield - finally: - global_test_holder.clear() - - @pytest.fixture(scope='function', autouse=True) - def signals_registration(self, ): - def sent_task_handler(*args, **kwargs): - calls = global_test_holder.setdefault('sent_task_signal_calls', 0) - global_test_holder['sent_task_signal_calls'] = calls + 1 - - def start_workflow_handler(workflow_context, *args, **kwargs): - workflow_context.states.append('start') - - def success_workflow_handler(workflow_context, *args, **kwargs): - workflow_context.states.append('success') - - def failure_workflow_handler(workflow_context, exception, *args, **kwargs): - workflow_context.states.append('failure') - workflow_context.exception = exception - - def cancel_workflow_handler(workflow_context, *args, **kwargs): - workflow_context.states.append('cancel') - - events.start_workflow_signal.connect(start_workflow_handler) - events.on_success_workflow_signal.connect(success_workflow_handler) - events.on_failure_workflow_signal.connect(failure_workflow_handler) - events.on_cancelled_workflow_signal.connect(cancel_workflow_handler) - events.sent_task_signal.connect(sent_task_handler) - try: - yield - finally: - events.start_workflow_signal.disconnect(start_workflow_handler) - events.on_success_workflow_signal.disconnect(success_workflow_handler) - events.on_failure_workflow_signal.disconnect(failure_workflow_handler) - events.on_cancelled_workflow_signal.disconnect(cancel_workflow_handler) - events.sent_task_signal.disconnect(sent_task_handler) - - @pytest.fixture(scope='function') - def executor(self): - result = thread.ThreadExecutor() - try: - yield result - finally: - result.close() - - @pytest.fixture(scope='function') - def workflow_context(self): - model_storage = aria.application_model_storage(tests.storage.InMemoryModelDriver()) - model_storage.setup() - blueprint = mock.models.get_blueprint() - deployment = mock.models.get_deployment() - model_storage.blueprint.store(blueprint) - model_storage.deployment.store(deployment) - node = mock.models.get_dependency_node() - node_instance = mock.models.get_dependency_node_instance(node) - model_storage.node.store(node) - model_storage.node_instance.store(node_instance) - result = context.workflow.WorkflowContext( - name='test', - model_storage=model_storage, - resource_storage=None, - deployment_id=deployment.id, - workflow_id='name') - result.states = [] - result.exception = None - return result - - -class TestEngine(BaseTest): - - def test_empty_graph_execution(self, workflow_context, executor): - @workflow - def mock_workflow(**_): - pass - self._execute(workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - assert workflow_context.states == ['start', 'success'] - assert workflow_context.exception is None - assert 'sent_task_signal_calls' not in global_test_holder - execution = workflow_context.execution - assert execution.started_at <= execution.ended_at <= datetime.utcnow() - assert execution.error is None - assert execution.status == models.Execution.TERMINATED - - def test_single_task_successful_execution(self, workflow_context, executor): - @workflow - def mock_workflow(ctx, graph): - graph.add_tasks(self._op(mock_success_task, ctx)) - self._execute( - workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - assert workflow_context.states == ['start', 'success'] - assert workflow_context.exception is None - assert global_test_holder.get('sent_task_signal_calls') == 1 - - def test_single_task_failed_execution(self, workflow_context, executor): - @workflow - def mock_workflow(ctx, graph): - graph.add_tasks(self._op(mock_failed_task, ctx)) - with pytest.raises(exceptions.ExecutorException): - self._execute( - workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - assert workflow_context.states == ['start', 'failure'] - assert isinstance(workflow_context.exception, exceptions.ExecutorException) - assert global_test_holder.get('sent_task_signal_calls') == 1 - execution = workflow_context.execution - assert execution.started_at <= execution.ended_at <= datetime.utcnow() - assert execution.error is not None - assert execution.status == models.Execution.FAILED - - def test_two_tasks_execution_order(self, workflow_context, executor): - @workflow - def mock_workflow(ctx, graph): - op1 = self._op(mock_ordered_task, ctx, inputs={'counter': 1}) - op2 = self._op(mock_ordered_task, ctx, inputs={'counter': 2}) - graph.sequence(op1, op2) - self._execute( - workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - assert workflow_context.states == ['start', 'success'] - assert workflow_context.exception is None - assert global_test_holder.get('invocations') == [1, 2] - assert global_test_holder.get('sent_task_signal_calls') == 2 - - def test_stub_and_subworkflow_execution(self, workflow_context, executor): - @workflow - def sub_workflow(ctx, graph): - op1 = self._op(mock_ordered_task, ctx, inputs={'counter': 1}) - op2 = api.task.StubTask() - op3 = self._op(mock_ordered_task, ctx, inputs={'counter': 2}) - graph.sequence(op1, op2, op3) - - @workflow - def mock_workflow(ctx, graph): - graph.add_tasks(api.task.WorkflowTask(sub_workflow, ctx=ctx)) - self._execute(workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - assert workflow_context.states == ['start', 'success'] - assert workflow_context.exception is None - assert global_test_holder.get('invocations') == [1, 2] - assert global_test_holder.get('sent_task_signal_calls') == 2 - - -class TestCancel(BaseTest): - - def test_cancel_started_execution(self, workflow_context, executor): - number_of_tasks = 100 - - @workflow - def mock_workflow(ctx, graph): - return graph.sequence(*(self._op(mock_sleep_task, ctx, inputs={'seconds': 0.1}) - for _ in range(number_of_tasks))) - eng = self._engine(workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - t = threading.Thread(target=eng.execute) - t.start() - time.sleep(1) - eng.cancel_execution() - t.join(timeout=30) - assert workflow_context.states == ['start', 'cancel'] - assert workflow_context.exception is None - invocations = global_test_holder.get('invocations', []) - assert 0 < len(invocations) < number_of_tasks - execution = workflow_context.execution - assert execution.started_at <= execution.ended_at <= datetime.utcnow() - assert execution.error is None - assert execution.status == models.Execution.CANCELLED - - def test_cancel_pending_execution(self, workflow_context, executor): - @workflow - def mock_workflow(graph, **_): - return graph - eng = self._engine(workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - eng.cancel_execution() - execution = workflow_context.execution - assert execution.status == models.Execution.CANCELLED - - -class TestRetries(BaseTest): - - def test_two_max_attempts_and_success_on_retry(self, workflow_context, executor): - @workflow - def mock_workflow(ctx, graph): - op = self._op(mock_conditional_failure_task, ctx, - inputs={'failure_count': 1}, - max_attempts=2) - graph.add_tasks(op) - self._execute( - workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - assert workflow_context.states == ['start', 'success'] - assert workflow_context.exception is None - assert len(global_test_holder.get('invocations', [])) == 2 - assert global_test_holder.get('sent_task_signal_calls') == 2 - - def test_two_max_attempts_and_failure_on_retry(self, workflow_context, executor): - @workflow - def mock_workflow(ctx, graph): - op = self._op(mock_conditional_failure_task, ctx, - inputs={'failure_count': 2}, - max_attempts=2) - graph.add_tasks(op) - with pytest.raises(exceptions.ExecutorException): - self._execute( - workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - assert workflow_context.states == ['start', 'failure'] - assert isinstance(workflow_context.exception, exceptions.ExecutorException) - assert len(global_test_holder.get('invocations', [])) == 2 - assert global_test_holder.get('sent_task_signal_calls') == 2 - - def test_three_max_attempts_and_success_on_first_retry(self, workflow_context, executor): - @workflow - def mock_workflow(ctx, graph): - op = self._op(mock_conditional_failure_task, ctx, - inputs={'failure_count': 1}, - max_attempts=3) - graph.add_tasks(op) - self._execute( - workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - assert workflow_context.states == ['start', 'success'] - assert workflow_context.exception is None - assert len(global_test_holder.get('invocations', [])) == 2 - assert global_test_holder.get('sent_task_signal_calls') == 2 - - def test_three_max_attempts_and_success_on_second_retry(self, workflow_context, executor): - @workflow - def mock_workflow(ctx, graph): - op = self._op(mock_conditional_failure_task, ctx, - inputs={'failure_count': 2}, - max_attempts=3) - graph.add_tasks(op) - self._execute( - workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - assert workflow_context.states == ['start', 'success'] - assert workflow_context.exception is None - assert len(global_test_holder.get('invocations', [])) == 3 - assert global_test_holder.get('sent_task_signal_calls') == 3 - - def test_infinite_retries(self, workflow_context, executor): - @workflow - def mock_workflow(ctx, graph): - op = self._op(mock_conditional_failure_task, ctx, - inputs={'failure_count': 1}, - max_attempts=-1) - graph.add_tasks(op) - self._execute( - workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - assert workflow_context.states == ['start', 'success'] - assert workflow_context.exception is None - assert len(global_test_holder.get('invocations', [])) == 2 - assert global_test_holder.get('sent_task_signal_calls') == 2 - - def test_retry_interval_float(self, workflow_context, executor): - self._test_retry_interval(retry_interval=0.3, - workflow_context=workflow_context, - executor=executor) - - def test_retry_interval_int(self, workflow_context, executor): - self._test_retry_interval(retry_interval=1, - workflow_context=workflow_context, - executor=executor) - - def _test_retry_interval(self, retry_interval, workflow_context, executor): - @workflow - def mock_workflow(ctx, graph): - op = self._op(mock_conditional_failure_task, ctx, - inputs={'failure_count': 1}, - max_attempts=2, - retry_interval=retry_interval) - graph.add_tasks(op) - self._execute( - workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - assert workflow_context.states == ['start', 'success'] - assert workflow_context.exception is None - invocations = global_test_holder.get('invocations', []) - assert len(invocations) == 2 - invocation1, invocation2 = invocations - assert invocation2 - invocation1 >= retry_interval - assert global_test_holder.get('sent_task_signal_calls') == 2 - - def test_ignore_failure(self, workflow_context, executor): - @workflow - def mock_workflow(ctx, graph): - op = self._op(mock_conditional_failure_task, ctx, - ignore_failure=True, - inputs={'failure_count': 100}, - max_attempts=100) - graph.add_tasks(op) - self._execute( - workflow_func=mock_workflow, - workflow_context=workflow_context, - executor=executor) - assert workflow_context.states == ['start', 'success'] - assert workflow_context.exception is None - invocations = global_test_holder.get('invocations', []) - assert len(invocations) == 1 - assert global_test_holder.get('sent_task_signal_calls') == 1 - - -@operation -def mock_success_task(**_): - pass - - -@operation -def mock_failed_task(**_): - raise RuntimeError - - -@operation -def mock_ordered_task(counter, **_): - invocations = global_test_holder.setdefault('invocations', []) - invocations.append(counter) - - -@operation -def mock_conditional_failure_task(failure_count, **_): - invocations = global_test_holder.setdefault('invocations', []) - try: - if len(invocations) < failure_count: - raise RuntimeError - finally: - invocations.append(time.time()) - - -def mock_sleep_task(seconds, **_): - invocations = global_test_holder.setdefault('invocations', []) - invocations.append(time.time()) - time.sleep(seconds) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/core/test_task.py ---------------------------------------------------------------------- diff --git a/tests/workflows/core/test_task.py b/tests/workflows/core/test_task.py deleted file mode 100644 index 56e49c6..0000000 --- a/tests/workflows/core/test_task.py +++ /dev/null @@ -1,113 +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, - timedelta -) - -import pytest - -from aria.context import workflow as workflow_context -from aria.workflows import ( - api, - core, - exceptions, -) - -from ... import mock - - -@pytest.fixture -def ctx(): - simple_context = mock.context.simple() - - blueprint = mock.models.get_blueprint() - deployment = mock.models.get_deployment() - node = mock.models.get_dependency_node() - node_instance = mock.models.get_dependency_node_instance(node) - execution = mock.models.get_execution() - - simple_context.model.blueprint.store(blueprint) - simple_context.model.deployment.store(deployment) - simple_context.model.node.store(node) - simple_context.model.node_instance.store(node_instance) - simple_context.model.execution.store(execution) - - return simple_context - - -class TestOperationTask(object): - - def _create_operation_task(self, ctx, node_instance): - with workflow_context.current.push(ctx): - api_task = api.task.OperationTask.node_instance( - instance=node_instance, - name='aria.interfaces.lifecycle.create', - ) - - core_task = core.task.OperationTask(api_task=api_task) - - return api_task, core_task - - def test_operation_task_creation(self, ctx): - node_instance = ctx.model.node_instance.get(mock.models.DEPENDENCY_NODE_INSTANCE_ID) - api_task, core_task = self._create_operation_task(ctx, node_instance) - storage_task = ctx.model.task.get(core_task.id) - - assert core_task.model_task == storage_task - assert core_task.name == api_task.name - assert core_task.operation_mapping == api_task.operation_mapping - assert core_task.actor == api_task.actor == node_instance - assert core_task.inputs == api_task.inputs == storage_task.inputs - - def test_operation_task_edit_locked_attribute(self, ctx): - node_instance = ctx.model.node_instance.get(mock.models.DEPENDENCY_NODE_INSTANCE_ID) - - _, core_task = self._create_operation_task(ctx, node_instance) - now = datetime.utcnow() - with pytest.raises(exceptions.TaskException): - core_task.status = core_task.STARTED - with pytest.raises(exceptions.TaskException): - core_task.started_at = now - with pytest.raises(exceptions.TaskException): - core_task.ended_at = now - with pytest.raises(exceptions.TaskException): - core_task.retry_count = 2 - with pytest.raises(exceptions.TaskException): - core_task.due_at = now - - def test_operation_task_edit_attributes(self, ctx): - node_instance = ctx.model.node_instance.get(mock.models.DEPENDENCY_NODE_INSTANCE_ID) - - _, core_task = self._create_operation_task(ctx, node_instance) - future_time = datetime.utcnow() + timedelta(seconds=3) - - with core_task._update(): - core_task.status = core_task.STARTED - core_task.started_at = future_time - core_task.ended_at = future_time - core_task.retry_count = 2 - core_task.eta = future_time - assert core_task.status != core_task.STARTED - assert core_task.started_at != future_time - assert core_task.ended_at != future_time - assert core_task.retry_count != 2 - assert core_task.due_at != future_time - - assert core_task.status == core_task.STARTED - assert core_task.started_at == future_time - assert core_task.ended_at == future_time - assert core_task.retry_count == 2 - assert core_task.eta == future_time http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/core/test_task_graph_into_exececution_graph.py ---------------------------------------------------------------------- diff --git a/tests/workflows/core/test_task_graph_into_exececution_graph.py b/tests/workflows/core/test_task_graph_into_exececution_graph.py deleted file mode 100644 index 2e7c7df..0000000 --- a/tests/workflows/core/test_task_graph_into_exececution_graph.py +++ /dev/null @@ -1,105 +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 networkx import topological_sort, DiGraph - -from aria import context -from aria.workflows import api, core - -from ... import mock - - -def test_task_graph_into_execution_graph(): - operation_name = 'aria.interfaces.lifecycle.create' - task_context = mock.context.simple() - node = mock.models.get_dependency_node() - node_instance = mock.models.get_dependency_node_instance() - deployment = mock.models.get_deployment() - execution = mock.models.get_execution() - task_context.model.node.store(node) - task_context.model.node_instance.store(node_instance) - task_context.model.deployment.store(deployment) - task_context.model.execution.store(execution) - - def sub_workflow(name, **_): - return api.task_graph.TaskGraph(name) - - 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(instance=node_instance, - name=operation_name) - simple_after_task = api.task.OperationTask.node_instance(instance=node_instance, - name=operation_name) - - inner_task_graph = api.task.WorkflowTask(sub_workflow, name='test_inner_task_graph') - inner_task = api.task.OperationTask.node_instance(instance=node_instance, - name=operation_name) - inner_task_graph.add_tasks(inner_task) - - test_task_graph.add_tasks(simple_before_task) - test_task_graph.add_tasks(simple_after_task) - test_task_graph.add_tasks(inner_task_graph) - test_task_graph.add_dependency(inner_task_graph, simple_before_task) - test_task_graph.add_dependency(simple_after_task, inner_task_graph) - - # Direct check - execution_graph = DiGraph() - core.translation.build_execution_graph(task_graph=test_task_graph, - execution_graph=execution_graph) - execution_tasks = topological_sort(execution_graph) - - assert len(execution_tasks) == 7 - - expected_tasks_names = [ - '{0}-Start'.format(test_task_graph.id), - simple_before_task.id, - '{0}-Start'.format(inner_task_graph.id), - inner_task.id, - '{0}-End'.format(inner_task_graph.id), - simple_after_task.id, - '{0}-End'.format(test_task_graph.id) - ] - - assert expected_tasks_names == execution_tasks - - assert isinstance(_get_task_by_name(execution_tasks[0], execution_graph), - core.task.StartWorkflowTask) - - _assert_execution_is_api_task(_get_task_by_name(execution_tasks[1], execution_graph), - simple_before_task) - assert isinstance(_get_task_by_name(execution_tasks[2], execution_graph), - core.task.StartSubWorkflowTask) - - _assert_execution_is_api_task(_get_task_by_name(execution_tasks[3], execution_graph), - inner_task) - assert isinstance(_get_task_by_name(execution_tasks[4], execution_graph), - core.task.EndSubWorkflowTask) - - _assert_execution_is_api_task(_get_task_by_name(execution_tasks[5], execution_graph), - simple_after_task) - assert isinstance(_get_task_by_name(execution_tasks[6], execution_graph), - core.task.EndWorkflowTask) - - -def _assert_execution_is_api_task(execution_task, api_task): - assert execution_task.id == api_task.id - assert execution_task.name == api_task.name - assert execution_task.operation_mapping == api_task.operation_mapping - assert execution_task.actor == api_task.actor - assert execution_task.inputs == api_task.inputs - - -def _get_task_by_name(task_name, graph): - return graph.node[task_name]['task'] http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/653365da/tests/workflows/executor/__init__.py ---------------------------------------------------------------------- diff --git a/tests/workflows/executor/__init__.py b/tests/workflows/executor/__init__.py deleted file mode 100644 index ae1e83e..0000000 --- a/tests/workflows/executor/__init__.py +++ /dev/null @@ -1,14 +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.