From: Alina Quereilhac Date: Tue, 29 Jul 2014 20:59:10 +0000 (+0200) Subject: Refactoring LinuGRETunnel X-Git-Tag: nepi-3.2.0~110 X-Git-Url: http://git.onelab.eu/?p=nepi.git;a=commitdiff_plain;h=81eb8370f0689f59aec1c356dae6fed95c9cce68 Refactoring LinuGRETunnel --- diff --git a/src/nepi/resources/linux/gretunnel.py b/src/nepi/resources/linux/gretunnel.py index 62f94cff..174829d5 100644 --- a/src/nepi/resources/linux/gretunnel.py +++ b/src/nepi/resources/linux/gretunnel.py @@ -47,7 +47,7 @@ class LinuxGRETunnel(LinuxTunnel): connected = [] for guid in self.connections: rm = self.ec.get_resource(guid) - if hasattr(rm, "gre_connect_command"): + if hasattr(rm, "gre_connect"): connected.append(rm) return connected @@ -55,48 +55,10 @@ class LinuxGRETunnel(LinuxTunnel): # Return the command to execute to initiate the connection to the # other endpoint connection_run_home = self.run_home(endpoint) - gre_connect_command = endpoint.gre_connect_command( - remote_endpoint, connection_run_home) - - # upload command to connect.sh script - shfile = os.path.join(self.app_home(endpoint), "gre-connect.sh") - endpoint.node.upload(gre_connect_command, - shfile, - text = True, - overwrite = False) - - # invoke connect script - cmd = "bash %s" % shfile - (out, err), proc = endpoint.node.run(cmd, self.run_home(endpoint)) - - # check if execution errors occurred - msg = " Failed to connect endpoints " - - if proc.poll() or err: - self.error(msg, out, err) - raise RuntimeError, msg - - # Wait for pid file to be generated - pid, ppid = endpoint.node.wait_pid(self.run_home(endpoint)) - - # If the process is not running, check for error information - # on the remote machine - if not pid or not ppid: - (out, err), proc = endpoint.node.check_errors(self.run_home(endpoint)) - # Out is what was written in the stderr file - if err: - msg = " Failed to start command '%s' " % command - self.error(msg, out, err) - raise RuntimeError, msg - - # After creating the TAP, the pl-vif-create.py script - # will write the name of the TAP to a file. We wait until - # we can read the interface name from the file. - vif_name = endpoint.wait_vif_name() - endpoint.set("deviceName", vif_name) - - # Wait if name - return True + connection_app_home = self.app_home(endpoint) + data = endpoint.gre_connect(remote_endpoint, connection_run_home, + connection_app_home) + return data def establish_connection(self, endpoint, remote_endpoint, data): pass diff --git a/src/nepi/resources/linux/tap.py b/src/nepi/resources/linux/tap.py index 7390dfb5..24efdff5 100644 --- a/src/nepi/resources/linux/tap.py +++ b/src/nepi/resources/linux/tap.py @@ -211,7 +211,45 @@ class LinuxTap(LinuxApplication): super(LinuxTap, self).do_release() - def gre_connect_command(self, remote_endpoint, connection_run_home): + def gre_connect(self, remote_endpoint, connection_app_home, + connection_run_home): + gre_connect_command = self._gre_connect_command( + remote_endpoint, connection_run_home) + + # upload command to connect.sh script + shfile = os.path.join(connection_app_home, "gre-connect.sh") + endpoint.node.upload(gre_connect_command, + shfile, + text = True, + overwrite = False) + + # invoke connect script + cmd = "bash %s" % shfile + (out, err), proc = self.node.run(cmd, connection_run_home) + + # check if execution errors occurred + msg = " Failed to connect endpoints " + + if proc.poll() or err: + self.error(msg, out, err) + raise RuntimeError, msg + + # Wait for pid file to be generated + pid, ppid = self.node.wait_pid(connection_run_home) + + # If the process is not running, check for error information + # on the remote machine + if not pid or not ppid: + (out, err), proc = self.node.check_errors(connection_run_home) + # Out is what was written in the stderr file + if err: + msg = " Failed to start command '%s' " % command + self.error(msg, out, err) + raise RuntimeError, msg + + return True + + def _gre_connect_command(self, remote_endpoint, connection_run_home): # Set the remote endpoint self.set("pointopoint", remote_endpoint.get("ip4")) self.set("greRemote", socket.gethostbyname( diff --git a/src/nepi/resources/linux/tunnel.py b/src/nepi/resources/linux/tunnel.py index c0e4a732..8c7402af 100644 --- a/src/nepi/resources/linux/tunnel.py +++ b/src/nepi/resources/linux/tunnel.py @@ -155,7 +155,6 @@ class LinuxTunnel(LinuxApplication): return self._state - def valid_connection(self, guid): # TODO: Validate! return True diff --git a/src/nepi/resources/linux/udptunnel.py b/src/nepi/resources/linux/udptunnel.py index ae4534d2..63ae086c 100644 --- a/src/nepi/resources/linux/udptunnel.py +++ b/src/nepi/resources/linux/udptunnel.py @@ -84,7 +84,7 @@ class LinuxUdpTunnel(LinuxTunnel): connected = [] for guid in self.connections: rm = self.ec.get_resource(guid) - if hasattr(rm, "udp_connect_command"): + if hasattr(rm, "udp_connect"): connected.append(rm) return connected @@ -96,43 +96,14 @@ class LinuxUdpTunnel(LinuxTunnel): # Return the command to execute to initiate the connection to the # other endpoint + connection_app_home = self.app_home(endpoint) connection_run_home = self.run_home(endpoint) - udp_connect_command = endpoint.udp_connect_command( - remote_endpoint, connection_run_home, + pid, ppid = endpoint.udp_connect( + remote_endpoint, + connection_app_home, + connection_run_home, cipher, cipher_key, bwlimit, txqueuelen) - # upload command to connect.sh script - shfile = os.path.join(self.app_home(endpoint), "udp-connect.sh") - endpoint.node.upload(udp_connect_command, - shfile, - text = True, - overwrite = False) - - # invoke connect script - cmd = "bash %s" % shfile - (out, err), proc = endpoint.node.run(cmd, self.run_home(endpoint)) - - # check if execution errors occurred - msg = "Failed to connect endpoints " - - if proc.poll(): - self.error(msg, out, err) - raise RuntimeError, msg - - # Wait for pid file to be generated - pid, ppid = endpoint.node.wait_pid(self.run_home(endpoint)) - - # If the process is not running, check for error information - # on the remote machine - if not pid or not ppid: - (out, err), proc = endpoint.node.check_errors(self.run_home(endpoint)) - # Out is what was written in the stderr file - if err: - msg = " Failed to start command '%s' " % command - self.error(msg, out, err) - raise RuntimeError, msg - - # wait until port is written to file port = self.wait_local_port(endpoint) self._pids[endpoint] = (pid, ppid) @@ -228,4 +199,3 @@ class LinuxUdpTunnel(LinuxTunnel): text = True, overwrite = False) - diff --git a/src/nepi/resources/planetlab/tap.py b/src/nepi/resources/planetlab/tap.py index dc6d448c..75e84de3 100644 --- a/src/nepi/resources/planetlab/tap.py +++ b/src/nepi/resources/planetlab/tap.py @@ -294,7 +294,90 @@ class PlanetlabTap(LinuxApplication): return vif_name - def udp_connect_command(self, remote_endpoint, connection_run_home, + def gre_connect(self, remote_endpoint, connection_app_home, + connection_run_home): + gre_connect_command = self._gre_connect_command( + remote_endpoint, connection_run_home) + + # upload command to connect.sh script + shfile = os.path.join(connection_app_home, "gre-connect.sh") + self.node.upload(gre_connect_command, + shfile, + text = True, + overwrite = False) + + # invoke connect script + cmd = "bash %s" % shfile + (out, err), proc = self.node.run(cmd, connection_run_home) + + # check if execution errors occurred + msg = " Failed to connect endpoints " + + if proc.poll() or err: + self.error(msg, out, err) + raise RuntimeError, msg + + # Wait for pid file to be generated + pid, ppid = self.node.wait_pid(connection_run_home) + + # If the process is not running, check for error information + # on the remote machine + if not pid or not ppid: + (out, err), proc = self.node.check_errors(connection_run_home) + # Out is what was written in the stderr file + if err: + msg = " Failed to start command '%s' " % command + self.error(msg, out, err) + raise RuntimeError, msg + + # After creating the TAP, the pl-vif-create.py script + # will write the name of the TAP to a file. We wait until + # we can read the interface name from the file. + vif_name = self.wait_vif_name() + self.set("deviceName", vif_name) + + return True + + def udp_connect(self, remote_endpoint, connection_app_home, + connection_run_home, cipher, cipher_key, bwlimit, txqueuelen): + udp_connect_command = self._udp_connect_command( + remote_endpoint, connection_run_home, + cipher, cipher_key, bwlimit, txqueuelen) + + # upload command to connect.sh script + shfile = os.path.join(connection_app_home, "udp-connect.sh") + self.node.upload(udp_connect_command, + shfile, + text = True, + overwrite = False) + + # invoke connect script + cmd = "bash %s" % shfile + (out, err), proc = self.node.run(cmd, connection_run_home) + + # check if execution errors occurred + msg = "Failed to connect endpoints " + + if proc.poll(): + self.error(msg, out, err) + raise RuntimeError, msg + + # Wait for pid file to be generated + pid, ppid = self.node.wait_pid(connection_run_home) + + # If the process is not running, check for error information + # on the remote machine + if not pid or not ppid: + (out, err), proc = self.node.check_errors(connection_run_home) + # Out is what was written in the stderr file + if err: + msg = " Failed to start command '%s' " % command + self.error(msg, out, err) + raise RuntimeError, msg + + return pid, ppid + + def _udp_connect_command(self, remote_endpoint, connection_run_home, cipher, cipher_key, bwlimit, txqueuelen): # Set the remote endpoint @@ -346,7 +429,7 @@ class PlanetlabTap(LinuxApplication): return command - def gre_connect_command(self, remote_endpoint, connection_run_home): + def _gre_connect_command(self, remote_endpoint, connection_run_home): # Set the remote endpoint self.set("pointopoint", remote_endpoint.get("ip4")) self.set("greRemote", socket.gethostbyname( diff --git a/test/resources/planetlab/gretunnel.py b/test/resources/planetlab/gretunnel.py index 1d69a698..9b6b9df4 100755 --- a/test/resources/planetlab/gretunnel.py +++ b/test/resources/planetlab/gretunnel.py @@ -26,7 +26,7 @@ import os import time import unittest -class GRETunnelTestCase(unittest.TestCase): +class PlanetLabGRETunnelTestCase(unittest.TestCase): def setUp(self): #self.host1 = "nepi2.pl.sophia.inria.fr" #self.host2 = "nepi5.pl.sophia.inria.fr"