diff options
Diffstat (limited to 'test-framework/vmware/virtualmachine.py')
-rw-r--r-- | test-framework/vmware/virtualmachine.py | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/test-framework/vmware/virtualmachine.py b/test-framework/vmware/virtualmachine.py new file mode 100644 index 000000000..7507cd531 --- /dev/null +++ b/test-framework/vmware/virtualmachine.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- +import commands, ConfigParser, os, string, utils, platform + +class VMException(Exception): + def __init__(self, value): + self.value = value + def __str__(self): + return repr(self.value) + +class VirtualMachine: + def __init__( self, vmrun, vmx, username, password, tempDir, ostype ): + self._vmrun = vmrun + self._vmx = vmx + self._username = username + self._password = password + self._tempDir = tempDir + self._ostype = ostype + self._useGui = True + self._name = "no name" + self._hostType = "" + self._hostLocation = None + self._hostUsername = None + self._hostPassword = None + + def setGuiEnabled( self, usegui ): + self._useGui = usegui + + def name( self ): + return self._name + + def isRemote( self ): + return len( self._hostType ) > 0; + + def setRemoteHost( self, type, loc, user, pw ): + self._hostType = type + self._hostLocation = loc + self._hostUsername = user + self._hostPassword = pw + + + def command( self, message, command, parameters=None ): + if len( self._hostType ) > 0: + remote = "-T {0} -h '{1}' -u {2} -p {3}".format( self._hostType, self._hostLocation, self._hostUsername, self._hostPassword ) + else: + remote = "" + vmcommand = "'{0}' {1} -gu {2} -gp {3} {4} '{5}' ".format( self._vmrun, remote, self._username, self._password, command, self._vmx ) + if parameters: + vmcommand += parameters + print "** " + message + status, output = commands.getstatusoutput(vmcommand) + if status != 0: + print "* Return code: {0}".format(status) + print "* Output:" + print output + print + return status, output + + def copyFileToGuest( self, source, target ): + #TODO convert paths to guest system? + status, _ = self.command( 'Copying {0} to {1}'.format( source, target ), 'copyFileFromHostToGuest', "'{0}' '{1}'".format( source, target ) ) + if status != 0: + raise VMException( "Could not copy from host to guest: source {0} target {1}".format( source, target ) ) + + def copyFileFromGuest( self, source, target ): + #TODO convert paths to guest system? + status, _ = self.command( 'Copying {0} to {1}'.format( source, target ), 'copyFileFromGuestToHost', "'{0}' '{1}'".format( source, target ) ) + if status != 0: + raise VMException( "Could not copy from guest to host: source {0} target {1}".format( source, target ) ) + + + def ostype( self ): + return self._ostype + + def vmxPath( self ): + return self._vmx + + def mkTempPath( self, filename ): + return self._tempDir + self.pathSep() + utils.basename( filename ) + + def pathSep( self ): + if self._ostype == "windows": + return "\\" + else: + return "/" + + def copyToTemp( self, source, targetN=None ): + if source == None or len( string.strip( source ) ) == 0: + return None + if targetN == None: + targetN = source + + target = self.mkTempPath( targetN ) + self.copyFileToGuest( source, target ) + return target + + def copyFromTemp( self, filename, target ): + source = self.mkTempPath( filename ) + self.copyFileFromGuest( source, target ) + return target + + def start( self ): + arg = "gui" if self._useGui else "nogui" + self.command("Starting VM ({0})".format( arg ), "start", arg ) + + def kill( self ): + self.command("Stopping VM", "stop", "hard" ) + + def isRunning( self ): + _, vmList = self.command("Checking running VMs", "list") + _, _, vmFilename = self._vmx.rpartition( os.sep ) + return vmList.find(vmFilename) is not -1 + + def snapshotExists( self, snapshot ): + _, output = self.command("Checking snapshots", "listSnapshots") + snapshotList = output.split("\n") + # Remove first entry which contains number of snapshots + snapshotList.pop(0) + return snapshotList.count( snapshot ) > 0 + + def checkPythonInstalled( self ): + pp = utils.unixPathSep( self._python ) + pythonStatus, _ = self.command("Checking for guest installed Python", "fileExistsInGuest", pp ) + print pythonStatus + if pythonStatus != 0: + raise VMException("Could not find python in {0}: Please specify the path/install Python in the VM from http://www.python.org/download/".format( pp ) ) + else: + print("Python found ({0})".format( pp ) ) + + def python( self ): + return self._python + + def snapshot( self ): + return self._snapshot + + def revertToSnapshot( self, snapshot=None ): + if snapshot != None: + snap = snapshot + else: + snap = self._snapshot + # VMware Fusion needs to be closed before you can restore snapshots so kill it + if ( platform.system() == "Darwin" ): + commands.getstatusoutput( "ps x|grep 'VMware Fusion'|cut -d ' ' -f1|xargs kill" ) + return self.command("Reverting to '{0}' snapshot".format( snap ), "revertToSnapshot", snap ) + + def createSnapshot( self, name ): + return self.command("Creating error snapshot '{0}'".format( name ), "snapshot", name ) + + +def fromVMRunAndPath( vmrun, path ): + config = ConfigParser.SafeConfigParser() + config.read( path ) + + hostType = utils.get_config_option( config, None, "type", "", "Host" ) + hostLocation = utils.get_config_option( config, None, "location", "", "Host" ) + hostUsername = utils.get_config_option( config, None, "username", "", "Host" ) + hostPassword = utils.get_config_option( config, None, "password", "", "Host" ) + + vmxVal = utils.get_config_option( config, None, "vmx" ) + if not len( hostType ) == 0: + vmx = utils.makeAbsolutePath( vmxVal, os.path.dirname( path ) ) + else: + vmx = vmxVal + + username = utils.get_config_option( config, None, "username", "nokia" ) + password = utils.get_config_option( config, None, "password", "nokia" ) + tempDir = utils.get_config_option( config, None, "tempDir", "c:\\windows\\temp" ) + ostype = utils.get_config_option( config, None, "os", "windows" ) + + vm = VirtualMachine( vmrun, vmx, username, password, tempDir, ostype ) + vm._name = utils.get_config_option( config, None, "name", utils.basename( path ) ) + vm._snapshot = utils.get_config_option( config, None, "snapshot", "base" ) + vm._python = utils.get_config_option( config, None, "python", "c:/python26/python.exe" ) + vm._hostType = hostType + vm._hostLocation = hostLocation + vm._hostUsername = hostUsername + vm._hostPassword = hostPassword + return vm |