elements are done"""
raise NotImplementedError
- def start(self, time):
+ def start(self):
raise NotImplementedError
- def stop(self, time):
+ def stop(self):
raise NotImplementedError
def set(self, time, guid, name, value):
return node_guid
def _get_dev_number(testbed_instance, guid):
- dev_guids = testbed_instance.get_connected(guid, "devs", "node")
+ node_guid = _get_node_guid(testbed_instance, guid)
+ dev_guids = testbed_instance.get_connected(node_guid, "devs", "node")
interface_number = 0
for guid_ in dev_guids:
if guid_ == guid:
break
- inteface_number += 1
+ interface_number += 1
return interface_number
### create traces functions ###
# TESTBED INSTANCE PROTOCOL MESSAGES
testbed_messages = dict({
TRACE: "%d|%s" % (TRACE, "%d|%s"),
- START: "%d|%s" % (START, "%s"),
- STOP: "%d|%s" % (STOP, "%s"),
+ START: "%d" % START,
+ STOP: "%d" % STOP,
SHUTDOWN: "%d" % SHUTDOWN,
CONFIGURE: "%d|%s" % (CONFIGURE, "%s|%s|%d"),
CREATE: "%d|%s" % (CREATE, "%d|%s"),
# launch daemon
proc = server.popen_ssh_subprocess(python_code, host = host,
port = port, user = user, agent = agent)
- #while not proc.poll():
- # time.sleep(0.5)
if proc.poll():
err = proc.stderr.read()
raise RuntimeError("Client could not be executed: %s" % \
elif mode == AccessConfiguration.MODE_DAEMON:
(root_dir, log_level, user, host, port, agent) = \
get_access_config_params(access_config)
- return TestbedIntanceProxy(root_dir, log_level, testbed_id = testbed_id,
+ return TestbedInstanceProxy(root_dir, log_level, testbed_id = testbed_id,
testbed_version = testbed_version, host = host, port = port,
user = user, agent = agent)
raise RuntimeError("Unsupported access configuration 'mode'" % mode)
return "%d|%s" % (OK, result)
def start(self, params):
- time = params[1]
- self._testbed.start(time)
+ self._testbed.start()
return "%d|%s" % (OK, "")
def stop(self, params):
- time = params[1]
- self._testbed.stop(time)
+ self._testbed.stop()
return "%d|%s" % (OK, "")
def shutdown(self, params):
self._controller.shutdown()
return "%d|%s" % (OK, "")
-class TestbedIntanceProxy(object):
+class TestbedInstanceProxy(object):
def __init__(self, root_dir, log_level, testbed_id = None,
testbed_version = None, launch = True, host = None,
port = None, user = None, agent = None):
def start(self, time = TIME_NOW):
msg = testbed_messages[START]
- msg = msg % (time)
self._client.send_msg(msg)
reply = self._client.read_reply()
result = reply.split("|")
def stop(self, time = TIME_NOW):
msg = testbed_messages[STOP]
- msg = msg % (time)
self._client.send_msg(msg)
reply = self._client.read_reply()
result = reply.split("|")
@test_util.skipUnless(test_util.ns3_usable(),
"Test requires working ns-3 bindings")
- def ptest_run_ping_if(self):
+ def test_run_ping_if(self):
testbed_version = "3_9_RC3"
instance = ns3.TestbedInstance(testbed_version)
instance.configure("homeDirectory", self.root_dir)
instance.start()
while instance.status(17) != STATUS_FINISHED:
time.sleep(0.1)
- comp_result = "- 9.021 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 9 protocol 1 offset 0 flags [none] length: 84 10.0.0.2 > 10.0.0.1) ns3::Icmpv4Header (type=0, code=0) ns3::Icmpv4Echo (identifier=0, sequence=9)"
ping_result = instance.trace(14, "P2PAsciiTrace")
- self.assertNotEqual(ping_result.find(comp_result), -1)
- instance.stop()
- instance.shutdown()
-
- @test_util.skipUnless(test_util.ns3_usable(),
- "Test requires working ns-3 bindings")
- def test_run_ping_routing(self):
- testbed_version = "3_9_RC3"
- instance = ns3.TestbedInstance(testbed_version)
- instance.configure("homeDirectory", self.root_dir)
- instance.create(2, "ns3::Node")
- instance.create(3, "ns3::Ipv4L3Protocol")
- instance.create(4, "ns3::ArpL3Protocol")
- instance.create(5, "ns3::Icmpv4L4Protocol")
- instance.create(6, "ns3::UdpL4Protocol")
- instance.connect(2, "protos", 3, "node")
- instance.connect(2, "protos", 4, "node")
- instance.connect(2, "protos", 5, "node")
- instance.connect(2, "protos", 6, "node")
- instance.create(7, "ns3::PointToPointNetDevice")
- instance.create(8, "ns3::DropTailQueue")
- instance.connect(2, "devs", 7, "node")
- instance.connect(7, "queue", 8, "dev")
- instance.add_trace(7, "P2PAsciiTrace")
- instance.add_address(7, "10.0.0.1", 24, None)
-
- instance.create(9, "ns3::Node")
- instance.create(10, "ns3::Ipv4L3Protocol")
- instance.create(11, "ns3::ArpL3Protocol")
- instance.create(12, "ns3::Icmpv4L4Protocol")
- instance.create(13, "ns3::UdpL4Protocol")
- instance.connect(9, "protos", 10, "node")
- instance.connect(9, "protos", 11, "node")
- instance.connect(9, "protos", 12, "node")
- instance.connect(9, "protos", 13, "node")
- instance.create(14, "ns3::PointToPointNetDevice")
- instance.create(15, "ns3::DropTailQueue")
- instance.connect(9, "devs", 14, "node")
- instance.connect(14, "queue", 15, "dev")
- instance.add_trace(14, "P2PAsciiTrace")
- instance.add_address(14, "10.0.0.2", 24, None)
-
- instance.create(16, "ns3::PointToPointChannel")
- instance.connect(7, "chan", 16, "dev2")
- instance.connect(14, "chan", 16, "dev2")
-
- instance.create(17, "ns3::PointToPointNetDevice")
- instance.create(18, "ns3::DropTailQueue")
- instance.connect(9, "devs", 17, "node")
- instance.connect(17, "queue", 18, "dev")
- instance.add_trace(17, "P2PAsciiTrace")
- instance.add_address(17, "10.0.1.1", 24, None)
-
- instance.create(19, "ns3::Node")
- instance.create(20, "ns3::Ipv4L3Protocol")
- instance.create(21, "ns3::ArpL3Protocol")
- instance.create(22, "ns3::Icmpv4L4Protocol")
- instance.create(23, "ns3::UdpL4Protocol")
- instance.connect(19, "protos", 20, "node")
- instance.connect(19, "protos", 21, "node")
- instance.connect(19, "protos", 22, "node")
- instance.connect(19, "protos", 23, "node")
- instance.create(24, "ns3::PointToPointNetDevice")
- instance.create(25, "ns3::DropTailQueue")
- instance.connect(19, "devs", 24, "node")
- instance.connect(24, "queue", 25, "dev")
- instance.add_trace(24, "P2PAsciiTrace")
- instance.add_address(24, "10.0.1.2", 24, None)
-
- instance.create(26, "ns3::PointToPointChannel")
- instance.connect(17, "chan", 26, "dev2")
- instance.connect(24, "chan", 26, "dev2")
-
- instance.create(27, "ns3::V4Ping")
- instance.create_set(27, "Remote", "10.0.1.2")
- instance.create_set(27, "StartTime", "0s")
- instance.create_set(27, "StopTime", "10s")
- instance.connect(27, "node", 2, "apps")
-
- instance.add_route(2, "10.0.1.0", 24, "10.0.0.2")
- instance.add_route(19, "10.0.0.0", 24, "10.0.1.1")
-
- instance.do_setup()
- instance.do_create()
- instance.do_connect()
- instance.do_configure()
- instance.start()
- while instance.status(27) != STATUS_FINISHED:
- time.sleep(0.1)
- comp_result = "- 9.04199 /NodeList/2/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 9 protocol 1 offset 0 flags [none] length: 84 10.0.1.2 > 10.0.0.1) ns3::Icmpv4Header (type=0, code=0) ns3::Icmpv4Echo (identifier=0, sequence=9)"
- ping_result = instance.trace(24, "P2PAsciiTrace")
+ comp_result = "- 9.021 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 9 protocol 1 offset 0 flags [none] length: 84 10.0.0.2 > 10.0.0.1) ns3::Icmpv4Header (type=0, code=0) ns3::Icmpv4Echo (identifier=0, sequence=9)"
self.assertNotEqual(ping_result.find(comp_result), -1)
instance.stop()
instance.shutdown()
--- /dev/null
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from nepi.util.constants import STATUS_FINISHED
+from nepi.testbeds import ns3
+import os
+import shutil
+import tempfile
+import test_util
+import time
+import unittest
+
+# The reason execute tests are run in separate scripts for ns3, is that the
+# same ns3 Simulator will be loaded only once per process, resulting in a
+# dirty state of the Simulator after the first test is executed.
+# As it is not possible to reset the state of the Simulator to the original
+# one, different tests should be executed in different processes (different
+# unittest instance)
+class Ns3ExecuteTestCase(unittest.TestCase):
+ def setUp(self):
+ self.root_dir = tempfile.mkdtemp()
+
+ @test_util.skipUnless(test_util.ns3_usable(),
+ "Test requires working ns-3 bindings")
+ def test_run_ping_routing(self):
+ testbed_version = "3_9_RC3"
+ instance = ns3.TestbedInstance(testbed_version)
+ instance.configure("homeDirectory", self.root_dir)
+ instance.create(2, "ns3::Node")
+ instance.create(3, "ns3::Ipv4L3Protocol")
+ instance.create(4, "ns3::ArpL3Protocol")
+ instance.create(5, "ns3::Icmpv4L4Protocol")
+ instance.create(6, "ns3::UdpL4Protocol")
+ instance.connect(2, "protos", 3, "node")
+ instance.connect(2, "protos", 4, "node")
+ instance.connect(2, "protos", 5, "node")
+ instance.connect(2, "protos", 6, "node")
+ instance.create(7, "ns3::PointToPointNetDevice")
+ instance.create(8, "ns3::DropTailQueue")
+ instance.connect(2, "devs", 7, "node")
+ instance.connect(7, "queue", 8, "dev")
+ instance.add_trace(7, "P2PAsciiTrace")
+ instance.add_address(7, "10.0.0.1", 24, None)
+
+ instance.create(9, "ns3::Node")
+ instance.create(10, "ns3::Ipv4L3Protocol")
+ instance.create(11, "ns3::ArpL3Protocol")
+ instance.create(12, "ns3::Icmpv4L4Protocol")
+ instance.create(13, "ns3::UdpL4Protocol")
+ instance.connect(9, "protos", 10, "node")
+ instance.connect(9, "protos", 11, "node")
+ instance.connect(9, "protos", 12, "node")
+ instance.connect(9, "protos", 13, "node")
+ instance.create(14, "ns3::PointToPointNetDevice")
+ instance.create(15, "ns3::DropTailQueue")
+ instance.connect(9, "devs", 14, "node")
+ instance.connect(14, "queue", 15, "dev")
+ instance.add_trace(14, "P2PAsciiTrace")
+ instance.add_address(14, "10.0.0.2", 24, None)
+
+ instance.create(16, "ns3::PointToPointChannel")
+ instance.connect(7, "chan", 16, "dev2")
+ instance.connect(14, "chan", 16, "dev2")
+
+ instance.create(17, "ns3::PointToPointNetDevice")
+ instance.create(18, "ns3::DropTailQueue")
+ instance.connect(9, "devs", 17, "node")
+ instance.connect(17, "queue", 18, "dev")
+ instance.add_trace(17, "P2PAsciiTrace")
+ instance.add_address(17, "10.0.1.1", 24, None)
+
+ instance.create(19, "ns3::Node")
+ instance.create(20, "ns3::Ipv4L3Protocol")
+ instance.create(21, "ns3::ArpL3Protocol")
+ instance.create(22, "ns3::Icmpv4L4Protocol")
+ instance.create(23, "ns3::UdpL4Protocol")
+ instance.connect(19, "protos", 20, "node")
+ instance.connect(19, "protos", 21, "node")
+ instance.connect(19, "protos", 22, "node")
+ instance.connect(19, "protos", 23, "node")
+ instance.create(24, "ns3::PointToPointNetDevice")
+ instance.create(25, "ns3::DropTailQueue")
+ instance.connect(19, "devs", 24, "node")
+ instance.connect(24, "queue", 25, "dev")
+ instance.add_trace(24, "P2PAsciiTrace")
+ instance.add_address(24, "10.0.1.2", 24, None)
+
+ instance.create(26, "ns3::PointToPointChannel")
+ instance.connect(17, "chan", 26, "dev2")
+ instance.connect(24, "chan", 26, "dev2")
+
+ instance.create(27, "ns3::V4Ping")
+ instance.create_set(27, "Remote", "10.0.1.2")
+ instance.create_set(27, "StartTime", "0s")
+ instance.create_set(27, "StopTime", "10s")
+ instance.connect(27, "node", 2, "apps")
+
+ instance.add_route(2, "10.0.1.0", 24, "10.0.0.2")
+ instance.add_route(19, "10.0.0.0", 24, "10.0.1.1")
+
+ instance.do_setup()
+ instance.do_create()
+ instance.do_connect()
+ instance.do_configure()
+ instance.start()
+ while instance.status(27) != STATUS_FINISHED:
+ time.sleep(0.1)
+ ping_result = instance.trace(24, "P2PAsciiTrace")
+ comp_result = "- 9.04199 /NodeList/2/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 9 protocol 1 offset 0 flags [none] length: 84 10.0.1.2 > 10.0.0.1) ns3::Icmpv4Header (type=0, code=0) ns3::Icmpv4Echo (identifier=0, sequence=9)"
+ self.assertNotEqual(ping_result.find(comp_result), -1)
+ instance.stop()
+ instance.shutdown()
+
+ def tearDown(self):
+ shutil.rmtree(self.root_dir)
+
+if __name__ == '__main__':
+ unittest.main()
+
--- /dev/null
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import getpass
+from nepi.core.design import ExperimentDescription, FactoriesProvider
+from nepi.core.execute import ExperimentController
+from nepi.util import proxy
+import os
+import shutil
+import tempfile
+import test_util
+import time
+import unittest
+
+class Ns3IntegrationTestCase(unittest.TestCase):
+ def setUp(self):
+ self.root_dir = tempfile.mkdtemp()
+
+ @test_util.skipUnless(test_util.ns3_usable(),
+ "Test requires working ns-3 bindings")
+ def test_local_if(self):
+ exp_desc = ExperimentDescription()
+ testbed_version = "3_9_RC3"
+ testbed_id = "ns3"
+ ns3_provider = FactoriesProvider(testbed_id, testbed_version)
+ ns3_desc = exp_desc.add_testbed_description(ns3_provider)
+ ns3_desc.set_attribute_value("homeDirectory", self.root_dir)
+
+ node1 = ns3_desc.create("ns3::Node")
+ ipv41 = ns3_desc.create("ns3::Ipv4L3Protocol")
+ arp1 = ns3_desc.create("ns3::ArpL3Protocol")
+ icmp1 = ns3_desc.create("ns3::Icmpv4L4Protocol")
+ node1.connector("protos").connect(ipv41.connector("node"))
+ node1.connector("protos").connect(arp1.connector("node"))
+ node1.connector("protos").connect(icmp1.connector("node"))
+ iface1 = ns3_desc.create("ns3::PointToPointNetDevice")
+ queue1 = ns3_desc.create("ns3::DropTailQueue")
+ node1.connector("devs").connect(iface1.connector("node"))
+ iface1.connector("queue").connect(queue1.connector("dev"))
+ trace1 = iface1.enable_trace("P2PAsciiTrace")
+ ip1 = iface1.add_address()
+ ip1.set_attribute_value("Address", "10.0.0.1")
+
+ node2 = ns3_desc.create("ns3::Node")
+ ipv42 = ns3_desc.create("ns3::Ipv4L3Protocol")
+ arp2 = ns3_desc.create("ns3::ArpL3Protocol")
+ icmp2 = ns3_desc.create("ns3::Icmpv4L4Protocol")
+ node2.connector("protos").connect(ipv42.connector("node"))
+ node2.connector("protos").connect(arp2.connector("node"))
+ node2.connector("protos").connect(icmp2.connector("node"))
+ iface2 = ns3_desc.create("ns3::PointToPointNetDevice")
+ queue2 = ns3_desc.create("ns3::DropTailQueue")
+ node2.connector("devs").connect(iface2.connector("node"))
+ iface2.connector("queue").connect(queue2.connector("dev"))
+ trace2 = iface2.enable_trace("P2PAsciiTrace")
+ ip2 = iface2.add_address()
+ ip2.set_attribute_value("Address", "10.0.0.2")
+
+ chan = ns3_desc.create("ns3::PointToPointChannel")
+ iface1.connector("chan").connect(chan.connector("dev2"))
+ iface2.connector("chan").connect(chan.connector("dev2"))
+
+ app = ns3_desc.create("ns3::V4Ping")
+ app.set_attribute_value("Remote", "10.0.0.2")
+ app.set_attribute_value("StartTime", "0s")
+ app.set_attribute_value("StopTime", "20s")
+ app.connector("node").connect(node1.connector("apps"))
+
+ xml = exp_desc.to_xml()
+ controller = ExperimentController(xml)
+ controller.start()
+ while not controller.is_finished(app.guid):
+ time.sleep(0.5)
+ ping_result = controller.trace(ns3_desc.guid, iface2.guid, "P2PAsciiTrace")
+ comp_result = "- 19.021 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 19 protocol 1 offset 0 flags [none] length: 84 10.0.0.2 > 10.0.0.1) ns3::Icmpv4Header (type=0, code=0) ns3::Icmpv4Echo (identifier=0, sequence=19)"
+ self.assertNotEqual(ping_result.find(comp_result), -1)
+ controller.stop()
+ controller.shutdown()
+
+ @test_util.skipUnless(test_util.ns3_usable(),
+ "Test requires working ns-3 bindings")
+ def test_all_daemonized_if(self):
+ exp_desc = ExperimentDescription()
+ testbed_version = "3_9_RC3"
+ testbed_id = "ns3"
+ ns3_provider = FactoriesProvider(testbed_id, testbed_version)
+ ns3_desc = exp_desc.add_testbed_description(ns3_provider)
+ ns3_desc.set_attribute_value("homeDirectory", self.root_dir)
+
+ node1 = ns3_desc.create("ns3::Node")
+ ipv41 = ns3_desc.create("ns3::Ipv4L3Protocol")
+ arp1 = ns3_desc.create("ns3::ArpL3Protocol")
+ icmp1 = ns3_desc.create("ns3::Icmpv4L4Protocol")
+ node1.connector("protos").connect(ipv41.connector("node"))
+ node1.connector("protos").connect(arp1.connector("node"))
+ node1.connector("protos").connect(icmp1.connector("node"))
+ iface1 = ns3_desc.create("ns3::PointToPointNetDevice")
+ queue1 = ns3_desc.create("ns3::DropTailQueue")
+ node1.connector("devs").connect(iface1.connector("node"))
+ iface1.connector("queue").connect(queue1.connector("dev"))
+ trace1 = iface1.enable_trace("P2PAsciiTrace")
+ ip1 = iface1.add_address()
+ ip1.set_attribute_value("Address", "10.0.0.1")
+
+ node2 = ns3_desc.create("ns3::Node")
+ ipv42 = ns3_desc.create("ns3::Ipv4L3Protocol")
+ arp2 = ns3_desc.create("ns3::ArpL3Protocol")
+ icmp2 = ns3_desc.create("ns3::Icmpv4L4Protocol")
+ node2.connector("protos").connect(ipv42.connector("node"))
+ node2.connector("protos").connect(arp2.connector("node"))
+ node2.connector("protos").connect(icmp2.connector("node"))
+ iface2 = ns3_desc.create("ns3::PointToPointNetDevice")
+ queue2 = ns3_desc.create("ns3::DropTailQueue")
+ node2.connector("devs").connect(iface2.connector("node"))
+ iface2.connector("queue").connect(queue2.connector("dev"))
+ trace2 = iface2.enable_trace("P2PAsciiTrace")
+ ip2 = iface2.add_address()
+ ip2.set_attribute_value("Address", "10.0.0.2")
+
+ chan = ns3_desc.create("ns3::PointToPointChannel")
+ iface1.connector("chan").connect(chan.connector("dev2"))
+ iface2.connector("chan").connect(chan.connector("dev2"))
+
+ app = ns3_desc.create("ns3::V4Ping")
+ app.set_attribute_value("Remote", "10.0.0.2")
+ app.set_attribute_value("StartTime", "0s")
+ app.set_attribute_value("StopTime", "20s")
+ app.connector("node").connect(node1.connector("apps"))
+
+ xml = exp_desc.to_xml()
+ access_config = proxy.AccessConfiguration()
+ access_config.set_attribute_value("mode",
+ proxy.AccessConfiguration.MODE_DAEMON)
+ access_config.set_attribute_value("rootDirectory", self.root_dir)
+ access_config.set_attribute_value("logLevel",
+ proxy.AccessConfiguration.DEBUG_LEVEL)
+ controller = proxy.create_controller(xml, access_config)
+
+ access_config2 = proxy.AccessConfiguration()
+ access_config2.set_attribute_value("mode",
+ proxy.AccessConfiguration.MODE_DAEMON)
+ inst_root_dir = os.path.join(self.root_dir, "instance")
+ os.mkdir(inst_root_dir)
+ access_config2.set_attribute_value("rootDirectory", inst_root_dir)
+ access_config2.set_attribute_value("logLevel",
+ proxy.AccessConfiguration.DEBUG_LEVEL)
+ controller.set_access_configuration(ns3_desc.guid, access_config2)
+
+ controller.start()
+ while not controller.is_finished(app.guid):
+ time.sleep(0.5)
+
+ ping_result = controller.trace(ns3_desc.guid, iface2.guid, "P2PAsciiTrace")
+ comp_result = "- 19.021 /NodeList/1/DeviceList/0/$ns3::PointToPointNetDevice/TxQueue/Dequeue ns3::PppHeader (Point-to-Point Protocol: IP (0x0021)) ns3::Ipv4Header (tos 0x0 ttl 64 id 19 protocol 1 offset 0 flags [none] length: 84 10.0.0.2 > 10.0.0.1) ns3::Icmpv4Header (type=0, code=0) ns3::Icmpv4Echo (identifier=0, sequence=19)"
+ self.assertNotEqual(ping_result.find(comp_result), -1)
+ controller.stop()
+ controller.shutdown()
+
+ def tearDown(self):
+ shutil.rmtree(self.root_dir)
+
+if __name__ == '__main__':
+ unittest.main()
+