added get_server
[sfa.git] / sfa / plc / api.py
index 8d0e806..9891410 100644 (file)
@@ -107,6 +107,7 @@ class SfaAPI(BaseAPI):
         self.hrn = self.config.SFA_INTERFACE_HRN
         self.time_format = "%Y-%m-%d %H:%M:%S"
 
+    
     def getPLCShell(self):
         self.plauth = {'Username': self.config.SFA_PLC_USER,
                        'AuthMethod': 'password',
@@ -127,6 +128,26 @@ class SfaAPI(BaseAPI):
         shell = xmlrpclib.Server(url, verbose = 0, allow_none = True)
         return shell
 
+    def get_server(self, interface, cred, timeout=30):
+        """
+        Returns a connection to the specified interface. Use the specified
+        credential to determine the caller and look for the caller's key/cert 
+        in the registry hierarchy cache. 
+        """       
+        from sfa.trust.hierarchy import Hierarchy
+        if not isinstance(cred, Credential):
+            cred_obj = Credential(string=cred)
+        else:
+            cred_obj = cred
+        caller_gid = cred_obj.get_gid_caller()
+        hierarchy = Hierarchy()
+        auth_info = hierarchy.get_auth_info(caller_gid.get_hrn())
+        key_file = auth_info.get_privkey_filename()
+        cert_file = auth_info.get_gid_filename()
+        server = interface.get_server(key_file, cert_file, timeout)
+        return server
+               
+        
     def getCredential(self):
         """
         Return a valid credential for this interface. 
@@ -140,7 +161,7 @@ class SfaAPI(BaseAPI):
             cred = Credential(filename = cred_filename)
             # make sure cred isnt expired
             if not cred.get_expiration or \
-               datetime.datetime.today() < cred.get_expiration():    
+               datetime.datetime.utcnow() < cred.get_expiration():    
                 return cred.save_to_string(save_parents=True)
 
         # get a new credential
@@ -160,7 +181,7 @@ class SfaAPI(BaseAPI):
         """
         if creds and not isinstance(creds, list): 
             creds = [creds]
-        delegated_creds = filter_creds_by_caller(creds,self.hrn)
+        delegated_creds = filter_creds_by_caller(creds, [self.hrn, self.hrn + '.slicemanager'])
         if not delegated_creds:
             return None
         return delegated_creds[0]
@@ -170,8 +191,8 @@ class SfaAPI(BaseAPI):
         Get our credential from a remote registry 
         """
         from sfa.server.registry import Registries
-        registries = Registries(self)
-        registry = registries[self.hrn]
+        registries = Registries()
+        registry = registries.get_server(self.hrn, self.key_file, self.cert_file)
         cert_string=self.cert.save_to_string(save_parents=True)
         # get self credential
         self_cred = registry.GetSelfCredential(cert_string, self.hrn, 'authority')
@@ -226,6 +247,8 @@ class SfaAPI(BaseAPI):
         except IOError:
             self.credential = self.getCredentialFromRegistry()
 
+
+
     ##
     # Convert SFA fields to PLC fields for use when registering up updating
     # registry record in the PLC database
@@ -505,7 +528,8 @@ class SfaAPI(BaseAPI):
             elif (type.startswith("authority")):
                 record['url'] = None
                 if record['hrn'] in self.aggregates:
-                    record['url'] = self.aggregates[record['hrn']].url
+                    
+                    record['url'] = self.aggregates[record['hrn']].get_url()
 
                 if record['pointer'] != -1:
                     record['PI'] = []