From: Alina Quereilhac Date: Fri, 22 Apr 2011 16:46:08 +0000 (+0200) Subject: bug fixing and code clean up. X-Git-Tag: nepi_v2~124 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=09c514fa6f96e861ccc8010c8fd8c3f2818cc6db;p=nepi.git bug fixing and code clean up. in execute.py: replaced references to "testbed intance" for "testbed controller" and separeted long methods into smaller ones in proxy.py: replaced references to "testbed intance" for "testbed controller" in attributes.py: corrected typo in testbed/ns3/*metadata*: added missing wifi "Standard" attribute --- diff --git a/src/nepi/core/attributes.py b/src/nepi/core/attributes.py index 0f0b6fca..3dd3da4d 100644 --- a/src/nepi/core/attributes.py +++ b/src/nepi/core/attributes.py @@ -116,7 +116,7 @@ class Attribute(object): (value >= self.range[0] and value <= self.range[1]) def _is_in_allowed_values(self, value): - return not self.allowed or value in self._allowed + return not self._allowed or value in self._allowed def _is_valid(self, value): return not self._validation_function or \ diff --git a/src/nepi/core/execute.py b/src/nepi/core/execute.py index bc8df211..88707423 100644 --- a/src/nepi/core/execute.py +++ b/src/nepi/core/execute.py @@ -301,6 +301,7 @@ class ExperimentController(object): self._testbeds = dict() self._access_config = dict() self._netrefs = dict() + self._crossdata = dict() self._root_dir = root_dir self.persist_experiment_xml() @@ -330,7 +331,7 @@ class ExperimentController(object): thread.join() def start(self): - self._create_testbed_instances() + self._init_testbed_controllers() # persist testbed connection data, for potential recovery self._persist_testbed_proxies() @@ -425,7 +426,7 @@ class ExperimentController(object): self._load_testbed_proxies() # recreate testbed proxies by reconnecting only - self._create_testbed_instances(recover=True) + self._init_testbed_controllers(recover = True) def is_finished(self, guid): for testbed in self._testbeds.values(): @@ -497,31 +498,18 @@ class ExperimentController(object): if fail_if_undefined: raise ValueError, "Unresolvable GUID: %r, in netref: %r" % (ref_guid, expr) - def _create_testbed_instances(self, recover = False): + def _init_testbed_controllers(self, recover = False): parser = XmlExperimentParser() data = parser.from_xml_to_data(self._experiment_xml) element_guids = list() label_guids = dict() data_guids = data.guids - netrefs = self._netrefs + + # create testbed controllers for guid in data_guids: if data.is_testbed_data(guid): - (testbed_id, testbed_version) = data.get_testbed_data(guid) - access_config = None if guid not in self._access_config else\ - self._access_config[guid] - - if recover and access_config is None: - # need to create one - access_config = self._access_config[guid] = proxy.AccessConfiguration() - if access_config is not None: - # force recovery mode - access_config.set_attribute_value("recover",recover) - - testbed = proxy.create_testbed_instance(testbed_id, - testbed_version, access_config) - for (name, value) in data.get_attribute_data(guid): - testbed.defer_configure(name, value) - self._testbeds[guid] = testbed + self._create_testbed_controller(guid, data, element_guids, + recover) else: element_guids.append(guid) label = data.get_attribute_data(guid, "label") @@ -529,6 +517,16 @@ class ExperimentController(object): if label in label_guids: raise RuntimeError, "Label %r is not unique" % (label,) label_guids[label] = guid + + # replace references to elements labels for its guid + self._resolve_labels(data, data_guids, label_guids) + + # program testbed controllers + if not recover: + self._program_testbed_controllers(element_guids, data) + + def _resolve_labels(self, data, data_guids, label_guids): + netrefs = self._netrefs for guid in data_guids: if not data.is_testbed_data(guid): for name, value in data.get_attribute_data(guid): @@ -541,9 +539,9 @@ class ExperimentController(object): if ref_guid is not None: value = ATTRIBUTE_PATTERN_BASE.sub( ATTRIBUTE_PATTERN_GUID_SUB % dict( - guid='GUID-%d' % (ref_guid,), - expr=match.group("expr"), - label=label), + guid = 'GUID-%d' % (ref_guid,), + expr = match.group("expr"), + label = label), value) data.set_attribute_data(guid, name, value) @@ -552,11 +550,27 @@ class ExperimentController(object): # communication at configuration time # (which could require high-latency network I/O) (testbed_guid, factory_id) = data.get_box_data(guid) - netrefs.setdefault((testbed_guid,guid),set()).add(name) - if not recover: - self._program_testbed_instances(element_guids, data) + netrefs.setdefault((testbed_guid, guid), set()).add(name) + + def _create_testbed_controller(self, guid, data, element_guids, recover): + (testbed_id, testbed_version) = data.get_testbed_data(guid) + access_config = None if guid not in self._access_config else\ + self._access_config[guid] + + if recover and access_config is None: + # need to create one + access_config = self._access_config[guid] = proxy.AccessConfiguration() + if access_config is not None: + # force recovery mode + access_config.set_attribute_value("recover",recover) + + testbed = proxy.create_testbed_controller(testbed_id, + testbed_version, access_config) + for (name, value) in data.get_attribute_data(guid): + testbed.defer_configure(name, value) + self._testbeds[guid] = testbed - def _program_testbed_instances(self, element_guids, data): + def _program_testbed_controllers(self, element_guids, data): for guid in element_guids: (testbed_guid, factory_id) = data.get_box_data(guid) testbed = self._testbeds[testbed_guid] diff --git a/src/nepi/testbeds/ns3/attributes_metadata_v3_9_RC3.py b/src/nepi/testbeds/ns3/attributes_metadata_v3_9_RC3.py index ccea25d4..819d3348 100644 --- a/src/nepi/testbeds/ns3/attributes_metadata_v3_9_RC3.py +++ b/src/nepi/testbeds/ns3/attributes_metadata_v3_9_RC3.py @@ -1,5 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- + +from factories_metadata_v3_9_RC3 import wifi_standards import validation as ns3_validation from nepi.core.attributes import Attribute from nepi.util import validation @@ -514,7 +516,7 @@ attributes = dict({ "validation_function": validation.is_enum, "value": "RowFirst", "allowed": ["RowFirst", - "ColumnFirst"], + "ColumnFirst"], "type": Attribute.ENUM, "help": "The type of layout." }), @@ -2105,6 +2107,13 @@ attributes = dict({ "type": Attribute.DOUBLE, "help": "The speed (m/s)" }), + "RndSpeed": dict({ + "name": "Speed", + "validation_function": validation.is_string, + "value": "Uniform:1:2", + "type": Attribute.STRING, + "help": "Random variable to control the speed (m/s)." + }), "Port": dict({ "name": "Port", "validation_function": validation.is_integer, @@ -2376,4 +2385,12 @@ attributes = dict({ "type": Attribute.STRING, "help": "When this timeout expires, the RTS/CTS handshake has failed." }), + "Standard": dict({ + "name": "Standard", + "validation_function": validation.is_string, + "value": "WIFI_PHY_STANDARD_80211a", + "type": Attribute.ENUM, + "allowed": wifi_standards.keys(), + "help": "Wifi PHY standard" + }), }) diff --git a/src/nepi/testbeds/ns3/factories_metadata_v3_9_RC3.py b/src/nepi/testbeds/ns3/factories_metadata_v3_9_RC3.py index 45696cc9..6bb651aa 100644 --- a/src/nepi/testbeds/ns3/factories_metadata_v3_9_RC3.py +++ b/src/nepi/testbeds/ns3/factories_metadata_v3_9_RC3.py @@ -157,8 +157,8 @@ def create_wifi_standard_model(testbed_instance, guid): create_element(testbed_instance, guid) element = testbed_instance._elements[guid] parameters = testbed_instance._get_parameters(guid) - if "standard" in parameters: - standard = parameters["standard"] + if "Standard" in parameters: + standard = parameters["Standard"] if standard: elements.ConfigureStandard(wifi_standards[standard]) @@ -1194,7 +1194,8 @@ factories_info = dict({ "Slot", "Pifs", "MaxPropagationDelay", - "Ssid"], + "Ssid", + "Standard"], }), "ns3::UdpEchoClient": dict({ "category": "Application", @@ -1357,7 +1358,8 @@ factories_info = dict({ "Slot", "Pifs", "MaxPropagationDelay", - "Ssid"], + "Ssid", + "Standard"], }), "ns3::YansErrorRateModel": dict({ "category": "Error", @@ -1455,7 +1457,8 @@ factories_info = dict({ "TxPowerStart", "RxNoiseFigure", "ChannelSwitchDelay", - "ChannelNumber"], + "ChannelNumber", + "Standard"], "traces": ["yanswifipcap"] }), "ns3::WifiRadioEnergyModel": dict({ @@ -1784,7 +1787,7 @@ factories_info = dict({ "help": "", "connector_types": ["node"], "box_attributes": ["Bounds", - "Speed", + "RndSpeed", "Pause", "Position", "Velocity"], diff --git a/src/nepi/testbeds/ns3/metadata_v3_9_RC3.py b/src/nepi/testbeds/ns3/metadata_v3_9_RC3.py index fe864d7f..9d5cfabe 100644 --- a/src/nepi/testbeds/ns3/metadata_v3_9_RC3.py +++ b/src/nepi/testbeds/ns3/metadata_v3_9_RC3.py @@ -62,8 +62,8 @@ def connect_node_other(tesbed_instance, node, other): node.AggregateObject(other) def connect_fd_tap(tesbed_instance, fd, tap): + print "CONNNECT TAP!!!" # TODO! - pass ### Connector information ### diff --git a/src/nepi/util/proxy.py b/src/nepi/util/proxy.py index b075efa2..b0c045d2 100644 --- a/src/nepi/util/proxy.py +++ b/src/nepi/util/proxy.py @@ -290,7 +290,7 @@ def create_controller(xml, access_config = None): agent = agent, launch = launch) raise RuntimeError("Unsupported access configuration '%s'" % mode) -def create_testbed_instance(testbed_id, testbed_version, access_config): +def create_testbed_controller(testbed_id, testbed_version, access_config): mode = None if not access_config \ else access_config.get_attribute_value("mode") launch = True if not access_config \ @@ -298,7 +298,7 @@ def create_testbed_instance(testbed_id, testbed_version, access_config): if not mode or mode == AccessConfiguration.MODE_SINGLE_PROCESS: if not launch: raise ValueError, "Unsupported instantiation mode: %s with lanch=False" % (mode,) - return _build_testbed_instance(testbed_id, testbed_version) + return _build_testbed_controller(testbed_id, testbed_version) elif mode == AccessConfiguration.MODE_DAEMON: (root_dir, log_level, user, host, port, agent) = \ get_access_config_params(access_config) @@ -307,7 +307,7 @@ def create_testbed_instance(testbed_id, testbed_version, access_config): user = user, agent = agent, launch = launch) raise RuntimeError("Unsupported access configuration '%s'" % mode) -def _build_testbed_instance(testbed_id, testbed_version): +def _build_testbed_controller(testbed_id, testbed_version): mod_name = "nepi.testbeds.%s" % (testbed_id.lower()) if not mod_name in sys.modules: __import__(mod_name) @@ -322,7 +322,7 @@ class TestbedControllerServer(server.Server): self._testbed = None def post_daemonize(self): - self._testbed = _build_testbed_instance(self._testbed_id, + self._testbed = _build_testbed_controller(self._testbed_id, self._testbed_version) def reply_action(self, msg):