Beispiel #1
0
 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)