Fixing GRE tunnel between localhost and remote host
authorAlina Quereilhac <alina.quereilhac@inria.fr>
Mon, 4 Aug 2014 14:26:41 +0000 (16:26 +0200)
committerAlina Quereilhac <alina.quereilhac@inria.fr>
Mon, 4 Aug 2014 14:26:41 +0000 (16:26 +0200)
src/nepi/resources/linux/application.py
src/nepi/resources/linux/node.py
src/nepi/resources/linux/tap.py
src/nepi/resources/planetlab/tap.py
test/resources/linux/gretunnel.py
test/resources/planetlab/gretunnel.py
test/resources/planetlab/udptunnel.py

index 08ea700..5e06dab 100644 (file)
@@ -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):
index fce5e6d..047dfe9 100644 (file)
@@ -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):
index f2e42a6..a0ec93a 100644 (file)
@@ -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 = ["("]
index 75e84de..1785f43 100644 (file)
@@ -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
 
index cb55760..a267845 100755 (executable)
@@ -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"
index 6548ed2..d0396a5 100755 (executable)
@@ -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")
index a74acee..da07718 100755 (executable)
@@ -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")