updates for MAX aggregate
[sfa.git] / sfa / plc / api.py
index 7e68a6b..a5d5f2a 100644 (file)
@@ -6,6 +6,7 @@ import sys
 import os
 import traceback
 import string
+import datetime
 import xmlrpclib
 
 from sfa.util.faults import *
@@ -17,7 +18,8 @@ from sfa.trust.auth import Auth
 from sfa.trust.rights import Right, Rights, determine_rights
 from sfa.trust.credential import Credential,Keypair
 from sfa.trust.certificate import Certificate
-from sfa.util.namespace import get_authority, hrn_to_pl_slicename, hrn_to_pl_slicename, hrn_to_urn, slicename_to_hrn, hostname_to_hrn
+from sfa.util.xrn import get_authority, hrn_to_urn
+from sfa.util.plxrn import hostname_to_hrn, hrn_to_pl_slicename, hrn_to_pl_slicename, slicename_to_hrn
 from sfa.util.nodemanager import NodeManager
 try:
     from collections import defaultdict
@@ -97,7 +99,8 @@ class SfaAPI(BaseAPI):
         self.credential = None
         # Initialize the PLC shell only if SFA wraps a myPLC
         rspec_type = self.config.get_aggregate_type()
-        if (rspec_type == 'pl' or rspec_type == 'vini' or rspec_type == 'eucalyptus'):
+        if (rspec_type == 'pl' or rspec_type == 'vini' or \
+            rspec_type == 'eucalyptus' or rspec_type == 'max'):
             self.plshell = self.getPLCShell()
             self.plshell_version = "4.3"
 
@@ -125,10 +128,27 @@ class SfaAPI(BaseAPI):
         """
         Return a valid credential for this interface. 
         """
+        type = 'authority'
+        path = self.config.SFA_DATA_DIR
+        filename = ".".join([self.interface, self.hrn, type, "cred"])
+        cred_filename = path + os.sep + filename
+        cred = None
+        if os.path.isfile(cred_filename):
+            cred = Credential(filename = cred_filename)
+            # make sure cred isnt expired
+            if not cred.get_expiration or \
+               datetime.datetime.today() < cred.get_expiration():    
+                return cred.save_to_string(save_parents=True)
+
+        # get a new credential
         if self.interface in ['registry']:
-            return self.getCredentialFromLocalRegistry()
+            cred =  self.__getCredentialRaw()
         else:
-            return self.getCredentialFromRegistry()
+            cred =  self.__getCredential()
+        cred.save_to_file(cred_filename, save_parents=True)
+
+        return cred.save_to_string(save_parents=True)
+
 
     def getDelegatedCredential(self, creds):
         """
@@ -142,32 +162,21 @@ class SfaAPI(BaseAPI):
             return None
         return delegated_creds[0]
  
-    def getCredentialFromRegistry(self):
+    def __getCredential(self):
         """ 
         Get our credential from a remote registry 
         """
-        type = 'authority'
-        path = self.config.SFA_DATA_DIR
-        filename = ".".join([self.interface, self.hrn, type, "cred"])
-        cred_filename = path + os.sep + filename
-        try:
-            credential = Credential(filename = cred_filename)
-            return credential.save_to_string(save_parents=True)
-        except IOError:
-            from sfa.server.registry import Registries
-            registries = Registries(self)
-            registry = registries[self.hrn]
-            cert_string=self.cert.save_to_string(save_parents=True)
-            # get self credential
-            self_cred = registry.GetSelfCredential(cert_string, self.hrn, type)
-            # get credential
-            cred = registry.GetCredential(self_cred, self.hrn, type)
-            
-            # save cred to file
-            Credential(string=cred).save_to_file(cred_filename, save_parents=True)
-            return cred
-
-    def getCredentialFromLocalRegistry(self):
+        from sfa.server.registry import Registries
+        registries = Registries(self)
+        registry = registries[self.hrn]
+        cert_string=self.cert.save_to_string(save_parents=True)
+        # get self credential
+        self_cred = registry.GetSelfCredential(cert_string, self.hrn, 'authority')
+        # get credential
+        cred = registry.GetCredential(self_cred, self.hrn, 'authority')
+        return Credential(string=cred)
+
+    def __getCredentialRaw(self):
         """
         Get our current credential directly from the local registry.
         """
@@ -193,15 +202,10 @@ class SfaAPI(BaseAPI):
         
         r1 = determine_rights(type, hrn)
         new_cred.set_privileges(r1)
-
-        auth_kind = "authority,ma,sa"
-
-        new_cred.set_parent(self.auth.hierarchy.get_auth_cred(auth_hrn, kind=auth_kind))
-
         new_cred.encode()
         new_cred.sign()
 
-        return new_cred.save_to_string(save_parents=True)
+        return new_cred
    
 
     def loadCredential (self):
@@ -335,8 +339,11 @@ class SfaAPI(BaseAPI):
                         break
             # fill in key info
             if record['type'] == 'user':
-                pubkeys = [keys[key_id]['key'] for key_id in record['key_ids'] if key_id in keys] 
-                record['keys'] = pubkeys
+                if 'key_ids' not in record:
+                    self.logger.info("user record has no 'key_ids' - need to import from myplc ?")
+                else:
+                    pubkeys = [keys[key_id]['key'] for key_id in record['key_ids'] if key_id in keys] 
+                    record['keys'] = pubkeys
 
         # fill in record hrns
         records = self.fill_record_hrns(records)