r286 - trunk/v7
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-01-12 16:14:15 +0000 (Tue, 12 Jan 2010)
New Revision: 286
Modified:
trunk/v7/test.py
Log:
488145 - FEAT: HTS should provide a run-time dependency option for installation
Modified: trunk/v7/test.py
===================================================================
--- trunk/v7/test.py 2010-01-12 16:13:59 UTC (rev 285)
+++ trunk/v7/test.py 2010-01-12 16:14:15 UTC (rev 286)
@@ -399,4 +399,7 @@
return self.virtualization
-
+ def getRequiredRPMs(self):
+ """Test should implement this method if they have package
+ requirements dependant on hardware or RHEL release"""
+ return list()
14 years, 4 months
r285 - trunk/v7
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-01-12 16:13:59 +0000 (Tue, 12 Jan 2010)
New Revision: 285
Modified:
trunk/v7/hardwaretest.py
Log:
488145 - FEAT: HTS should provide a run-time dependency option for installation
Modified: trunk/v7/hardwaretest.py
===================================================================
--- trunk/v7/hardwaretest.py 2010-01-12 16:03:31 UTC (rev 284)
+++ trunk/v7/hardwaretest.py 2010-01-12 16:13:59 UTC (rev 285)
@@ -220,13 +220,18 @@
print "Hardware: %s %s %s" % (self.certification.getHardware(Tags.vendor),
self.certification.getHardware(Tags.make),
self.certification.getHardware(Tags.model))
- self.certification.setOS(Tags.name, self.getReleaseName())
- releaseNumber = self.getReleaseNumber()
- if releaseNumber:
- self.certification.setOS(Tags.release, releaseNumber)
+ (product, name, number) = self.getRedHatRelease()
+ self.certification.setOS(Tags.name, name)
+ if number:
+ self.certification.setOS(Tags.release, number)
else:
print "Error: could not determine OS release number"
- return False
+ return False
+ if product:
+ self.certification.setOS(Tags.product, product)
+ else:
+ print "Error: could not determine OS product name"
+ return False
print "OS: %s %s" % (self.certification.getOS(Tags.name), self.certification.getOS(Tags.release))
hostname = socket.gethostname()
if hostname:
@@ -272,6 +277,7 @@
if not self.certification:
self.doDiscover()
self.saveNewPlan(tests)
+ self.checkRequiredRPMs(tests)
else:
if not self.checkPlan():
return False
@@ -347,6 +353,56 @@
missingTests[key].markDeleted()
return True
+
+ def checkRequiredRPMs(self, tests):
+ print "Checking for additional required packages based on the test plan:"
+ requiredRPMs = dict()
+ for test in tests:
+ rpms = test.getRequiredRPMs()
+ if len(rpms) > 0:
+ sys.stdout.write(test.Name() + " requires ")
+ needComma = False
+ for rpm in rpms:
+ if needComma:
+ sys.stdout.write(", ")
+ needComma = True
+ sys.stdout.write(rpm)
+ requiredRPMs[rpm] = rpm
+ sys.stdout.write("\n")
+
+ while True:
+ missingRPMs = list()
+ for rpm in requiredRPMs.keys():
+ try:
+ rpmQ = Command("rpm -q " + rpm)
+ rpmQ.getString("not installed") # this should throw and exception if rpm is there
+ missingRPMs.append(rpm)
+ except V7CommandException, e:
+ # "not installed" not there, so we're ok
+ pass
+ if len(missingRPMs) > 0:
+ print "The following rpms are required for testing:"
+ missingRPMList = ""
+ for rpm in missingRPMs:
+ missingRPMList = "%s %s" % (missingRPMList, rpm)
+ print missingRPMList
+ if self.ui.promptConfirm("Would you like to install them now?"):
+ try:
+ yum = Command("yum install -y " + missingRPMList)
+ print "Running yum: --------------------------------"
+ yum.echo()
+ print "---------------------------------------------"
+ except V7CommandException, e:
+ print "Error: Could not install rpm"
+ print e
+ print "Rechecking required rpms"
+ else:
+ print "Warning: some tests may fail due to missing rpms"
+ return False
+ else:
+ print "All required rpms installed"
+ return True
+ print ""
def doServer(self, args):
if len(args) > 1:
@@ -794,24 +850,14 @@
f=open("/etc/redhat-release")
line=f.readline()
f.close()
- return line
-
- def getReleaseNumber(self):
- """Return the RHEL release number"""
- line=self.getRedHatRelease()
- # the number is the next string after "release"
- lastword=""
- for word in line.split():
- if lastword == "release":
- return word
- lastword=word
- # otherwise, not found
- return None
-
- def getReleaseName(self):
- """Return the name of the RHEL release running on the system"""
- line=self.getRedHatRelease()
- return line[line.rindex('(')+1:line.rindex(')')]
+ if line:
+ pattern = re.compile("^(?P<product>[a-zA-Z\ ]+)release (?P<number>[1-9\.]+) \((?P<name>[a-zA-Z]+)\)")
+ match = pattern.match(line)
+ product = None
+ if match.group("product"):
+ product = match.group("product").strip()
+ return (product, match.group("number"), match.group("name"))
+ return (None, None, None)
def makeTestRunDirectory(self):
"""Create a directory for the current test run"""
14 years, 4 months
r284 - trunk/v7
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-01-12 16:03:31 +0000 (Tue, 12 Jan 2010)
New Revision: 284
Modified:
trunk/v7/environment.py
Log:
523824 - FEAT: v7 should fv_* tests should support KVM
Modified: trunk/v7/environment.py
===================================================================
--- trunk/v7/environment.py 2010-01-12 16:03:10 UTC (rev 283)
+++ trunk/v7/environment.py 2010-01-12 16:03:31 UTC (rev 284)
@@ -35,7 +35,9 @@
self.defaultLibraryDirectory = "/usr/share/v7/lib"
self.defaultLogDirectory = "/var/log/v7"
self.defaultGuestImageDirectory = '/var/lib/xen/images'
+ self.defaultKVMGuestImageDirectory = self.defaultDataDirectory
self.defaultGuestConfigDirectory = '/etc/xen'
+ self.defaultKVMGuestConfigDirectory = '/etc/libvirt/qemu'
self.defaultGuestBootDirectory = '/usr/lib/xen/boot/'
self.defaultPartnerServerURL = "ftp://partners.redhat.com/a166eabc5cf5df158922f9b06e5e7b21/hwcert/"
self.defaultMaximumAttachmentFileSize = 64 * 1048576 # 64 MB
@@ -68,8 +70,12 @@
self.setTextNode(element, self.defaultLogDirectory)
element = self.findOrCreateElement(filesystemElement, Tags.guest_image_directory)
self.setTextNode(element, self.defaultGuestImageDirectory)
+ element = self.findOrCreateElement(filesystemElement, Tags.kvm_guest_image_directory)
+ self.setTextNode(element, self.defaultKVMGuestImageDirectory)
element = self.findOrCreateElement(filesystemElement, Tags.guest_config_directory)
self.setTextNode(element, self.defaultGuestConfigDirectory)
+ element = self.findOrCreateElement(filesystemElement, Tags.kvm_guest_config_directory)
+ self.setTextNode(element, self.defaultKVMGuestConfigDirectory)
element = self.findOrCreateElement(filesystemElement, Tags.guest_boot_directory)
self.setTextNode(element, self.defaultGuestBootDirectory)
element = self.findOrCreateElement(urlElement, Tags.partner_server)
@@ -113,9 +119,23 @@
guestImageElement = self.findOrCreateElement(self._getFilesystemElement(), Tags.guest_image_directory)
return self.getTextNode(guestImageElement).data
+ def getKVMGuestImageDirectory(self):
+ guestImageElement = self.findOrCreateElement(self._getFilesystemElement(), Tags.kvm_guest_image_directory)
+ if not self.getTextNode(guestImageElement):
+ self.setTextNode(guestImageElement, self.defaultKVMGuestImageDirectory)
+ self.save(self.environmentFile)
+ return self.getTextNode(guestImageElement).data
+
def getGuestConfigDirectory(self):
guestConfigElement = self.findOrCreateElement(self._getFilesystemElement(), Tags.guest_config_directory)
return self.getTextNode(guestConfigElement).data
+
+ def getKVMGuestConfigDirectory(self):
+ guestConfigElement = self.findOrCreateElement(self._getFilesystemElement(), Tags.kvm_guest_config_directory)
+ if not self.getTextNode(guestConfigElement):
+ self.setTextNode(guestConfigElement, self.defaultKVMGuestConfigDirectory)
+ self.save(self.environmentFile)
+ return self.getTextNode(guestConfigElement).data
def getGuestBootDirectory(self):
guestBootElement = self.findOrCreateElement(self._getFilesystemElement(), Tags.guest_boot_directory)
14 years, 4 months
r283 - trunk/v7
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-01-12 16:03:10 +0000 (Tue, 12 Jan 2010)
New Revision: 283
Modified:
trunk/v7/tags.py
Log:
523824 - FEAT: v7 should fv_* tests should support KVM
Modified: trunk/v7/tags.py
===================================================================
--- trunk/v7/tags.py 2010-01-12 16:02:53 UTC (rev 282)
+++ trunk/v7/tags.py 2010-01-12 16:03:10 UTC (rev 283)
@@ -50,10 +50,13 @@
device_class="device-class"
attachment="attachment"
guest_config_directory="guest-config-directory"
+ kvm_guest_config_directory="kvm-guest-config-directory"
guest_image_directory="guest-image-directory"
+ kvm_guest_image_directory="kvm-guest-image-directory"
guest_boot_directory="guest-boot-directory"
urls="urls"
partner_server="partner-server"
+ product="product"
class Attributes:
v7_version="v7-version"
@@ -142,6 +145,9 @@
udev="udev"
udi="udi"
info_dot_udi="info.udi"
+ kvm="kvm"
+ xen="xen"
+ hvm="hvm"
class SystemFunction:
system = "system"
14 years, 4 months
r282 - trunk/v7
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-01-12 16:02:53 +0000 (Tue, 12 Jan 2010)
New Revision: 282
Modified:
trunk/v7/fvtest.py
Log:
523824 - FEAT: v7 should fv_* tests should support KVM
Modified: trunk/v7/fvtest.py
===================================================================
--- trunk/v7/fvtest.py 2010-01-09 20:31:08 UTC (rev 281)
+++ trunk/v7/fvtest.py 2010-01-12 16:02:53 UTC (rev 282)
@@ -45,7 +45,7 @@
self.hardwarePlatform = Command("uname -i").getString()
self.guestName = "v7%s" % self.hardwarePlatform
self.guestImageFile = 'v7' + self.hardwarePlatform + '.img'
- self.guestConfigFile = 'v7' + self.hardwarePlatform
+ self.loopBackDevice = None
self.dataImageFile = 'v7data.img'
if self.hardwarePlatform == "ia64":
self.nvramFile = "nvram_v7ia64"
@@ -55,34 +55,72 @@
self.testToRun = ""
self.waitTime = 60 # in minutes
self.environment = Environment()
+ self.debug = Constants.off
- # read the hypervisor capabilities if that file exists
+ self.__getHypervisor()
+ if self.hypervisor == Constants.xen:
+ self.guestConfigFile = 'v7' + self.hardwarePlatform
+ self.guestConfigPath = os.path.join(self.environment.getGuestConfigDirectory(), self.guestConfigFile)
+ self.guestImageDirectory = self.environment.getGuestImageDirectory()
+ elif self.hypervisor == Constants.kvm:
+ self.guestConfigFile = 'v7' + self.hardwarePlatform + ".xml"
+ self.guestConfigPath = os.path.join(self.environment.getKVMGuestConfigDirectory(), self.guestConfigFile)
+ self.guestImageDirectory = self.environment.getKVMGuestImageDirectory()
+
+ def __getHypervisor(self):
+ cpuflags = Command("fgrep flags /proc/cpuinfo")
+ self.hypervisor = None
try:
- capabilityFile = open('/sys/hypervisor/properties/capabilities')
- self.hypervisorCapabilities = capabilityFile.readline()
- capabilityFile.close()
- except IOError:
- self.hypervisorCapabilities = 'none'
+ if cpuflags.getString(regex="(vmx|smx)", singleLine=False):
+ # read the hypervisor capabilities if that file exists
+ try:
+ capabilityFile = open('/sys/hypervisor/properties/capabilities')
+ self.hypervisorCapabilities = capabilityFile.readline()
+ capabilityFile.close()
+ if Constants.hvm in self.hypervisorCapabilities:
+ self.hypervisor = Constants.xen
+ except IOError:
+ self.hypervisorCapabilities = 'none'
+
+ # if not xen, plan in for kvm
+ if self.hypervisor != Constants.xen:
+ self.hypervisor = Constants.kvm
+ except V7CommandException, e:
+ pass # no virtualization support
def plan(self, devices):
tests = list()
- for device in devices:
- # plan this test if the current system is capable to do FV
- if 'xen' in device.getProperty("system.kernel.version") and 'hvm' in self.hypervisorCapabilities:
- test = self.makeCopy()
- test.setDevice(device)
- tests.append(test)
+ if self.hypervisor == Constants.xen:
+ for device in devices:
+ if Constants.xen in device.getProperty("system.kernel.version"):
+ self.hypervisor = Constants.xen
+ test = self.makeCopy()
+ test.setDevice(device)
+ tests.append(test)
+ return tests
+
+ # otherwise
+ if self.hypervisor == Constants.kvm:
+ test = self.makeCopy()
+ tests.append(test)
+
return tests
+ def getRequiredRPMs(self):
+ rpms = ["libvirt", "libvirt-python", "python-virtinst"]
+ if self.hypervisor == Constants.kvm:
+ rpms.append('qemu')
+ return rpms
+
def verifyGuest(self):
guestName = None
try:
- guestName = Command("xm list").getString(regex=self.guestName, singleLine=False)
+ guestName = Command("virsh list").getString(regex=self.guestName, singleLine=False)
print "Warning: Guest %s is already running" % guestName
print "Attempting shutdown:"
- Command("xm destroy %s" % self.guestName).echo()
- guestName = Command("xm list").getString(regex=self.guestName, singleLine=False)
+ Command("virsh destroy %s" % self.guestName).echo()
+ guestName = Command("virsh list").getString(regex=self.guestName, singleLine=False)
print "Error: could not shutdown guest"
return False
except:
@@ -93,24 +131,21 @@
def verifyGuestFiles(self):
-
- #if not self.verifyFile(self.environment.getGuestConfigDirectory(), self.guestConfigFile):
- filePath = os.path.join(self.environment.getGuestConfigDirectory(), self.guestConfigFile)
- if os.path.exists(filePath):
- print "Verified: " + filePath
- elif not self.generateGuestConfigFile():
+ if not self.verifyFile(self.guestImageDirectory, self.dataImageFile):
return False
- if not self.verifyFile(self.environment.getGuestImageDirectory(), self.dataImageFile):
+ if not self.verifyFile(self.guestImageDirectory, self.guestImageFile):
return False
-
- if not self.verifyFile(self.environment.getGuestImageDirectory(), self.guestImageFile):
- return False
if self.hardwarePlatform == "ia64":
if (not self.verifyFile(self.environment.getGuestBootDirectory(), self.nvramFile)
or not self.verifyFile(self.environment.getGuestBootDirectory(), self.nvramUuidFile)):
return False
+
+ if os.path.exists(self.guestConfigPath):
+ print "Verified: " + self.guestConfigPath
+ elif not self.generateGuestConfigFile():
+ return False
print "Guest files verified"
sys.stdout.flush()
@@ -157,15 +192,47 @@
print "Error: could not find or download guest file" + filename
return False
-
+ def mountDataImage(self):
+ try:
+ self.loopBackDevice = Command("losetup -f").getString(regex="^(?P<device>/dev/loop[0-9]+)", regexGroup="device", singleLine=False)
+ print "Using loopback device " + self.loopBackDevice + " for guest data image"
+ loop = os.path.basename(self.loopBackDevice)
+ Command("losetup " + self.loopBackDevice + " " + os.path.join(self.guestImageDirectory, self.dataImageFile)).echo()
+ Command("kpartx -av " + self.loopBackDevice).echo()
+ partition = Command("ls /dev/mapper").getString(regex="%sp[0-9]" % loop, singleLine=False)
+ Command("mount /dev/mapper/" + partition + " /mnt").run()
+ print "Mounted /dev/mapper/" + partition + " on /mnt"
+ if self.debug != Constants.off:
+ Command("df -h /mnt").echo()
+ Command("ls -al /mnt").echo()
+ except V7CommandException, e:
+ print "Error: could not mount data image"
+ print e
+ return False
+ return True
+
+ def unmountDataImage(self):
+ print "Unmounting /mnt"
+ sys.stdout.flush()
+ try:
+ Command("umount /mnt").echo()
+ if self.loopBackDevice:
+ print "Deleting loopback device " + self.loopBackDevice + " configuration."
+ Command("kpartx -dv " + self.loopBackDevice).echo()
+ Command("losetup -d " + self.loopBackDevice).echo()
+ except V7CommandException, e:
+ print e
+ print "Error: could not unmount data image."
+ return False
+ return True
def submitTasks(self):
# mount the data image and then write test info
try:
- dataImagePath = os.path.join(self.environment.getGuestImageDirectory(), self.dataImageFile)
- Command("umount /mnt")
- Command("lomount -diskimage %s -partition 1 /mnt" % dataImagePath).echo()
-
+ dataImagePath = os.path.join(self.guestImageDirectory, self.dataImageFile)
+ self.unmountDataImage()
+ if not self.mountDataImage():
+ return False
guestScriptFile = "/mnt/v7-guest-script"
guestScript = open(guestScriptFile, "w")
guestScript.write("#!/bin/sh\n")
@@ -187,7 +254,7 @@
guestScript.close()
os.chmod(guestScriptFile, 0744)
- Command("umount /mnt").echo()
+ self.unmountDataImage()
print "Submitted tests: " + commandToRun
sys.stdout.flush()
return True
@@ -196,7 +263,22 @@
print e
return False
+
def generateGuestConfigFile(self):
+ guestImagePath = os.path.join(self.guestImageDirectory, self.guestImageFile)
+ guestDataPath = os.path.join(self.guestImageDirectory, self.dataImageFile)
+ if self.hypervisor == Constants.kvm:
+ virtInstall = "virt-install --name " + self.guestName + " --ram 512 --disk path=" + guestImagePath + " --disk path=" + guestDataPath + " --network network:default --vnc --import --noreboot --noautoconsole"
+ print virtInstall
+ try:
+ Command(virtInstall).echo()
+ except V7CommandException, e:
+ print "Error: could not generate guest config file."
+ print e
+ return False
+ return True
+
+ # otherwise, use direct config generation for xen
try:
ifconfig = Command("ifconfig")
xenbr = ifconfig.getString(regex="eth(?P<xenbrNumber>[0-9]+)", regexGroup="xenbrNumber", singleLine=False)
@@ -215,7 +297,7 @@
# this uuid needs to match the one in the nvram files...
guestConfig.write("uuid = \"8d6e4122-a025-0a68-2efd-c4ea32a5f235\"\n")
else:
- guestConfig.write("uuid = \"60d27529-59a2-99e6-8933-ca3609c58cdf\"\n")
+ guestConfig.write("uuid = \"60d27529-59a2-99e6-8933-ca3609c58cdf\"\n")
guestConfig.write("maxmem = 512\n")
guestConfig.write("memory = 512\n")
guestConfig.write("vcpus = 1\n")
@@ -254,16 +336,19 @@
return False
+
+
def runGuest(self):
+
try:
- Command("xm create v7%s" % self.hardwarePlatform).echo()
+ Command("virsh start %s" % self.guestName).echo()
print "FV Guest started ..."
except V7CommandException, e:
print "Error: could not start the FV Guest."
print e
return False
print "%s test is running, it takes some time(less than %s minutes), please be patient ..." % (self.name, self.waitTime)
- print "You may use the virt-manager to open the virtual machine console to monitor the testing progress."
+ print "You may use \"virsh console %s\" to monitor the testing progress" % self.guestName
sys.stdout.flush()
# check the guest's status in every minute, this test should not consume more than 1 hour
@@ -271,17 +356,18 @@
while 1:
if count == self.waitTime:
try:
- Command("xm destroy v7%s" % self.hardwarePlatform).echo()
- print "time out, the FV Guest was destroyed."
+ Command("virsh destroy %s" % self.guestName).echo()
+ print "time out, the FV Guest was destroyed."
except V7CommandException, e:
pass
return False
else:
time.sleep(60)
try:
- guestIsRunning = Command("xm list").getString(regex="v7%s" % self.hardwarePlatform, singleLine=False)
+ guestIsRunning = Command("virsh list").getString(regex=self.guestName, singleLine=False)
count = count + 1
except:
+ print "Guest has shutdown"
break
return True
@@ -292,8 +378,7 @@
# mount the data image and see if the result rpm is there
result = True
try:
- dataImagePath = os.path.join(self.environment.getGuestImageDirectory(), self.dataImageFile)
- Command("lomount -diskimage %s -partition 1 /mnt" % dataImagePath).echo()
+ self.mountDataImage()
Command("cp /mnt/" + self.environment.getResultsFileName() + " .").echo()
# merge the results
result = self.getGuestTestRunResult()
@@ -303,7 +388,7 @@
result = False
try:
- Command("umount /mnt").echo()
+ self.unmountDataImage()
except:
print "Warning: could not unmount data image"
print e
14 years, 4 months
r281 - trunk
by gnichols@fedoraproject.org
Author: gnichols
Date: 2010-01-09 20:31:08 +0000 (Sat, 09 Jan 2010)
New Revision: 281
Modified:
trunk/Makefile
Log:
R22
Modified: trunk/Makefile
===================================================================
--- trunk/Makefile 2009-12-22 18:18:19 UTC (rev 280)
+++ trunk/Makefile 2010-01-09 20:31:08 UTC (rev 281)
@@ -14,7 +14,7 @@
# Author: Greg Nichols
V7_VERSION := 1.0
-V7_RELEASE := 21
+V7_RELEASE := 22
V7_VERSION_RELEASE := $(V7_VERSION)-$(V7_RELEASE)
V7_VERSION_PY := v7/version.py
V7_SVN_MODULE := svn+ssh://svn.fedorahosted.org/svn/v7
14 years, 4 months