import sys import socket from urlparse import urlparse from sfa.util.sfalogging import logger from sfa.util.py23 import xmlrpc_client class NitosShell: """ A simple xmlrpc shell to a NITOS Scheduler instance This class can receive all NITOS API calls to the underlying testbed For safety this is limited to a set of hard-coded calls """ direct_calls = ['getNodes', 'getChannels', 'getSlices', 'getUsers', 'getReservedNodes', 'getReservedChannels', 'getTestbedInfo', 'reserveNodes', 'reserveChannels', 'addSlice', 'addUser', 'addUserToSlice', 'addUserKey', 'addNode', 'addChannel', 'updateReservedNodes', 'updateReservedChannels', 'updateSlice', 'updateUser', 'updateNode', 'updateChannel', 'deleteNode', 'deleteChannel', 'deleteSlice', 'deleteUser', 'deleteUserFromSLice', 'deleteKey', 'releaseNodes', 'releaseChannels' ] # use the 'capability' auth mechanism for higher performance when the PLC # db is local def __init__(self, config): url = config.SFA_NITOS_URL self.proxy = xmlrpc_client.ServerProxy( url, verbose=False, allow_none=True) def __getattr__(self, name): def func(*args, **kwds): actual_name = None if name in NitosShell.direct_calls: actual_name = name if not actual_name: raise Exception( "Illegal method call %s for NITOS driver" % (name)) actual_name = "scheduler.server." + actual_name result = getattr(self.proxy, actual_name)(*args, **kwds) logger.debug('NitosShell %s (%s) returned ... ' % (name, actual_name)) return result return func