- RefreshPeer & AddSliceToNodes had bugs
[plcapi.git] / PLC / ForeignNodes.py
index ba482e4..b609006 100644 (file)
@@ -1,6 +1,7 @@
 #
 # Thierry Parmentelat - INRIA
 # 
+import time
 
 from types import StringTypes
 
@@ -26,31 +27,44 @@ class ForeignNode (Row) :
         'version' : Parameter (str,"Version, see Node"),
         'date_created': Parameter(int, "Creation time, see Node"),
         'last_updated': Parameter(int, "Update time, see Node"),
+        'slice_ids': Parameter([int], "List of slices on this node"),
        }
 
     def __init__(self,api,fields={},uptodate=True):
        Row.__init__(self,api,fields)
        self.uptodate=uptodate
 
+    def validate_date_created(self,timestamp):
+        return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(timestamp))
+
+    def validate_last_updated(self,timestamp):
+        return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(timestamp))
+
+    def purge_peer_node (self,commit=True):
+        sql = "DELETE FROM peer_node WHERE node_id=%d"%self['node_id']
+        self.api.db.do(sql)
+        if commit:
+            self.api.db.commit()
+
     def delete (self, commit=True):
         """
         Delete existing foreign node.
         """
-        print 'in ForeignNode::delete',self
+        self.purge_peer_node()
         self['deleted']=True
         self.sync(commit)
         
 
 class ForeignNodes (Table):
+    def __init__ (self, api, foreign_node_filter = None, columns = None):
+        Table.__init__(self, api, ForeignNode, columns)
 
-    def __init__ (self, api, foreign_node_filter = None):
-        Table.__init__(self, api, ForeignNode)
-
-       sql = "SELECT %s FROM view_foreign_nodes WHERE deleted IS False" % \
-              ", ".join(ForeignNode.fields)
-
+        sql = ""
+       sql += "SELECT %s FROM view_foreign_nodes " % ", ".join(self.columns)
+        sql += "WHERE deleted IS False "
+              
         if foreign_node_filter is not None:
-            if isinstance(foreign_node_filter, list):
+            if isinstance(foreign_node_filter, (list, tuple, set)):
                 # Separate the list into integers and strings
                 ints = filter(lambda x: isinstance(x, (int, long)), foreign_node_filter)
                 strs = filter(lambda x: isinstance(x, StringTypes), foreign_node_filter)
@@ -61,3 +75,18 @@ class ForeignNodes (Table):
                 sql += " AND (%s)" % foreign_node_filter.sql(api, "AND")
 
        self.selectall(sql)
+
+    # managing an index by hostname
+    def hostname_index(self):
+        if 'hostname' not in self.columns:
+            raise PLCFault,"ForeignNodes::index_hostname, hostname not selected"
+        self.index={}
+        for foreign_node in self:
+            self.index[foreign_node['hostname']]=foreign_node
+            
+    def hostname_add_by(self,foreign_node):
+        self.index[foreign_node['hostname']]=foreign_node
+
+    def hostname_locate(self,hostname):
+        return self.index[hostname]
+