bug fixing and code clean up.
authorAlina Quereilhac <alina.quereilhac@inria.fr>
Fri, 22 Apr 2011 16:46:08 +0000 (18:46 +0200)
committerAlina Quereilhac <alina.quereilhac@inria.fr>
Fri, 22 Apr 2011 16:46:08 +0000 (18:46 +0200)
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

src/nepi/core/attributes.py
src/nepi/core/execute.py
src/nepi/testbeds/ns3/attributes_metadata_v3_9_RC3.py
src/nepi/testbeds/ns3/factories_metadata_v3_9_RC3.py
src/nepi/testbeds/ns3/metadata_v3_9_RC3.py
src/nepi/util/proxy.py

index 0f0b6fc..3dd3da4 100644 (file)
@@ -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 \
index bc8df21..8870742 100644 (file)
@@ -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]
index ccea25d..819d334 100644 (file)
@@ -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"
+    }),
 })
index 45696cc..6bb651a 100644 (file)
@@ -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"],
index fe864d7..9d5cfab 100644 (file)
@@ -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 ###
 
index b075efa..b0c045d 100644 (file)
@@ -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):