Fix #123 [NS3] Upload a local ns-3 sources tar
authorAlina Quereilhac <alina.quereilhac@inria.fr>
Wed, 12 Feb 2014 23:43:36 +0000 (00:43 +0100)
committerAlina Quereilhac <alina.quereilhac@inria.fr>
Wed, 12 Feb 2014 23:43:36 +0000 (00:43 +0100)
16 files changed:
src/nepi/resources/linux/application.py
src/nepi/resources/linux/ns3/ns3simulation.py
src/nepi/resources/ns3/ns3application.py
test/resources/linux/application.py
test/resources/linux/ccn/ccnping.py
test/resources/linux/ccn/fibentry.py
test/resources/linux/interface.py
test/resources/linux/mtr.py
test/resources/linux/node.py
test/resources/linux/nping.py
test/resources/linux/ns3/ns-3.18-user.tar.gz [new file with mode: 0644]
test/resources/linux/ns3/ns3simulation.py
test/resources/linux/ping.py
test/resources/linux/tcpdump.py
test/resources/linux/traceroute.py
test/resources/linux/udptest.py

index d437421..a1a9f97 100644 (file)
@@ -358,11 +358,14 @@ class LinuxApplication(ResourceManager):
                     stdout = "deploy_stdout", 
                     stderr = "deploy_stderr")
 
-    def upload_sources(self):
+    def upload_sources(self, src_dir = None):
         sources = self.get("sources")
    
         command = ""
 
+        if not src_dir:
+            src_dir = self.node.src_dir
+
         if sources:
             self.info("Uploading sources ")
 
@@ -379,15 +382,16 @@ class LinuxApplication(ResourceManager):
 
                     command.append( " ( " 
                             # Check if the source already exists
-                            " ls ${SRC}/%(basename)s "
+                            " ls %(src_dir)s/%(basename)s "
                             " || ( "
                             # If source doesn't exist, download it and check
                             # that it it downloaded ok
-                            "   wget -c --directory-prefix=${SRC} %(source)s && "
-                            "   ls ${SRC}/%(basename)s "
+                            "   wget -c --directory-prefix=%(src_dir)s %(source)s && "
+                            "   ls %(src_dir)s/%(basename)s "
                             " ) ) " % {
                                 "basename": os.path.basename(source),
-                                "source": source
+                                "source": source,
+                                "src_dir": src_dir
                                 })
 
             command = " && ".join(command)
@@ -397,7 +401,7 @@ class LinuxApplication(ResourceManager):
        
             if sources:
                 sources = ' '.join(sources)
-                self.node.upload(sources, self.node.src_dir, overwrite = False)
+                self.node.upload(sources, src_dir, overwrite = False)
 
         return command
 
index fbc8a38..5b41c14 100644 (file)
@@ -152,6 +152,12 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
                     os.path.join(self.node.src_dir, "%s.tar.gz" % self.pygccxml_version),
                     overwrite = False)
 
+        # Upload user defined ns-3 sources
+        self.node.mkdir(os.path.join(self.node.src_dir, "ns-3"))
+        src_dir = os.path.join(self.node.src_dir, "ns-3")
+
+        super(LinuxNS3Simulation, self).upload_sources(src_dir = src_dir)
+
     def upload_start_command(self):
         command = self.get("command")
         env = self.get("env")
@@ -202,6 +208,18 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
             if not self.get("depends"):
                 self.set("depends", self._dependencies)
 
+            if self.get("sources"):
+                sources = self.get("sources")
+                source = sources.split(" ")[0]
+                basename = os.path.basename(source)
+                version = ( basename.strip().replace(".tar.gz", "")
+                    .replace(".tar","")
+                    .replace(".gz","")
+                    .replace(".zip","") )
+
+                self.set("ns3Version", version)
+                self.set("sources", source)
+
             if not self.get("build"):
                 self.set("build", self._build)
 
@@ -286,9 +304,9 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
     @property
     def _dependencies(self):
         if self.node.use_rpm:
-            return ( " gcc gcc-c++ python python-devel mercurial bzr tcpdump socat gccxml")
+            return ( " gcc gcc-c++ python python-devel mercurial bzr tcpdump socat gccxml unzip")
         elif self.node.use_deb:
-            return ( " gcc g++ python python-dev mercurial bzr tcpdump socat gccxml python-pygccxml")
+            return ( " gcc g++ python python-dev mercurial bzr tcpdump socat gccxml python-pygccxml unzip")
         return ""
 
     @property
@@ -301,6 +319,47 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
 
     @property
     def _build(self):
+        # If the user defined local sources for ns-3, we uncompress the sources
+        # on the remote sources directory. Else we clone ns-3 from the official repo.
+        source = self.get("sources")
+        if not source:
+            copy_ns3_cmd = "hg clone %(ns3_repo)s/%(ns3_version)s ${SRC}/ns-3/%(ns3_version)s" \
+                    % ({
+                        'ns3_version': self.get("ns3Version"),
+                        'ns3_repo':  self.ns3_repo,       
+                       })
+        else:
+            if source.find(".tar.gz") > -1:
+                copy_ns3_cmd = ( 
+                            "tar xzf ${SRC}/ns-3/%(basename)s " 
+                            " --strip-components=1 -C ${SRC}/ns-3/%(ns3_version)s "
+                            ) % ({
+                                'basename': os.path.basename(source),
+                                'ns3_version': self.get("ns3Version"),
+                                })
+            elif source.find(".tar") > -1:
+                copy_ns3_cmd = ( 
+                            "tar xf ${SRC}/ns-3/%(basename)s " 
+                            " --strip-components=1 -C ${SRC}/ns-3/%(ns3_version)s "
+                            ) % ({
+                                'basename': os.path.basename(source),
+                                'ns3_version': self.get("ns3Version"),
+                                })
+            elif source.find(".zip") > -1:
+                basename = os.path.basename(source)
+                bare_basename = basename.replace(".zip", "") \
+                        .replace(".tar", "") \
+                        .replace(".tar.gz", "")
+
+                copy_ns3_cmd = ( 
+                            "unzip ${SRC}/ns-3/%(basename)s && "
+                            "mv ${SRC}/ns-3/%(bare_basename)s ${SRC}/ns-3/%(ns3_version)s "
+                            ) % ({
+                                'bare_basename': basename_name,
+                                'basename': basename,
+                                'ns3_version': self.get("ns3Version"),
+                                })
+
         return (
                 # Test if ns-3 is alredy installed
                 " ( "
@@ -329,7 +388,7 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
                 "  && "
                 "   (   "
                 "     ( "
-                "       test -d ${BIN}/pybindgen/%(pybindgen_version)s && "
+                "       test -d ${SRC}/pybindgen/%(pybindgen_version)s && "
                 "       echo 'binaries found, nothing to do' "
                 "     ) "
                 "      || "
@@ -342,17 +401,18 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
                 "        ./waf "
                 "      ) "
                 "   ) " 
-                && "
-                # Clone and build ns-3
+                " && "
+                # Get ns-3 source code
                 "  ( "
-                "    hg clone %(ns3_repo)s/%(ns3_version)s ${SRC}/ns-3/%(ns3_version)s"
-               "   ) "
+                "     mkdir -p ${SRC}/ns-3/%(ns3_version)s && "
+                "     %(copy_ns3_cmd)s "
+                "  ) "
                 " ) "
              ) % ({ 
-                    'ns3_repo':  self.ns3_repo,       
                     'ns3_version': self.get("ns3Version"),
                     'pybindgen_version': self.get("pybindgenVersion"),
                     'pygccxml_version': self.pygccxml_version,
+                    'copy_ns3_cmd': copy_ns3_cmd,
                  })
 
     @property
index 46c98ea..cbb76b4 100644 (file)
@@ -59,7 +59,7 @@ class NS3BaseApplication(NS3Base):
     def state(self):
         if self._state == ResourceState.STARTED:
             is_running = self.simulation.invoke(self.uuid, "isAppRunning")
-
+            
             if not is_running:
                 self.set_stopped()
 
index edbc2ba..8d8fe21 100755 (executable)
@@ -32,7 +32,7 @@ import unittest
 class LinuxApplicationTestCase(unittest.TestCase):
     def setUp(self):
         self.fedora_host = "nepi2.pl.sophia.inria.fr"
-        self.fedora_user = "inria_test"
+        self.fedora_user = "inria_nepi"
 
         self.ubuntu_host = "roseval.pl.sophia.inria.fr"
         self.ubuntu_user = "alina"
index 672a11c..a740128 100644 (file)
@@ -29,7 +29,7 @@ import unittest
 class LinuxCCNPingTestCase(unittest.TestCase):
     def setUp(self):
         self.fedora_host = "nepi2.pl.sophia.inria.fr"
-        self.fedora_user = "inria_test"
+        self.fedora_user = "inria_nepi"
 
         self.ubuntu_host = "roseval.pl.sophia.inria.fr"
         self.ubuntu_user = "alina"
index 00ac5e8..c6b219c 100644 (file)
@@ -29,7 +29,7 @@ import unittest
 class LinuxFIBEntryTestCase(unittest.TestCase):
     def setUp(self):
         self.fedora_host = "nepi2.pl.sophia.inria.fr"
-        self.fedora_user = "inria_test"
+        self.fedora_user = "inria_nepi"
 
         self.ubuntu_host = "roseval.pl.sophia.inria.fr"
         self.ubuntu_user = "nepi"
index bd4d74d..379f92e 100755 (executable)
@@ -35,7 +35,7 @@ import unittest
 class LinuxInterfaceTestCase(unittest.TestCase):
     def setUp(self):
         self.fedora_host = "nepi2.pl.sophia.inria.fr"
-        self.fedora_user = "inria_test"
+        self.fedora_user = "inria_nepi"
 
         self.ubuntu_host = "roseval.pl.sophia.inria.fr"
         self.ubuntu_user = "alina"
index c62848a..a34068d 100755 (executable)
@@ -29,7 +29,7 @@ import unittest
 class LinuxMtrTestCase(unittest.TestCase):
     def setUp(self):
         self.fedora_host = "nepi2.pl.sophia.inria.fr"
-        self.fedora_user = "inria_test"
+        self.fedora_user = "inria_nepi"
 
         self.ubuntu_host = "roseval.pl.sophia.inria.fr"
         self.ubuntu_user = "alina"
index cebf0d8..e7d44e1 100755 (executable)
@@ -32,7 +32,7 @@ import unittest
 class LinuxNodeTestCase(unittest.TestCase):
     def setUp(self):
         self.fedora_host = "nepi2.pl.sophia.inria.fr"
-        self.fedora_user = "inria_test"
+        self.fedora_user = "inria_nepi"
 
         self.ubuntu_host = "roseval.pl.sophia.inria.fr"
         self.ubuntu_user = "alina"
index b6af3dc..19c4ef4 100755 (executable)
@@ -29,7 +29,7 @@ import unittest
 class LinuxNPingTestCase(unittest.TestCase):
     def setUp(self):
         self.fedora_host = "nepi2.pl.sophia.inria.fr"
-        self.fedora_user = "inria_test"
+        self.fedora_user = "inria_nepi"
 
         self.ubuntu_host = "roseval.pl.sophia.inria.fr"
         self.ubuntu_user = "alina"
diff --git a/test/resources/linux/ns3/ns-3.18-user.tar.gz b/test/resources/linux/ns3/ns-3.18-user.tar.gz
new file mode 100644 (file)
index 0000000..fcbfb70
Binary files /dev/null and b/test/resources/linux/ns3/ns-3.18-user.tar.gz differ
index 095ae9a..4352e3b 100644 (file)
@@ -75,9 +75,10 @@ def add_csma_device(ec, ns3_node, address, prefix):
 
 class LinuxNS3ClientTest(unittest.TestCase):
     def setUp(self):
-        self.fedora_host = "nepi2.pl.sophia.inria.fr"
+        #self.fedora_host = "nepi2.pl.sophia.inria.fr"
+        self.fedora_host = "planetlabpc1.upf.edu"
         #self.fedora_host = "peeramide.irisa.fr"
-        self.fedora_user = "inria_test"
+        self.fedora_user = "inria_nepi"
         #self.fedora_user = "inria_alina"
         self.fedora_identity = "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME'])
 
@@ -92,8 +93,6 @@ class LinuxNS3ClientTest(unittest.TestCase):
         #ec.set(node, "cleanHome", True)
 
         simu = ec.register_resource("LinuxNS3Simulation")
-        ec.set(simu, "verbose", True)
-        ec.set(simu, "nsLog", "V4Ping:Node")
         ec.register_connection(simu, node)
 
         nsnode1 = add_ns3_node(ec, simu)
@@ -138,6 +137,99 @@ class LinuxNS3ClientTest(unittest.TestCase):
         ec.set(node, "cleanProcesses", True)
         #ec.set(node, "cleanHome", True)
 
+        simu = ec.register_resource("LinuxNS3Simulation")
+        ec.register_connection(simu, node)
+
+        nsnode1 = add_ns3_node(ec, simu)
+        dev1 = add_csma_device(ec, nsnode1, "10.0.0.1", "30")
+
+        nsnode2 = add_ns3_node(ec, simu)
+        dev2 = add_csma_device(ec, nsnode2, "10.0.0.2", "30")
+
+        # Create channel
+        chan = ec.register_resource("ns3::CsmaChannel")
+        ec.set(chan, "Delay", "0s")
+        ec.register_connection(chan, dev1)
+        ec.register_connection(chan, dev2)
+
+        ### create pinger
+        ping = ec.register_resource("ns3::V4Ping")
+        ec.set (ping, "Remote", "10.0.0.2")
+        ec.set (ping, "Interval", "1s")
+        ec.set (ping, "Verbose", True)
+        ec.set (ping, "StartTime", "0s")
+        ec.set (ping, "StopTime", "20s")
+        ec.register_connection(ping, nsnode1)
+
+        ec.deploy()
+
+        ec.wait_finished([ping])
+        
+        stdout = ec.trace(simu, "stdout") 
+
+        expected = "20 packets transmitted, 20 received, 0% packet loss"
+        self.assertTrue(stdout.find(expected) > -1)
+
+        ec.shutdown()
+
+    def test_compile_local_source(self):
+        ec = ExperimentController(exp_id = "test-ns3-local-source")
+        
+        node = ec.register_resource("LinuxNode")
+        ec.set(node, "hostname", self.fedora_host)
+        ec.set(node, "username", self.fedora_user)
+        ec.set(node, "identity", self.fedora_identity)
+        ec.set(node, "cleanProcesses", True)
+        #ec.set(node, "cleanHome", True)
+
+        simu = ec.register_resource("LinuxNS3Simulation")
+        sources = os.path.join(os.path.dirname(os.path.realpath(__file__)), 
+                "ns-3.18-user.tar.gz")
+        ec.set(simu, "sources", sources)
+        ec.register_connection(simu, node)
+
+        nsnode1 = add_ns3_node(ec, simu)
+        dev1 = add_csma_device(ec, nsnode1, "10.0.0.1", "30")
+
+        nsnode2 = add_ns3_node(ec, simu)
+        dev2 = add_csma_device(ec, nsnode2, "10.0.0.2", "30")
+
+        # Create channel
+        chan = ec.register_resource("ns3::CsmaChannel")
+        ec.set(chan, "Delay", "0s")
+        ec.register_connection(chan, dev1)
+        ec.register_connection(chan, dev2)
+
+        ### create pinger
+        ping = ec.register_resource("ns3::V4Ping")
+        ec.set (ping, "Remote", "10.0.0.2")
+        ec.set (ping, "Interval", "1s")
+        ec.set (ping, "Verbose", True)
+        ec.set (ping, "StartTime", "0s")
+        ec.set (ping, "StopTime", "20s")
+        ec.register_connection(ping, nsnode1)
+
+        ec.deploy()
+
+        ec.wait_finished([ping])
+        
+        stdout = ec.trace(simu, "stdout") 
+
+        expected = "20 packets transmitted, 20 received, 0% packet loss"
+        self.assertTrue(stdout.find(expected) > -1)
+        
+        ec.shutdown()
+
+    def test_compile_debug_mode(self):
+        ec = ExperimentController(exp_id = "test-ns3-debug-mode")
+        
+        node = ec.register_resource("LinuxNode")
+        ec.set(node, "hostname", self.fedora_host)
+        ec.set(node, "username", self.fedora_user)
+        ec.set(node, "identity", self.fedora_identity)
+        ec.set(node, "cleanProcesses", True)
+        #ec.set(node, "cleanHome", True)
+
         simu = ec.register_resource("LinuxNS3Simulation")
         ec.set(simu, "verbose", True)
         ec.set(simu, "nsLog", "V4Ping:Node")
@@ -173,6 +265,10 @@ class LinuxNS3ClientTest(unittest.TestCase):
 
         expected = "20 packets transmitted, 20 received, 0% packet loss"
         self.assertTrue(stdout.find(expected) > -1)
+        
+        stderr = ec.trace(simu, "stderr")
+        expected = "V4Ping:Read32"
+        self.assertTrue(stderr.find(expected) > -1)
 
         ec.shutdown()
 
@@ -187,9 +283,9 @@ class LinuxNS3ClientTest(unittest.TestCase):
         #ec.set(node, "cleanHome", True)
 
         simu = ec.register_resource("LinuxNS3Simulation")
-        ec.set(simu, "verbose", True)
         ec.set(simu, "simulatorImplementationType", "ns3::RealtimeSimulatorImpl")
         ec.set(simu, "checksumEnabled", True)
+        ec.set(simu, "verbose", True)
         ec.register_connection(simu, node)
 
         nsnode1 = add_ns3_node(ec, simu)
@@ -216,7 +312,7 @@ class LinuxNS3ClientTest(unittest.TestCase):
         ec.deploy()
 
         ec.wait_finished([ping])
-       
+      
         stdout = ec.trace(simu, "stdout") 
 
         expected = "20 packets transmitted, 20 received, 0% packet loss"
@@ -243,8 +339,6 @@ class LinuxNS3ClientTest(unittest.TestCase):
         #ec.set(node, "cleanHome", True)
 
         simu = ec.register_resource("LinuxNS3Simulation")
-        ec.set(simu, "verbose", True)
-        ec.set(simu, "nsLog", "V4Ping:Node")
         ec.register_connection(simu, node)
 
         nsnode1 = add_ns3_node(ec, simu)
index 8846690..6530276 100755 (executable)
@@ -29,7 +29,7 @@ import unittest
 class LinuxPingTestCase(unittest.TestCase):
     def setUp(self):
         self.fedora_host = "nepi2.pl.sophia.inria.fr"
-        self.fedora_user = "inria_test"
+        self.fedora_user = "inria_nepi"
 
         self.ubuntu_host = "roseval.pl.sophia.inria.fr"
         self.ubuntu_user = "alina"
index 6c9a9be..6ba7375 100755 (executable)
@@ -29,7 +29,7 @@ import unittest
 class LinuxTcpdumpTestCase(unittest.TestCase):
     def setUp(self):
         self.fedora_host = "nepi2.pl.sophia.inria.fr"
-        self.fedora_user = "inria_test"
+        self.fedora_user = "inria_nepi"
 
         self.ubuntu_host = "roseval.pl.sophia.inria.fr"
         self.ubuntu_user = "alina"
index dfdae42..996472e 100755 (executable)
@@ -29,7 +29,7 @@ import unittest
 class LinuxTracerouteTestCase(unittest.TestCase):
     def setUp(self):
         self.fedora_host = "nepi2.pl.sophia.inria.fr"
-        self.fedora_user = "inria_test"
+        self.fedora_user = "inria_nepi"
 
         self.ubuntu_host = "roseval.pl.sophia.inria.fr"
         self.ubuntu_user = "alina"
index aeafe6a..37bfc88 100755 (executable)
@@ -29,7 +29,7 @@ import unittest
 class LinuxUdpTestTestCase(unittest.TestCase):
     def setUp(self):
         self.fedora_host = "nepi2.pl.sophia.inria.fr"
-        self.fedora_user = "inria_test"
+        self.fedora_user = "inria_nepi"
 
         self.ubuntu_host = "roseval.pl.sophia.inria.fr"
         self.ubuntu_user = "alina"