A small one-node SFA/planetlab test worked.
authorAlina Quereilhac <alina.quereilhac@inria.fr>
Sat, 14 Jan 2012 19:06:31 +0000 (20:06 +0100)
committerAlina Quereilhac <alina.quereilhac@inria.fr>
Sat, 14 Jan 2012 19:06:31 +0000 (20:06 +0100)
src/nepi/testbeds/planetlab/execute.py
src/nepi/testbeds/planetlab/interfaces.py
src/nepi/testbeds/planetlab/node.py
src/nepi/util/parser/sfa.py
src/nepi/util/sfiapi.py

index 698e865..65ee9c4 100644 (file)
@@ -247,7 +247,7 @@ class TestbedController(testbed_impl.TestbedController):
                         to_provision.add(node_id)
                         reserved.add(hostname)
                     elif not candidates:
-                        raise RuntimeError, "Cannot assign resources for node %s, no candidates sith %s" % (guid,
+                        raise RuntimeError, "Cannot assign resources for node %s, no candidates with %s" % (guid,
                             node.make_filter_description())
             finally:
                 reserve_lock.release()
index cc8d179..7823900 100644 (file)
@@ -60,9 +60,16 @@ class NodeIface(object):
         
         if self.node is None or self.node._node_id is None:
             raise RuntimeError, "Cannot pick interface without an assigned node"
-        
+      
+        # HACK: SFA doesnt give the node_id!!
+        if not isinstance(self.node._node_id, int):
+            node_data = self._api.GetNodes(filters={'hostname':self.node.hostname}, fields=('node_id',))[0]
+            node_id = node_data['node_id']
+        else:
+            node_id = self.node._node_id
+
         avail = self._api.GetInterfaces(
-            node_id=self.node._node_id, 
+            node_id=node_id, 
             is_primary=self.primary,
             fields=('interface_id','mac','netmask','ip') )
         
index e6bbebb..eb9a6de 100644 (file)
@@ -265,9 +265,9 @@ class Node(object):
         hostnames = None
         if candidates:
             self._logger.info("  Found %s candidates. Checking for reachability...", len(candidates))
-            
+           
             hostnames = dict(map(operator.itemgetter('node_id','hostname'),
-                self._api.GetNodes(list(candidates), ['node_id','hostname'])
+                self._sliceapi.GetNodes(list(candidates), ['node_id','hostname'])
             ))
 
             def resolvable(node_id):
@@ -348,7 +348,7 @@ class Node(object):
         replacements = {'timeframe':self.timeframe}
         tagnames = [ tagname % replacements 
                      for tagname, weight, default in self.RATE_FACTORS ]
-        
+       
         taginfo = self._sliceapi.GetNodeTags(
             node_id=list(nodes), 
             tagname=tagnames,
@@ -358,7 +358,7 @@ class Node(object):
         for value in taginfo:
             node, tagname, value = unpack(value)
             if value and value.lower() != 'n/a':
-                tags[tagname][int(node)] = float(value)
+                tags[tagname][node] = float(value)
         
         for tagname, weight, default in self.RATE_FACTORS:
             taginfo = tags[tagname % replacements].get
@@ -383,6 +383,7 @@ class Node(object):
         self.timeframe = 'm'
         
         replacements = {'timeframe':self.timeframe}
+
         for attr, tag in self.BASEFILTERS.iteritems():
             if tag in info:
                 value = info[tag]
@@ -401,7 +402,7 @@ class Node(object):
         
         if 'peer_id' in info:
             orig_attrs['site'] = self.site
-            self.site = self._api.peer_map[info['peer_id']]
+            self.site = self._sliceapi.peer_map[info['peer_id']]
         
         if 'interface_ids' in info:
             self.min_num_external_ifaces = \
index 5194493..bb83508 100644 (file)
@@ -95,11 +95,16 @@ class SFAResourcesParser(object):
                     node_data[name] = get_child_text(node_tag, name)
                 iface_tags =  node_tag.getElementsByTagName('interface')
                 ifaces_data = dict()
+                iface_ids = list()
                 for iface_tag in iface_tags: 
                     if iface_tag.nodeType == doc.ELEMENT_NODE:
                         for name in ['component_id', 'ipv4']:
-                            ifaces_data[name] = get_attribute(iface_tag, name)
+                            value = get_attribute(iface_tag, name)
+                            ifaces_data[name] = value
+                            if name == 'component_id':
+                                iface_ids.append(value)
                 node_data['interfaces'] = ifaces_data
+                node_data['interface_ids'] = iface_ids
         return nodes_data
 
     def slice_tags_from_xml(self, doc, rspec_tag):
index 90affff..5b4b3cc 100644 (file)
@@ -22,6 +22,7 @@ class SFIAPI(object):
         return list(self._slice_nodes)
 
     def GetNodeInfo(self, node_id):
+        # TODO: thread-unsafe!! sanitize!
         info = self.GetNodes(node_id)
         tags = self.GetNodeTags(node_id=node_id, fields=('tagname','value'))
         return info, tags
@@ -50,7 +51,6 @@ class SFIAPI(object):
 
     def GetNodes(self, nodeIdOrName=None, fields=[], **kw):
         #TODO: filter - peer
-        #      field - interface_ids
         nodes = self._all_nodes
         if nodeIdOrName is not None:
             node_ids = nodeIdOrName
@@ -62,8 +62,12 @@ class SFIAPI(object):
             if '|slice_ids' in filters:
                 nodes = self._FilterByNodeId(nodes, self._slice_nodes)
                 del filters['|slice_ids']
+            # TODO: Remove this!! need to allow filter '>last_contact' !!!
+            for f in ['>last_contact', 'node_type', 'run_level']:
+                if f in filters:
+                    del filters[f]
             nodes = self._FilterByFilters(nodes, filters)
-        return self._GetNodeInfo(nodes, fields)
+        return self._GetNodeFieldsInfo(nodes, fields)
     
     def _FilterByNodeId(self, nodes, node_ids):
         return dict((k, nodes[k]) for k in node_ids if k in nodes)
@@ -73,22 +77,25 @@ class SFIAPI(object):
             data = nodes[node_id]
             for name, value in filters.iteritems():
                 #if  (name == '>last_contact' and data['lastcontact'] > value) or \
-                if (not name in data or data[tag] != value):
+                if (not name in data or data[name] != value):
                     return False
             return True
         return dict((k, value) for k, value in nodes.iteritems() if has_all_tags(k))
 
-    def _GetNodeInfo(self, nodes, fields):
+    def _GetNodeFieldsInfo(self, nodes, fields):
         result = list()
         for k, data in nodes.iteritems():
+            if not fields:
+                result.append(data)
+                continue
             r_data = dict()
-            result.append(r_data)
             for f in fields:
                 if f == "node_id":
                     value = k
                 else:
                     value = data[f]
                 r_data[f] = value
+            result.append(r_data)
         return result
 
     def _GetTagInfo(self, nodes, tagnames, fields):