aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rumba/testbeds/qemu.py32
1 files changed, 23 insertions, 9 deletions
diff --git a/rumba/testbeds/qemu.py b/rumba/testbeds/qemu.py
index 218f3e1..fab1726 100644
--- a/rumba/testbeds/qemu.py
+++ b/rumba/testbeds/qemu.py
@@ -35,6 +35,7 @@ import rumba.log as log
import rumba.multiprocess as m_processing
from rumba.executors.ssh import SSHExecutor
+from rumba.ssh_support import SSHException
if sys.version_info[0] >= 3:
from urllib.request import urlretrieve
@@ -44,6 +45,8 @@ else:
logger = log.get_logger(__name__)
+USER_HOME = os.path.expanduser("~")
+
class Testbed(mod.Testbed):
"""
@@ -51,6 +54,7 @@ class Testbed(mod.Testbed):
"""
def __init__(self, exp_name, bzimage_path=None, initramfs_path=None,
proj_name="ARCFIRE", password="root", username="root",
+ public_key_path=os.path.join(USER_HOME, '.ssh', 'id_rsa.pub'),
use_vhost=True):
"""
Initializes the testbed class.
@@ -61,6 +65,10 @@ class Testbed(mod.Testbed):
:param proj_name: Project name of the experiment.
:param password: Password of the user.
:param username: User of the VM.
+ :param public_key_path: path to the public key used to connect via
+ ssh to the virtual machines.
+ If `None`, password auth (root, root)
+ will be used.
:param use_vhost: Use virtual hosting or not?
.. note:: In case no bzimage or initramfs is provided, Rumba
@@ -77,6 +85,7 @@ class Testbed(mod.Testbed):
self.bzimage_path = bzimage_path
self.initramfs_path = initramfs_path
self.multiproc_manager = None
+ self.key_path = public_key_path
self.executor = SSHExecutor(self)
@@ -355,15 +364,20 @@ class Testbed(mod.Testbed):
self._recover_if_names(experiment)
- for node in experiment.nodes:
- pub_key = os.path.join(os.path.expanduser("~"),
- '.ssh',
- 'id_rsa.pub')
- node.copy_file(pub_key, '/root/.ssh')
- node.execute_command('cd /root/.ssh; '
- 'mv authorized_keys old.authorized_keys; '
- 'cat old.authorized_keys id_rsa.pub '
- '> authorized_keys')
+ if self.key_path is not None:
+ for node in experiment.nodes:
+ try:
+ node.copy_file(self.key_path, '/root/.ssh')
+ node.execute_command(
+ 'cd /root/.ssh; '
+ 'mv authorized_keys old.authorized_keys; '
+ 'cat old.authorized_keys id_rsa.pub '
+ '> authorized_keys'
+ )
+ except SSHException as e:
+ logger.warning("Could not install ssh key into node %s. "
+ "%s.", node.name, str(e))
+ logger.debug("Exception details:", exc_info=e)
logger.info('Experiment has been successfully swapped in.')