Check tasks should not provide same values
Check is added to linear_flow and unordered_flow patterns that there are no two child items provide same values. Unit tests added. Change-Id: I7a293d58a962de37ba2fd1dd989bf0a218417430 Closes-Bug: #1264995
This commit is contained in:
@@ -40,6 +40,7 @@ class Flow(flow.Flow):
|
|||||||
# NOTE(imelnikov): we add item to the end of flow, so it should
|
# NOTE(imelnikov): we add item to the end of flow, so it should
|
||||||
# not provide anything previous items of the flow require
|
# not provide anything previous items of the flow require
|
||||||
requires = self.requires
|
requires = self.requires
|
||||||
|
provides = self.provides
|
||||||
for item in items:
|
for item in items:
|
||||||
requires |= item.requires
|
requires |= item.requires
|
||||||
out_of_order = requires & item.provides
|
out_of_order = requires & item.provides
|
||||||
@@ -49,6 +50,15 @@ class Flow(flow.Flow):
|
|||||||
"by previous item(s) of linear flow %(flow)s"
|
"by previous item(s) of linear flow %(flow)s"
|
||||||
% dict(item=item.name, flow=self.name,
|
% dict(item=item.name, flow=self.name,
|
||||||
oo=sorted(out_of_order)))
|
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
|
||||||
|
|
||||||
self._children.extend(items)
|
self._children.extend(items)
|
||||||
return self
|
return self
|
||||||
|
|||||||
@@ -52,7 +52,15 @@ class Flow(flow.Flow):
|
|||||||
"by other item(s) of unordered flow %(flow)s"
|
"by other item(s) of unordered flow %(flow)s"
|
||||||
% dict(item=item.name, flow=self.name,
|
% dict(item=item.name, flow=self.name,
|
||||||
oo=sorted(bad_provs)))
|
oo=sorted(bad_provs)))
|
||||||
provides |= item_provides
|
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
|
||||||
|
|
||||||
for item in items:
|
for item in items:
|
||||||
bad_reqs = provides & item.requires
|
bad_reqs = provides & item.requires
|
||||||
|
|||||||
@@ -110,12 +110,25 @@ class FlowDependenciesTest(test.TestCase):
|
|||||||
self.assertEqual(flow.provides, set(['x', 'y', 'q', 'i', 'j', 'k']))
|
self.assertEqual(flow.provides, set(['x', 'y', 'q', 'i', 'j', 'k']))
|
||||||
|
|
||||||
def test_linear_flow_self_requires(self):
|
def test_linear_flow_self_requires(self):
|
||||||
flow = lf.Flow('uf')
|
flow = lf.Flow('lf')
|
||||||
self.assertRaises(exceptions.InvariantViolationException,
|
self.assertRaises(exceptions.InvariantViolationException,
|
||||||
flow.add,
|
flow.add,
|
||||||
utils.TaskNoRequiresNoReturns(rebind=['x'],
|
utils.TaskNoRequiresNoReturns(rebind=['x'],
|
||||||
provides='x'))
|
provides='x'))
|
||||||
|
|
||||||
|
def test_linear_flow_provides_same_values(self):
|
||||||
|
flow = lf.Flow('lf').add(utils.TaskOneReturn(provides='x'))
|
||||||
|
self.assertRaises(exceptions.DependencyFailure,
|
||||||
|
flow.add,
|
||||||
|
utils.TaskOneReturn(provides='x'))
|
||||||
|
|
||||||
|
def test_linear_flow_provides_same_values_one_add(self):
|
||||||
|
flow = lf.Flow('lf')
|
||||||
|
self.assertRaises(exceptions.DependencyFailure,
|
||||||
|
flow.add,
|
||||||
|
utils.TaskOneReturn(provides='x'),
|
||||||
|
utils.TaskOneReturn(provides='x'))
|
||||||
|
|
||||||
def test_unordered_flow_without_dependencies(self):
|
def test_unordered_flow_without_dependencies(self):
|
||||||
flow = uf.Flow('uf').add(
|
flow = uf.Flow('uf').add(
|
||||||
utils.TaskNoRequiresNoReturns('task1'),
|
utils.TaskNoRequiresNoReturns('task1'),
|
||||||
@@ -182,6 +195,19 @@ class FlowDependenciesTest(test.TestCase):
|
|||||||
self.assertEqual(flow.requires, set(['a', 'b', 'c', 'x', 'y', 'z']))
|
self.assertEqual(flow.requires, set(['a', 'b', 'c', 'x', 'y', 'z']))
|
||||||
self.assertEqual(flow.provides, set(['d', 'e', 'f', 'i', 'j', 'k']))
|
self.assertEqual(flow.provides, set(['d', 'e', 'f', 'i', 'j', 'k']))
|
||||||
|
|
||||||
|
def test_unordered_flow_provides_same_values(self):
|
||||||
|
flow = uf.Flow('uf').add(utils.TaskOneReturn(provides='x'))
|
||||||
|
self.assertRaises(exceptions.DependencyFailure,
|
||||||
|
flow.add,
|
||||||
|
utils.TaskOneReturn(provides='x'))
|
||||||
|
|
||||||
|
def test_unordered_flow_provides_same_values_one_add(self):
|
||||||
|
flow = uf.Flow('uf')
|
||||||
|
self.assertRaises(exceptions.DependencyFailure,
|
||||||
|
flow.add,
|
||||||
|
utils.TaskOneReturn(provides='x'),
|
||||||
|
utils.TaskOneReturn(provides='x'))
|
||||||
|
|
||||||
def test_nested_flows_requirements(self):
|
def test_nested_flows_requirements(self):
|
||||||
flow = uf.Flow('uf').add(
|
flow = uf.Flow('uf').add(
|
||||||
lf.Flow('lf').add(
|
lf.Flow('lf').add(
|
||||||
@@ -196,6 +222,13 @@ class FlowDependenciesTest(test.TestCase):
|
|||||||
self.assertEqual(flow.requires, set(['a', 'b', 'c']))
|
self.assertEqual(flow.requires, set(['a', 'b', 'c']))
|
||||||
self.assertEqual(flow.provides, set(['x', 'y', 'z', 'q']))
|
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_without_dependencies(self):
|
def test_graph_flow_without_dependencies(self):
|
||||||
flow = gf.Flow('gf').add(
|
flow = gf.Flow('gf').add(
|
||||||
utils.TaskNoRequiresNoReturns('task1'),
|
utils.TaskNoRequiresNoReturns('task1'),
|
||||||
|
|||||||
Reference in New Issue
Block a user