resolve conflict manually
[sfa.git] / sfa / server / interface.py
index a2ef36e..7ae027d 100644 (file)
@@ -5,15 +5,13 @@
 
 from sfa.util.faults import *
 from sfa.util.storage import *
 
 from sfa.util.faults import *
 from sfa.util.storage import *
-from sfa.util.namespace import *
+from sfa.util.namespace import get_authority, hrn_to_urn
 from sfa.trust.gid import GID
 from sfa.trust.gid import GID
-from sfa.util.table import SfaTable
 from sfa.util.record import SfaRecord
 import traceback
 import sfa.util.xmlrpcprotocol as xmlrpcprotocol
 import sfa.util.soapprotocol as soapprotocol
 
 from sfa.util.record import SfaRecord
 import traceback
 import sfa.util.xmlrpcprotocol as xmlrpcprotocol
 import sfa.util.soapprotocol as soapprotocol
 
-
 # GeniLight client support is optional
 try:
     from egeni.geniLight_client import *
 # GeniLight client support is optional
 try:
     from egeni.geniLight_client import *
@@ -60,6 +58,13 @@ class Interfaces(dict):
         interfaces = self.interface_info.values()[0].values()[0]
         if not isinstance(interfaces, list):
             interfaces = [self.interfaces]
         interfaces = self.interface_info.values()[0].values()[0]
         if not isinstance(interfaces, list):
             interfaces = [self.interfaces]
+        # set the url and urn 
+        for interface in interfaces:
+            hrn, address, port = interface['hrn'], interface['addr'], interface['port']
+            url = 'http://%(address)s:%(port)s' % locals()
+            interface['url'] = url
+            interface['urn'] = hrn_to_urn(hrn, 'authority')
+    
         self.interfaces = {}
         required_fields = self.default_fields.keys()
         for interface in interfaces:
         self.interfaces = {}
         required_fields = self.default_fields.keys()
         for interface in interfaces:
@@ -87,8 +92,8 @@ class Interfaces(dict):
         hrns_current = [gid.get_hrn() for gid in gids_current] 
         hrns_expected = self.interfaces.keys() 
         new_hrns = set(hrns_expected).difference(hrns_current)
         hrns_current = [gid.get_hrn() for gid in gids_current] 
         hrns_expected = self.interfaces.keys() 
         new_hrns = set(hrns_expected).difference(hrns_current)
-        gids = self.get_peer_gids(new_hrns)
-        # update the local db records for these registries
+        gids = self.get_peer_gids(new_hrns) + gids_current
+        # make sure there is a record for every gid
         self.update_db_records(self.type, gids)
         
     def get_peer_gids(self, new_hrns):
         self.update_db_records(self.type, gids)
         
     def get_peer_gids(self, new_hrns):
@@ -130,8 +135,7 @@ class Interfaces(dict):
             except:
                 message = "interface: %s\tunable to install trusted gid for %s" % \
                             (self.api.interface, new_hrn) 
             except:
                 message = "interface: %s\tunable to install trusted gid for %s" % \
                             (self.api.interface, new_hrn) 
-                self.api.logger.info(message)
-                traceback.print_exc()
+                self.api.logger.log_exc(message)
         
         # reload the trusted certs list
         self.api.auth.load_trusted_certs()
         
         # reload the trusted certs list
         self.api.auth.load_trusted_certs()
@@ -143,13 +147,13 @@ class Interfaces(dict):
         defined in the config file (registries.xml). Removes old records from
         the db.         
         """
         defined in the config file (registries.xml). Removes old records from
         the db.         
         """
+        # import SfaTable here so this module can be loaded by ComponentAPI 
+        from sfa.util.table import SfaTable
         if not gids: 
             return
         if not gids: 
             return
-        # get hrns we expect to find
-        # ignore records for local interfaces
-        ignore_interfaces = [self.api.config.SFA_INTERFACE_HRN]
-        hrns_expected = [gid.get_hrn() for gid in gids \
-                         if gid.get_hrn() not in ignore_interfaces]
+        
+        # hrns that should have a record
+        hrns_expected = [gid.get_hrn() for gid in gids]
 
         # get hrns that actually exist in the db
         table = SfaTable()
 
         # get hrns that actually exist in the db
         table = SfaTable()
@@ -158,7 +162,8 @@ class Interfaces(dict):
       
         # remove old records
         for record in records:
       
         # remove old records
         for record in records:
-            if record['hrn'] not in hrns_expected:
+            if record['hrn'] not in hrns_expected and \
+                record['hrn'] != self.api.config.SFA_INTERFACE_HRN:
                 table.remove(record)
 
         # add new records
                 table.remove(record)
 
         # add new records
@@ -184,12 +189,8 @@ class Interfaces(dict):
         required_fields = self.default_fields.keys()
         for interface in self.interfaces.values():
             # make sure the required fields are present and not null
         required_fields = self.default_fields.keys()
         for interface in self.interfaces.values():
             # make sure the required fields are present and not null
-            if not all([interface.get(key) for key in required_fields]):
-                continue
-            
-            hrn, address, port = interface['hrn'], interface['addr'], interface['port']
-            url = 'http://%(address)s:%(port)s' % locals()
             
             
+            url = interface['url']
             # check which client we should use
             # sfa.util.xmlrpcprotocol is default
             client_type = 'xmlrpcprotocol'
             # check which client we should use
             # sfa.util.xmlrpcprotocol is default
             client_type = 'xmlrpcprotocol'
@@ -199,6 +200,6 @@ class Interfaces(dict):
                 client_type = 'geniclientlight'
                 connections[hrn] = GeniClientLight(url, self.api.key_file, self.api.cert_file) 
             else:
                 client_type = 'geniclientlight'
                 connections[hrn] = GeniClientLight(url, self.api.key_file, self.api.cert_file) 
             else:
-                connections[hrn] = xmlrpcprotocol.get_server(url, self.api.key_file, self.api.cert_file)
+                connections[interface['hrn']] = xmlrpcprotocol.get_server(url, self.api.key_file, self.api.cert_file)
 
         return connections 
 
         return connections