From fc4cfa215cc56eb84d7d1883373a1e1c46e3748b Mon Sep 17 00:00:00 2001 From: Alina Quereilhac Date: Wed, 12 Feb 2014 00:08:17 +0100 Subject: [PATCH] #124 - Allow the ns-3 sources to be built in debug mode --- src/nepi/resources/linux/ns3/ns3simulation.py | 80 ++++++++----- src/nepi/resources/ns3/ns3netdevice.py | 2 + test/resources/linux/ns3/ns3simulation.py | 111 ++++++++++++++---- 3 files changed, 139 insertions(+), 54 deletions(-) diff --git a/src/nepi/resources/linux/ns3/ns3simulation.py b/src/nepi/resources/linux/ns3/ns3simulation.py index d73e7382..fbc8a388 100644 --- a/src/nepi/resources/linux/ns3/ns3simulation.py +++ b/src/nepi/resources/linux/ns3/ns3simulation.py @@ -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) diff --git a/src/nepi/resources/ns3/ns3netdevice.py b/src/nepi/resources/ns3/ns3netdevice.py index e3af336a..3e742783 100644 --- a/src/nepi/resources/ns3/ns3netdevice.py +++ b/src/nepi/resources/ns3/ns3netdevice.py @@ -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" diff --git a/test/resources/linux/ns3/ns3simulation.py b/test/resources/linux/ns3/ns3simulation.py index 823a1c67..095ae9a4 100644 --- a/test/resources/linux/ns3/ns3simulation.py +++ b/test/resources/linux/ns3/ns3simulation.py @@ -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) -- 2.43.0