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_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_connect_all_password(self):
inventory = make_inventory(ssh_password='test')
# Get a host
somehost = inventory.get_host('somehost')
self.assertEqual(somehost.data.ssh_password, 'test')
state = State(inventory, Config())
connect_all(state)
self.assertEqual(len(state.active_hosts), 2)
def test_connect_with_ssh_key_password(self):
state = State(make_inventory(hosts=(
('somehost', {'ssh_key': 'testkey', 'ssh_key_password': 'testpass'}),
)), Config())
with patch(
'pyinfra.api.connectors.ssh.path.isfile',
lambda *args, **kwargs: True,
), patch(
'pyinfra.api.connectors.ssh.RSAKey.from_private_key_file',
) as fake_key_open:
def fake_key_open_fail(*args, **kwargs):
if 'password' not in kwargs:
raise PasswordRequiredException()
fake_key_open.side_effect = fake_key_open_fail
def test_connect_all(self):
inventory = make_inventory()
state = State(inventory, Config())
connect_all(state)
self.assertEqual(len(state.active_hosts), 2)
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!')
def test_file_upload_op(self):
inventory = make_inventory()
state = State(inventory, Config())
connect_all(state)
with patch('pyinfra.modules.files.path.isfile', lambda *args, **kwargs: True):
# Test normal
add_op(
state, files.put,
{'First op name'},
'files/file.txt',
'/home/vagrant/file.txt',
)
# And with sudo
add_op(
state, files.put,
'files/file.txt',
'/home/vagrant/file.txt',
def test_connect_with_ssh_key(self):
state = State(make_inventory(hosts=(
('somehost', {'ssh_key': 'testkey'}),
)), Config())
with patch('pyinfra.api.connectors.ssh.path.isfile', lambda *args, **kwargs: True), \
patch('pyinfra.api.connectors.ssh.RSAKey.from_private_key_file') as fake_key_open:
fake_key = FakeRSAKey()
fake_key_open.return_value = fake_key
state.deploy_dir = '/'
connect_all(state)
# Check the key was created properly
fake_key_open.assert_called_with(filename='testkey')
def test_connect_with_missing_ssh_key(self):
state = State(make_inventory(hosts=(
('somehost', {'ssh_key': 'testkey'}),
)), Config())
with self.assertRaises(IOError) as e:
connect_all(state)
# Ensure pyinfra style IOError
self.assertTrue(e.exception.args[0].startswith('No such private key file:'))
# Operation w/optional args (. ARG1 ARG2 ...)
elif len(operations[0].split('.')) == 2:
command = 'op'
operations = get_operation_and_args(operations)
else:
raise CliError('''Invalid operations: {0}
Operation usage:
pyinfra INVENTORY deploy_web.py [deploy_db.py]...
pyinfra INVENTORY server.user pyinfra home=/home/pyinfra
pyinfra INVENTORY exec -- echo "hello world"
pyinfra INVENTORY fact os [users]...'''.format(operations))
# Create an empty/unitialised state object
state = State()
pseudo_state.set(state)
# Setup printing on the new state
print_output = verbosity > 0
print_fact_output = verbosity > 1
state.print_output = print_output # -v
state.print_fact_info = print_output # -v
state.print_fact_output = print_fact_output # -vv
print('--> Loading config...')
# Load up any config.py from the filesystem
config = load_config(deploy_dir)
# Load any hooks/config from the deploy file
if name not in groups[group_name][0]:
groups[group_name][0].append(name)
# First we setup some inventory we want to target
# the first argument is a tuple of (list all all hosts, global/ALL data)
inventory = Inventory((hosts, {}), **groups)
# Now we create a new config (w/optional args)
config = Config(
FAIL_PERCENT=81,
CONNECT_TIMEOUT=5,
)
# Setup the pyinfra state for this deploy
state = State(inventory, config)
# Connect to all the hosts
print('Connecting...')
connect_all(state)
# Start adding operations
print('Generating operations...')
add_op(
state, server.user,
'pyinfra',
home='/home/pyinfra',
shell='/bin/bash',
sudo=True,
)