X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fplanetlab%2Fplshell.py;fp=sfa%2Fplanetlab%2Fplshell.py;h=8877f410e7c034f24884a65b97feefd623220130;hb=04a3f20dc71bf8b3f96b1e3172623aa346a638a7;hp=15c58b69cd0647723e33de51e3785205ac8ae14e;hpb=c1c136b3042a24604823c6da135308b7c031c234;p=sfa.git diff --git a/sfa/planetlab/plshell.py b/sfa/planetlab/plshell.py index 15c58b69..8877f410 100644 --- a/sfa/planetlab/plshell.py +++ b/sfa/planetlab/plshell.py @@ -5,13 +5,14 @@ from urlparse import urlparse from sfa.util.sfalogging import logger + class PlShell: """ A simple xmlrpc shell to a myplc instance This class can receive all PLCAPI calls to the underlying testbed For safety this is limited to a set of hard-coded calls """ - + direct_calls = ['AddNode', 'AddPerson', 'AddPersonKey', 'AddPersonToSite', 'AddPersonToSlice', 'AddRoleToPerson', 'AddSite', 'AddSiteTag', 'AddSlice', 'AddSliceTag', 'AddSliceToNodes', 'BindObjectToPeer', 'DeleteKey', @@ -22,9 +23,9 @@ class PlShell: 'UnBindObjectFromPeer', 'UpdateNode', 'UpdatePerson', 'UpdateSite', 'UpdateSlice', 'UpdateSliceTag', # also used as-is in importer - 'GetSites','GetNodes', + 'GetSites', 'GetNodes', # Lease management methods - 'GetLeases', 'GetLeaseGranularity', 'DeleteLeases','UpdateLeases', + 'GetLeases', 'GetLeaseGranularity', 'DeleteLeases', 'UpdateLeases', 'AddLeases', # HRN management methods 'SetPersonHrn', 'GetPersonHrn', 'SetSliceHrn', 'GetSliceHrn', @@ -32,65 +33,72 @@ class PlShell: # Tag slice/person/site created by SFA 'SetPersonSfaCreated', 'GetPersonSfaCreated', 'SetSliceSfaCreated', 'GetSliceSfaCreated', 'SetNodeSfaCreated', 'GetNodeSfaCreated', - 'GetSiteSfaCreated', 'SetSiteSfaCreated', + 'GetSiteSfaCreated', 'SetSiteSfaCreated', ] # support for other names - this is experimental - alias_calls = { 'get_authorities':'GetSites', - 'get_nodes':'GetNodes', - } - + alias_calls = {'get_authorities': 'GetSites', + 'get_nodes': 'GetNodes', + } - # use the 'capability' auth mechanism for higher performance when the PLC db is local - def __init__ ( self, config ) : + # use the 'capability' auth mechanism for higher performance when the PLC + # db is local + def __init__(self, config): url = config.SFA_PLC_URL # try to figure if the url is local - hostname=urlparse(url).hostname - is_local=False - if hostname == 'localhost': is_local=True - # otherwise compare IP addresses; + hostname = urlparse(url).hostname + is_local = False + if hostname == 'localhost': + is_local = True + # otherwise compare IP addresses; # this might fail for any number of reasons, so let's harden that try: # xxx todo this seems to result in a DNS request for each incoming request to the AM # should be cached or improved - url_ip=socket.gethostbyname(hostname) - local_ip=socket.gethostbyname(socket.gethostname()) - if url_ip==local_ip: is_local=True + url_ip = socket.gethostbyname(hostname) + local_ip = socket.gethostbyname(socket.gethostname()) + if url_ip == local_ip: + is_local = True except: pass if is_local: try: # too bad this is not installed properly - plcapi_path="/usr/share/plc_api" - if plcapi_path not in sys.path: sys.path.append(plcapi_path) + plcapi_path = "/usr/share/plc_api" + if plcapi_path not in sys.path: + sys.path.append(plcapi_path) import PLC.Shell - plc_direct_access=True + plc_direct_access = True except: - plc_direct_access=False + plc_direct_access = False if is_local and plc_direct_access: logger.info('plshell access - capability') - self.plauth = { 'AuthMethod': 'capability', - 'Username': str(config.SFA_PLC_USER), - 'AuthString': str(config.SFA_PLC_PASSWORD), - } - self.proxy = PLC.Shell.Shell () + self.plauth = {'AuthMethod': 'capability', + 'Username': str(config.SFA_PLC_USER), + 'AuthString': str(config.SFA_PLC_PASSWORD), + } + self.proxy = PLC.Shell.Shell() else: logger.info('plshell access - xmlrpc') - self.plauth = { 'AuthMethod': 'password', - 'Username': str(config.SFA_PLC_USER), - 'AuthString': str(config.SFA_PLC_PASSWORD), - } - self.proxy = xmlrpclib.Server(url, verbose = False, allow_none = True) + self.plauth = {'AuthMethod': 'password', + 'Username': str(config.SFA_PLC_USER), + 'AuthString': str(config.SFA_PLC_PASSWORD), + } + self.proxy = xmlrpclib.Server(url, verbose=False, allow_none=True) def __getattr__(self, name): def func(*args, **kwds): - actual_name=None - if name in PlShell.direct_calls: actual_name=name - if name in PlShell.alias_calls: actual_name=PlShell.alias_calls[name] + actual_name = None + if name in PlShell.direct_calls: + actual_name = name + if name in PlShell.alias_calls: + actual_name = PlShell.alias_calls[name] if not actual_name: - raise Exception("Illegal method call %s for PL driver"%(name)) - result=getattr(self.proxy, actual_name)(self.plauth, *args, **kwds) - logger.debug('PlShell %s (%s) returned ... '%(name,actual_name)) + raise Exception( + "Illegal method call %s for PL driver" % (name)) + result = getattr(self.proxy, actual_name)( + self.plauth, *args, **kwds) + logger.debug('PlShell %s (%s) returned ... ' % (name, actual_name)) return result return func