Fix #123 [NS3] Upload a local ns-3 sources tar
[nepi.git] / test / resources / linux / ns3 / ns3simulation.py
index 9399563..4352e3b 100644 (file)
 
 
 from nepi.execution.ec import ExperimentController 
+from nepi.execution.trace import TraceAttr
 
 import os
 import time
 import unittest
 
+def add_ns3_node(ec, simu):
+    ns3_node = ec.register_resource("ns3::Node")
+    ec.register_connection(ns3_node, simu)
+
+    ipv4 = ec.register_resource("ns3::Ipv4L3Protocol")
+    ec.register_connection(ns3_node, ipv4)
+
+    arp = ec.register_resource("ns3::ArpL3Protocol")
+    ec.register_connection(ns3_node, arp)
+    
+    icmp = ec.register_resource("ns3::Icmpv4L4Protocol")
+    ec.register_connection(ns3_node, icmp)
+
+    return ns3_node
+
+def add_point2point_device(ec, ns3_node, address, prefix):
+    dev = ec.register_resource("ns3::PointToPointNetDevice")
+    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
+
+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 = "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'])
 
-    def ztest_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)
+        #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 = ec.register_resource("ns3::Node")
-        ec.register_connection(nsnode1, simu)
+        nsnode1 = add_ns3_node(ec, simu)
+        dev1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
 
-        ipv41 = ec.register_resource("ns3::Ipv4L3Protocol")
-        ec.register_connection(nsnode1, ipv41)
+        nsnode2 = add_ns3_node(ec, simu)
+        dev2 = add_point2point_device(ec, nsnode2, "10.0.0.2", "30")
 
-        arp1 = ec.register_resource("ns3::ArpL3Protocol")
-        ec.register_connection(nsnode1, arp1)
-        
-        icmp1 = ec.register_resource("ns3::Icmpv4L4Protocol")
-        ec.register_connection(nsnode1, icmp1)
+        # Create channel
+        chan = ec.register_resource("ns3::PointToPointChannel")
+        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()
 
-        p1 = ec.register_resource("ns3::PointToPointNetDevice")
-        ec.set(p1, "ip", "10.0.0.1")
-        ec.set(p1, "prefix", "30")
-        ec.register_connection(nsnode1, p1)
-        q1 = ec.register_resource("ns3::DropTailQueue")
-        ec.register_connection(p1, q1)
+        ec.wait_finished([ping])
+        
+        stdout = ec.trace(simu, "stdout") 
 
-        nsnode2 = ec.register_resource("ns3::Node")
-        ec.register_connection(nsnode2, simu)
+        expected = "20 packets transmitted, 20 received, 0% packet loss"
+        self.assertTrue(stdout.find(expected) > -1)
 
-        ipv42 = ec.register_resource("ns3::Ipv4L3Protocol")
-        ec.register_connection(nsnode2, ipv42)
+        ec.shutdown()
 
-        arp2 = ec.register_resource("ns3::ArpL3Protocol")
-        ec.register_connection(nsnode2, arp2)
+    def test_simple_cmsa_ping(self):
+        ec = ExperimentController(exp_id = "test-ns3-csma-ping")
         
-        icmp2 = ec.register_resource("ns3::Icmpv4L4Protocol")
-        ec.register_connection(nsnode2, icmp2)
+        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)
 
-        p2 = ec.register_resource("ns3::PointToPointNetDevice")
-        ec.set(p2, "ip", "10.0.0.2")
-        ec.set(p2, "prefix", "30")
-        ec.register_connection(nsnode2, p2)
-        q2 = ec.register_resource("ns3::DropTailQueue")
-        ec.register_connection(p2, q2)
+        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::PointToPointChannel")
+        chan = ec.register_resource("ns3::CsmaChannel")
         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")
@@ -119,64 +172,133 @@ class LinuxNS3ClientTest(unittest.TestCase):
 
         ec.shutdown()
 
-    def ztest_real_time(self):
-        ec = ExperimentController(exp_id = "test-ns3-real-time")
+    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)
+        #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)
+        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 = ec.register_resource("ns3::Node")
-        ec.register_connection(nsnode1, simu)
+        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") 
 
-        ipv41 = ec.register_resource("ns3::Ipv4L3Protocol")
-        ec.register_connection(nsnode1, ipv41)
+        expected = "20 packets transmitted, 20 received, 0% packet loss"
+        self.assertTrue(stdout.find(expected) > -1)
+        
+        ec.shutdown()
 
-        arp1 = ec.register_resource("ns3::ArpL3Protocol")
-        ec.register_connection(nsnode1, arp1)
+    def test_compile_debug_mode(self):
+        ec = ExperimentController(exp_id = "test-ns3-debug-mode")
         
-        icmp1 = ec.register_resource("ns3::Icmpv4L4Protocol")
-        ec.register_connection(nsnode1, icmp1)
+        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")
+        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()
 
-        p1 = ec.register_resource("ns3::PointToPointNetDevice")
-        ec.set(p1, "ip", "10.0.0.1")
-        ec.set(p1, "prefix", "30")
-        ec.register_connection(nsnode1, p1)
-        q1 = ec.register_resource("ns3::DropTailQueue")
-        ec.register_connection(p1, q1)
+        ec.wait_finished([ping])
+        
+        stdout = ec.trace(simu, "stdout") 
 
-        nsnode2 = ec.register_resource("ns3::Node")
-        ec.register_connection(nsnode2, simu)
+        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)
 
-        ipv42 = ec.register_resource("ns3::Ipv4L3Protocol")
-        ec.register_connection(nsnode2, ipv42)
+        ec.shutdown()
 
-        arp2 = ec.register_resource("ns3::ArpL3Protocol")
-        ec.register_connection(nsnode2, arp2)
+    def test_real_time(self):
+        ec = ExperimentController(exp_id = "test-ns3-real-time")
         
-        icmp2 = ec.register_resource("ns3::Icmpv4L4Protocol")
-        ec.register_connection(nsnode2, icmp2)
+        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, "simulatorImplementationType", "ns3::RealtimeSimulatorImpl")
+        ec.set(simu, "checksumEnabled", True)
+        ec.set(simu, "verbose", True)
+        ec.register_connection(simu, node)
 
-        p2 = ec.register_resource("ns3::PointToPointNetDevice")
-        ec.set(p2, "ip", "10.0.0.2")
-        ec.set(p2, "prefix", "30")
-        ec.register_connection(nsnode2, p2)
-        q2 = ec.register_resource("ns3::DropTailQueue")
-        ec.register_connection(p2, q2)
+        nsnode1 = add_ns3_node(ec, simu)
+        dev1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
+
+        nsnode2 = add_ns3_node(ec, simu)
+        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")
@@ -190,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"
@@ -206,34 +328,76 @@ class LinuxNS3ClientTest(unittest.TestCase):
 
         ec.shutdown()
 
-    def test_stop_time(self):
-        ec = ExperimentController(exp_id = "test-ns3-stop-time")
+    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)
 
         simu = ec.register_resource("LinuxNS3Simulation")
-        ec.set(simu, "verbose", True)
-        ec.set(simu, "simulatorImplementationType", "ns3::RealtimeSimulatorImpl")
-        ec.set(simu, "checksumEnabled", True)
-        ec.set(simu, "stopTime", "20s")
         ec.register_connection(simu, node)
 
+        nsnode1 = add_ns3_node(ec, simu)
+        dev1 = add_point2point_device(ec, nsnode1, "10.0.0.1", "30")
+
+        nsnode2 = add_ns3_node(ec, simu)
+        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, 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)
+
+        # enable traces
+        ec.enable_trace(dev1, "pcap")
+        ec.enable_trace(dev1, "promiscPcap")
+        ec.enable_trace(dev1, "ascii")
+
+        ec.enable_trace(dev2, "pcap")
+        ec.enable_trace(dev2, "promiscPcap")
+        ec.enable_trace(dev2, "ascii")
+
         ec.deploy()
 
-        ec.wait_finished([simu])
-       
-        rm = ec.get_resource(simu)
-        start_time = rm.start_time
-        stop_time = rm.stop_time
-        delta =  stop_time - start_time
+        ec.wait_finished([ping])
 
-        print delta.seconds
-        self.assertTrue(delta.seconds >= 20)
-        self.assertTrue(delta.seconds < 25)
+        # Trace verification
+        rm_simu = ec.get_resource(simu)
+
+        # TODO: Fix this in ns-3: pcap traces do not flush until the Simulator 
+        #   process is ended, so we can't get the traces of the 'pcap' and
+        #   'promiscPcap' traces.
+        #
+        #for trace in ["pcap", "promiscPcap", "ascii"]:
+        for trace in ["ascii"]:
+            for guid in [dev1, dev2]:
+                output = ec.trace(guid, trace)
+
+                size = ec.trace(guid, trace, attr = TraceAttr.SIZE)
+                self.assertEquals(size, len(output))
+                self.assertTrue(size > 100)
+                
+                block = ec.trace(guid, trace, attr = TraceAttr.STREAM, block = 5, offset = 1)
+                self.assertEquals(block, output[5:10])
+
+                trace_path = ec.trace(guid, trace, attr = TraceAttr.PATH)
+                rm = ec.get_resource(guid)
+                path = os.path.join(rm_simu.run_home, rm._trace_filename.get(trace))
+                self.assertEquals(trace_path, path)
 
         ec.shutdown()