ns3_version = Attribute("ns3Version",
"Version of ns-3 to install from nsam repo",
#default = "ns-3.19",
- default = "ns-3-dev",
+ default = "ns-3.20",
+ #default = "ns-3-dev",
flags = Flags.Design)
pybindgen_version = Attribute("pybindgenVersion",
"Version of pybindgen to install from bazar repo",
#default = "864",
default = "868",
+ #default = "876",
+ flags = Flags.Design)
+
+ dce_version = Attribute("dceVersion",
+ "Version of dce to install from nsam repo (tag branch for repo)",
+ default = "dce-1.3",
+ #default = "dce-dev",
flags = Flags.Design)
populate_routing_tables = Attribute("populateRoutingTables",
cls._register_attribute(build_mode)
cls._register_attribute(ns3_version)
cls._register_attribute(pybindgen_version)
+ cls._register_attribute(dce_version)
cls._register_attribute(populate_routing_tables)
cls._register_attribute(stoptime)
self.get("buildMode"), "build")
def trace(self, name, attr = TraceAttr.ALL, block = 512, offset = 0):
- self._client.flush()
+ # stout needs to get flushed on the ns-3 server side, else we will
+ # get an empty stream. We try twice to retrieve the stream
+ # if we get empty stdout since the stream might not be
+ # flushed immediately.
+ if name.endswith("stdout"):
+ self._client.flush()
+ result = LinuxApplication.trace(self, name, attr, block, offset)
+ if result:
+ return result
+ # Let the stream be flushed
+ time.sleep(1)
+
return LinuxApplication.trace(self, name, attr, block, offset)
def upload_sources(self):
# Run the ns3wrapper
self._run_in_background()
+ # Wait until the remote socket is created
+ self.wait_remote_socket()
+
def configure(self):
if self.has_changed("simulatorImplementationType"):
simu_type = self.get("simulatorImplementationType")
self._client.start()
+ """
# XXX: IS THIS REALLY NEEDED??!!!
# Wait until the Simulation is actually started...
is_running = False
for i in xrange(1000):
is_running = self.invoke(SIMULATOR_UUID, "isRunning")
+ is_finished = self.invoke(SIMULATOR_UUID, "isFinished")
- if is_running:
+ if is_running or is_finished:
break
else:
time.sleep(1)
msg = " Simulation did not start"
self.error(msg)
raise RuntimeError
-
+ """
self.set_started()
else:
msg = " Failed to execute command '%s'" % command
return "http://code.nsnam.org/ns-3-dce"
#eturn "http://code.nsnam.org/epmancini/ns-3-dce"
+ @property
+ def dce_version(self):
+ dce_version = self.get("dceVersion")
+ return dce_version or "dce-dev"
+
@property
def _build(self):
# If the user defined local sources for ns-3, we uncompress the sources
clone_dce_cmd = " echo 'DCE will not be built' "
if self.enable_dce:
+ dce_version = self.dce_version
+ dce_tag = ""
+ if dce_version != "dce-dev":
+ dce_tag = "-r %s" % dce_version
+
clone_dce_cmd = (
# DCE installation
# Test if dce is alredy installed
" ( "
" ( "
- " ( test -d ${SRC}/dce/ns-3-dce ) "
+ " ( test -d ${SRC}/dce/ns-3-dce/%(dce_version)s ) "
" && echo 'dce binaries found, nothing to do'"
" ) "
" ) "
" || "
# Get dce source code
" ( "
- " mkdir -p ${SRC}/dce && "
- " hg clone %(dce_repo)s ${SRC}/dce/ns-3-dce"
+ " mkdir -p ${SRC}/dce/%(dce_version)s && "
+ " hg clone %(dce_repo)s %(dce_tag)s ${SRC}/dce/ns-3-dce/%(dce_version)s"
" ) "
) % {
- 'dce_repo': self.dce_repo
+ "dce_repo": self.dce_repo,
+ "dce_tag": dce_tag,
+ "dce_version": dce_version,
}
return (
if self.enable_dce:
install_dce_cmd = (
" ( "
- " ((test -d %(ns3_build_home)s/bin_dce ) && "
+ " ((test -d %(ns3_build_home)s/bin_dce/%(dce_version)s ) && "
" echo 'dce binaries found, nothing to do' )"
" ) "
" ||"
" ( "
# If not, copy ns-3 build to bin
- " cd ${SRC}/dce/ns-3-dce && "
- " rm -rf ${SRC}/dce/ns-3-dce/build && "
+ " cd ${SRC}/dce/ns-3-dce/%(dce_version)s && "
+ " rm -rf ${SRC}/dce/ns-3-dce/%(dce_version)s/build && "
" ./waf configure %(enable_opt)s --with-pybindgen=${SRC}/pybindgen/%(pybindgen_version)s "
" --prefix=%(ns3_build_home)s --with-ns3=%(ns3_build_home)s && "
" ./waf build && "
" mv %(ns3_build_home)s/lib*/python*/site-packages/ns/dce.so %(ns3_build_home)s/lib/python/site-packages/ns/ "
" )"
) % {
- 'ns3_version': self.get("ns3Version"),
- 'pybindgen_version': self.get("pybindgenVersion"),
- 'ns3_build_home': self.ns3_build_home,
- 'build_mode': self.get("buildMode"),
- 'enable_opt': "--enable-opt" if self.get("buildMode") == "optimized" else ""
+ "ns3_version": self.get("ns3Version"),
+ "pybindgen_version": self.get("pybindgenVersion"),
+ "ns3_build_home": self.ns3_build_home,
+ "build_mode": self.get("buildMode"),
+ "enable_opt": "--enable-opt" if self.get("buildMode") == "optimized" else "",
+ "dce_version": self.dce_version,
}
return (
# TODO: Validate!
return True
+ def wait_remote_socket(self):
+ """ Waits until the remote socket is created
+ """
+ command = " [ -e %s ] && echo 'DONE' " % self.remote_socket
+
+ for i in xrange(200):
+ (out, err), proc = self.node.execute(command, retry = 1,
+ with_lock = True)
+
+ if out.find("DONE") > -1:
+ break
+ else:
+ raise RuntimeError("Remote socket not found at %s" % \
+ self.remote_socket)
+
+
from nepi.execution.ec import ExperimentController
from nepi.execution.trace import TraceAttr
+from test_utils import skipIfNotAlive
+
import os
import time
import unittest
return node
-def add_point2point_device(ec, node, address = None, prefix = None):
+def add_point2point_device(ec, node, ip, prefix):
dev = ec.register_resource("ns3::PointToPointNetDevice")
- if address:
- ec.set(dev, "ip", address)
- if prefix:
- ec.set(dev, "prefix", prefix)
+ ec.set(dev, "ip", ip)
+ ec.set(dev, "prefix", prefix)
ec.register_connection(node, dev)
queue = ec.register_resource("ns3::DropTailQueue")
return dev
-def add_csma_device(ec, node, address = None, prefix = None):
+def add_csma_device(ec, node, ip, prefix):
dev = ec.register_resource("ns3::CsmaNetDevice")
- if address:
- ec.set(dev, "ip", address)
- if prefix:
- ec.set(dev, "prefix", prefix)
+ ec.set(dev, "ip", ip)
+ ec.set(dev, "prefix", prefix)
ec.register_connection(node, dev)
queue = ec.register_resource("ns3::DropTailQueue")
return dev
-def add_wifi_device(ec, node, address = None, prefix = None,
+def add_wifi_device(ec, node, ip, prefix,
access_point = False):
dev = ec.register_resource("ns3::WifiNetDevice")
- if address:
- ec.set(dev, "ip", address)
- if prefix:
- ec.set(dev, "prefix", prefix)
+ ec.set(dev, "ip", ip)
+ ec.set(dev, "prefix", prefix)
ec.register_connection(node, dev)
phy = ec.register_resource("ns3::YansWifiPhy")
self.fedora_user = "inria_nepi"
self.fedora_identity = "%s/.ssh/id_rsa_planetlab" % (os.environ['HOME'])
- def test_local_p2p_ping(self):
- ec = ExperimentController(exp_id = "test-ns3-local-p2p")
-
- node = ec.register_resource("LinuxNode")
- ec.set(node, "hostname", "localhost")
-
- simu = ec.register_resource("LinuxNS3Simulation")
- ec.set(simu, "verbose", True)
- 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)
-
- 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_p2p_ping(self):
+ @skipIfNotAlive
+ def t_p2p_ping(self, host, user = None, identity = None):
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)
+ if host == "localhost":
+ ec.set(node, "hostname", "localhost")
+ else:
+ ec.set(node, "hostname", host)
+ ec.set(node, "username", user)
+ ec.set(node, "identity", identity)
+
ec.set(node, "cleanProcesses", True)
#ec.set(node, "cleanHome", True)
ec.shutdown()
- def test_simple_cmsa_ping(self):
+ @skipIfNotAlive
+ def t_csma_ping(self, host, user = None, identity = None):
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)
+ if host == "localhost":
+ ec.set(node, "hostname", "localhost")
+ else:
+ ec.set(node, "hostname", host)
+ ec.set(node, "username", user)
+ ec.set(node, "identity", identity)
+
ec.set(node, "cleanProcesses", True)
#ec.set(node, "cleanHome", True)
ec.shutdown()
- def test_compile_local_source(self):
- ec = ExperimentController(exp_id = "test-ns3-local-source")
+ @skipIfNotAlive
+ def t_user_sources(self, host, user = None, identity = None):
+ ec = ExperimentController(exp_id = "test-ns3-user-sources")
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)
+ if host == "localhost":
+ ec.set(node, "hostname", "localhost")
+ else:
+ ec.set(node, "hostname", host)
+ ec.set(node, "username", user)
+ ec.set(node, "identity", identity)
+
ec.set(node, "cleanProcesses", True)
#ec.set(node, "cleanHome", True)
ec.shutdown()
- def test_compile_debug_mode(self):
+ @skipIfNotAlive
+ def t_compile_debug_mode(self, host, user = None, identity = None):
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)
+ if host == "localhost":
+ ec.set(node, "hostname", host)
+ else:
+ ec.set(node, "hostname", host)
+ ec.set(node, "username", user)
+ ec.set(node, "identity", identity)
+
ec.set(node, "cleanProcesses", True)
#ec.set(node, "cleanHome", True)
ec.shutdown()
- def test_real_time(self):
+ @skipIfNotAlive
+ def t_real_time(self, host, user = None, identity = None):
ec = ExperimentController(exp_id = "test-ns3-real-time")
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)
+ if host == "localhost":
+ ec.set(node, "hostname", "localhost")
+ else:
+ ec.set(node, "hostname", host)
+ ec.set(node, "username", user)
+ ec.set(node, "identity", identity)
+ ec.set(node, "cleanProcesses", True)
+
#ec.set(node, "cleanHome", True)
simu = ec.register_resource("LinuxNS3Simulation")
ec.shutdown()
- def test_traces(self):
+ @skipIfNotAlive
+ def t_traces(self, host, user = None, identity = None):
ec = ExperimentController(exp_id = "test-ns3-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)
+ if host == "localhost":
+ ec.set(node, "hostname", "localhost")
+ else:
+ 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.shutdown()
- def test_simple_wifi_ping(self):
+ @skipIfNotAlive
+ def t_wifi_ping(self, host, user = None, identity = None):
bounds_width = bounds_height = 200
x = y = 100
speed = 1
ec = ExperimentController(exp_id = "test-ns3-wifi-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)
+ if host == "localhost":
+ ec.set(node, "hostname", "localhost")
+ else:
+ ec.set(node, "hostname", host)
+ ec.set(node, "username", user)
+ ec.set(node, "identity", identity)
+
ec.set(node, "cleanProcesses", True)
#ec.set(node, "cleanHome", True)
ec.shutdown()
- def test_routing(self):
+ @skipIfNotAlive
+ def t_routing(self, host, user = None, localhost = None):
"""
network topology:
n4
ec = ExperimentController(exp_id = "test-ns3-routes")
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)
+ if host == "localhost":
+ ec.set(node, "hostname", host)
+ else:
+ ec.set(node, "hostname", host)
+ ec.set(node, "username", user)
+ ec.set(node, "identity", identity)
+
ec.set(node, "cleanProcesses", True)
#ec.set(node, "cleanHome", True)
ec.shutdown()
- def ztest_automatic_routing(self):
+ @skipIfNotAlive
+ def t_automatic_routing(self, host, user = None, identity = None):
"""
network topology:
n4
ec = ExperimentController(exp_id = "test-ns3-routing")
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)
+ if host == "localhost":
+ ec.set(node, "hostname", "localhost")
+ else:
+ ec.set(node, "hostname", host)
+ ec.set(node, "username", user)
+ ec.set(node, "identity", identity)
+
ec.set(node, "cleanProcesses", True)
#ec.set(node, "cleanHome", True)
ec.shutdown()
- def test_dce(self):
+ @skipIfNotAlive
+ def t_dce(self, host, user = None, identity = None):
ec = ExperimentController(exp_id = "test-ns3-dce")
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)
+ if host == "localhost":
+ ec.set(node, "hostname", host)
+ else:
+ ec.set(node, "hostname", host)
+ ec.set(node, "username", user)
+ ec.set(node, "identity", identity)
+
ec.set(node, "cleanProcesses", True)
#ec.set(node, "cleanHome", True)
simu = ec.register_resource("LinuxNS3Simulation")
ec.set(simu, "verbose", True)
- ec.set(simu, "enableDCE", True)
ec.set(simu, "buildMode", "debug")
ec.set(simu, "nsLog", "DceApplication")
ec.register_connection(simu, node)
self.assertTrue(stderr.find(expected) > -1, stderr)
ec.shutdown()
+
+ def test_p2p_ping_fedora(self):
+ self.t_p2p_ping(self.fedora_host, self.fedora_user, self.fedora_identity)
+
+ def test_p2p_ping_local(self):
+ self.t_p2p_ping("localhost")
+
+ def test_csma_ping_fedora(self):
+ self.t_csma_ping(self.fedora_host, self.fedora_user, self.fedora_identity)
+
+ def test_csma_ping_local(self):
+ self.t_csma_ping("localhost")
+
+ def test_wifi_ping_fedora(self):
+ self.t_wifi_ping(self.fedora_host, self.fedora_user, self.fedora_identity)
+
+ def test_wifi_ping_local(self):
+ self.t_wifi_ping("localhost")
+
+ def test_user_sources_fedora(self):
+ self.t_user_sources(self.fedora_host, self.fedora_user, self.fedora_identity)
+
+ def test_user_sources_local(self):
+ self.t_user_sources("localhost")
+
+ def test_compile_debug_mode_fedora(self):
+ self.t_compile_debug_mode(self.fedora_host, self.fedora_user, self.fedora_identity)
+
+ def test_compile_debug_mode_local(self):
+ self.t_compile_debug_mode("localhost")
+
+ def test_real_time_fedora(self):
+ self.t_real_time(self.fedora_host, self.fedora_user, self.fedora_identity)
+
+ def test_real_time_local(self):
+ self.t_real_time("localhost")
+
+ def test_traces_fedora(self):
+ self.t_traces(self.fedora_host, self.fedora_user, self.fedora_identity)
+
+ def test_traces_local(self):
+ self.t_traces("localhost")
+
+ def test_routing_fedora(self):
+ self.t_routing(self.fedora_host, self.fedora_user, self.fedora_identity)
+
+ def test_routing_local(self):
+ self.t_routing("localhost")
+
+ def test_dce_fedora(self):
+ self.t_dce(self.fedora_host, self.fedora_user, self.fedora_identity)
+
+ def test_dce_local(self):
+ self.t_dce("localhost")
if __name__ == '__main__':