def test_ssh_async(sshd_manager, loop): class DummyAsyncDelegate(AbstractSSHLibDelegate): def on_update(self, future, callback): callback.set_result(True) def on_done(self, *args, **kwargs): pass def prepare_status(self, name, nodes): pass with sshd_manager.run(20) as sshd_ports: runner = MultiRunner(['127.0.0.1:{}'.format(port) for port in sshd_ports], user=getpass.getuser(), key_path=sshd_manager.key_path, async_delegate=DummyAsyncDelegate()) host_port = ['127.0.0.1:{}'.format(port) for port in sshd_ports] chain = CommandChain('test') chain.add_execute(['uname', '-a']) try: results = loop.run_until_complete(runner.run_commands_chain_async([chain], block=True)) finally: loop.close() assert not os.path.isfile('test.json') assert len(results) == 20 for host_result in results: for command_result in host_result: for host, process_result in command_result.items(): assert process_result['returncode'] == 0, process_result['stderr'] assert host in host_port assert '/usr/bin/ssh' in process_result['cmd'] assert 'uname' in process_result['cmd'] assert '-tt' in process_result['cmd'] assert len(process_result['cmd']) == 13
def test_ssh_command_terminate_async(sshd_manager, loop): with sshd_manager.run(1) as sshd_ports: workspace = str(sshd_manager.tmpdir) runner = MultiRunner(['127.0.0.1:{}'.format(port) for port in sshd_ports], user=getpass.getuser(), key_path=sshd_manager.key_path, process_timeout=0.05) chain = CommandChain('test') chain.add_execute(['sleep', '20']) start_time = time.time() try: results = loop.run_until_complete(runner.run_commands_chain_async([chain], block=True, state_json_dir=workspace)) finally: loop.close() elapsed_time = time.time() - start_time assert elapsed_time < 5 assert os.path.isfile(workspace + '/test.json') with open(workspace + '/test.json') as fh: result_json = json.load(fh) assert result_json['total_hosts'] == 1 assert 'hosts_failed' not in result_json assert 'hosts_success' not in result_json for host_result in results: for command_result in host_result: for host, process_result in command_result.items(): assert result_json['hosts'][host]['host_status'] == 'terminated' assert process_result['stdout'] == [''] assert process_result['stderr'] == [''] assert process_result['returncode'] is None
def test_scp_recursive_async(sshd_manager, loop): with sshd_manager.run(1) as sshd_ports: workspace = str(sshd_manager.tmpdir) id = uuid.uuid4().hex pkgpanda.util.write_string(workspace + '/recursive_pilot.txt', id) runner = MultiRunner(['127.0.0.1:{}'.format(port) for port in sshd_ports], user=getpass.getuser(), key_path=sshd_manager.key_path) host_port = ['127.0.0.1:{}'.format(port) for port in sshd_ports] chain = CommandChain('test') chain.add_copy(workspace + '/recursive_pilot.txt', workspace + '/recursive_pilot.txt.copied', recursive=True) try: copy_results = loop.run_until_complete(runner.run_commands_chain_async([chain], block=True, state_json_dir=workspace)) finally: loop.close() dest_path = workspace + '/recursive_pilot.txt.copied' assert os.path.exists(dest_path) assert os.path.isfile(dest_path) assert len(copy_results) == 1 assert pkgpanda.util.load_string(dest_path) == id for host_result in copy_results: for command_result in host_result: for host, process_result in command_result.items(): assert process_result['returncode'] == 0, process_result['stderr'] assert host in host_port assert '/usr/bin/scp' in process_result['cmd'] assert '-r' in process_result['cmd'] assert workspace + '/recursive_pilot.txt' in process_result['cmd']
def test_scp_async(sshd_manager, loop): with sshd_manager.run(1) as sshd_ports: workspace = str(sshd_manager.tmpdir) id = uuid.uuid4().hex pkgpanda.util.write_string(workspace + '/pilot.txt', id) runner = MultiRunner( ['127.0.0.1:{}'.format(port) for port in sshd_ports], user=getpass.getuser(), key_path=sshd_manager.key_path) host_port = ['127.0.0.1:{}'.format(port) for port in sshd_ports] chain = CommandChain('test') chain.add_copy(workspace + '/pilot.txt', workspace + '/pilot.txt.copied') try: copy_results = loop.run_until_complete( runner.run_commands_chain_async([chain], block=True, state_json_dir=workspace)) finally: loop.close() assert len(copy_results) == 1 assert os.path.isfile(workspace + '/pilot.txt.copied') assert pkgpanda.util.load_string(workspace + '/pilot.txt.copied') == id for host_result in copy_results: for command_result in host_result: for host, process_result in command_result.items(): assert process_result['returncode'] == 0, process_result[ 'stderr'] assert host in host_port assert '/usr/bin/scp' in process_result['cmd'] assert workspace + '/pilot.txt' in process_result['cmd']
def test_tags_async(sshd_manager, loop): with sshd_manager.run(1) as sshd_ports: workspace = str(sshd_manager.tmpdir) host_ports = ['127.0.0.1:{}'.format(port) for port in sshd_ports] targets = [] for _port in sshd_ports: _host = Node('127.0.0.1:{}'.format(_port), { 'tag1': 'test1', 'tag2': 'test2' }) targets.append(_host) runner = MultiRunner(targets, user=getpass.getuser(), key_path=workspace + '/host_key') chain = CommandChain('test') chain.add_execute(['sleep', '1']) try: loop.run_until_complete( runner.run_commands_chain_async([chain], block=True, state_json_dir=workspace)) finally: loop.close() with open(workspace + '/test.json') as fh: result_json = json.load(fh) for host_port in host_ports: assert 'tags' in result_json['hosts'][host_port] assert len(result_json['hosts'][host_port]['tags']) == 2 assert result_json['hosts'][host_port]['tags'][ 'tag1'] == 'test1' assert result_json['hosts'][host_port]['tags'][ 'tag2'] == 'test2' assert result_json['hosts'][host_port]['commands'][0][ 'cmd'] == [ "/usr/bin/ssh", "-oConnectTimeout=10", "-oStrictHostKeyChecking=no", "-oUserKnownHostsFile=/dev/null", "-oBatchMode=yes", "-oPasswordAuthentication=no", "-p{}".format(sshd_ports[0]), "-i", "{}/host_key".format(workspace), "-tt", "{}@127.0.0.1".format(getpass.getuser()), "sleep", "1" ]
def test_tags_async(sshd_manager, loop): with sshd_manager.run(1) as sshd_ports: workspace = str(sshd_manager.tmpdir) host_ports = ['127.0.0.1:{}'.format(port) for port in sshd_ports] targets = [] for _port in sshd_ports: _host = Node('127.0.0.1:{}'.format(_port), {'tag1': 'test1', 'tag2': 'test2'}) targets.append(_host) runner = MultiRunner(targets, user=getpass.getuser(), key_path=workspace + '/host_key') chain = CommandChain('test') chain.add_execute(['sleep', '1']) try: loop.run_until_complete(runner.run_commands_chain_async([chain], block=True, state_json_dir=workspace)) finally: loop.close() with open(workspace + '/test.json') as fh: result_json = json.load(fh) for host_port in host_ports: assert 'tags' in result_json['hosts'][host_port] assert len(result_json['hosts'][host_port]['tags']) == 2 assert result_json['hosts'][host_port]['tags']['tag1'] == 'test1' assert result_json['hosts'][host_port]['tags']['tag2'] == 'test2' assert result_json['hosts'][host_port]['commands'][0]['cmd'] == [ "/usr/bin/ssh", "-oConnectTimeout=10", "-oStrictHostKeyChecking=no", "-oUserKnownHostsFile=/dev/null", "-oBatchMode=yes", "-oPasswordAuthentication=no", "-p{}".format(sshd_ports[0]), "-i", "{}/host_key".format(workspace), "-tt", "{}@127.0.0.1".format(getpass.getuser()), "sleep", "1" ]