diff options
-rw-r--r-- | rumba/model.py | 3 | ||||
-rw-r--r-- | rumba/prototypes/rlite.py | 87 | ||||
-rw-r--r-- | rumba/ssh_support.py | 16 | ||||
-rw-r--r-- | rumba/testbeds/jfed.py | 5 |
4 files changed, 97 insertions, 14 deletions
diff --git a/rumba/model.py b/rumba/model.py index 8e63822..0d93fcd 100644 --- a/rumba/model.py +++ b/rumba/model.py @@ -132,9 +132,10 @@ class NormalDIF(DIF): # SSH Configuration # class SSHConfig: - def __init__(self, hostname, port=22): + def __init__(self, hostname, port=22, proxycommand=None): self.hostname = hostname self.port = port + self.proxycommand = proxycommand # A node in the experiment diff --git a/rumba/prototypes/rlite.py b/rumba/prototypes/rlite.py index 0ff680d..9568d7e 100644 --- a/rumba/prototypes/rlite.py +++ b/rumba/prototypes/rlite.py @@ -1,7 +1,7 @@ # # Commands to setup and instruct rlite # -# Vincenzo Maffione <v.maffione@nextworks.it> +# Author: Vincenzo Maffione <v.maffione@nextworks.it> # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -22,13 +22,18 @@ import rumba.ssh_support as ssh import rumba.model as mod import time -# An experiment over the RLITE implementation +# An experiment over the rlite implementation class Experiment(mod.Experiment): + def __init__(self, testbed, nodes=None): mod.Experiment.__init__(self, testbed, nodes) - def setup(self): - cmds = list() + def execute_commands(self, node, cmds): + ssh.execute_commands(self.testbed, node.ssh_config, + cmds, time_out=None) + + def init(self): + cmds = [] if False: # ubuntu cmds.append("apt-get update") @@ -38,19 +43,79 @@ class Experiment(mod.Experiment): cmds.append("rm -rf ~/rlite") cmds.append("cd ~; git clone https://github.com/vmaffione/rlite") cmds.append("cd ~/rlite && ./configure && make && sudo make install") + + # Load kernel modules cmds.append("modprobe rlite") cmds.append("modprobe rlite-normal") cmds.append("modprobe rlite-shim-eth") cmds.append("modprobe rlite-shim-udp4") cmds.append("modprobe rlite-shim-loopback") - cmds.append("nohup rlite-uipcps -v DBG -k 0 -U -A &> uipcp.log &") + + # Start the uipcps daemon + cmds.append("rlite-uipcps -v DBG -k 0 &> uipcp.log &") for node in self.nodes: - ssh.execute_commands(self.testbed, node.ssh_config, - cmds, time_out=None) + self.execute_commands(node, cmds) + + def create_ipcps(self): + for node in self.nodes: + cmds = [] + + for ipcp in node.ipcps: + # Generate the command to create the IPCP + if type(ipcp.dif) is mod.NormalDIF: + ipcp_type = 'normal' + elif type(ipcp.dif) is mod.ShimEthDIF: + ipcp_type = 'shim-eth' + elif type(ipcp.dif) is mod.ShimUDPDIF: + ipcp_type = 'shim-udp4' + else: + print("unknown type for DIF %s, default to loopback" \ + % ipcp.dif.name) + ipcp_type = 'shim-loopback' + + cmds.append("rlite-ctl ipcp-create %s %s %s" % \ + (ipcp.name, ipcp_type, ipcp.dif.name)) + + # Generate the command to configure the interface + # name for the shim-eth + if type(ipcp.dif) is mod.ShimEthDIF: + ipcp.ifname = 'eth1' + cmds.append("rlite-ctl ipcp-config %s netdev %s" \ + % (ipcp.name, ipcp.ifname)) + + self.execute_commands(node, cmds) + + def register_ipcps(self): + for node in self.nodes: + cmds = [] + + for ipcp in node.ipcps: + for lower in ipcp.registrations: + cmds.append("rlite-ctl ipcp-register %s %s" \ + % (ipcp.name, lower.name)) + + self.execute_commands(node, cmds) + + def enroll_ipcps(self): + for el in self.enrollments: + for e in el: + d = {'enrollee': e['enrollee'].name, + 'dif': e['dif'].name, + 'lower_dif': e['lower_dif'].name, + 'enroller': e['enroller'].name + } + cmd = "rlite-ctl ipcp-enroll %(enrollee)s %(dif)s "\ + "%(lower_dif)s %(enroller)s" % d + self.execute_commands(e['enrollee'], [cmd]) def run_prototype(self): - print("[RLITE experiment] start") - print("Setting up rlite on the nodes...") - self.setup() - print("[RLITE experiment] end") + print("rlite: setting up") + self.init() + print("rlite: software initialized on all nodes") + self.create_ipcps() + print("rlite: IPCPs created on all nodes") + self.register_ipcps() + print("rlite: IPCPs registered to their lower DIFs on all nodes") + self.enroll_ipcps() + print("rlite: enrollment completed in all DIFs") diff --git a/rumba/ssh_support.py b/rumba/ssh_support.py index 3ed4208..0179c5d 100644 --- a/rumba/ssh_support.py +++ b/rumba/ssh_support.py @@ -52,10 +52,16 @@ def execute_commands(testbed, ssh_config, commands, time_out=3): ''' ssh_client = get_ssh_client() + if ssh_config.proxycommand != None: + proxy = paramiko.ProxyCommand(ssh_config.proxycommand) + else: + proxy = None + try: ssh_client.connect(ssh_config.hostname, ssh_config.port, testbed.username, testbed.password, - look_for_keys=True, timeout=time_out) + look_for_keys=True, timeout=time_out, + sock=proxy) o = "" for command in commands: print("%s@%s:%s >> %s" % (testbed.username, @@ -106,11 +112,17 @@ def copy_file_to_testbed(testbed, ssh_config, text, file_name): ''' ssh_client = get_ssh_client() + if ssh_config.proxycommand != None: + proxy = paramiko.ProxyCommand(ssh_config.proxycommand) + else: + proxy = None + try: ssh_client.connect(ssh_config.hostname, ssh_config.port, testbed.username, testbed.password, - look_for_keys=True) + look_for_keys=True, + sock=proxy) cmd = "touch " + file_name + \ "; chmod a+rwx " + file_name diff --git a/rumba/testbeds/jfed.py b/rumba/testbeds/jfed.py index 0dfc904..f09bb4e 100644 --- a/rumba/testbeds/jfed.py +++ b/rumba/testbeds/jfed.py @@ -113,6 +113,11 @@ class Testbed(mod.Testbed): auth_name_r = self.auth_name.replace(".", "-") node.ssh_config.hostname = node.name + "." + self.exp_name + "." + \ auth_name_r + "." + self.auth_name + node.ssh_config.proxycommand = "ssh -i '" + self.cert_file + \ + "' -o StrictHostKeyChecking=no " + \ + self.username + \ + "@bastion.test.iminds.be nc " + \ + node.ssh_config.hostname + " 22" subprocess.call(["java", "-jar", self.jfed_jar, "create", "-S", \ self.proj_name, "--rspec", \ |