From 97b16ada2b710cfe88c3bc6bf9e0dc42a943fca5 Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Sun, 18 Jul 2021 21:13:43 +0200 Subject: exp: Add metrics and prototype update commands This adds a couple of commands to start/stop metrics exporter, set link rate on virtual wall, and updating the prototype from git, which is useful in interactive mode. --- rumba/prototypes/ouroboros.py | 152 ++++++++++++++++++++++-------------------- 1 file changed, 79 insertions(+), 73 deletions(-) (limited to 'rumba/prototypes/ouroboros.py') diff --git a/rumba/prototypes/ouroboros.py b/rumba/prototypes/ouroboros.py index aa030ba..1558acd 100644 --- a/rumba/prototypes/ouroboros.py +++ b/rumba/prototypes/ouroboros.py @@ -94,7 +94,7 @@ class Experiment(mod.Experiment): git_repo='https://ouroboros.rocks/git/ouroboros', git_branch='master', build_options='', - add_packages=[], + add_packages=None, enrollment_strategy='minimal', flows_strategy='full-mesh', influxdb=None): @@ -138,6 +138,7 @@ class Experiment(mod.Experiment): self.r_ipcps = dict() self.irmd = None self.influxdb = influxdb + self.prototype_location = '/tmp/prototype/' self.set_startup_command("irmd") self.metrics_python_version = "python3.9" @@ -176,6 +177,22 @@ class Experiment(mod.Experiment): for node in self.nodes: node.execute_command("sudo nohup irmd > /dev/null &", time_out=None) + time.sleep(1) + + def _install_packages_and_execute_cmds(self, packages, cmds, nodes=None): + names = [] + executors = [] + args = [] + + if nodes is None: + nodes = self.nodes + + for node in nodes: + executor = self.make_executor(node, packages, self.testbed) + names.append(node.name) + executors.append(executor) + args.append(cmds) + m_processing.call_in_parallel(names, args, executors) def install_ouroboros(self): if isinstance(self.testbed, local.Testbed): @@ -184,27 +201,28 @@ class Experiment(mod.Experiment): packages = ["cmake", "protobuf-c-compiler", "git", "libfuse-dev", "libgcrypt20-dev", "libssl-dev"] + self.add_packages - fs_loc = '/tmp/prototype' - cmds = ["sudo DEBIAN_FRONTEND=noninteractive apt-get install libprotobuf-c-dev --yes || true", - "sudo rm -r " + fs_loc + " || true", - "git clone -b " + self.git_branch + " " + self.git_repo + \ - " " + fs_loc, - "cd " + fs_loc + " && mkdir build && cd build && " + + "sudo rm -r " + self.prototype_location + " || true", + "git clone -b " + self.git_branch + " " + self.git_repo + " " + self.prototype_location, + "cd " + self.prototype_location + " && mkdir build && cd build && " + "cmake " + self.build_options + " .. && " + "sudo make install -j$(nproc) && " + "sudo sed -i 's/#user_allow_other/user_allow_other/g' /etc/fuse.conf"] - names = [] - executors = [] - args = [] + self._install_packages_and_execute_cmds(packages, cmds) - for node in self.nodes: - executor = self.make_executor(node, packages, self.testbed) - names.append(node.name) - executors.append(executor) - args.append(cmds) - m_processing.call_in_parallel(names, args, executors) + def update_ouroboros(self, branch): + if isinstance(self.testbed, local.Testbed): + return + + if branch is not None: + self.git_branch = branch + + cmds = ["cd " + self.prototype_location + " && " + + "git checkout " + self.git_branch + " && " + + "git pull && cd build && sudo make install -j$(nproc)"] + + self._install_packages_and_execute_cmds([], cmds) def _install_python_ppa(self): packages = ["software-properties-common"] @@ -212,17 +230,7 @@ class Experiment(mod.Experiment): cmds = ["sudo add-apt-repository {} -y".format(python_ppa), "sudo apt-get update"] - names = [] - args = [] - executors = [] - - for node in self.nodes: - executor = self.make_executor(node, packages, self.testbed) - names.append(node.name) - executors.append(executor) - args.append(cmds) - - m_processing.call_in_parallel(names, args, executors) + self._install_packages_and_execute_cmds(packages, cmds) def _install_python_version(self, python_version): python_packages = ["distutils", "venv"] @@ -235,19 +243,7 @@ class Experiment(mod.Experiment): for lib in python_libs: packages += ["lib" + python_version + "-" + lib] - cmds = [] - - names = [] - args = [] - executors = [] - - for node in self.nodes: - executor = self.make_executor(node, packages, self.testbed) - names.append(node.name) - executors.append(executor) - args.append(cmds) - - m_processing.call_in_parallel(names, args, executors) + self._install_packages_and_execute_cmds(packages, []) def install_ouroboros_python_exporter(self): if isinstance(self.testbed, local.Testbed): @@ -284,17 +280,18 @@ class Experiment(mod.Experiment): "echo 'timeout=6000' >> config.ini", 'echo "proxy=$http_proxy" >> config.ini', "echo 'verify_ssl=False' >> config.ini"] - names = [] - executors = [] - args = [] - for node in self.nodes: - executor = self.make_executor(node, [], self.testbed) - names.append(node.name) - args.append(cmds) - executors.append(executor) + self._install_packages_and_execute_cmds([], cmds) - m_processing.call_in_parallel(names, args, executors) + def start_ouroboros_metrics_exporter(self, nodes, interval=100): + cmds = ["nohup ~/venv/bin/python3.9 ~/oexport.py --interval {} > /dev/null 2>&1 &".format(interval)] + + self._install_packages_and_execute_cmds([], cmds, nodes) + + def stop_ouroboros_metrics_exporter(self, nodes): + cmds = ["kill $(ps ax | grep oexport.py | grep -v grep| cut -f1 -d' ') || true"] + + self._install_packages_and_execute_cmds([], cmds, nodes) def create_ipcps(self): for node in self.nodes: @@ -334,9 +331,8 @@ class Experiment(mod.Experiment): cmd2 += " ipcp " + ipcp_b.name cmds2.append(cmd2) elif isinstance(ipcp.dif, mod.ShimUDPDIF): - # FIXME: Will fail, since we don't keep IPs yet - cmd += " type udp" - cmd += " layer " + ipcp.dif.name + logger.error("UDP IPCP not supported yet") + continue else: logger.error("Unsupported IPCP type") continue @@ -422,32 +418,36 @@ class Experiment(mod.Experiment): logger.info("All done, have fun!") + def _update_prototype(self, branch): + logger.info("Updating Ouroboros") + self.update_ouroboros(branch) + logger.info("Update done") + def _terminate_prototype(self, force=False): cmds = list() if force is True: kill = 'killall -9 ' - cmds.append(kill + 'irmd') - cmds.append(kill + 'ipcpd-unicast') - cmds.append(kill + 'ipcpd-broadcast') - cmds.append(kill + 'ipcpd-eth-llc') - cmds.append(kill + 'ipcpd-eth-dix') - cmds.append(kill + 'ipcpd-udp') - cmds.append(kill + 'ipcpd-local') - cmds.append(kill + 'ocbr') - cmds.append(kill + 'oping') - cmds.append(kill + 'operf') - cmds.append(kill + 'oecho') - cmds.append(kill + 'ioquake3.x86_64') - cmds.append(kill + 'ioq3ded.x86_64') - cmds.append(kill + 'ouroborosio') - cmds.append('rm -rf /dev/shm/ouroboros.*') - cmds.append('for i in /tmp/ouroboros/*; do fusermount -u $i; rmdir $i; done') - cmds.append('rm -rf /tmp/ouroboros') - cmds.append('kill -9 $(ps axjf | grep \'sudo irmd\' ' - '| grep -v grep | cut -f4 -d " "') + cmds.append(kill + 'irmd || true') + cmds.append(kill + 'ipcpd-unicast || true') + cmds.append(kill + 'ipcpd-broadcast || true') + cmds.append(kill + 'ipcpd-eth-llc || true') + cmds.append(kill + 'ipcpd-eth-dix || true') + cmds.append(kill + 'ipcpd-udp || true') + cmds.append(kill + 'ipcpd-local || true') + cmds.append(kill + 'ocbr || true') + cmds.append(kill + 'oping || true') + cmds.append(kill + 'operf || true') + cmds.append(kill + 'oecho || true') + cmds.append(kill + 'ioquake3.x86_64 || true') + cmds.append(kill + 'ioq3ded.x86_64 || true') + cmds.append(kill + 'ouroborosio || true') + cmds.append('rm -rf /dev/shm/ouroboros.* || true') + cmds.append('bash -c "for i in /tmp/ouroboros/*; do fusermount -u $i; rmdir $i; done || true"') + cmds.append('rm -rf /tmp/ouroboros || true') + cmds.append('kill -9 $(ps axjf | grep \'sudo irmd\' | grep -v grep | cut -f4 -d " ") || true') else: - cmds.append('killall -15 irmd') + cmds.append('killall -15 irmd || true') logger.info("Killing Ouroboros...") if isinstance(self.testbed, local.Testbed): @@ -458,6 +458,12 @@ class Experiment(mod.Experiment): for node in self.nodes: node.execute_commands(cmds, time_out=None, as_root=True) + def _start_metrics_exporter(self, nodes, interval): + self.start_ouroboros_metrics_exporter(nodes, interval) + + def _stop_metrics_exporter(self, nodes): + self.stop_ouroboros_metrics_exporter(nodes) + def destroy_dif(self, dif): for ipcp in dif.ipcps: ipcp.node.execute_command('irm i d n ' + ipcp.name) @@ -493,7 +499,7 @@ class Experiment(mod.Experiment): # Get IPCP address if not hasattr(ipcp, 'address'): - path = '/tmp/ouroboros/'+ ipcp.name + '/dt*' + path = '/tmp/ouroboros/' + ipcp.name + '/dt*' dt_path = node.execute_command('ls -d %s' % path) dts = dt_path.split('.') ipcp.address = int(dts[-1]) -- cgit v1.2.3