From: Alina Quereilhac <alina.quereilhac@inria.fr>
Date: Wed, 6 Jul 2011 13:16:53 +0000 (+0200)
Subject: filter attributes by flag
X-Git-Tag: nepi-3.0.0~381^2~1
X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=e7c5823e717497ec2be80c763f06eb77b27a9aea;p=nepi.git

filter attributes by flag
---

diff --git a/src/nepi/core/attributes.py b/src/nepi/core/attributes.py
index 201ca048..272cbef2 100644
--- a/src/nepi/core/attributes.py
+++ b/src/nepi/core/attributes.py
@@ -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
diff --git a/src/nepi/core/connector.py b/src/nepi/core/connector.py
index e8ff719f..a62d3049 100644
--- a/src/nepi/core/connector.py
+++ b/src/nepi/core/connector.py
@@ -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, 
diff --git a/src/nepi/core/execute.py b/src/nepi/core/execute.py
index 55f4b1ae..9e7b8dcb 100644
--- a/src/nepi/core/execute.py
+++ b/src/nepi/core/execute.py
@@ -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
diff --git a/src/nepi/core/testbed_impl.py b/src/nepi/core/testbed_impl.py
index fd76bf4d..0c19d627 100644
--- a/src/nepi/core/testbed_impl.py
+++ b/src/nepi/core/testbed_impl.py
@@ -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)
diff --git a/src/nepi/testbeds/netns/execute.py b/src/nepi/testbeds/netns/execute.py
index 350c8f3e..4bfff535 100644
--- a/src/nepi/testbeds/netns/execute.py
+++ b/src/nepi/testbeds/netns/execute.py
@@ -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:
diff --git a/src/nepi/util/proxy.py b/src/nepi/util/proxy.py
index dd0f7332..9cb26f34 100644
--- a/src/nepi/util/proxy.py
+++ b/src/nepi/util/proxy.py
@@ -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)