removed another bunch of references to geni
[sfa.git] / sfa / util / record.py
index 8575f01..aad12ca 100644 (file)
@@ -1,5 +1,5 @@
 ##
-# Implements support for geni records
+# Implements support for SFA records
 #
 # TODO: Use existing PLC database methods? or keep this separate?
 ##
@@ -14,13 +14,15 @@ from sfa.trust.gid import *
 import sfa.util.report
 from sfa.util.rspec import *
 from sfa.util.parameter import *
+from sfa.util.namespace import *
+from sfa.util.row import Row
 
-class GeniRecord(dict):
+class SfaRecord(Row):
     """ 
-    The GeniRecord class implements a Geni Record. A GeniRecord is a tuple
-    (Name, GID, Type, Info).
+    The SfaRecord class implements an SFA Record. A SfaRecord is a tuple
+    (Hrn, GID, Type, Info).
  
-    Name specifies the HRN of the object
+    Hrn specifies the Human Readable Name of the object
     GID is the GID of the object
     Type is user | authority | slice | component
  
@@ -35,20 +37,28 @@ class GeniRecord(dict):
     of different types.
     """
 
+    table_name = 'sfa'
+    
+    primary_key = 'record_id'
+
+    ### the wsdl generator assumes this is named 'fields'
+    internal_fields = {
+        'record_id': Parameter(int, 'An id that uniquely identifies this record', ro=True),
+        'pointer': Parameter(int, 'An id that uniquely identifies this record in an external database ')
+    }
+
     fields = {
+        'authority': Parameter(str, "The authority for this record"),
+        'peer_authority': Parameter(str, "The peer authority for this record"),
         'hrn': Parameter(str, "Human readable name of object"),
         'gid': Parameter(str, "GID of the object"),
         'type': Parameter(str, "Record type"),
-        #'last_updated': Parameter(int, 'Date and time of last update'),
-        #'date_created': Parameter(int, 'Date and time this record was created'),
-    }
-
-    internal_fields = {
-        'pointer': Parameter(int, "Internal ID")
+        'last_updated': Parameter(int, 'Date and time of last update', ro=True),
+        'date_created': Parameter(int, 'Date and time this record was created', ro=True),
     }
-
+    all_fields = dict(fields.items() + internal_fields.items())
     ##
-    # Create a Geni Record
+    # Create an SFA Record
     #
     # @param name if !=None, assign the name of the record
     # @param gid if !=None, assign the gid of the record
@@ -56,14 +66,15 @@ class GeniRecord(dict):
     # @param pointer is a pointer to a PLC record
     # @param dict if !=None, then fill in this record from the dictionary
 
-    def __init__(self, name=None, gid=None, type=None, pointer=None, dict=None, string=None):
+    def __init__(self, hrn=None, gid=None, type=None, pointer=None, peer_authority=None, dict=None, string=None):
         self.dirty = True
-        self.name = None
+        self.hrn = None
         self.gid = None
         self.type = None
         self.pointer = None
-        if name:
-            self.set_name(name)
+        self.set_peer_auth(peer_authority)
+        if hrn:
+            self.set_name(hrn)
         if gid:
             self.set_gid(gid)
         if type:
@@ -75,7 +86,10 @@ class GeniRecord(dict):
         if string:
             self.load_from_string(string)
 
-    
+
+    def validate_last_updated(self, last_updated):
+        return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
+        
     def update(self, new_dict):
         if isinstance(new_dict, list):
             new_dict = new_dict[0]
@@ -92,13 +106,14 @@ class GeniRecord(dict):
     ##
     # Set the name of the record
     #
-    # @param name is a string containing the HRN
+    # @param hrn is a string containing the HRN
 
-    def set_name(self, name):
+    def set_name(self, hrn):
         """
         Set the name of the record
         """
-        self.name = name
+        self.hrn = hrn
+        self['hrn'] = hrn
         self.dirty = True
 
     ##
@@ -113,8 +128,10 @@ class GeniRecord(dict):
 
         if isinstance(gid, StringTypes):
             self.gid = gid
+            self['gid'] = gid
         else:
             self.gid = gid.save_to_string(save_parents=True)
+            self['gid'] = gid.save_to_string(save_parents=True)
         self.dirty = True
 
     ##
@@ -127,6 +144,7 @@ class GeniRecord(dict):
         Set the type of the record
         """
         self.type = type
+        self['type'] = type
         self.dirty = True
 
     ##
@@ -139,6 +157,13 @@ class GeniRecord(dict):
         Set the pointer of the record
         """
         self.pointer = pointer
+        self['pointer'] = pointer
+        self.dirty = True
+
+
+    def set_peer_auth(self, peer_authority):
+        self.peer_authority = peer_authority
+        self['peer_authority'] = peer_authority
         self.dirty = True
 
     ##
@@ -148,7 +173,7 @@ class GeniRecord(dict):
         """
         Return the name (HRN) of the record
         """
-        return self.name
+        return self.hrn
 
     ##
     # Return the type of the record
@@ -183,19 +208,6 @@ class GeniRecord(dict):
         """
         return GID(string=self.gid)
 
-    ##
-    # Return a key that uniquely identifies this record among all records in
-    # Geni. This key is used to uniquely identify the record in the Geni
-    # database.
-
-    def get_key(self):
-        """
-        Return a key that uniquely identifies this record among all records in
-        Geni. This key is used to uniquely identify the record in the Geni
-        database.
-        """
-        return self.name + "#" + self.type
-
     ##
     # Returns a list of field names in this record. 
 
@@ -203,39 +215,39 @@ class GeniRecord(dict):
         """
         Returns a list of field names in this record.
         """
-        return ["name", "gid", "type", "pointer"]
+        return self.fields.keys()
 
     ##
-    # Given a field name ("name", "gid", ...) return the value of that field.
+    # Given a field name ("hrn", "gid", ...) return the value of that field.
     #
-    # @param name is the name of field to be returned
+    # @param fieldname is the name of field to be returned
 
     def get_field_value_string(self, fieldname):
         """
-        Given a field name ("name", "gid", ...) return the value of that field.
+        Given a field name ("hrn", "gid", ...) return the value of that field.
         """
-        if fieldname == "key":
-            val = self.get_key()
+        if fieldname == "authority":
+            val = get_authority(self['hrn'])
         else:
-            val = getattr(self, fieldname)
+            try:
+                val = getattr(self, fieldname)
+            except:
+                val = self[fieldname] 
         if isinstance(val, str):
             return "'" + str(val) + "'"
         else:
             return str(val)
 
     ##
-    # Given a list of field names, return a list of values for those fields.
+    # Given a list of field names, return a list of values for those public.
     #
     # @param fieldnames is a list of field names
 
     def get_field_value_strings(self, fieldnames):
         """
-        Given a list of field names, return a list of values for those fields.
+        Given a list of field names, return a list of values for those public.
         """
-        strs = []
-        for fieldname in fieldnames:
-            strs.append(self.get_field_value_string(fieldname))
-        return strs
+        return [ self.get_field_value_string (fieldname) for fieldname in fieldnames ]
 
     ##
     # Return the record in the form of a dictionary
@@ -249,13 +261,13 @@ class GeniRecord(dict):
     ##
     # Load the record from a dictionary
     #
-    # @param dict dictionary to load record fields from
+    # @param dict dictionary to load record public from
 
     def load_from_dict(self, dict):
         """
         Load the record from a dictionary 
         """
-        self.set_name(dict['name'])
+        self.set_name(dict['hrn'])
         gidstr = dict.get("gid", None)
         if gidstr:
             self.set_gid(dict['gid'])
@@ -264,7 +276,6 @@ class GeniRecord(dict):
            self.set_pointer(dict['pointer'])
 
         self.set_type(dict['type'])
-        self['hrn'] = dict['name'] 
         self.update(dict)        
     
     ##
@@ -276,9 +287,10 @@ class GeniRecord(dict):
         Save the record to a string. The string contains an XML representation of
         the record.
         """
-        dict = self.as_dict()
+        recorddict = self.as_dict()
+        filteredDict = dict([(key, val) for (key, val) in recorddict.iteritems() if key in self.fields.keys()])
         record = RecordSpec()
-        record.parseDict(dict)
+        record.parseDict(filteredDict)
         str = record.toxml()
         #str = xmlrpclib.dumps((dict,), allow_none=True)
         return str
@@ -297,8 +309,8 @@ class GeniRecord(dict):
         record = RecordSpec()
         record.parseString(str)
         record_dict = record.toDict()
-        geni_dict = record_dict['record']
-        self.load_from_dict(geni_dict)
+        sfa_dict = record_dict['record']
+        self.load_from_dict(sfa_dict)
 
     ##
     # Dump the record to stdout
@@ -319,12 +331,12 @@ class GeniRecord(dict):
         #    self.get_gid_object().dump(8, dump_parents)
         #print "    pointer:", self.pointer
        
-        order = GeniRecord.fields.keys() 
+        order = SfaRecord.fields.keys() 
         for key in self.keys():
             if key not in order:
                 order.append(key)
         for key in order:
-            if key in (self and self.fields):
+            if key in self and key in self.fields:
                 if key in 'gid' and self[key]:
                     gid = GID(string=self[key])
                     print "     %s:" % key
@@ -336,7 +348,7 @@ class GeniRecord(dict):
         return dict(self)
     
 
-class UserRecord(GeniRecord):
+class UserRecord(SfaRecord):
 
     fields = {
         'email': Parameter(str, 'email'),
@@ -344,19 +356,11 @@ class UserRecord(GeniRecord):
         'last_name': Parameter(str, 'Last name'),
         'phone': Parameter(str, 'Phone Number'),
         'key': Parameter(str, 'Public key'),
-        'slice': Parameter([str], 'List of slices this user belongs to'),
+        'slices': Parameter([str], 'List of slices this user belongs to'),
         }
-    fields.update(GeniRecord.fields)
-    internal_fields = {
-        'roles': Parameter([str], 'List of roles'),
-        'title': Parameter(str, 'Title'),
-        'sites': Parameter([str], 'List of sites this user belongs to'),
-        'enabled': Parameter(bool, 'Is this person enabled'),
-        }
-    internal_fields.update(GeniRecord.internal_fields)
+    fields.update(SfaRecord.fields)
     
-class SliceRecord(GeniRecord):
+class SliceRecord(SfaRecord):
     fields = {
         'name': Parameter(str, 'Slice name'),
         'url': Parameter(str, 'Slice url'),
@@ -364,17 +368,10 @@ class SliceRecord(GeniRecord):
         'researcher': Parameter([str], 'List of users for this slice'),
         'description': Parameter([str], 'Description of this slice'), 
         }
-    fields.update(GeniRecord.fields)
+    fields.update(SfaRecord.fields)
 
-    internal_fields = {
-        'site': Parameter(str, 'Site this slice belongs to'),
-        'instantiation': Parameter(str, 'Slice instantiation'),
-        'nodes': Parameter([str], 'List of nodes this slice is instantiated on'),
-        'max_nodes': Parameter(int, 'Maximum number of nodes this slice is allowed on')
-        }
-    internal_fields.update(GeniRecord.internal_fields)
  
-class NodeRecord(GeniRecord):
+class NodeRecord(SfaRecord):
     fields = {
         'hostname': Parameter(str, 'This nodes dns name'),
         'node_type': Parameter(str, 'Type of node this is'),
@@ -382,27 +379,10 @@ class NodeRecord(GeniRecord):
         'latitude': Parameter(str, 'latitude'),
         'longitude': Parameter(str, 'longitude'),
         }
-    fields.update(GeniRecord.fields)
+    fields.update(SfaRecord.fields)
 
-    internal_fields = {
-        'slice_ids_whitelist': Parameter([str], 'List of allowed slices on this node'),
-        'site': Parameter(str, 'Site this node belongs to'),
-        'slices': Parameter([str], 'List of instantiated slices on this node'),
-        'boot_state': Parameter(str, 'This nodes boot state'),
-        'session': Parameter(str, 'This nodes session key'),
-        'ssh_rsa_key': Parameter(str, 'Last known ssh host key'),
-        'verified': Parameter(str, 'Whether the node configuration is verified correct'),
-        'last_contact': Parameter(int, 'Date and time this node last phoned home'),
-        'run_level': Parameter(str, 'Run level'),
-        'version': Parameter(str, 'Node software version'),
-        'key': Parameter(str, 'Node key'),
-        'boot_noonce': Parameter(str, 'Random value generate at nodes last boot'),
-        'model': Parameter(str, 'Model of node'),
-        'ports': Parameter([int], 'List of pcu ports this node is connected to') 
-        }
-    internal_fields.update(GeniRecord.internal_fields)
 
-class AuthorityRecord(GeniRecord):
+class AuthorityRecord(SfaRecord):
     fields =  {
         'name': Parameter(str, 'Name'),
         'login_base': Parameter(str, 'login base'),
@@ -413,17 +393,6 @@ class AuthorityRecord(GeniRecord):
         'researcher': Parameter([str], 'List of researchers'),
         'PI': Parameter([str], 'List of Principal Investigators'),
         }
-    fields.update(GeniRecord.fields)
+    fields.update(SfaRecord.fields)
     
-    internal_fields = {
-        'nodes': Parameter([str], 'List of nodes at this site'),  
-        'slices': Parameter([str], 'List of slices instantiated by this site'),
-        'abbreviated_name': Parameter(str, 'Abbreviated name'),
-        'owners': Parameter([str], 'List of owners'),
-        'max_slices': Parameter(int, 'Maximum number of slices this site can instantiate'),
-        'max_slivers': Parameter(int, 'Maximum number of slivers this site can instantiate'),
-        'pi': Parameter([str], 'List of pis'),
-        'is_public': Parameter(bool, 'Is this site public'),
-        
-        }
-    internal_fields.update(GeniRecord.internal_fields) 
+