Re: [libvirt] [libvirt-test-API][PATCH] Add connection_getDomainCapabilities test case

2015-03-26 Thread hongming


On 03/26/2015 05:06 PM, jiahu wrote:

This case will test getDomainCapabilities API, and
connection_getDomainCapabilities test case was added to
test_connection.conf
---
  cases/test_connection.conf|  10 +
  repos/virconn/connection_getDomainCapabilities.py | 438 ++
  2 files changed, 448 insertions(+)
  create mode 100644 repos/virconn/connection_getDomainCapabilities.py

diff --git a/cases/test_connection.conf b/cases/test_connection.conf
index 7552024..5719937 100644
--- a/cases/test_connection.conf
+++ b/cases/test_connection.conf
@@ -47,3 +47,13 @@ virconn:free_pages
  0
  pagesize
  4k,2M
+
+virconn:connection_getDomainCapabilities
+emulatorbin
+/usr/libexec/qemu-kvm
+arch
+x86_64
+machine
+pc-i440fx-rhel7.0.0
+virttype
+kvm
diff --git a/repos/virconn/connection_getDomainCapabilities.py 
b/repos/virconn/connection_getDomainCapabilities.py
new file mode 100644
index 000..f0cfa1f
--- /dev/null
+++ b/repos/virconn/connection_getDomainCapabilities.py
@@ -0,0 +1,438 @@
+#!/usr/bin/env python
+# test getDomainCapabilities() API for libvirtd
+
+import os
+import libvirt
+import hashlib
+import fcntl
+
+from xml.dom import minidom
+from libvirt import libvirtError
+from src import sharedmod
+from utils import utils
+
+required_params = ('emulatorbin','arch','machine','virttype',)
+optional_params = {}
+
+QEMU_CAPS = ""
+API_FILE = "/tmp/caps_from_api.xml"
+CMD = "rm -rf %s"
+OVMF = "/usr/share/OVMF/OVMF_CODE.fd"
+IOMMU = "/sys/kernel/iommu_groups/"
+VFIO = "/dev/vfio/vfio"
+KVM = "/dev/kvm"
+KVM_CHECK_EXTENSION = 44547
+KVM_CAP_IOMMU = 18
+maxcpu = 0
+
+ovmf_f = False
+drive = False
+drive_forma = False
+drive_readonly = False
+blk_sg_io = False
+usb_storage = False
+device = False
+scsi_generic = False
+vfio_pci = False
+
+def clean_env(logger):
+"""
+   clean testing environment
+"""
+status, output = utils.exec_cmd(CMD % API_FILE, shell=True)
+if status != 0:
+logger.error("Can not delete %s" % API_FILE)
+else:
+logger.debug("Deleted %s successfully" % API_FILE)
+
+def get_hypervisor_ver(emulatorbin,logger):
+"""
+   Obtain qemu-kvm's version, and return a number value of version
+"""
+RPM = "rpm -qf %s"
+status, package = utils.exec_cmd(RPM % emulatorbin, shell=True)
+if not status:
+logger.debug("The package is %s" % package)
+else:
+logger.debug("The package is %s" % package)
+return 0
+package = package[0].split('-')
+version = ""
+for item in package:
+if not item.isalnum():
+for v in item.split("."):
+version = version + v.rjust(3,"0")
+break
+return int(version)
+
+def validate_caps_from_hv(emulatorbin,logger):
+"""
+Validate the relative caps between libvirt and qemu-kvm
+"""
+F1 = "%s -h| grep \"\-drive\""
+F2 = "%s -h| grep \"format=\""
+F3 = "%s -h| grep \"readonly=\""
+F4 = "%s -h| grep \"^\\-device\""
+l = [F1,F2,F3,F4]
+flags = []
+for item in l:
+status, temp = utils.exec_cmd(item % emulatorbin, shell=True)
+if not status:
+flags.append(True)
+logger.debug("Got: %s from vh" % temp)
+else:
+flags.append(False)
+logger.debug("Got: %s from vh" % temp)
+if get_hypervisor_ver(emulatorbin,logger) >= 11000:
+ flags.append(True)
+else:
+ flags.append(False)
+libvirt_f = [drive,drive_forma,drive_readonly,device,blk_sg_io]
+if flags == libvirt_f:
+return True
+else:
+return False
+
+def generate_hash(emulatorbin,logger):
+"""
+   generate file name using sha256
+"""
+global QEMU_CAPS
+QEMU_CAPS = "/var/cache/libvirt/qemu/capabilities/"
+file_name = hashlib.sha256(emulatorbin).hexdigest()
+QEMU_CAPS = QEMU_CAPS + file_name + ".xml"
+logger.debug("Cache file is %s" % QEMU_CAPS)
+
+def get_maxcpu(machine,logger):
+"""
+   return maxcpu for given machine type from QEMU_CAPS xml
+"""
+global maxcpu
+xml = minidom.parse(QEMU_CAPS)
+qemu = xml.getElementsByTagName('qemuCaps')[0]
+for item in qemu.getElementsByTagName('machine'):
+if item.getAttribute('name') == machine:
+maxcpu = int(item.getAttribute('maxCpus'))
+return True
+
+def get_os_flags(logger):
+"""
+   Read results from QEMU_CAPS file and set three flags
+"""
+global drive, drive_forma, drive_readonly
+xml = minidom.parse(QEMU_CAPS)
+qemu = xml.getElementsByTagName('qemuCaps')[0]
+for item in qemu.getElementsByTagName('flag'):
+if item.getAttribute('name') == "drive":
+drive = True
+if item.getAttribute('name') == "drive-format":
+drive_forma = True
+if item.getAttribute('name') == "drive-readonly":
+drive_readonly = True
+logger.debug("dri

[libvirt] [libvirt-test-API][PATCH] Add connection_getDomainCapabilities test case

2015-03-26 Thread jiahu
In the case, we will validate getDomainCapabilities API for libvirt.

jiahu (1):
  Add connection_getDomainCapabilities test case

 cases/test_connection.conf|  10 +
 repos/virconn/connection_getDomainCapabilities.py | 438 ++
 2 files changed, 448 insertions(+)
 create mode 100644 repos/virconn/connection_getDomainCapabilities.py

-- 
1.8.1.4

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [libvirt-test-API][PATCH] Add connection_getDomainCapabilities test case

2015-03-26 Thread jiahu
This case will test getDomainCapabilities API, and
connection_getDomainCapabilities test case was added to
test_connection.conf
---
 cases/test_connection.conf|  10 +
 repos/virconn/connection_getDomainCapabilities.py | 438 ++
 2 files changed, 448 insertions(+)
 create mode 100644 repos/virconn/connection_getDomainCapabilities.py

diff --git a/cases/test_connection.conf b/cases/test_connection.conf
index 7552024..5719937 100644
--- a/cases/test_connection.conf
+++ b/cases/test_connection.conf
@@ -47,3 +47,13 @@ virconn:free_pages
 0
 pagesize
 4k,2M
+
+virconn:connection_getDomainCapabilities
+emulatorbin
+/usr/libexec/qemu-kvm
+arch
+x86_64
+machine
+pc-i440fx-rhel7.0.0
+virttype
+kvm
diff --git a/repos/virconn/connection_getDomainCapabilities.py 
b/repos/virconn/connection_getDomainCapabilities.py
new file mode 100644
index 000..f0cfa1f
--- /dev/null
+++ b/repos/virconn/connection_getDomainCapabilities.py
@@ -0,0 +1,438 @@
+#!/usr/bin/env python
+# test getDomainCapabilities() API for libvirtd
+
+import os
+import libvirt
+import hashlib
+import fcntl
+
+from xml.dom import minidom
+from libvirt import libvirtError
+from src import sharedmod
+from utils import utils
+
+required_params = ('emulatorbin','arch','machine','virttype',)
+optional_params = {}
+
+QEMU_CAPS = ""
+API_FILE = "/tmp/caps_from_api.xml"
+CMD = "rm -rf %s"
+OVMF = "/usr/share/OVMF/OVMF_CODE.fd"
+IOMMU = "/sys/kernel/iommu_groups/"
+VFIO = "/dev/vfio/vfio"
+KVM = "/dev/kvm"
+KVM_CHECK_EXTENSION = 44547
+KVM_CAP_IOMMU = 18
+maxcpu = 0
+
+ovmf_f = False
+drive = False
+drive_forma = False
+drive_readonly = False
+blk_sg_io = False
+usb_storage = False
+device = False
+scsi_generic = False
+vfio_pci = False
+
+def clean_env(logger):
+"""
+   clean testing environment
+"""
+status, output = utils.exec_cmd(CMD % API_FILE, shell=True)
+if status != 0:
+logger.error("Can not delete %s" % API_FILE)
+else:
+logger.debug("Deleted %s successfully" % API_FILE)
+
+def get_hypervisor_ver(emulatorbin,logger):
+"""
+   Obtain qemu-kvm's version, and return a number value of version
+"""
+RPM = "rpm -qf %s"
+status, package = utils.exec_cmd(RPM % emulatorbin, shell=True)
+if not status:
+logger.debug("The package is %s" % package)
+else:
+logger.debug("The package is %s" % package)
+return 0
+package = package[0].split('-')
+version = ""
+for item in package:
+if not item.isalnum():
+for v in item.split("."):
+version = version + v.rjust(3,"0")
+break
+return int(version)
+
+def validate_caps_from_hv(emulatorbin,logger):
+"""
+Validate the relative caps between libvirt and qemu-kvm
+"""
+F1 = "%s -h| grep \"\-drive\""
+F2 = "%s -h| grep \"format=\""
+F3 = "%s -h| grep \"readonly=\""
+F4 = "%s -h| grep \"^\\-device\""
+l = [F1,F2,F3,F4]
+flags = []
+for item in l:
+status, temp = utils.exec_cmd(item % emulatorbin, shell=True)
+if not status:
+flags.append(True)
+logger.debug("Got: %s from vh" % temp)
+else:
+flags.append(False)
+logger.debug("Got: %s from vh" % temp)
+if get_hypervisor_ver(emulatorbin,logger) >= 11000:
+ flags.append(True)
+else:
+ flags.append(False)
+libvirt_f = [drive,drive_forma,drive_readonly,device,blk_sg_io]
+if flags == libvirt_f:
+return True
+else:
+return False
+
+def generate_hash(emulatorbin,logger):
+"""
+   generate file name using sha256
+"""
+global QEMU_CAPS
+QEMU_CAPS = "/var/cache/libvirt/qemu/capabilities/"
+file_name = hashlib.sha256(emulatorbin).hexdigest()
+QEMU_CAPS = QEMU_CAPS + file_name + ".xml"
+logger.debug("Cache file is %s" % QEMU_CAPS)
+
+def get_maxcpu(machine,logger):
+"""
+   return maxcpu for given machine type from QEMU_CAPS xml
+"""
+global maxcpu
+xml = minidom.parse(QEMU_CAPS)
+qemu = xml.getElementsByTagName('qemuCaps')[0]
+for item in qemu.getElementsByTagName('machine'):
+if item.getAttribute('name') == machine:
+maxcpu = int(item.getAttribute('maxCpus'))
+return True
+
+def get_os_flags(logger):
+"""
+   Read results from QEMU_CAPS file and set three flags
+"""
+global drive, drive_forma, drive_readonly
+xml = minidom.parse(QEMU_CAPS)
+qemu = xml.getElementsByTagName('qemuCaps')[0]
+for item in qemu.getElementsByTagName('flag'):
+if item.getAttribute('name') == "drive":
+drive = True
+if item.getAttribute('name') == "drive-format":
+drive_forma = True
+if item.getAttribute('name') == "drive-readonly":
+drive_readonly = True
+logger.debug("drive = %s; drive_format = %s; drive_readonly = %s