def getPerformanceData(vm): def impl(): return _perf.query( ["*"], [vm] ) logger.debug("Controller method %s invoked" % support.discoverCaller() ) d = threads.deferToThread(impl) return d
class CommandExecuter(object): logger = logging.getLogger(support.discoverCaller()) def __init__(self, cmdId, parameters): #parameters is a dict self._cmdId = cmdId self._parameters = parameters def executeCommand(self): """ Executes (or tries to) cmd. Runs cmd, returning a tuple (stdout, stderr) with the contents of the execution """ res = None cmd = self._parameters.pop('cmd') fileForStdin = self._parameters.pop('fileForStdin') try: if fileForStdin: fileForStdin = file(fileForStdin, 'r') except Exception, e: res = defer.fail( ('', str(e), -1) ) #mimic process output self._execResUsage = resource.getrusage( resource.RUSAGE_CHILDREN ) else:
def listAvailableVMs(): def impl(): vbox = _ctx['vbox'] ms = _getMachines() msNames = [ str(m.name) for m in ms ] return msNames logger.debug("Controller method %s invoked" % support.discoverCaller() ) d = threads.deferToThread(impl) return d
def listRunningVMs(): def impl(): vbox = _ctx['vbox'] ms = _getMachines() isRunning = lambda m: m.state == _ctx['ifaces'].MachineState_Running res = filter( isRunning, ms ) res = [ str(m.name) for m in res ] return res logger.debug("Controller method %s invoked" % support.discoverCaller() ) d = threads.deferToThread(impl) return d
def getState( vm): def _getNameForMachineStateCode(c): d = _ctx['ifaces']._Values['MachineState'] revD = [k for (k,v) in d.iteritems() if v == c] return revD[0] logger.debug("Controller method %s invoked" % support.discoverCaller() ) vbox = _ctx['vbox'] m = vbox.findMachine(vm) stateCode = m.state stateName = _getNameForMachineStateCode(stateCode) return stateName
def pause(vm): def impl(): session = _getSessionForVM(vm) console = session.console try: console.pause() finally: session.close() return True logger.debug("Controller method %s invoked" % support.discoverCaller() ) d = threads.deferToThread( impl ) return d
def restoreSnapshot(vm): def impl(): session = _getSessionForVM(vm) console = session.console try: progress = console.discardCurrentState() progress.waitForCompletion(-1) #XXX finally: session.close() return True logger.debug("Controller method %s invoked" % support.discoverCaller() ) d = threads.deferToThread( impl ) return d
def saveState(vm): def impl(): session = _getSessionForVM(vm) console = session.console try: progress = console.saveState() progress.waitForCompletion(WAITING_GRACE_MS) finally: session.close() return True logger.debug("Controller method %s invoked" % support.discoverCaller() ) d = threads.deferToThread( impl ) return d
def powerOff(vm): def impl(): session = _getSessionForVM(vm) console = session.console try: # progress = console.powerDownAsync() # progress.waitForCompletion(-1) #XXX console.powerButton() finally: session.close() return True logger.debug("Controller method %s invoked" % support.discoverCaller() ) d = threads.deferToThread( impl ) return d
def start(vm): vbox = _ctx['vbox'] mgr = _ctx['mgr'] #what an ugly hack this is... if platform.system() != "Windows": def impl(): m = _findMachineByNameOrId(vm) mId = m.id session = mgr.getSessionObject(vbox) logger.info("Starting VM for machine %s" % m.name) progress = vbox.openRemoteSession(session, mId, "vrdp", "") progress.waitForCompletion(WAITING_GRACE_MS) completed = progress.completed logger.info("Startup of machine %s completed: %s" % (m.name, str(completed))) session.close() return True d = threads.deferToThread(impl) else: m = _findMachineByNameOrId(vm) mName = str(m.name) processProtocol = VBoxHeadlessProcessProtocol() pseudoCWD = os.path.dirname(sys.modules[__name__].__file__) vboxBinariesPath = None #TODO: use VBOX_INSTALL_PATH cmdWithPath = os.path.join(pseudoCWD, 'scripts', 'vboxstart.bat') cmdWithArgs = ("vboxstart.bat", vboxBinariesPath, mName) cmdPath = os.path.join(pseudoCWD, 'scripts') newProc = lambda: reactor.spawnProcess( processProtocol, cmdWithPath, args=cmdWithArgs, env=None, path=cmdPath ) reactor.callWhenRunning(newProc) d = True #in order to have a unique return try: _startCollectingPerfData(vm) except: pass #TODO: loggging logger.debug("Controller method %s invoked" % support.discoverCaller() ) return d
#the following two lines should go in a finally:, #but that's not supported by python 2.4 if session.state == _ctx['ifaces'].SessionState_Open: session.close() raise #the following two lines should go in a finally:, #but that's not supported by python 2.4 if session.state == _ctx['ifaces'].SessionState_Open: session.close() return (True, name) logger.debug("Controller method %s invoked" % support.discoverCaller() ) d = threads.deferToThread( impl ) return d ######### internal methods follow ################# def _attachNICs(mutableM): vbox = _ctx['vbox'] def _findHostOnlyInterface(): host = vbox.host for iface in host.getNetworkInterfaces(): if iface.interfaceType == _ctx['ifaces'].HostNetworkInterfaceType_HostOnly: return iface else: raise ValueError('No Host-Only interface found on the host')