filter attributes by flag
authorAlina Quereilhac <alina.quereilhac@inria.fr>
Wed, 6 Jul 2011 13:16:53 +0000 (15:16 +0200)
committerAlina Quereilhac <alina.quereilhac@inria.fr>
Wed, 6 Jul 2011 13:16:53 +0000 (15:16 +0200)
src/nepi/core/attributes.py
src/nepi/core/connector.py
src/nepi/core/execute.py
src/nepi/core/testbed_impl.py
src/nepi/testbeds/netns/execute.py
src/nepi/util/proxy.py

index 201ca04..272cbef 100644 (file)
@@ -39,7 +39,7 @@ class Attribute(object):
     HasNoDefaultValue = 0x08
 
     def __init__(self, name, help, type, value = None, range = None,
-        allowed = None, flags = NoFlags, validation_function = None, 
+        allowed = None, flags = None, validation_function = None, 
         category = None):
         if not type in Attribute.types:
             raise AttributeError("invalid type %s " % type)
@@ -47,7 +47,7 @@ class Attribute(object):
         self._type = type
         self._help = help
         self._value = value
-        self._flags = flags
+        self._flags = flags if flags != None else Attribute.NoFlags
         # range: max and min possible values
         self._range = range
         # list of possible values
@@ -150,9 +150,14 @@ class AttributesMap(object):
     def attributes(self):
         return self._attributes.values()
 
-    @property
-    def attributes_list(self):
-        return self._attributes.keys()
+    def get_attribute_list(self, filter_flags = None):
+        attributes = self._attributes
+        if filter_flags != None:
+            def filter_attrs(attr):
+                (attr_id, attr_data) = attr
+                return not ((attr_data.flags & filter_flags) == filter_flags)
+            attributes = dict(filter(filter_attrs, attributes.iteritems()))
+        return attributes.keys()
 
     def set_attribute_value(self, name, value):
         self._attributes[name].value = value
index e8ff719..a62d304 100644 (file)
@@ -81,14 +81,18 @@ class ConnectorType(object):
         testbed_id, factory_id, name = connector_type_id
         
         # the key is always a candidate
+        #print " 1 - ", connector_type_id
         yield connector_type_id
         
         # Try wildcard combinations
         if (testbed_id, None, name) != connector_type_id:
+            #print " 2 - ", (testbed_id, None, name)
             yield (testbed_id, None, name)
         if (None, factory_id, name) != connector_type_id:
+            #print " 3 - ", (None, factory_id, name)
             yield (None, factory_id, name)
         if (None, None, name) != connector_type_id:
+            #print " 4 - ", (None, None, name)
             yield (None, None, name)
 
     def add_from_connection(self, testbed_id, factory_id, name, can_cross, 
index 55f4b1a..9e7b8dc 100644 (file)
@@ -165,7 +165,7 @@ class TestbedController(object):
         """
         raise NotImplementedError
 
-    def get_attribute_list(self, guid):
+    def get_attribute_list(self, guid, filter_flags = None):
         raise NotImplementedError
 
     def get_factory_id(self, guid):
@@ -368,7 +368,7 @@ class ExperimentController(object):
         for testbed_guid, testbed_config in self._deployment_config.iteritems():
             testbed_guid = str(testbed_guid)
             conf.add_section(testbed_guid)
-            for attr in testbed_config.attributes_list:
+            for attr in testbed_config.get_attribute_list():
                 if attr not in TRANSIENT:
                     conf.set(testbed_guid, attr, 
                         testbed_config.get_attribute_value(attr))
@@ -399,7 +399,7 @@ class ExperimentController(object):
                 
             testbed_guid = str(testbed_guid)
             conf.add_section(testbed_guid)
-            for attr in testbed_config.attributes_list:
+            for attr in testbed_config.get_attribute_list():
                 if attr not in TRANSIENT:
                     getter = getattr(conf, TYPEMAP.get(
                         testbed_config.get_attribute_type(attr),
@@ -772,8 +772,9 @@ class ExperimentController(object):
                     _testbed_id = cross_testbed.testbed_id,
                     _testbed_version = cross_testbed.testbed_version)
                 cross_data[cross_testbed_guid][cross_guid] = elem_cross_data
-                attributes_list = cross_testbed.get_attribute_list(cross_guid)
-                for attr_name in attributes_list:
+                attribute_list = cross_testbed.get_attribute_list(cross_guid,
+                        filter_flags = Attribute.DesignOnly)
+                for attr_name in attribute_list:
                     attr_value = cross_testbed.get(cross_guid, attr_name)
                     elem_cross_data[attr_name] = attr_value
         return cross_data
index fd76bf4..0c19d62 100644 (file)
@@ -430,10 +430,10 @@ class TestbedController(execute.TestbedController):
         
         return addresses[index][attribute_index]
 
-    def get_attribute_list(self, guid):
+    def get_attribute_list(self, guid, filter_flags = None):
         factory = self._get_factory(guid)
         attribute_list = list()
-        return factory.box_attributes.attributes_list
+        return factory.box_attributes.get_attribute_list(filter_flags)
 
     def get_factory_id(self, guid):
         factory = self._get_factory(guid)
index 350c8f3..4bfff53 100644 (file)
@@ -86,7 +86,8 @@ class TestbedController(testbed_impl.TestbedController):
         # TODO: take on account schedule time for the task 
         factory_id = self._create[guid]
         factory = self._factories[factory_id]
-        if factory.box_attributes.is_attribute_design_only(name):
+        if factory.box_attributes.is_attribute_design_only(name) or \
+                factory.box_attributes.is_attribute_invisible(name):
             return
         element = self._elements.get(guid)
         if element:
@@ -97,7 +98,8 @@ class TestbedController(testbed_impl.TestbedController):
         # TODO: take on account schedule time for the task
         factory_id = self._create[guid]
         factory = self._factories[factory_id]
-        if factory.box_attributes.is_attribute_design_only(name):
+        if factory.box_attributes.is_attribute_design_only(name) or \
+                factory.box_attributes.is_attribute_invisible(name):
             return value
         element = self._elements.get(guid)
         try:
index dd0f733..9cb26f3 100644 (file)
@@ -648,10 +648,10 @@ class TestbedControllerServer(BaseServer):
         return self._testbed.status(guid)
 
     @Marshalling.handles(GET_ATTRIBUTE_LIST)
-    @Marshalling.args(int)
+    @Marshalling.args(int, int)
     @Marshalling.retval( Marshalling.pickled_data )
-    def get_attribute_list(self, guid):
-        return self._testbed.get_attribute_list(guid)
+    def get_attribute_list(self, guid, filter_flags = None):
+        return self._testbed.get_attribute_list(guid, filter_flags)
 
     @Marshalling.handles(GET_FACTORY_ID)
     @Marshalling.args(int)