def trace(self, guid, trace_id, attribute='value'):
raise NotImplementedError
+ def traces_info(self):
+ """ dictionary of dictionaries:
+ traces_info = dict({
+ guid = dict({
+ trace_id = dict({
+ host = host,
+ filepath = filepath,
+ filesize = size in bytes,
+ })
+ })
+ })"""
+ raise NotImplementedError
+
def shutdown(self):
raise NotImplementedError
return testbed.trace(guid, trace_id, attribute)
raise RuntimeError("No element exists with guid %d" % guid)
+ def traces_info(self):
+ traces_info = dict()
+ for guid, testbed in self._testbeds.iteritems():
+ traces_info[guid] = testbed.traces_info()
+ return traces_info
+
@staticmethod
def _parallel(callables):
excs = []
def trace(self, guid, trace_id, attribute='value'):
if attribute == 'value':
- fd = open("%s" % self.trace_filename(guid, trace_id), "r")
+ fd = open("%s" % self.trace_filepath(guid, trace_id), "r")
content = fd.read()
fd.close()
elif attribute == 'path':
- content = self.trace_filename(guid, trace_id)
+ content = self.trace_filepath(guid, trace_id)
+ elif attribute == 'size':
+ content = str(self.traces_filesize(guid, trace_id))
else:
content = None
return content
- def trace_filename(self, guid, trace_id):
+ def traces_info(self):
+ traces_info = dict()
+ host = self._attributes.get_attribute_value("deployment_host")
+ for guid, trace_list in self._add_trace.iteritems():
+ traces_info[guid] = dict()
+ for trace_id in trace_list:
+ traces_info[guid][trace_id] = dict()
+ filepath = self.trace(guid, trace_id, attribute = "path")
+ # TODO: Filesize!
+ # filesize = self.trace(guid, trace_id)
+ filesize = -1
+ traces_info[guid][trace_id]["host"] = host
+ traces_info[guid][trace_id]["filepath"] = filepath
+ traces_info[guid][trace_id]["filesize"] = str(filesize)
+ return traces_info
+
+ def trace_filepath(self, guid, trace_id):
"""
Return a trace's file path, for TestbedController's default
implementation of trace()
"""
raise NotImplementedError
+ def trace_filesize(self, guid, trace_id):
+ """
+ Return a trace's filesize in bytes
+ """
+ raise NotImplementedError
+
#shutdown: NotImplementedError
def get_connected(self, guid, connector_type_name,
element.destroy()
self._elements.clear()
- def trace_filename(self, guid, trace_id, filename = None):
+ def trace_filepath(self, guid, trace_id, filename = None):
if not filename:
(trace, filename) = self._traces[guid][trace_id]
return os.path.join(self.home_directory, filename)
FDNETDEV = "ns3::FileDescriptorNetDevice"
def _follow_trace(testbed_instance, guid, trace_id, filename):
- filepath = testbed_instance.trace_filename(guid, trace_id, filename)
+ filepath = testbed_instance.trace_filepath(guid, trace_id, filename)
trace = open(filepath, "wb")
testbed_instance.follow_trace(guid, trace_id, trace, filename)
return trace
filename = "%d-pcap.stderr" % guid
stderr = _follow_trace(testbed_instance, guid, "pcap_stderr", filename)
filename = "%d-node.pcap" % guid
- filepath = testbed_instance.trace_filename(guid, trace_id, filename)
+ filepath = testbed_instance.trace_filenpath(guid, trace_id, filename)
command = "tcpdump -i 'any' -w %s" % filepath
user = "root"
trace = node.Popen(command, shell = True, stdout = stdout,
def action(self, time, guid, action):
raise NotImplementedError
- def trace_filename(self, guid, trace_id):
+ def trace_filepath(self, guid, trace_id):
filename = self._traces[guid][trace_id]
return os.path.join(self.home_directory, filename)
interface_number += 1
return interface_number
+def _follow_trace(testbed_instance, guid, trace_id, filename):
+ testbed_instance.follow_trace(guid, trace_id, filename)
+ filepath = testbed_instance.trace_filepath(guid, trace_id)
+ return filepath
+
### create traces functions ###
def p2pascii_trace(testbed_instance, guid, trace_id):
interface_number = _get_dev_number(testbed_instance, guid)
element = testbed_instance._elements[guid]
filename = "trace-p2p-node-%d-dev-%d.tr" % (node_guid, interface_number)
- testbed_instance.follow_trace(guid, trace_id, filename)
- filepath = testbed_instance.trace_filename(guid, trace_id)
+ filepath = _follow_trace(testbed_instance, guid, trace_id, filename)
helper = testbed_instance.ns3.PointToPointHelper()
asciiHelper = testbed_instance.ns3.AsciiTraceHelper()
stream = asciiHelper.CreateFileStream(filepath)
interface_number = _get_dev_number(testbed_instance, guid)
element = testbed_instance._elements[guid]
filename = "trace-p2p-node-%d-dev-%d.pcap" % (node_guid, interface_number)
- testbed_instance.follow_trace(guid, trace_id, filename)
- filepath = testbed_instance.trace_filename(guid, trace_id)
+ filepath = _follow_trace(testbed_instance, guid, trace_id, filename)
helper = testbed_instance.ns3.PointToPointHelper()
helper.EnablePcap(filepath, element, explicitFilename = True)
interface_number = _get_dev_number(testbed_instance, guid)
element = testbed_instance._elements[guid]
filename = "trace-csma-node-%d-dev-%d.pcap" % (node_guid, interface_number)
- testbed_instance.follow_trace(guid, trace_id, filename)
- filepath = testbed_instance.trace_filename(guid, trace_id)
+ filepath = _follow_trace(testbed_instance, guid, trace_id, filename)
helper = testbed_instance.ns3.CsmaHelper()
helper.EnablePcap(filepath, element, promiscuous = promisc,
explicitFilename = True)
interface_number = _get_dev_number(testbed_instance, guid)
element = testbed_instance._elements[guid]
filename = "trace-fd-node-%d-dev-%d.pcap" % (node_guid, interface_number)
- testbed_instance.follow_trace(guid, trace_id, filename)
- filepath = testbed_instance.trace_filename(guid, trace_id)
+ filepath = _follow_trace(testbed_instance, guid, trace_id, filename)
helper = testbed_instance.ns3.FileDescriptorHelper()
helper.EnablePcap(filepath, element, explicitFilename = True)
interface_number = _get_dev_number(testbed_instance, dev_guid)
element = testbed_instance._elements[dev_guid]
filename = "trace-yanswifi-node-%d-dev-%d.pcap" % (node_guid, interface_number)
- testbed_instance.follow_trace(guid, trace_id, filename)
- filepath = testbed_instance.trace_filename(guid, trace_id)
+ filepath = _follow_trace(testbed_instance, guid, trace_id, filename)
helper = testbed_instance.ns3.YansWifiPhyHelper()
helper.EnablePcap(filepath, element, explicitFilename = True)
interface_number = _get_dev_number(testbed_instance, guid)
element = testbed_instance._elements[guid]
filename = "trace-wimax-node-%d-dev-%d.tr" % (node_guid, interface_number)
- testbed_instance.follow_trace(guid, trace_id, filename)
- filepath = testbed_instance.trace_filename(guid, trace_id)
+ filepath = _follow_trace(testbed_instance, guid, trace_id, filename)
helper = testbed_instance.ns3.WimaxHelper()
asciiHelper = testbed_instance.ns3.AsciiTraceHelper()
stream = asciiHelper.CreateFileStream (filepath)
interface_number = _get_dev_number(testbed_instance, guid)
element = testbed_instance._elements[guid]
filename = "trace-wimax-node-%d-dev-%d.pcap" % (node_guid, interface_number)
- testbed_instance.follow_trace(guid, trace_id, filename)
- filepath = testbed_instance.trace_filename(guid, trace_id)
+ filepath = _follow_trace(testbed_instance, guid, trace_id, filename)
helper = testbed_instance.ns3.WimaxHelper()
helper.EnablePcap(filepath, element, explicitFilename = True)
helper = testbed_instance.ns3.PlotHelper()
prefix = "trace-app-%d" % (guid, )
filename = helper.GetFilenameFromSource(prefix, element, trace_id)
- testbed_instance.follow_trace(guid, trace_id, filename)
- filepath = testbed_instance.trace_filename(guid, trace_id)
+ filepath = _follow_trace(testbed_instance, guid, trace_id, filename)
prefix = filepath[:filepath.find(prefix)+len(prefix)]
helper.EnableTrace(element, trace_id, prefix, "T")
content = None
elif attribute == 'path':
content = app.remote_trace_path(trace_id)
+ elif attribute == 'size':
+ # TODO
+ raise NotImplementedError
else:
content = None
return content
GET_FACTORY_ID = 38
GET_TESTBED_ID = 39
GET_TESTBED_VERSION = 40
+TRACES_INFO = 41
instruction_text = dict({
OK: "OK",
GUIDS: "GUIDS",
TESTBED_ID: "TESTBED_ID",
TESTBED_VERSION: "TESTBED_VERSION",
+ TRACES_INFO: "TRACES_INFO",
})
def log_msg(server, params):
def __init__(self, path):
self.path = path
-def create_controller(xml, access_config = None):
+def create_experiment_controller(xml, access_config = None):
mode = None if not access_config \
else access_config.get_attribute_value(DC.DEPLOYMENT_MODE)
launch = True if not access_config \
def trace(self, guid, trace_id, attribute):
return self._testbed.trace(guid, trace_id, attribute)
+ @Marshalling.handles(TRACES_INFO)
+ @Marshalling.args()
+ @Marshalling.retval( Marshalling.pickled_data )
+ def traces_info(self):
+ return self._testbed.traces_info()
+
@Marshalling.handles(START)
@Marshalling.args()
@Marshalling.retvoid
def __init__(self, root_dir, log_level, experiment_xml):
super(ExperimentControllerServer, self).__init__(root_dir, log_level)
self._experiment_xml = experiment_xml
- self._controller = None
+ self._experiment = None
def post_daemonize(self):
from nepi.core.execute import ExperimentController
- self._controller = ExperimentController(self._experiment_xml,
+ self._experiment = ExperimentController(self._experiment_xml,
root_dir = self._root_dir)
@Marshalling.handles(GUIDS)
@Marshalling.args()
@Marshalling.retval( Marshalling.pickled_data )
def guids(self):
- return self._controller.guids
+ return self._experiment.guids
@Marshalling.handles(XML)
@Marshalling.args()
@Marshalling.retval()
def experiment_xml(self):
- return self._controller.experiment_xml
+ return self._experiment.experiment_xml
@Marshalling.handles(TRACE)
@Marshalling.args(int, str, Marshalling.base64_data)
@Marshalling.retval()
def trace(self, guid, trace_id, attribute):
- return str(self._controller.trace(guid, trace_id, attribute))
+ return str(self._experiment.trace(guid, trace_id, attribute))
+
+ @Marshalling.handles(TRACES_INFO)
+ @Marshalling.args()
+ @Marshalling.retval( Marshalling.pickled_data )
+ def traces_info(self):
+ return self._experiment.traces_info()
@Marshalling.handles(FINISHED)
@Marshalling.args(int)
@Marshalling.retval(Marshalling.bool)
def is_finished(self, guid):
- return self._controller.is_finished(guid)
+ return self._experiment.is_finished(guid)
@Marshalling.handles(GET)
@Marshalling.args(int, Marshalling.base64_data, str)
@Marshalling.retval( Marshalling.pickled_data )
def get(self, guid, name, time):
- return self._controller.get(guid, name, time)
+ return self._experiment.get(guid, name, time)
@Marshalling.handles(SET)
@Marshalling.args(int, Marshalling.base64_data, Marshalling.pickled_data, str)
@Marshalling.retvoid
def set(self, guid, name, value, time):
- self._controller.set(guid, name, value, time)
+ self._experiment.set(guid, name, value, time)
@Marshalling.handles(START)
@Marshalling.args()
@Marshalling.retvoid
def start(self):
- self._controller.start()
+ self._experiment.start()
@Marshalling.handles(STOP)
@Marshalling.args()
@Marshalling.retvoid
def stop(self):
- self._controller.stop()
+ self._experiment.stop()
@Marshalling.handles(RECOVER)
@Marshalling.args()
@Marshalling.retvoid
def recover(self):
- self._controller.recover()
+ self._experiment.recover()
@Marshalling.handles(SHUTDOWN)
@Marshalling.args()
@Marshalling.retvoid
def shutdown(self):
- self._controller.shutdown()
+ self._experiment.shutdown()
@Marshalling.handles(GET_TESTBED_ID)
@Marshalling.args(int)
@Marshalling.retval()
def get_testbed_id(self, guid):
- return self._controller.get_testbed_id(guid)
+ return self._experiment.get_testbed_id(guid)
@Marshalling.handles(GET_FACTORY_ID)
@Marshalling.args(int)
@Marshalling.retval()
def get_factory_id(self, guid):
- return self._controller.get_factory_id(guid)
+ return self._experiment.get_factory_id(guid)
@Marshalling.handles(GET_TESTBED_VERSION)
@Marshalling.args(int)
@Marshalling.retval()
def get_testbed_version(self, guid):
- return self._controller.get_testbed_version(guid)
+ return self._experiment.get_testbed_version(guid)
class BaseProxy(object):
_ServerClass = None
--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
"""
-
self.assertTrue(app_result.startswith(comp_result))
+ traces_info = instance.traces_info()
+ expected_traces_info = dict({
+ 7 : dict({
+ 'fake': dict({
+ 'host': 'localhost',
+ 'filesize': '-1',
+ 'filepath': '<test>'
+ })
+ })
+ })
+ self.assertEquals(traces_info, expected_traces_info)
+
instance.stop()
instance.shutdown()
self.make_cross_test_experiment()
xml = exp_desc.to_xml()
access_config = None
- controller = proxy.create_controller(xml, access_config)
+ controller = proxy.create_experiment_controller(xml, access_config)
controller.start()
cross1 = controller.get(iface12.guid, "cross")
exp_desc, desc, app, node1, node2, iface1, iface2 = self.make_test_experiment()
xml = exp_desc.to_xml()
access_config = None
- controller = proxy.create_controller(xml, access_config)
+ controller = proxy.create_experiment_controller(xml, access_config)
controller.start()
while not controller.is_finished(app.guid):
access_config = proxy.AccessConfiguration()
access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
- controller = proxy.create_controller(xml, access_config)
+ controller = proxy.create_experiment_controller(xml, access_config)
controller.start()
while not controller.is_finished(app.guid):
xml = exp_desc.to_xml()
- controller = proxy.create_controller(xml, access_config = None)
+ controller = proxy.create_experiment_controller(xml, access_config = None)
controller.start()
while not controller.is_finished(app.guid):
access_config = proxy.AccessConfiguration()
access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
- controller = proxy.create_controller(xml, access_config)
+ controller = proxy.create_experiment_controller(xml, access_config)
controller.start()
while not controller.is_finished(app.guid):
self.assertEquals(controller.get_testbed_version(node1.guid), "01")
self.assertEquals(controller.get_factory_id(node1.guid), "Node")
+ traces_info = controller.traces_info()
+ expected_traces_info = dict({
+ 1: dict({ # testbed guid
+ 6: dict({ # element guid
+ 'fake': dict({ # trace_id
+ 'host': 'localhost',
+ 'filesize': '-1',
+ 'filepath': '<test>'
+ })
+ })
+ })
+ })
+ self.assertEquals(traces_info, expected_traces_info)
+
controller.stop()
controller.shutdown()
access_config = proxy.AccessConfiguration()
access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
- controller = proxy.create_controller(xml, access_config)
+ controller = proxy.create_experiment_controller(xml, access_config)
controller.start()
while not controller.is_finished(app.guid):
# recover
access_config.set_attribute_value(DC.RECOVER,True)
- controller = proxy.create_controller(xml, access_config)
+ controller = proxy.create_experiment_controller(xml, access_config)
# test recovery
self.assertTrue(controller.is_finished(app.guid))
xml = exp_desc.to_xml()
access_config = None
- controller = proxy.create_controller(xml, access_config)
+ controller = proxy.create_experiment_controller(xml, access_config)
controller.start()
while not controller.is_finished(app.guid):
time.sleep(0.5)
xml = exp_desc.to_xml()
access_config = None
- controller = proxy.create_controller(xml, access_config)
+ controller = proxy.create_experiment_controller(xml, access_config)
controller.start()
while not controller.is_finished(app.guid):
time.sleep(0.5)
access_config.set_attribute_value(DC.DEPLOYMENT_COMMUNICATION, DC.ACCESS_SSH)
access_config.set_attribute_value(DC.DEPLOYMENT_PORT, env.port)
access_config.set_attribute_value(DC.USE_AGENT, True)
- controller = proxy.create_controller(xml, access_config)
+ controller = proxy.create_experiment_controller(xml, access_config)
controller.start()
while not controller.is_finished(app.guid):
instance.shutdown()
@test_util.skipUnless(os.getuid() == 0, "Test requires root privileges")
- def test_node_pcap_trace(self):
+ def bug_test_node_pcap_trace(self):
user = getpass.getuser()
testbed_version = "01"
instance = netns.TestbedController(testbed_version)
instance.defer_create_set(6, "user", user)
instance.defer_connect(6, "node", 2, "apps")
- time.sleep(5)
instance.do_setup()
instance.do_create()
instance.do_connect_init()
instance.start()
while instance.status(6) != STATUS_FINISHED:
time.sleep(0.5)
- time.sleep(5)
pcap_result = instance.trace(2, "pcap")
self.assertEquals(len(pcap_result), 1024)
instance.stop()
access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
access_config.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
- controller = proxy.create_controller(xml, access_config)
+ controller = proxy.create_experiment_controller(xml, access_config)
controller.start()
while not controller.is_finished(app.guid):
access_config.set_attribute_value(DC.DEPLOYMENT_COMMUNICATION, DC.ACCESS_SSH)
access_config.set_attribute_value(DC.DEPLOYMENT_PORT, env.port)
access_config.set_attribute_value(DC.USE_AGENT, True)
- controller = proxy.create_controller(xml, access_config)
+ controller = proxy.create_experiment_controller(xml, access_config)
controller.start()
while not controller.is_finished(app.guid):
access_config.set_attribute_value(DC.DEPLOYMENT_MODE, DC.MODE_DAEMON)
access_config.set_attribute_value(DC.ROOT_DIRECTORY, self.root_dir)
access_config.set_attribute_value(DC.LOG_LEVEL, DC.DEBUG_LEVEL)
- controller = proxy.create_controller(xml, access_config)
+ controller = proxy.create_experiment_controller(xml, access_config)
controller.start()
while not controller.is_finished(app.guid):