import sys import xmlrpclib import socket from urlparse import urlparse from sfa.util.sfalogging import logger class OpenstackShell: """ A simple xmlrpc shell to a myplc instance This class can receive all Openstack calls to the underlying testbed """ # dont care about limiting calls yet direct_calls = [] alias_calls = {} # 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; # 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 except: pass # Openstack provides a RESTful api but it is very limited, so we will # ignore it for now and always use the native openstack (nova) library. # This of course will not work if sfa is not installed on the same machine # as the openstack-compute package. if is_local: try: from nova.auth.manager import AuthManager, db, context direct_access=True except: direct_access=False if is_local and direct_access: logger.debug('openstack access - native') self.auth = context.get_admin_context() # AuthManager isnt' really useful for much yet but it's # more convenient to use than the db reference which requires # a context. Lets hold onto the AuthManager reference for now. #self.proxy = AuthManager() self.auth_manager = AuthManager() self.proxy = db else: self.auth = None self.proxy = None logger.debug('openstack access - REST') raise SfaNotImplemented('openstack access - Rest') def __getattr__(self, name): def func(*args, **kwds): result=getattr(self.proxy, name)(self.auth, *args, **kwds) return result return func