##
from types import StringTypes
-
from sfa.trust.gid import GID
-
from sfa.storage.parameter import Parameter
from sfa.util.xrn import get_authority
from sfa.storage.row import Row
from sfa.util.xml import XML
+from sfa.util.sfalogging import logger
+from sfa.util.sfatime import utcparse, datetime_to_string
class SfaRecord(Row):
"""
of different types.
"""
- table_name = 'sfa'
-
- primary_key = 'record_id'
+# 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 ')
+ '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 = {
'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', ro=True),
- 'date_created': Parameter(int, 'Date and time this record was created', ro=True),
+ '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())
##
# @param pointer is a pointer to a PLC record
# @param dict if !=None, then fill in this record from the dictionary
- def __init__(self, hrn=None, gid=None, type=None, pointer=None, peer_authority=None, dict=None, string=None):
+ def __init__(self, hrn=None, gid=None, type=None, pointer=None, authority=None,
+ peer_authority=None, dict=None, string=None):
self.dirty = True
self.hrn = None
self.gid = None
self.type = None
self.pointer = None
self.set_peer_auth(peer_authority)
+ self.set_authority(authority)
if hrn:
self.set_name(hrn)
if gid:
self['hrn'] = hrn
self.dirty = True
+ def set_authority(self, authority):
+ """
+ Set the authority
+ """
+ if not authority:
+ authority = ""
+ self.authority = authority
+ self['authority'] = authority
+ self.dirty = True
+
+
##
# Set the GID of the record
#
"""
recorddict = self.as_dict()
filteredDict = dict([(key, val) for (key, val) in recorddict.iteritems() if key in self.fields.keys()])
- record = XML('<record/>')
- record.parse_dict(filteredDict)
- str = record.toxml()
+ xml_record = XML('<record/>')
+ xml_record.parse_dict(filteredDict)
+ str = xml_record.toxml()
return str
##
"""
#dict = xmlrpclib.loads(str)[0][0]
- record = XML(str)
- self.load_from_dict(record.todict())
+ xml_record = XML(str)
+ self.load_from_dict(xml_record.todict())
##
# Dump the record to stdout
#
# @param dump_parents if true, then the parents of the GID will be dumped
- def dump(self, dump_parents=False):
+ def dump_text(self, dump_parents=False):
"""
Walk tree and dump records.
"""
- #print "RECORD", self.name
- #print " hrn:", self.name
- #print " type:", self.type
- #print " gid:"
- #if (not self.gid):
- # print " None"
- #else:
- # self.get_gid_object().dump(8, dump_parents)
- #print " pointer:", self.pointer
+ # print core fields in this order
+ print "".join(['=' for i in range(40)])
+ print "RECORD"
+ print " hrn:", self.get('hrn')
+ print " type:", self.get('type')
+ print " authority:", self.get('authority')
+ date_created = datetime_to_string(utcparse(self.get('date_created')))
+ print " date created:", date_created
+ last_updated = datetime_to_string(utcparse(self.get('last_updated')))
+ print " last updated:", last_updated
+ print " gid:"
+ print "\t\t", self.get_gid_object().dump_string(8, dump_parents)
- 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 key in self.fields:
- if key in 'gid' and self[key]:
- gid = GID(string=self[key])
- print " %s:" % key
- gid.dump(8, dump_parents)
- else:
- print " %s: %s" % (key, self[key])
-
+ # print remaining fields
+ all_fields = set(UserRecord.fields.keys() +
+ AuthorityRecord.fields.keys() +
+ SliceRecord.fields.keys() +
+ NodeRecord.fields.keys())
+ for field in self:
+ # dont print core fields
+ if field in all_fields and field not in SfaRecord.fields:
+ print " %s: %s" % (field, self[field])
+
+ def dump(self, format=None, dump_parents=False):
+ if not format:
+ format = 'text'
+ else:
+ format = format.lower()
+
+ if format == 'text':
+ self.dump_text(dump_parents)
+ elif format == 'xml':
+ print self.save_to_string()
+ elif format == 'summary':
+ print self.summary_string()
+ else:
+ raise Exception, "Invalid format %s" % format
+
+ def summary_string(self):
+ return "Record(record_id=%s, hrn=%s, type=%s, authority=%s, pointer=%s)" % \
+ (self.get('record_id'), self.get('hrn'), self.get('type'), self.get('authority'), \
+ self.get('pointer'))
+
def getdict(self):
return dict(self)
-
+
+ def sync(self):
+ """
+ Sync this record with the database.
+ """
+ from sfa.storage.table import SfaTable
+ table = SfaTable()
+ filter = {}
+ if self.get('record_id'):
+ filter['record_id'] = self.get('record_id')
+ if self.get('hrn') and self.get('type'):
+ filter['hrn'] = self.get('hrn')
+ filter['type'] = self.get('type')
+ if self.get('pointer'):
+ filter['pointer'] = self.get('pointer')
+ existing_records = table.find(filter)
+ if not existing_records:
+ table.insert(self)
+ else:
+ existing_record = existing_records[0]
+ self['record_id'] = existing_record['record_id']
+ table.update(self)
+
+ def delete(self):
+ """
+ Remove record from the database.
+ """
+ from sfa.storage.table import SfaTable
+ table = SfaTable()
+ filter = {}
+ if self.get('record_id'):
+ filter['record_id'] = self.get('record_id')
+ if self.get('hrn') and self.get('type'):
+ filter['hrn'] = self.get('hrn')
+ filter['type'] = self.get('type')
+ if self.get('pointer'):
+ filter['pointer'] = self.get('pointer')
+ if filter:
+ existing_records = table.find(filter)
+ for record in existing_records:
+ table.remove(record)
class UserRecord(SfaRecord):
fields = {
'hostname': Parameter(str, 'This nodes dns name'),
'node_type': Parameter(str, 'Type of node this is'),
- 'node_type': Parameter(str, 'Type of node this is'),
'latitude': Parameter(str, 'latitude'),
'longitude': Parameter(str, 'longitude'),
}