Merge "Relax the linear flow symbol constraints"

This commit is contained in:
Jenkins
2014-10-18 18:25:09 +00:00
committed by Gerrit Code Review
3 changed files with 2 additions and 84 deletions

View File

@@ -14,7 +14,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from taskflow import exceptions
from taskflow import flow
@@ -22,14 +21,11 @@ _LINK_METADATA = {'invariant': True}
class Flow(flow.Flow):
"""Linear Flow pattern.
"""Linear flow pattern.
A linear (potentially nested) flow of *tasks/flows* that can be
applied in order as one unit and rolled back as one unit using
the reverse order that the *tasks/flows* have been applied in.
NOTE(imelnikov): Tasks/flows contained in this linear flow must not
depend on outputs (provided names/values) of tasks/flows that follow it.
"""
def __init__(self, name, retry=None):
@@ -38,32 +34,7 @@ class Flow(flow.Flow):
def add(self, *items):
"""Adds a given task/tasks/flow/flows to this flow."""
if not items:
return self
# NOTE(imelnikov): we add item to the end of flow, so it should
# not provide anything previous items of the flow require.
requires = self.requires
provides = self.provides
for item in items:
requires |= item.requires
out_of_order = requires & item.provides
if out_of_order:
raise exceptions.DependencyFailure(
"%(item)s provides %(oo)s that are required "
"by previous item(s) of linear flow %(flow)s"
% dict(item=item.name, flow=self.name,
oo=sorted(out_of_order)))
same_provides = provides & item.provides
if same_provides:
raise exceptions.DependencyFailure(
"%(item)s provides %(value)s but is already being"
" provided by %(flow)s and duplicate producers"
" are disallowed"
% dict(item=item.name, flow=self.name,
value=sorted(same_provides)))
provides |= item.provides
items = [i for i in items if i not in self._children]
self._children.extend(items)
return self

View File

@@ -14,7 +14,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from taskflow import exceptions as exc
from taskflow.patterns import linear_flow as lf
from taskflow import retry
from taskflow import test
@@ -95,24 +94,6 @@ class LinearFlowTest(test.TestCase):
(task1, task2, {'invariant': True})
])
def test_linear_flow_two_dependent_tasks_reverse_order(self):
task1 = _task(name='task1', provides=['a'])
task2 = _task(name='task2', requires=['a'])
f = lf.Flow('test')
self.assertRaises(exc.DependencyFailure, f.add, task2, task1)
def test_linear_flow_two_dependent_tasks_reverse_order2(self):
task1 = _task(name='task1', provides=['a'])
task2 = _task(name='task2', requires=['a'])
f = lf.Flow('test').add(task2)
self.assertRaises(exc.DependencyFailure, f.add, task1)
def test_linear_flow_two_task_same_provide(self):
task1 = _task(name='task1', provides=['a', 'b'])
task2 = _task(name='task2', provides=['a', 'c'])
f = lf.Flow('test')
self.assertRaises(exc.DependencyFailure, f.add, task2, task1)
def test_linear_flow_three_tasks(self):
task1 = _task(name='task1')
task2 = _task(name='task2')

View File

@@ -186,13 +186,6 @@ class FlowDependenciesTest(test.TestCase):
self.assertEqual(flow.requires, set(['a', 'b', 'c']))
self.assertEqual(flow.provides, set(['x', 'y', 'z', 'q']))
def test_nested_flows_provides_same_values(self):
flow = lf.Flow('lf').add(
uf.Flow('uf').add(utils.TaskOneReturn(provides='x')))
self.assertRaises(exceptions.DependencyFailure,
flow.add,
gf.Flow('gf').add(utils.TaskOneReturn(provides='x')))
def test_graph_flow_requires_values(self):
flow = gf.Flow('gf').add(
utils.TaskOneArg('task1'),
@@ -336,18 +329,6 @@ class FlowDependenciesTest(test.TestCase):
self.assertEqual(flow.requires, set(['x', 'y', 'c']))
self.assertEqual(flow.provides, set(['a', 'b', 'z']))
def test_linear_flow_retry_and_task_dependency_conflict(self):
flow = lf.Flow('lf', retry.AlwaysRevert('rt', requires=['x']))
self.assertRaises(exceptions.DependencyFailure,
flow.add,
utils.TaskOneReturn(provides=['x']))
def test_linear_flow_retry_and_task_provide_same_value(self):
flow = lf.Flow('lf', retry.AlwaysRevert('rt', provides=['x']))
self.assertRaises(exceptions.DependencyFailure,
flow.add,
utils.TaskOneReturn('t1', provides=['x']))
def test_unordered_flow_retry_and_task(self):
flow = uf.Flow('uf', retry.AlwaysRevert('rt',
requires=['x', 'y'],
@@ -399,21 +380,6 @@ class FlowDependenciesTest(test.TestCase):
flow.add,
utils.TaskOneReturn('t1', provides=['x']))
def test_two_retries_provide_same_values_in_nested_flows(self):
flow = lf.Flow('lf', retry.AlwaysRevert('rt1', provides=['x']))
self.assertRaises(exceptions.DependencyFailure,
flow.add,
lf.Flow('lf1', retry.AlwaysRevert('rt2',
provides=['x'])))
def test_two_retries_provide_same_values(self):
flow = lf.Flow('lf').add(
lf.Flow('lf1', retry.AlwaysRevert('rt1', provides=['x'])))
self.assertRaises(exceptions.DependencyFailure,
flow.add,
lf.Flow('lf2', retry.AlwaysRevert('rt2',
provides=['x'])))
def test_builtin_retry_args(self):
class FullArgsRetry(retry.AlwaysRevert):