@ -187,194 +187,11 @@ class TestTaskExecutor(unittest.TestCase):
def _execute ( variables ) :
def _execute ( variables ) :
return dict ( item = variables . get ( ' item ' ) )
return dict ( item = variables . get ( ' item ' ) )
te . _squash_items = MagicMock ( return_value = items )
te . _execute = MagicMock ( side_effect = _execute )
te . _execute = MagicMock ( side_effect = _execute )
res = te . _run_loop ( items )
res = te . _run_loop ( items )
self . assertEqual ( len ( res ) , 3 )
self . assertEqual ( len ( res ) , 3 )
def test_task_executor_squash_items ( self ) :
items = [ ' a ' , ' b ' , ' c ' ]
fake_loader = DictDataLoader ( { } )
mock_host = MagicMock ( )
loop_var = ' item '
def _evaluate_conditional ( templar , variables ) :
item = variables . get ( loop_var )
if item == ' b ' :
return False
return True
mock_task = MagicMock ( )
mock_task . evaluate_conditional . side_effect = _evaluate_conditional
mock_play_context = MagicMock ( )
mock_shared_loader = None
mock_queue = MagicMock ( )
new_stdin = None
job_vars = dict ( pkg_mgr = ' yum ' )
te = TaskExecutor (
host = mock_host ,
task = mock_task ,
job_vars = job_vars ,
play_context = mock_play_context ,
new_stdin = new_stdin ,
loader = fake_loader ,
shared_loader_obj = mock_shared_loader ,
final_q = mock_queue ,
)
# No replacement
mock_task . action = ' yum '
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
self . assertEqual ( new_items , [ ' a ' , ' b ' , ' c ' ] )
self . assertIsInstance ( mock_task . args , MagicMock )
mock_task . action = ' foo '
mock_task . args = { ' name ' : ' {{ item}} ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
self . assertEqual ( new_items , [ ' a ' , ' b ' , ' c ' ] )
self . assertEqual ( mock_task . args , { ' name ' : ' {{ item}} ' } )
mock_task . action = ' yum '
mock_task . args = { ' name ' : ' static ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
self . assertEqual ( new_items , [ ' a ' , ' b ' , ' c ' ] )
self . assertEqual ( mock_task . args , { ' name ' : ' static ' } )
mock_task . action = ' yum '
mock_task . args = { ' name ' : ' {{ pkg_mgr}} ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
self . assertEqual ( new_items , [ ' a ' , ' b ' , ' c ' ] )
self . assertEqual ( mock_task . args , { ' name ' : ' {{ pkg_mgr}} ' } )
mock_task . action = ' {{ unknown}} '
mock_task . args = { ' name ' : ' {{ item}} ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
self . assertEqual ( new_items , [ ' a ' , ' b ' , ' c ' ] )
self . assertEqual ( mock_task . args , { ' name ' : ' {{ item}} ' } )
# Could do something like this to recover from bad deps in a package
job_vars = dict ( pkg_mgr = ' yum ' , packages = [ ' a ' , ' b ' ] )
items = [ ' absent ' , ' latest ' ]
mock_task . action = ' yum '
mock_task . args = { ' name ' : ' {{ packages }} ' , ' state ' : ' {{ item }} ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
self . assertEqual ( new_items , items )
self . assertEqual ( mock_task . args , { ' name ' : ' {{ packages }} ' , ' state ' : ' {{ item }} ' } )
# Maybe should raise an error in this case. The user would have to specify:
# - yum: name="{{ packages[item] }}"
# with_items:
# - ['a', 'b']
# - ['foo', 'bar']
# you can't use a list as a dict key so that would probably throw
# an error later. If so, we can throw it now instead.
# Squashing in this case would not be intuitive as the user is being
# explicit in using each list entry as a key.
job_vars = dict ( pkg_mgr = ' yum ' , packages = { " a " : " foo " , " b " : " bar " , " foo " : " baz " , " bar " : " quux " } )
items = [ [ ' a ' , ' b ' ] , [ ' foo ' , ' bar ' ] ]
mock_task . action = ' yum '
mock_task . args = { ' name ' : ' {{ packages[item] }} ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
self . assertEqual ( new_items , items )
self . assertEqual ( mock_task . args , { ' name ' : ' {{ packages[item] }} ' } )
# Replaces
items = [ ' a ' , ' b ' , ' c ' ]
mock_task . action = ' yum '
mock_task . args = { ' name ' : ' {{ item}} ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
self . assertEqual ( new_items , [ [ ' a ' , ' c ' ] ] )
self . assertEqual ( mock_task . args , { ' name ' : [ ' a ' , ' c ' ] } )
mock_task . action = ' {{ pkg_mgr}} '
mock_task . args = { ' name ' : ' {{ item}} ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
self . assertEqual ( new_items , [ [ ' a ' , ' c ' ] ] )
self . assertEqual ( mock_task . args , { ' name ' : [ ' a ' , ' c ' ] } )
# New loop_var
mock_task . action = ' yum '
mock_task . args = { ' name ' : ' {{ a_loop_var_item}} ' }
mock_task . loop_control = { ' loop_var ' : ' a_loop_var_item ' }
loop_var = ' a_loop_var_item '
new_items = te . _squash_items ( items = items , loop_var = ' a_loop_var_item ' , variables = job_vars )
self . assertEqual ( new_items , [ [ ' a ' , ' c ' ] ] )
self . assertEqual ( mock_task . args , { ' name ' : [ ' a ' , ' c ' ] } )
loop_var = ' item '
#
# These are presently not optimized but could be in the future.
# Expected output if they were optimized is given as a comment
# Please move these to a different section if they are optimized
#
# Squashing lists
job_vars = dict ( pkg_mgr = ' yum ' )
items = [ [ ' a ' , ' b ' ] , [ ' foo ' , ' bar ' ] ]
mock_task . action = ' yum '
mock_task . args = { ' name ' : ' {{ item }} ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
# self.assertEqual(new_items, [['a', 'b', 'foo', 'bar']])
# self.assertEqual(mock_task.args, {'name': ['a', 'b', 'foo', 'bar']})
self . assertEqual ( new_items , items )
self . assertEqual ( mock_task . args , { ' name ' : ' {{ item }} ' } )
# Retrieving from a dict
items = [ ' a ' , ' b ' , ' foo ' ]
mock_task . action = ' yum '
mock_task . args = { ' name ' : ' {{ packages[item] }} ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
# self.assertEqual(new_items, [['foo', 'baz']])
# self.assertEqual(mock_task.args, {'name': ['foo', 'baz']})
self . assertEqual ( new_items , items )
self . assertEqual ( mock_task . args , { ' name ' : ' {{ packages[item] }} ' } )
# Another way to retrieve from a dict
job_vars = dict ( pkg_mgr = ' yum ' )
items = [ { ' package ' : ' foo ' } , { ' package ' : ' bar ' } ]
mock_task . action = ' yum '
mock_task . args = { ' name ' : ' {{ item[ " package " ] }} ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
# self.assertEqual(new_items, [['foo', 'bar']])
# self.assertEqual(mock_task.args, {'name': ['foo', 'bar']})
self . assertEqual ( new_items , items )
self . assertEqual ( mock_task . args , { ' name ' : ' {{ item[ " package " ] }} ' } )
items = [
dict ( name = ' a ' , state = ' present ' ) ,
dict ( name = ' b ' , state = ' present ' ) ,
dict ( name = ' c ' , state = ' present ' ) ,
]
mock_task . action = ' yum '
mock_task . args = { ' name ' : ' {{ item.name}} ' , ' state ' : ' {{ item.state}} ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
# self.assertEqual(new_items, [dict(name=['a', 'b', 'c'], state='present')])
# self.assertEqual(mock_task.args, {'name': ['a', 'b', 'c'], 'state': 'present'})
self . assertEqual ( new_items , items )
self . assertEqual ( mock_task . args , { ' name ' : ' {{ item.name}} ' , ' state ' : ' {{ item.state}} ' } )
items = [
dict ( name = ' a ' , state = ' present ' ) ,
dict ( name = ' b ' , state = ' present ' ) ,
dict ( name = ' c ' , state = ' absent ' ) ,
]
mock_task . action = ' yum '
mock_task . args = { ' name ' : ' {{ item.name}} ' , ' state ' : ' {{ item.state}} ' }
new_items = te . _squash_items ( items = items , loop_var = ' item ' , variables = job_vars )
# self.assertEqual(new_items, [dict(name=['a', 'b'], state='present'),
# dict(name='c', state='absent')])
# self.assertEqual(mock_task.args, {'name': '{{item.name}}', 'state': '{{item.state}}'})
self . assertEqual ( new_items , items )
self . assertEqual ( mock_task . args , { ' name ' : ' {{ item.name}} ' , ' state ' : ' {{ item.state}} ' } )
def test_task_executor_get_action_handler ( self ) :
def test_task_executor_get_action_handler ( self ) :
te = TaskExecutor (
te = TaskExecutor (
host = MagicMock ( ) ,
host = MagicMock ( ) ,