예제 #1
0
def getPerformanceData(vm):
  def impl():
    return _perf.query( ["*"], [vm] )
    
  logger.debug("Controller method %s invoked" % support.discoverCaller() )
  d = threads.deferToThread(impl)
  return d
예제 #2
0
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:
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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
예제 #6
0
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
예제 #7
0
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
예제 #8
0
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
예제 #9
0
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
예제 #10
0
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
예제 #11
0
      #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')