Add useful and important tag filters for node selection:
authorClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Thu, 28 Jul 2011 16:19:01 +0000 (18:19 +0200)
committerClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Thu, 28 Jul 2011 16:19:01 +0000 (18:19 +0200)
 - Location
 - CPU available
 - Load average

src/nepi/testbeds/planetlab/metadata.py
src/nepi/testbeds/planetlab/node.py

index 2ce01c2..e319c5d 100644 (file)
@@ -636,6 +636,27 @@ attributes = dict({
                 "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
                 "validation_function": validation.is_string,
             }),
+    "city": dict({      
+                "name": "city",
+                "help": "Constrain location (city) during resource discovery. May use wildcards.",
+                "type": Attribute.STRING, 
+                "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
+                "validation_function": validation.is_string,
+            }),
+    "country": dict({      
+                "name": "hostname",
+                "help": "Constrain location (country) during resource discovery. May use wildcards.",
+                "type": Attribute.STRING, 
+                "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
+                "validation_function": validation.is_string,
+            }),
+    "region": dict({      
+                "name": "hostname",
+                "help": "Constrain location (region) during resource discovery. May use wildcards.",
+                "type": Attribute.STRING, 
+                "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
+                "validation_function": validation.is_string,
+            }),
     "architecture": dict({      
                 "name": "architecture",
                 "help": "Constrain architexture during resource discovery.",
@@ -699,6 +720,38 @@ attributes = dict({
                 "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
                 "validation_function": validation.is_number,
             }),
+    "min_load": dict({
+                "name": "minLoad",
+                "help": "Constrain node load average while picking PlanetLab nodes. Specifies a lower acceptable bound.",
+                "type": Attribute.DOUBLE,
+                "range": (0,2**31),
+                "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
+                "validation_function": validation.is_number,
+            }),
+    "max_load": dict({
+                "name": "maxLoad",
+                "help": "Constrain node load average while picking PlanetLab nodes. Specifies an upper acceptable bound.",
+                "type": Attribute.DOUBLE,
+                "range": (0,2**31),
+                "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
+                "validation_function": validation.is_number,
+            }),
+    "min_cpu": dict({
+                "name": "minCpu",
+                "help": "Constrain available cpu time while picking PlanetLab nodes. Specifies a lower acceptable bound.",
+                "type": Attribute.DOUBLE,
+                "range": (0,100),
+                "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
+                "validation_function": validation.is_number,
+            }),
+    "max_cpu": dict({
+                "name": "maxCpu",
+                "help": "Constrain available cpu time while picking PlanetLab nodes. Specifies an upper acceptable bound.",
+                "type": Attribute.DOUBLE,
+                "range": (0,100),
+                "flags": Attribute.ExecReadOnly | Attribute.ExecImmutable,
+                "validation_function": validation.is_number,
+            }),
             
     "up": dict({
                 "name": "up",
index 1b9b15e..4d055c1 100644 (file)
@@ -49,10 +49,17 @@ class Node(object):
         'architecture' : ('arch','value'),
         'operatingSystem' : ('fcdistro','value'),
         'pl_distro' : ('pldistro','value'),
+        'city' : ('city','value'),
+        'country' : ('country','value'),
+        'region' : ('region','value'),
         'minReliability' : ('reliability%(timeframe)s', ']value'),
         'maxReliability' : ('reliability%(timeframe)s', '[value'),
         'minBandwidth' : ('bw%(timeframe)s', ']value'),
         'maxBandwidth' : ('bw%(timeframe)s', '[value'),
+        'minLoad' : ('load%(timeframe)s', ']value'),
+        'maxLoad' : ('load%(timeframe)s', '[value'),
+        'minCpu' : ('cpu%(timeframe)s', ']value'),
+        'maxCpu' : ('cpu%(timeframe)s', '[value'),
     }    
     
     DEPENDS_PIDFILE = '/tmp/nepi-depends.pid'
@@ -64,6 +71,10 @@ class Node(object):
     maxReliability = _castproperty(float, '_maxReliability')
     minBandwidth = _castproperty(float, '_minBandwidth')
     maxBandwidth = _castproperty(float, '_maxBandwidth')
+    minCpu = _castproperty(float, '_minCpu')
+    maxCpu = _castproperty(float, '_maxCpu')
+    minLoad = _castproperty(float, '_minLoad')
+    maxLoad = _castproperty(float, '_maxLoad')
     
     def __init__(self, api=None):
         if not api:
@@ -76,10 +87,17 @@ class Node(object):
         self.operatingSystem = None
         self.pl_distro = None
         self.site = None
+        self.city = None
+        self.country = None
+        self.region = None
         self.minReliability = None
         self.maxReliability = None
         self.minBandwidth = None
         self.maxBandwidth = None
+        self.minCpu = None
+        self.maxCpu = None
+        self.minLoad = None
+        self.maxLoad = None
         self.min_num_external_ifaces = None
         self.max_num_external_ifaces = None
         self.timeframe = 'm'
@@ -348,7 +366,11 @@ class Node(object):
         self.minReliability = \
         self.maxReliability = \
         self.minBandwidth = \
-        self.maxBandwidth = None
+        self.maxBandwidth = \
+        self.minCpu = \
+        self.maxCpu = \
+        self.minLoad = \
+        self.maxLoad = None
 
     def install_dependencies(self):
         if self.required_packages and not self._installed: