fix bug in connectRegistries:
[sfa.git] / geni / registry.py
index e792c55..bcd1e8d 100644 (file)
@@ -113,7 +113,6 @@ class Registry(GeniServer):
         self.registry_info = XmlStorage(registries_file, {'registries': {'registry': [connection_dict]}})
         self.registry_info.load()
         self.connectRegistry()
-        self.loadCredential()
         self.connectRegistries()
         
  
@@ -156,7 +155,9 @@ class Registry(GeniServer):
         """
 
         # see if this file exists
-        ma_cred_filename = self.server_basedir + os.sep + "reg." + self.hrn + ".sa.cred"
+        # XX This is really the aggregate's credential. Using this is easier than getting
+        # the registry's credential from iteslf (ssl errors).   
+        ma_cred_filename = self.server_basedir + os.sep + "agg." + self.hrn + ".ma.cred"
         try:
             self.credential = Credential(filename = ma_cred_filename)
         except IOError:
@@ -193,13 +194,18 @@ class Registry(GeniServer):
         create an GeniClient connection to each. 
         """
         self.registries= {}
+        required_fields = ['hrn', 'addr', 'port']
         registries = self.registry_info['registries']['registry']
         if isinstance(registries, dict):
             registries = [registries]
         if isinstance(registries, list):
             for registry in registries:
                 # create xmlrpc connection using GeniClient
+                if not set(required_fields).issubset(registry.keys()):
+                    continue  
                 hrn, address, port = registry['hrn'], registry['addr'], registry['port']
+                if not hrn or not address or not port:
+                    continue
                 url = 'http://%(address)s:%(port)s' % locals()
                 self.registries[hrn] = GeniClient(url, self.key_file, self.cert_file)
 
@@ -304,6 +310,12 @@ class Registry(GeniServer):
             pl_res = self.shell.GetSlices(self.pl_auth, [pointer])
         elif (type == "user"):
             pl_res = self.shell.GetPersons(self.pl_auth, [pointer])
+            key_ids = pl_res[0]['key_ids']
+            keys = self.shell.GetKeys(self.pl_auth, key_ids)
+            pubkeys = []
+            if keys:
+                pubkeys = [key['key'] for key in keys]
+            pl_res[0]['keys'] = pubkeys
         elif (type == "node"):
             pl_res = self.shell.GetNodes(self.pl_auth, [pointer])
         else:
@@ -765,8 +777,16 @@ class Registry(GeniServer):
 
     def resolve(self, cred, name):
         self.decode_authentication(cred, "resolve")
+        
+        try:
+            records = self.resolve_raw("*", name)
+        except:
+            records = []
+            for registry in self.registries:
+                if name.startswith(registry):
+                    records = self.registries[registry].resolve(self.credential, name)
+                
 
-        records = self.resolve_raw("*", name)
         dicts = []
         for record in records:
             dicts.append(record.as_dict())
@@ -931,7 +951,7 @@ class Registry(GeniServer):
 
     def get_credential(self, cred, type, name):
         if not cred:
-            return get_self_credential(self, type, name)
+            return self.get_self_credential(type, name)
 
         self.decode_authentication(cred, "getcredential")