aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rumba/model.py3
-rw-r--r--rumba/prototypes/rlite.py87
-rw-r--r--rumba/ssh_support.py16
-rw-r--r--rumba/testbeds/jfed.py5
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", \