From 9e38155d654e012879a03e784f03a95de4aef64e Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Wed, 14 Mar 2018 18:07:32 +0100 Subject: prototypes: Add local Ouroboros support This adds local Ouroboros support in case of a fake testbed (i.e. no resources allocated). A next PR will abstract away the mode of communication with the testbed, since the Docker plugin will also need it. This also adds another function to the model, terminate_prototype, which should clean up the prototype gracefully, or can be skipped depending on the testbed. Currently the ouroboros plugin with the fake testbed needs to be run as root. If there is a way to run the command as root in the background and then clean it up properly, I would be happy to know how. --- rumba/prototypes/ouroboros.py | 79 ++++++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 20 deletions(-) (limited to 'rumba/prototypes/ouroboros.py') diff --git a/rumba/prototypes/ouroboros.py b/rumba/prototypes/ouroboros.py index 6dec9e4..c588405 100644 --- a/rumba/prototypes/ouroboros.py +++ b/rumba/prototypes/ouroboros.py @@ -25,11 +25,13 @@ # import time +import subprocess import rumba.ssh_support as ssh import rumba.model as mod import rumba.multiprocess as m_processing import rumba.log as log +import rumba.testbeds.faketestbed as fake logger = log.get_logger(__name__) @@ -53,13 +55,33 @@ class Experiment(mod.Experiment): def prototype_name(self): return 'ouroboros' + def exec_local_cmd(self, cmd): + try: + logger.info(cmd) + subprocess.check_call(cmd.split(' ')) + except subprocess.CalledProcessError as e: + logger.error("Return code was " + str(e.returncode)) + raise + + def exec_local_cmds(self, cmds): + for cmd in cmds: + self.exec_local_cmd(cmd) + def setup_ouroboros(self): - for node in self.nodes: - ssh.execute_command(self.testbed, node.ssh_config, - "sudo nohup irmd > /dev/null &", - time_out=None) + if isinstance(self.testbed, fake.Testbed): + self.irmd = subprocess.Popen(["irmd"]) + logger.info("Started IRMd, sleeping 2 seconds...") + time.sleep(2) + else: + for node in self.nodes: + ssh.execute_command(self.testbed, node.ssh_config, + "sudo nohup irmd > /dev/null &", + time_out=None) def install_ouroboros(self): + if isinstance(self.testbed, fake.Testbed): + return + packages = ["cmake", "protobuf-c-compiler", "git", "libfuse-dev", "libgcrypt20-dev", "libssl-dev"] @@ -97,11 +119,11 @@ class Experiment(mod.Experiment): cmd = "irm i c n " + ipcp.name if isinstance(ipcp.dif, mod.ShimEthDIF): - # NOTE: Here to test with fake testbed - if ipcp.ifname is None: - ipcp.ifname = "eth0" - cmd += " type eth-llc if_name " + ipcp.ifname - cmd += " layer " + ipcp.dif.name + if isinstance(self.testbed, fake.Testbed): + cmd += " type local layer " + ipcp.dif.name + else: + cmd += " type eth-llc if_name " + ipcp.ifname + cmd += " layer " + ipcp.dif.name elif isinstance(ipcp.dif, mod.NormalDIF): cmd += " type normal" if ipcp.dif_bootstrapper: @@ -131,8 +153,11 @@ class Experiment(mod.Experiment): # Postpone registrations self.r_ipcps[ipcp] = cmds2 - ssh.execute_commands(self.testbed, node.ssh_config, cmds, - time_out=None) + if isinstance(self.testbed, fake.Testbed): + self.exec_local_cmds(cmds) + else: + ssh.execute_commands(self.testbed, node.ssh_config, cmds, + time_out=None) def enroll_dif(self, el): for e in el: @@ -141,9 +166,13 @@ class Experiment(mod.Experiment): # Execute postponed registration if e['enroller'] in self.r_ipcps: - ssh.execute_commands(self.testbed, - e['enroller'].node.ssh_config, - self.r_ipcps[e['enroller']], time_out=None) + if isinstance(self.testbed, fake.Testbed): + self.exec_local_cmds(self.r_ipcps[e['enroller']]) + else: + ssh.execute_commands(self.testbed, + e['enroller'].node.ssh_config, + self.r_ipcps[e['enroller']], + time_out=None) self.r_ipcps.pop(e['enroller'], None) cmd = "irm r n " + ipcp.name @@ -158,9 +187,12 @@ class Experiment(mod.Experiment): cmd += " layer " + dif_b.name cmds.append(cmd) - ssh.execute_commands(self.testbed, - e['enrollee'].node.ssh_config, - cmds, time_out=None) + if isinstance(self.testbed, fake.Testbed): + self.exec_local_cmds(cmds) + else: + ssh.execute_commands(self.testbed, + e['enrollee'].node.ssh_config, + cmds, time_out=None) def setup_flows(self, el, comp): for e in el: @@ -168,9 +200,12 @@ class Experiment(mod.Experiment): cmd = "irm i conn n " + ipcp.name + " comp " + \ comp + " dst " + e['dst'].name - ssh.execute_command(self.testbed, - ipcp.node.ssh_config, - cmd, time_out=None) + if isinstance(self.testbed, fake.Testbed): + self.exec_local_cmd(cmd) + else: + ssh.execute_command(self.testbed, + ipcp.node.ssh_config, + cmd, time_out=None) def _install_prototype(self): logger.info("Installing Ouroboros...") @@ -192,3 +227,7 @@ class Experiment(mod.Experiment): self.setup_flows(dt, comp="dt") logger.info("All done, have fun!") + + def _terminate_prototype(self): + if isinstance(self.testbed, fake.Testbed): + self.irmd.terminate() -- cgit v1.2.3