def _bootstrap_hosts(self, hosts): self._systems_do(lambda s: s.clean_logs(hosts)) cmd = 'VM={} make --quiet bootstrap-vm' executor = Executor() for host in hosts: executor.run(Shell(cmd.format(host), 'bootstrap ' + host)) executor.shutdown() # blocking
def test_runnable_output(self): executor = Executor() with patch.object(Runnable, 'run', return_value=TestExecutor.output): executor.run(Runnable()) executor.wait() results = executor.results self.assertEqual(1, len(results)) self.assertEqual(TestExecutor.output, results[0])
def test_function_outputs(self): executor = Executor() runnable = Runnable() with patch.object(Runnable, 'run', side_effect=TestExecutor.outputs): executor.run(runnable) executor.run(runnable) executor.wait() results = executor.results self.assertListEqual(TestExecutor.outputs, results)
def test_exception_logging(self): executor = Executor() executor._log = Mock() with patch.object(Runnable, 'run', side_effect=Exception): executor.run(Runnable) executor.wait() self.assertEqual(1, executor._log.error.call_count)
def test_calledprocesserror_logging(self): executor = Executor() executor._log = Mock() exception = CalledProcessError(returncode=1, cmd='command') with patch.object(Runnable, 'run', side_effect=exception): executor.run(Runnable) executor.wait() self.assertEqual(1, executor._log.error.call_count)
def test_logged_title_when_it_differs_from_command(self): command, title = 'command', 'title' runnable = Runnable() runnable.title = title exception = CalledProcessError(returncode=1, cmd=command) runnable.run = Mock(side_effect=exception) executor = Executor() executor._log = Mock() executor.run(runnable) executor.wait() executor._log.error.assert_called_once_with(Matcher(has_title))
def test_if_logged_title_is_hidden_if_it_equals_command(self): command = 'command' runnable = Runnable() runnable.title = command exception = CalledProcessError(returncode=1, cmd=command) runnable.run = Mock(side_effect=exception) executor = Executor() executor._log = Mock() executor.run(runnable) executor.wait() executor._log.error.assert_called_once_with(Matcher(has_not_title))
def test_if_shutdown_clears_runnable_resources(self): executor = Executor() executor._future_runnables = Mock() executor.shutdown() executor._future_runnables.clear.assert_called_once_with()
def test_if_shutdown_clears_function_resources(self): executor = Executor() executor._function_titles = Mock() executor.shutdown() executor._function_titles.clear.assert_called_once_with()
def test_if_shutdown_shutdowns_executor(self): executor = Executor() executor._executor = Mock() executor.shutdown() executor._executor.shutdown.called_once_with()
def test_against_function_memory_leak(self): executor = Executor() executor.run_function(background_function) executor.wait() self.assertEqual(0, len(executor._function_titles))
def test_against_runnable_memory_leak(self): executor = Executor() with patch.object(Runnable, 'run'): executor.run(Runnable()) executor.wait() self.assertEqual(0, len(executor._future_runnables))
def test_function_output(self): executor = Executor() executor.run_function(background_function) executor.wait() output = executor.results[0] self.assertEqual(TestExecutor.output, output)
#!/usr/bin/env python3 from expyrimenter.core import SSH, Executor # Suppose we have a cluster with hostnames vm0, vm1 and vm2 cluster = ['vm%d' % i for i in range(0, 3)] # Let's run the command below in all VMs: cmd = 'echo "$(date +%S) Hello by $(hostname)"' # Blocking version, serial execution print('Serial execution\n================') for vm in cluster: output = SSH(vm, cmd, stdout=True).run() print(output) # Create a pool for parallel execution pool = Executor() # Non-blocking version, parallel execution print('\nParallel execution\n==================') for vm in cluster: ssh = SSH(vm, cmd, stdout=True) pool.run(ssh) # Block until all parallel calls are done # and then print the results pool.wait() for result in pool.results: print(result)