[PATCH] [TEST] #3 Update VSMS 14_define_sys_disk.py to use cim_define()

# HG changeset patch # User Kaitlin Rupert <karupert@us.ibm.com> # Date 1233789475 28800 # Node ID 2d445349b1e6fc2dff2f86e12566a0e55259b44a # Parent edfa908a60d058c7f1ba7394bd1d818999802287 [TEST] #3 Update VSMS 14_define_sys_disk.py to use cim_define() Updates from 2 to 3: -Verify the Address attribute of the DiskRASD for the guest is the same address specified during the define call. Updates form 1 to 2: -Added comment to describe test -Added flag to indicate whether guest should be undefined Signed-off-by: Kaitlin Rupert <karupert@us.ibm.com> diff -r edfa908a60d0 -r 2d445349b1e6 suites/libvirt-cim/cimtest/VirtualSystemManagementService/14_define_sys_disk.py --- a/suites/libvirt-cim/cimtest/VirtualSystemManagementService/14_define_sys_disk.py Tue Feb 03 09:37:05 2009 -0800 +++ b/suites/libvirt-cim/cimtest/VirtualSystemManagementService/14_define_sys_disk.py Wed Feb 04 15:17:55 2009 -0800 @@ -18,6 +18,14 @@ # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Purpose: +# Verify providers support disk images with long paths / names +# +# Steps: +# 1) Create a disk image with a long path +# 2) Build RASD parameters, making sure to specify disk image created in step 1 +# 3) Verify guest is defined properly # import sys @@ -25,14 +33,13 @@ from VirtLib.utils import run_remote from CimTest.Globals import logger from CimTest.ReturnCodes import FAIL, PASS -from XenKvmLib.common_util import create_using_definesystem -from XenKvmLib.test_doms import destroy_and_undefine_domain from XenKvmLib.classes import get_typed_class, inst_to_mof from XenKvmLib.rasd import get_default_rasds -from XenKvmLib.vsms import get_vssd_mof -from XenKvmLib.const import get_provider_version from XenKvmLib.const import do_main, _image_dir, f9_changeset, \ - KVM_default_disk_dev + KVM_default_disk_dev, get_provider_version +from XenKvmLib.vxml import get_class +from XenKvmLib.common_util import parse_instance_id +from XenKvmLib.enumclass import EnumInstances sup_types = ['Xen', 'XenFV', 'KVM', 'LXC'] test_dom = 'rstest_disk_domain' @@ -50,28 +57,58 @@ return path -def get_vssd_rasd(ip, virt, addr, disk_type): - vssd = get_vssd_mof(virt, test_dom) +def get_rasd_list(ip, virt, addr, disk_type): + drasd_cn = get_typed_class(virt, "DiskResourceAllocationSettingData") rasds = get_default_rasds(ip, virt) - rasd_list = [] + rasd_list = {} for rasd in rasds: - if 'DiskPool' in rasd['PoolID']: + if rasd.classname == drasd_cn: if disk_type != "" and rasd['Caption'] != disk_type: continue rasd['Address'] = addr curr_cim_rev, changeset = get_provider_version(virt, ip) if changeset == f9_changeset and virt == 'KVM': rasd['VirtualDevice'] = KVM_default_disk_dev - rasd_list.append(inst_to_mof(rasd)) + rasd_list[rasd.classname] = inst_to_mof(rasd) - params = { 'vssd' : vssd, - 'rasd' : rasd_list - } + return rasd_list - return params +def verify_disk_path(ip, virt, addr, guest_name): + inst = None + + try: + drasd_cn = get_typed_class(virt, 'DiskResourceAllocationSettingData') + enum_list = EnumInstances(ip, drasd_cn) + + if enum_list < 1: + raise Exception("No %s instances returned" % drasd_cn) + + for rasd in enum_list: + guest, dev, status = parse_instance_id(rasd.InstanceID) + if status != PASS: + raise Exception("Unable to parse InstanceID: %s" % \ + rasd.InstanceID) + + if guest == guest_name: + inst = rasd + break + + if inst is None: + raise Exception("%s instance for %s not found" % (drasd_cn, + guest_name)) + + if inst.Address != addr: + raise Exception("%s instance for %s not found" % (drasd_cn, + guest_name)) + + except Exception, details: + logger.error(details) + return FAIL + + return PASS @do_main(sup_types) def main(): @@ -84,20 +121,29 @@ else: disk_cap = "" + cxml = get_class(options.virt)(test_dom) + + guest_defined = False + try: addr = make_long_disk_path(options.ip) if addr is None: raise Exception("Unable to create large disk image") - define_params = get_vssd_rasd(options.ip, options.virt, addr, disk_cap) - if len(define_params) != 2: - raise Exception("Unable to get VSSD and RASDs for %s" % test_dom) + rasd_list = get_rasd_list(options.ip, options.virt, addr, disk_cap) + if len(rasd_list) < 1: + raise Exception("Unable to get template RASDs for %s" % test_dom) - status = create_using_definesystem(test_dom, options.ip, - params=define_params, ref_config="", - virt=options.virt) + cxml.set_res_settings(rasd_list) + ret = cxml.cim_define(options.ip) + if not ret: + raise Exception("Unable to define %s" % test_dom) + + guest_defined = True + + status = verify_disk_path(options.ip, options.virt, addr, test_dom) if status != PASS: - raise Exception("Unable to define %s" % test_dom) + raise Exception("Failed to verify disk path for %s" % test_dom) except Exception, details: logger.error(details) @@ -106,7 +152,8 @@ if os.path.exists(addr): os.remove(addr) - destroy_and_undefine_domain(test_dom, options.ip, options.virt) + if guest_defined == True: + cxml.undefine(options.ip) return status

Kaitlin Rupert wrote:
# HG changeset patch # User Kaitlin Rupert <karupert@us.ibm.com> # Date 1233789475 28800 # Node ID 2d445349b1e6fc2dff2f86e12566a0e55259b44a # Parent edfa908a60d058c7f1ba7394bd1d818999802287 [TEST] #3 Update VSMS 14_define_sys_disk.py to use cim_define()
Updates from 2 to 3: -Verify the Address attribute of the DiskRASD for the guest is the same address specified during the define call.
Updates form 1 to 2: -Added comment to describe test -Added flag to indicate whether guest should be undefined
Signed-off-by: Kaitlin Rupert <karupert@us.ibm.com>
diff -r edfa908a60d0 -r 2d445349b1e6 suites/libvirt-cim/cimtest/VirtualSystemManagementService/14_define_sys_disk.py --- a/suites/libvirt-cim/cimtest/VirtualSystemManagementService/14_define_sys_disk.py Tue Feb 03 09:37:05 2009 -0800 +++ b/suites/libvirt-cim/cimtest/VirtualSystemManagementService/14_define_sys_disk.py Wed Feb 04 15:17:55 2009 -0800 @@ -18,6 +18,14 @@ # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Purpose: +# Verify providers support disk images with long paths / names +# +# Steps: +# 1) Create a disk image with a long path +# 2) Build RASD parameters, making sure to specify disk image created in step 1 +# 3) Verify guest is defined properly #
import sys @@ -25,14 +33,13 @@ from VirtLib.utils import run_remote from CimTest.Globals import logger from CimTest.ReturnCodes import FAIL, PASS -from XenKvmLib.common_util import create_using_definesystem -from XenKvmLib.test_doms import destroy_and_undefine_domain from XenKvmLib.classes import get_typed_class, inst_to_mof from XenKvmLib.rasd import get_default_rasds -from XenKvmLib.vsms import get_vssd_mof -from XenKvmLib.const import get_provider_version from XenKvmLib.const import do_main, _image_dir, f9_changeset, \ - KVM_default_disk_dev + KVM_default_disk_dev, get_provider_version +from XenKvmLib.vxml import get_class +from XenKvmLib.common_util import parse_instance_id +from XenKvmLib.enumclass import EnumInstances
sup_types = ['Xen', 'XenFV', 'KVM', 'LXC'] test_dom = 'rstest_disk_domain' @@ -50,28 +57,58 @@
return path
-def get_vssd_rasd(ip, virt, addr, disk_type): - vssd = get_vssd_mof(virt, test_dom) +def get_rasd_list(ip, virt, addr, disk_type): + drasd_cn = get_typed_class(virt, "DiskResourceAllocationSettingData")
rasds = get_default_rasds(ip, virt)
- rasd_list = [] + rasd_list = {}
for rasd in rasds: - if 'DiskPool' in rasd['PoolID']: + if rasd.classname == drasd_cn: if disk_type != "" and rasd['Caption'] != disk_type: continue rasd['Address'] = addr curr_cim_rev, changeset = get_provider_version(virt, ip) if changeset == f9_changeset and virt == 'KVM': rasd['VirtualDevice'] = KVM_default_disk_dev - rasd_list.append(inst_to_mof(rasd)) + rasd_list[rasd.classname] = inst_to_mof(rasd)
- params = { 'vssd' : vssd, - 'rasd' : rasd_list - } + return rasd_list
- return params +def verify_disk_path(ip, virt, addr, guest_name): + inst = None + + try: + drasd_cn = get_typed_class(virt, 'DiskResourceAllocationSettingData') + enum_list = EnumInstances(ip, drasd_cn)
GetInstance of the DiskRASD would be much more simpler than EnumInstances. Any reason behind using EnumInstances instead .
+ + if enum_list < 1: + raise Exception("No %s instances returned" % drasd_cn) + + for rasd in enum_list: + guest, dev, status = parse_instance_id(rasd.InstanceID) + if status != PASS: + raise Exception("Unable to parse InstanceID: %s" % \ + rasd.InstanceID) + + if guest == guest_name: + inst = rasd + break + + if inst is None: + raise Exception("%s instance for %s not found" % (drasd_cn, + guest_name)) + + if inst.Address != addr: + raise Exception("%s instance for %s not found" % (drasd_cn, + guest_name)) + + except Exception, details: + logger.error(details) + return FAIL + + return PASS
@do_main(sup_types) def main(): @@ -84,20 +121,29 @@ else: disk_cap = ""
+ cxml = get_class(options.virt)(test_dom) + + guest_defined = False + try: addr = make_long_disk_path(options.ip) if addr is None: raise Exception("Unable to create large disk image")
- define_params = get_vssd_rasd(options.ip, options.virt, addr, disk_cap) - if len(define_params) != 2: - raise Exception("Unable to get VSSD and RASDs for %s" % test_dom) + rasd_list = get_rasd_list(options.ip, options.virt, addr, disk_cap) + if len(rasd_list) < 1: + raise Exception("Unable to get template RASDs for %s" % test_dom)
- status = create_using_definesystem(test_dom, options.ip, - params=define_params, ref_config="", - virt=options.virt) + cxml.set_res_settings(rasd_list) + ret = cxml.cim_define(options.ip) + if not ret: + raise Exception("Unable to define %s" % test_dom) + + guest_defined = True + + status = verify_disk_path(options.ip, options.virt, addr, test_dom) if status != PASS: - raise Exception("Unable to define %s" % test_dom) + raise Exception("Failed to verify disk path for %s" % test_dom)
except Exception, details: logger.error(details) @@ -106,7 +152,8 @@ if os.path.exists(addr): os.remove(addr)
- destroy_and_undefine_domain(test_dom, options.ip, options.virt) + if guest_defined == True: + cxml.undefine(options.ip)
return status
_______________________________________________ Libvirt-cim mailing list Libvirt-cim@redhat.com https://www.redhat.com/mailman/listinfo/libvirt-cim
-- Thanks and Regards, Deepti B. Kalakeri IBM Linux Technology Center deeptik@linux.vnet.ibm.com

- params = { 'vssd' : vssd, - 'rasd' : rasd_list - } + return rasd_list - return params +def verify_disk_path(ip, virt, addr, guest_name): + inst = None + + try: + drasd_cn = get_typed_class(virt, 'DiskResourceAllocationSettingData') + enum_list = EnumInstances(ip, drasd_cn)
GetInstance of the DiskRASD would be much more simpler than EnumInstances. Any reason behind using EnumInstances instead .
Using GetInstance() means that you have to know how the InstanceID of the reference you're querying is formatted. The only reason we know how the InstanceID is formatted is because we know how the providers work =) The idea behind CIM is that you don't have to know how the underlying implementation works in order to get information from the providers. So a CIM client shouldn't need to know how we format our InstanceIDs in order to use our providers. I'm not sure how often CIM clients build their own references. In reality, they should be using the references the providers return. They shouldn't be building their own (like we do in cimtest's GetInstance() call). So I try to use EnumInstances() to avoid building my own reference. This forces the providers to return the references for me. cimtest's GetInstance() function really should only take a reference as a parameter instead of taking keys and doing a call to CIMInstanceName(). But faking a reference can be useful in some situations. =) I'm inclined to leave this as is unless you think it'd be easier to read / maintain with GetInstance() in place of EnumInstances(). -- Kaitlin Rupert IBM Linux Technology Center kaitlin@linux.vnet.ibm.com

Kaitlin Rupert wrote:
- params = { 'vssd' : vssd, - 'rasd' : rasd_list - } + return rasd_list - return params +def verify_disk_path(ip, virt, addr, guest_name): + inst = None + + try: + drasd_cn = get_typed_class(virt, 'DiskResourceAllocationSettingData') + enum_list = EnumInstances(ip, drasd_cn)
GetInstance of the DiskRASD would be much more simpler than EnumInstances. Any reason behind using EnumInstances instead .
Using GetInstance() means that you have to know how the InstanceID of the reference you're querying is formatted. The only reason we know how the InstanceID is formatted is because we know how the providers work =)
The idea behind CIM is that you don't have to know how the underlying implementation works in order to get information from the providers. So a CIM client shouldn't need to know how we format our InstanceIDs in order to use our providers.
I'm not sure how often CIM clients build their own references. In reality, they should be using the references the providers return. They shouldn't be building their own (like we do in cimtest's GetInstance() call).
So I try to use EnumInstances() to avoid building my own reference. This forces the providers to return the references for me.
cimtest's GetInstance() function really should only take a reference as a parameter instead of taking keys and doing a call to CIMInstanceName().
But faking a reference can be useful in some situations. =) I'm inclined to leave this as is unless you think it'd be easier to read / maintain with GetInstance() in place of EnumInstances().
Deepti - is this patch ready to go? Or should I change EnumInstances() to GetInstance()? Thanks! -- Kaitlin Rupert IBM Linux Technology Center kaitlin@linux.vnet.ibm.com

+1. -- Thanks and Regards, Deepti B. Kalakeri IBM Linux Technology Center deeptik@linux.vnet.ibm.com
participants (2)
-
Deepti B Kalakeri
-
Kaitlin Rupert