#124 - Allow the ns-3 sources to be built in debug mode
authorAlina Quereilhac <alina.quereilhac@inria.fr>
Tue, 11 Feb 2014 23:08:17 +0000 (00:08 +0100)
committerAlina Quereilhac <alina.quereilhac@inria.fr>
Tue, 11 Feb 2014 23:08:17 +0000 (00:08 +0100)
src/nepi/resources/linux/ns3/ns3simulation.py
src/nepi/resources/ns3/ns3netdevice.py
test/resources/linux/ns3/ns3simulation.py

index d73e738..fbc8a38 100644 (file)
@@ -71,11 +71,31 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
             type = Types.Bool,
             flags = Flags.Design)
 
+        build_mode = Attribute("buildMode",
+            "Mode used to build ns-3 with waf. One if: debug, release, oprimized ",
+            default = "release", 
+            allowed = ["debug", "release", "optimized"],
+            type = Types.Enumerate,
+            flags = Flags.Design)
+
+        ns3_version = Attribute("ns3Version",
+            "Version of ns-3 to install from nsam repo",
+            default = "ns-3.19", 
+            flags = Flags.Design)
+
+        pybindgen_version = Attribute("pybindgenVersion",
+            "Version of pybindgen to install from bazar repo",
+            default = "834", 
+            flags = Flags.Design)
+
         cls._register_attribute(impl_type)
         cls._register_attribute(sched_type)
         cls._register_attribute(check_sum)
         cls._register_attribute(ns_log)
         cls._register_attribute(verbose)
+        cls._register_attribute(build_mode)
+        cls._register_attribute(ns3_version)
+        cls._register_attribute(pybindgen_version)
 
     def __init__(self, ec, guid):
         LinuxApplication.__init__(self, ec, guid)
@@ -273,19 +293,11 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
 
     @property
     def ns3_repo(self):
-       return "http://code.nsnam.org"
-
-    @property
-    def ns3_version(self):
-       return "ns-3.19"
-
-    @property
-    def pybindgen_version(self):
-       return "834"
+        return "http://code.nsnam.org"
 
     @property
     def pygccxml_version(self):
-       return "pygccxml-1.0.0"
+        return "pygccxml-1.0.0"
 
     @property
     def _build(self):
@@ -293,8 +305,9 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
                 # Test if ns-3 is alredy installed
                 " ( "
                 " (( "
-                "  ( test -d ${SRC}/%(ns3_version)s ) || (test -d ${NS3BINDINGS:='None'} && test -d ${NS3LIBRARIES:='None'}) ) && "
-                "  echo 'binaries found, nothing to do' )"
+                "    ( test -d ${SRC}/ns-3/%(ns3_version)s ) || "
+                "    ( test -d ${NS3BINDINGS:='None'} && test -d ${NS3LIBRARIES:='None'}) "
+                "  ) && echo 'binaries found, nothing to do' )"
                 " ) "
                 "  || " 
                 # If not, install ns-3 and its dependencies
@@ -316,14 +329,15 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
                 "  && "
                 "   (   "
                 "     ( "
-                "       test -d ${BIN}/pybindgen && "
+                "       test -d ${BIN}/pybindgen/%(pybindgen_version)s && "
                 "       echo 'binaries found, nothing to do' "
                 "     ) "
                 "      || "
                 # If not, clone and build
                 "      ( cd ${SRC} && "
-                "        bzr checkout lp:pybindgen -r %(pybindgen_version)s && "
-                "        cd ${SRC}/pybindgen && "
+                "        mkdir -p ${SRC}/pybindgen && "
+                "        bzr checkout lp:pybindgen -r %(pybindgen_version)s ${SRC}/pybindgen/%(pybindgen_version)s && "
+                "        cd ${SRC}/pybindgen/%(pybindgen_version)s && "
                 "        ./waf configure && "
                 "        ./waf "
                 "      ) "
@@ -331,17 +345,14 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
                "  && "
                 # Clone and build ns-3
                 "  ( "
-                "    hg clone %(ns3_repo)s/%(ns3_version)s ${SRC}/%(ns3_version)s && "
-                "    cd ${SRC}/%(ns3_version)s && "
-                "    ./waf configure -d optimized  && "
-                "    ./waf "
-                "   ) "
+                "    hg clone %(ns3_repo)s/%(ns3_version)s ${SRC}/ns-3/%(ns3_version)s"
+               "   ) "
                 " ) "
              ) % ({ 
                     'ns3_repo':  self.ns3_repo,       
-                    'ns3_version': self.ns3_version,
-                    'pybindgen_version': self.pybindgen_version,
-                    'pygccxml_version': self.pygccxml_version
+                    'ns3_version': self.get("ns3Version"),
+                    'pybindgen_version': self.get("pybindgenVersion"),
+                    'pygccxml_version': self.pygccxml_version,
                  })
 
     @property
@@ -349,28 +360,35 @@ class LinuxNS3Simulation(LinuxApplication, NS3Simulation):
         return (
                  # Test if ns-3 is alredy cloned
                 " ( "
-                "  ( ( (test -d ${BIN}/%(ns3_version)s/build ) || "
+                "  ( ( (test -d ${BIN}/ns-3/%(ns3_version)s/%(build_mode)s/build ) || "
                 "    (test -d ${NS3BINDINGS:='None'} && test -d ${NS3LIBRARIES:='None'}) ) && "
                 "    echo 'binaries found, nothing to do' )"
                 " ) "
                 " ||" 
                 " (   "
                  # If not, copy ns-3 build to bin
-                "  mkdir -p ${BIN}/%(ns3_version)s && "
-                "  mv ${SRC}/%(ns3_version)s/build ${BIN}/%(ns3_version)s/build "
+                "  cd ${SRC}/ns-3/%(ns3_version)s && "
+                "  ./waf configure -d %(build_mode)s --with-pybindgen=${SRC}/pybindgen/%(pybindgen_version)s && "
+                "  ./waf && "
+                "  mkdir -p ${BIN}/ns-3/%(ns3_version)s/%(build_mode)s && "
+                "  mv ${SRC}/ns-3/%(ns3_version)s/build ${BIN}/ns-3/%(ns3_version)s/%(build_mode)s/build "
                 " )"
              ) % ({ 
-                    'ns3_version': self.ns3_version
+                    'ns3_version': self.get("ns3Version"),
+                    'pybindgen_version': self.get("pybindgenVersion"),
+                    'build_mode': self.get("buildMode"),
                  })
 
     @property
     def _environment(self):
         env = []
-        env.append("NS3BINDINGS=${NS3BINDINGS:=${BIN}/%(ns3_version)s/build/bindings/python/}" % ({ 
-                    'ns3_version': self.ns3_version,
+        env.append("NS3BINDINGS=${NS3BINDINGS:=${BIN}/ns-3/%(ns3_version)s/%(build_mode)s/build/bindings/python/}" % ({ 
+                    'ns3_version': self.get("ns3Version"),
+                    'build_mode': self.get("buildMode")
                  }))
-        env.append("NS3LIBRARIES=${NS3LIBRARIES:=${BIN}/%(ns3_version)s/build/}" % ({ 
-                    'ns3_version': self.ns3_version,
+        env.append("NS3LIBRARIES=${NS3LIBRARIES:=${BIN}/ns-3/%(ns3_version)s/%(build_mode)s/build/}" % ({ 
+                    'ns3_version': self.get("ns3Version"),
+                    'build_mode': self.get("buildMode")
                  }))
 
         return " ".join(env) 
index e3af336..3e74278 100644 (file)
@@ -24,6 +24,8 @@ from nepi.resources.ns3.ns3base import NS3Base
 
 import ipaddr
 
+# TODO: Validate that device must be connected to queue!! If not a segmentation fault occurs
+
 @clsinit_copy
 class NS3BaseNetDevice(NS3Base):
     _rtype = "abstract::ns3::NetDevice"
index 823a1c6..095ae9a 100644 (file)
@@ -62,17 +62,32 @@ def add_point2point_device(ec, ns3_node, address, prefix):
 
     return dev
 
+def add_csma_device(ec, ns3_node, address, prefix):
+    dev = ec.register_resource("ns3::CsmaNetDevice")
+    ec.set(dev, "ip", address)
+    ec.set(dev, "prefix", prefix)
+    ec.register_connection(ns3_node, dev)
+
+    queue = ec.register_resource("ns3::DropTailQueue")
+    ec.register_connection(dev, queue)
+
+    return dev
+
 class LinuxNS3ClientTest(unittest.TestCase):
     def setUp(self):
         self.fedora_host = "nepi2.pl.sophia.inria.fr"
+        #self.fedora_host = "peeramide.irisa.fr"
         self.fedora_user = "inria_test"
+        #self.fedora_user = "inria_alina"
+        self.fedora_identity = "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME'])
 
-    def test_simple_ping(self):
-        ec = ExperimentController(exp_id = "test-ns3-ping")
+    def test_simple_p2p_ping(self):
+        ec = ExperimentController(exp_id = "test-ns3-p2p-ping")
         
         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)
 
@@ -82,16 +97,64 @@ class LinuxNS3ClientTest(unittest.TestCase):
         ec.register_connection(simu, node)
 
         nsnode1 = add_ns3_node(ec, simu)
-        p1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
+        dev1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
 
         nsnode2 = add_ns3_node(ec, simu)
-        p2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
+        dev2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
 
         # Create channel
         chan = ec.register_resource("ns3::PointToPointChannel")
         ec.set(chan, "Delay", "0s")
-        ec.register_connection(chan, p1)
-        ec.register_connection(chan, p2)
+        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_simple_cmsa_ping(self):
+        ec = ExperimentController(exp_id = "test-ns3-csma-ping")
+        
+        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")
+        ec.set(simu, "buildMode", "debug")
+        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")
@@ -119,6 +182,7 @@ class LinuxNS3ClientTest(unittest.TestCase):
         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)
 
@@ -129,16 +193,16 @@ class LinuxNS3ClientTest(unittest.TestCase):
         ec.register_connection(simu, node)
 
         nsnode1 = add_ns3_node(ec, simu)
-        p1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
+        dev1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
 
         nsnode2 = add_ns3_node(ec, simu)
-        p2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
+        dev2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
 
         # Create channel
         chan = ec.register_resource("ns3::PointToPointChannel")
         ec.set(chan, "Delay", "0s")
-        ec.register_connection(chan, p1)
-        ec.register_connection(chan, p2)
+        ec.register_connection(chan, dev1)
+        ec.register_connection(chan, dev2)
 
         ### create pinger
         ping = ec.register_resource("ns3::V4Ping")
@@ -168,12 +232,13 @@ class LinuxNS3ClientTest(unittest.TestCase):
 
         ec.shutdown()
 
-    def test_p2p_traces(self):
-        ec = ExperimentController(exp_id = "test-ns3-p2p-traces")
+    def test_dev2p_traces(self):
+        ec = ExperimentController(exp_id = "test-ns3-dev2p-traces")
         
         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)
 
@@ -183,16 +248,16 @@ class LinuxNS3ClientTest(unittest.TestCase):
         ec.register_connection(simu, node)
 
         nsnode1 = add_ns3_node(ec, simu)
-        p1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
+        dev1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
 
         nsnode2 = add_ns3_node(ec, simu)
-        p2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
+        dev2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
 
         # Create channel
         chan = ec.register_resource("ns3::PointToPointChannel")
         ec.set(chan, "Delay", "0s")
-        ec.register_connection(chan, p1)
-        ec.register_connection(chan, p2)
+        ec.register_connection(chan, dev1)
+        ec.register_connection(chan, dev2)
 
         ### create pinger
         ping = ec.register_resource("ns3::V4Ping")
@@ -204,13 +269,13 @@ class LinuxNS3ClientTest(unittest.TestCase):
         ec.register_connection(ping, nsnode1)
 
         # enable traces
-        ec.enable_trace(p1, "pcap")
-        ec.enable_trace(p1, "promiscPcap")
-        ec.enable_trace(p1, "ascii")
+        ec.enable_trace(dev1, "pcap")
+        ec.enable_trace(dev1, "promiscPcap")
+        ec.enable_trace(dev1, "ascii")
 
-        ec.enable_trace(p2, "pcap")
-        ec.enable_trace(p2, "promiscPcap")
-        ec.enable_trace(p2, "ascii")
+        ec.enable_trace(dev2, "pcap")
+        ec.enable_trace(dev2, "promiscPcap")
+        ec.enable_trace(dev2, "ascii")
 
         ec.deploy()
 
@@ -225,7 +290,7 @@ class LinuxNS3ClientTest(unittest.TestCase):
         #
         #for trace in ["pcap", "promiscPcap", "ascii"]:
         for trace in ["ascii"]:
-            for guid in [p1, p2]:
+            for guid in [dev1, dev2]:
                 output = ec.trace(guid, trace)
 
                 size = ec.trace(guid, trace, attr = TraceAttr.SIZE)