X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fserver%2Finterface.py;h=2f4614618d9810918321438302b483f01a8f2067;hb=935de64c2ed3a68566da471c68447a1ac384455d;hp=baeb2e79b2f613607606ec5ae5b8b9d890b8e00f;hpb=de6e581a83658003a2a741348e4fe05e0f9fca95;p=sfa.git diff --git a/sfa/server/interface.py b/sfa/server/interface.py index baeb2e79..2f461461 100644 --- a/sfa/server/interface.py +++ b/sfa/server/interface.py @@ -1,13 +1,5 @@ -import traceback -import os.path - -from sfa.util.faults import * -from sfa.util.storage import XmlStorage -from sfa.util.xrn import get_authority, hrn_to_urn -from sfa.util.record import SfaRecord -import sfa.util.xmlrpcprotocol as xmlrpcprotocol -import sfa.util.soapprotocol as soapprotocol -from sfa.trust.gid import GID +from sfa.client.sfaserverproxy import SfaServerProxy +from sfa.util.xml import XML # GeniLight client support is optional try: @@ -15,10 +7,11 @@ try: except ImportError: GeniClientLight = None - - class Interface: - + """ + Interface to another SFA service, typically a peer, or the local aggregate + can retrieve a xmlrpclib.ServerProxy object for issuing calls there + """ def __init__(self, hrn, addr, port, client_type='sfa'): self.hrn = hrn self.addr = addr @@ -31,12 +24,13 @@ class Interface: url = "http://%s" % "/".join(address_parts) return url - def get_server(self, key_file, cert_file, timeout=30): + def server_proxy(self, key_file, cert_file, timeout=30): server = None if self.client_type == 'geniclientlight' and GeniClientLight: + # xxx url and self.api are undefined server = GeniClientLight(url, self.api.key_file, self.api.cert_file) else: - server = xmlrpcprotocol.get_server(self.get_url(), key_file, cert_file, timeout) + server = SfaServerProxy(self.get_url(), key_file, cert_file, timeout) return server ## @@ -62,21 +56,20 @@ class Interfaces(dict): def __init__(self, conf_file): dict.__init__(self, {}) # load config file - self.interface_info = XmlStorage(conf_file, self.default_dict) - self.interface_info.load() - records = self.interface_info.values()[0].values()[0] - if not isinstance(records, list): - records = [records] - - required_fields = self.default_fields.keys() - for record in records: - if not set(required_fields).issubset(record.keys()): - continue - # port is appended onto the domain, before the path. Should look like: - # http://domain:port/path - hrn, address, port = record['hrn'], record['addr'], record['port'] - interface = Interface(hrn, address, port) - self[hrn] = interface + required_fields = set(self.default_fields.keys()) + self.interface_info = XML(conf_file).todict() + for value in self.interface_info.values(): + if isinstance(value, list): + for record in value: + if isinstance(record, dict) and \ + required_fields.issubset(record.keys()): + hrn, address, port = record['hrn'], record['addr'], record['port'] + # sometime this is called at a very early stage with no config loaded + # avoid to remember this instance in such a case + if not address or not port: + continue + interface = Interface(hrn, address, port) + self[hrn] = interface - def get_server(self, hrn, key_file, cert_file, timeout=30): - return self[hrn].get_server(key_file, cert_file, timeout) + def server_proxy(self, hrn, key_file, cert_file, timeout=30): + return self[hrn].server_proxy(key_file, cert_file, timeout)