From: Alina Quereilhac Date: Mon, 4 Aug 2014 14:26:41 +0000 (+0200) Subject: Fixing GRE tunnel between localhost and remote host X-Git-Tag: nepi-3.2.0~103 X-Git-Url: http://git.onelab.eu/?p=nepi.git;a=commitdiff_plain;h=dceafc553de152296b99e8c2f4b3fef1321bd7ef Fixing GRE tunnel between localhost and remote host --- diff --git a/src/nepi/resources/linux/application.py b/src/nepi/resources/linux/application.py index 08ea7004..5e06dab7 100644 --- a/src/nepi/resources/linux/application.py +++ b/src/nepi/resources/linux/application.py @@ -196,7 +196,7 @@ class LinuxApplication(ResourceManager): def node(self): node = self.get_connected(LinuxNode.get_rtype()) if node: return node[0] - return None + raise RuntimeError, "Application must be connected to Node" @property def app_home(self): diff --git a/src/nepi/resources/linux/node.py b/src/nepi/resources/linux/node.py index fce5e6dd..047dfe96 100644 --- a/src/nepi/resources/linux/node.py +++ b/src/nepi/resources/linux/node.py @@ -28,6 +28,7 @@ import collections import os import random import re +import socket import tempfile import time import threading @@ -194,6 +195,9 @@ class LinuxNode(ResourceManager): gateway = Attribute("gateway", "Hostname of the gateway machine", flags = Flags.Design) + ip = Attribute("ip", "Linux host public IP address", + flags = Flags.NoWrite) + cls._register_attribute(hostname) cls._register_attribute(username) cls._register_attribute(port) @@ -206,6 +210,7 @@ class LinuxNode(ResourceManager): cls._register_attribute(tear_down) cls._register_attribute(gateway_user) cls._register_attribute(gateway) + cls._register_attribute(ip) def __init__(self, ec, guid): super(LinuxNode, self).__init__(ec, guid) @@ -361,6 +366,14 @@ class LinuxNode(ResourceManager): self.mkdir(paths) + # Get Public IP address + if self.localhost: + ip = socket.gethostbyname(socket.gethostname()) + else: + ip = socket.gethostbyname(self.get("hostname")) + + self.set("ip", ip) + super(LinuxNode, self).do_provision() def do_deploy(self): diff --git a/src/nepi/resources/linux/tap.py b/src/nepi/resources/linux/tap.py index f2e42a68..a0ec93a6 100644 --- a/src/nepi/resources/linux/tap.py +++ b/src/nepi/resources/linux/tap.py @@ -107,7 +107,7 @@ class LinuxTap(LinuxApplication): def node(self): node = self.get_connected(LinuxNode.get_rtype()) if node: return node[0] - return None + raise RuntimeError, "TAP/TUN devices must be connected to Node" @property def gre_enabled(self): @@ -254,9 +254,8 @@ class LinuxTap(LinuxApplication): # 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, + self.node.upload_command(gre_connect_command, + shfile = shfile, overwrite = False) # invoke connect script @@ -294,9 +293,8 @@ class LinuxTap(LinuxApplication): # 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, + self.node.upload_command(udp_connect_command, + shfile = shfile, overwrite = False) # invoke connect script @@ -337,7 +335,7 @@ class LinuxTap(LinuxApplication): self.set("pi", True) remote_ip = socket.gethostbyname( - remote_endpoint.node.get("hostname")) + remote_endpoint.node.get("ip")) local_port_file = os.path.join(connection_run_home, "local_port") @@ -388,7 +386,7 @@ class LinuxTap(LinuxApplication): # Set the remote endpoint self.set("pointopoint", remote_endpoint.get("ip4")) self.set("greRemote", socket.gethostbyname( - remote_endpoint.node.get("hostname"))) + remote_endpoint.node.get("ip"))) # Generate GRE connect command command = ["("] diff --git a/src/nepi/resources/planetlab/tap.py b/src/nepi/resources/planetlab/tap.py index 75e84de3..1785f43c 100644 --- a/src/nepi/resources/planetlab/tap.py +++ b/src/nepi/resources/planetlab/tap.py @@ -106,7 +106,7 @@ class PlanetlabTap(LinuxApplication): def node(self): node = self.get_connected(PlanetlabNode.get_rtype()) if node: return node[0] - return None + raise RuntimeError, "TAP/TUN devices must be connected to Node" @property def gre_enabled(self): @@ -160,9 +160,8 @@ class PlanetlabTap(LinuxApplication): # upload stop.sh script stop_command = self.replace_paths(self._stop_command) - self.node.upload(stop_command, - os.path.join(self.app_home, "stop.sh"), - text = True, + self.node.upload_command(stop_command, + shfile = os.path.join(self.app_home, "stop.sh"), # Overwrite file every time. # The stop.sh has the path to the socket, which should change # on every experiment run. @@ -266,17 +265,23 @@ class PlanetlabTap(LinuxApplication): super(PlanetlabTap, self).do_release() - def wait_vif_name(self): + def wait_vif_name(self, exec_run_home = None): """ Waits until the vif_name file for the command is generated, and returns the vif_name for the device """ vif_name = None delay = 0.5 + # The vif_name file will be created in the tap-home, while the + # current execution home might be elsewhere to check for errors + # (e.g. could be a tunnel-home) + if not exec_run_home: + exec_run_home = self.run_home + for i in xrange(20): (out, err), proc = self.node.check_output(self.run_home, "vif_name") if proc.poll() > 0: - (out, err), proc = self.node.check_errors(self.run_home) + (out, err), proc = self.node.check_errors(exec_run_home) if err.strip(): raise RuntimeError, err @@ -301,9 +306,8 @@ class PlanetlabTap(LinuxApplication): # 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, + self.node.upload_command(gre_connect_command, + shfile = shfile, overwrite = False) # invoke connect script @@ -333,7 +337,7 @@ class PlanetlabTap(LinuxApplication): # 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() + vif_name = self.wait_vif_name(exec_run_home = connection_run_home) self.set("deviceName", vif_name) return True @@ -346,9 +350,8 @@ class PlanetlabTap(LinuxApplication): # 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, + self.node.upload_command(udp_connect_command, + shfile = shfile, overwrite = False) # invoke connect script @@ -384,7 +387,7 @@ class PlanetlabTap(LinuxApplication): self.set("pointopoint", remote_endpoint.get("ip4")) remote_ip = socket.gethostbyname( - remote_endpoint.node.get("hostname")) + remote_endpoint.node.get("ip")) local_port_file = os.path.join(connection_run_home, "local_port") @@ -433,7 +436,7 @@ class PlanetlabTap(LinuxApplication): # Set the remote endpoint self.set("pointopoint", remote_endpoint.get("ip4")) self.set("greRemote", socket.gethostbyname( - remote_endpoint.node.get("hostname"))) + remote_endpoint.node.get("ip"))) # Generate GRE connect command diff --git a/test/resources/linux/gretunnel.py b/test/resources/linux/gretunnel.py index cb557604..a267845e 100755 --- a/test/resources/linux/gretunnel.py +++ b/test/resources/linux/gretunnel.py @@ -26,6 +26,8 @@ import os import time import unittest +## TODO: VALIDATE THIS TEST! + class LinuxGRETunnelTestCase(unittest.TestCase): def setUp(self): self.host1 = "roseval.pl.sophia.inria.fr" diff --git a/test/resources/planetlab/gretunnel.py b/test/resources/planetlab/gretunnel.py index 6548ed27..d0396a55 100755 --- a/test/resources/planetlab/gretunnel.py +++ b/test/resources/planetlab/gretunnel.py @@ -30,8 +30,9 @@ class PlanetLabGRETunnelTestCase(unittest.TestCase): def setUp(self): #self.host1 = "nepi2.pl.sophia.inria.fr" #self.host2 = "nepi5.pl.sophia.inria.fr" + #self.host2 = "planetlab1.informatik.uni-goettingen.de" self.host1 = "planetlab1.informatik.uni-erlangen.de" - self.host2 = "planetlab1.informatik.uni-goettingen.de" + self.host2 = "planck227ple.test.ibbt.be" self.host3 = "roseval.pl.sophia.inria.fr" self.user = "inria_nepi" self.identity = "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME']) @@ -48,7 +49,8 @@ class PlanetLabGRETunnelTestCase(unittest.TestCase): ec.set(node1, "hostname", host1) ec.set(node1, "username", user1) ec.set(node1, "identity", identity1) - ec.set(node1, "cleanHome", True) + #ec.set(node1, "cleanHome", True) + ec.set(node1, "cleanExperiment", True) ec.set(node1, "cleanProcesses", True) tap1 = ec.register_resource("PlanetlabTap") @@ -60,7 +62,8 @@ class PlanetLabGRETunnelTestCase(unittest.TestCase): ec.set(node2, "hostname", host2) ec.set(node2, "username", user2) ec.set(node2, "identity", identity2) - ec.set(node2, "cleanHome", True) + #ec.set(node2, "cleanHome", True) + ec.set(node2, "cleanExperiment", True) ec.set(node2, "cleanProcesses", True) tap2 = ec.register_resource("PlanetlabTap") @@ -103,7 +106,8 @@ class PlanetLabGRETunnelTestCase(unittest.TestCase): ec.set(node1, "hostname", host1) ec.set(node1, "username", user1) ec.set(node1, "identity", identity1) - ec.set(node1, "cleanHome", True) + #ec.set(node1, "cleanHome", True) + ec.set(node1, "cleanExperiment", True) ec.set(node1, "cleanProcesses", True) tun1 = ec.register_resource("PlanetlabTun") @@ -115,7 +119,8 @@ class PlanetLabGRETunnelTestCase(unittest.TestCase): ec.set(node2, "hostname", host2) ec.set(node2, "username", user2) ec.set(node2, "identity", identity2) - ec.set(node2, "cleanHome", True) + #ec.set(node2, "cleanHome", True) + ec.set(node2, "cleanExperiment", True) ec.set(node2, "cleanProcesses", True) tun2 = ec.register_resource("PlanetlabTun") @@ -158,7 +163,8 @@ class PlanetLabGRETunnelTestCase(unittest.TestCase): ec.set(node1, "hostname", host1) ec.set(node1, "username", user1) ec.set(node1, "identity", identity1) - ec.set(node1, "cleanHome", True) + #ec.set(node1, "cleanHome", True) + ec.set(node1, "cleanExperiment", True) ec.set(node1, "cleanProcesses", True) tun1 = ec.register_resource("PlanetlabTun") @@ -170,7 +176,8 @@ class PlanetLabGRETunnelTestCase(unittest.TestCase): ec.set(node2, "hostname", host2) ec.set(node2, "username", user2) ec.set(node2, "identity", identity2) - ec.set(node2, "cleanHome", True) + #ec.set(node2, "cleanHome", True) + ec.set(node2, "cleanExperiment", True) ec.set(node2, "cleanProcesses", True) tun2 = ec.register_resource("LinuxTun") diff --git a/test/resources/planetlab/udptunnel.py b/test/resources/planetlab/udptunnel.py index a74acee6..da077181 100755 --- a/test/resources/planetlab/udptunnel.py +++ b/test/resources/planetlab/udptunnel.py @@ -30,8 +30,9 @@ class PlanetlabUdpTunnelTestCase(unittest.TestCase): def setUp(self): #self.host1 = "nepi2.pl.sophia.inria.fr" #self.host2 = "nepi5.pl.sophia.inria.fr" + #self.host2 = "planetlab1.informatik.uni-goettingen.de" self.host1 = "planetlab1.informatik.uni-erlangen.de" - self.host2 = "planetlab1.informatik.uni-goettingen.de" + self.host2 = "planck227ple.test.ibbt.be" self.user = "inria_nepi" self.identity = "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME']) #self.netblock = "192.168.1" @@ -47,7 +48,8 @@ class PlanetlabUdpTunnelTestCase(unittest.TestCase): ec.set(node1, "hostname", host1) ec.set(node1, "username", user1) ec.set(node1, "identity", identity1) - ec.set(node1, "cleanHome", True) + #ec.set(node1, "cleanHome", True) + ec.set(node1, "cleanExperiment", True) ec.set(node1, "cleanProcesses", True) tap1 = ec.register_resource("PlanetlabTap") @@ -59,7 +61,8 @@ class PlanetlabUdpTunnelTestCase(unittest.TestCase): ec.set(node2, "hostname", host2) ec.set(node2, "username", user2) ec.set(node2, "identity", identity2) - ec.set(node2, "cleanHome", True) + #ec.set(node2, "cleanHome", True) + ec.set(node2, "cleanExperiment", True) ec.set(node2, "cleanProcesses", True) tap2 = ec.register_resource("PlanetlabTap") @@ -101,7 +104,8 @@ class PlanetlabUdpTunnelTestCase(unittest.TestCase): ec.set(node1, "hostname", host1) ec.set(node1, "username", user1) ec.set(node1, "identity", identity1) - ec.set(node1, "cleanHome", True) + #ec.set(node1, "cleanHome", True) + ec.set(node1, "cleanExperiment", True) ec.set(node1, "cleanProcesses", True) tun1 = ec.register_resource("PlanetlabTun") @@ -113,7 +117,8 @@ class PlanetlabUdpTunnelTestCase(unittest.TestCase): ec.set(node2, "hostname", host2) ec.set(node2, "username", user2) ec.set(node2, "identity", identity2) - ec.set(node2, "cleanHome", True) + #ec.set(node2, "cleanHome", True) + ec.set(node2, "cleanExperiment", True) ec.set(node2, "cleanProcesses", True) tun2 = ec.register_resource("PlanetlabTun")