Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_op_hosts_limit(self):
inventory = make_inventory()
state = State(inventory, Config())
connect_all(state)
# Add op to both hosts
add_op(state, server.shell, 'echo "hi"')
# Add op to just the first host
add_op(
state, server.user,
'somehost_user',
hosts=inventory['somehost'],
)
# Ensure there are two ops
self.assertEqual(len(state.get_op_order()), 2)
# Ensure somehost has two ops and anotherhost only has the one
self.assertEqual(len(state.ops[inventory.get_host('somehost')]), 2)
self.assertEqual(len(state.ops[inventory.get_host('anotherhost')]), 1)
def test_op_state_hosts_limit(self):
inventory = make_inventory()
state = State(inventory, Config())
connect_all(state)
# Add op to both hosts
add_op(state, server.shell, 'echo "hi"')
# Add op to just the first host
with state.hosts('test_group'):
add_op(
state, server.user,
'somehost_user',
)
# Now, also limited but set hosts to the non-limited hosts, which
# should mean this operation applies to no hosts.
add_op(
state, server.user,
def test_op_hosts_limit(self):
inventory = make_inventory()
state = State(inventory, Config())
connect_all(state)
# Add op to both hosts
add_op(state, server.shell, 'echo "hi"')
# Add op to just the first host
add_op(
state, server.user,
'somehost_user',
hosts=inventory['somehost'],
)
# Ensure there are two ops
self.assertEqual(len(state.get_op_order()), 2)
# Ensure somehost has two ops and anotherhost only has the one
def test_op_state_hosts_limit(self):
inventory = make_inventory()
state = State(inventory, Config())
connect_all(state)
# Add op to both hosts
add_op(state, server.shell, 'echo "hi"')
# Add op to just the first host
with state.hosts('test_group'):
add_op(
state, server.user,
'somehost_user',
)
# Now, also limited but set hosts to the non-limited hosts, which
# should mean this operation applies to no hosts.
add_op(
state, server.user,
'somehost_user',
hosts=inventory.get_host('anotherhost'),
)
# Ensure there are three ops
self.assertEqual(len(state.get_op_order()), 3)
# Ensure somehost has two ops and anotherhost only has the one
self.assertEqual(len(state.ops[inventory.get_host('somehost')]), 2)
def test_op_hosts_limit(self):
inventory = make_inventory()
state = State(inventory, Config())
connect_all(state)
# Add op to both hosts
add_op(state, server.shell, 'echo "hi"')
# Add op to just the first host
add_op(
state, server.user,
'somehost_user',
hosts=inventory['somehost'],
)
# Ensure there are two ops
self.assertEqual(len(state.get_op_order()), 2)
# Ensure somehost has two ops and anotherhost only has the one
self.assertEqual(len(state.ops[inventory.get_host('somehost')]), 2)
from pyinfra.modules import server
server.shell(
{'First task operation'},
'echo first_task_operation',
)
server.shell(
{'Second task operation'},
'echo second_task_operation',
)
# Create some conditional branches
if host.name == 'somehost':
server.shell(
{'Second main operation'},
'echo second_main_op',
)
elif host.name == 'anotherhost':
local.include('tasks/a_task.py')
# Include the whole file again, but for all hosts
local.include('tasks/a_task.py')
# Do a loop which will generate duplicate op hashes
for i in range(2):
server.shell(
{'Loop-{0} main operation'.format(i)},
'echo loop_{0}_main_operation'.format(i),
)
files.file(
{'Third main operation'},
'files/a_file',
'/a_file',
)
with state.preserve_loop_order([1, 2]) as loop_items:
for item in loop_items():
server.shell(
{'Order loop {0}'.format(item)},
'echo loop_{0}'.format(item),
)
def test_op_line_numbers(self):
inventory = make_inventory()
state = State(inventory, Config())
connect_all(state)
# Add op to both hosts
add_op(state, server.shell, 'echo "hi"')
# Add op to just the second host - using the pseudo modules such that
# it replicates a deploy file.
pseudo_state.set(state)
pseudo_host.set(inventory['anotherhost'])
first_pseudo_hash = server.user('anotherhost_user').hash
first_pseudo_call_line = getframeinfo(currentframe()).lineno - 1
# Add op to just the first host - using the pseudo modules such that
# it replicates a deploy file.
pseudo_state.set(state)
pseudo_host.set(inventory['somehost'])
second_pseudo_hash = server.user('somehost_user').hash
second_pseudo_call_line = getframeinfo(currentframe()).lineno - 1
pseudo_state.reset()
def test_run_once_serial_op(self):
inventory = make_inventory()
state = State(inventory, Config())
connect_all(state)
# Add a run once op
add_op(state, server.shell, 'echo "hi"', run_once=True, serial=True)
# Ensure it's added to op_order
self.assertEqual(len(state.get_op_order()), 1)
somehost = inventory.get_host('somehost')
anotherhost = inventory.get_host('anotherhost')
# Ensure between the two hosts we only run the one op
self.assertEqual(len(state.ops[somehost]) + len(state.ops[anotherhost]), 1)
# Check run works
run_ops(state)
self.assertEqual((
state.results[somehost]['success_ops']
+ state.results[anotherhost]['success_ops']
def test_full_op_fail(self):
inventory = make_inventory()
state = State(inventory, Config())
connect_all(state)
add_op(state, server.shell, 'echo "hi"')
with patch('pyinfra.api.connectors.ssh.run_shell_command') as fake_run_command:
fake_channel = FakeChannel(1)
fake_run_command.return_value = (
False,
FakeBuffer('', fake_channel),
)
with self.assertRaises(PyinfraError) as e:
run_ops(state)
self.assertEqual(e.exception.args[0], 'No hosts remaining!')
somehost = inventory.get_host('somehost')
# Ensure the op was not flagged as success