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")
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)
@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
@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
" ( "
" && "
" ( "
" ( "
- " test -d ${BIN}/pybindgen/%(pybindgen_version)s && "
+ " test -d ${SRC}/pybindgen/%(pybindgen_version)s && "
" echo 'binaries found, nothing to do' "
" ) "
" || "
" ./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
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'])
#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)
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")
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()
#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)
ec.deploy()
ec.wait_finished([ping])
-
+
stdout = ec.trace(simu, "stdout")
expected = "20 packets transmitted, 20 received, 0% packet loss"
#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)