[Libvirt-cim] [PATCH] [TEST] #5 Fix ECTP 01_forward.py to support system with multiple networks defined

Deepti B Kalakeri deeptik at linux.vnet.ibm.com
Fri Nov 14 08:30:09 UTC 2008



Kaitlin Rupert wrote:
> # HG changeset patch
> # User Kaitlin Rupert <karupert at us.ibm.com>
> # Date 1226619337 28800
> # Node ID a969c3700069c085eef3e258a58a21119f29388d
> # Parent  8d6f2db22eda9bda08ff26caa8982f137a3d4486
> [TEST] #5 Fix ECTP 01_forward.py to support system with multiple networks defined
>
> This test was doing a lot of unnecessary checking (and unessary building of
> lists).  Instead, this test calls EnumInstances on each of the classes expected
> to be returned by the association.
>
> These instances are then compared against the list of instances returned by the ECTP association query.
>
> The FIXME will be fixed when bug 0007 is fixed.
>
> Updates from 4 to 5:
>    -Incase of exception, return FAIL.  This doesn't currently handle to XFAIL
>     case - this will be fixed in a follow-up patch.
>
> Updates from 3 to 4:
>    -Fix false positive - if an exception is encountered, be sure to set the
>     return status as FAILED.
>    -Build the appropriate profile list needed for testing with older providers
>    -Change provider version from 680 to 686 (which has additional ECTP changes
>     needed to have ECTP work properly).
>
> Updates from 2 to 3:
>   -Place most of main block in a try/except.  When a failure is encountered,
>    an exception is raised, and the test is cleaned up properly.
>   -If the provider is < 680, don't check the ECTP values for
>    CIM:DSP1059-GenericDeviceResourceVirtualization-1.0.0 - ECTP doesn't support
>    this provider version.
>
> Updates from 1 to 2:
>   -Return from test case if init_vs_pool_values() returns a failure
>
> Signed-off-by: Kaitlin Rupert <karupert at us.ibm.com>
>
> diff -r 8d6f2db22eda -r a969c3700069 suites/libvirt-cim/cimtest/ElementConforms/01_forward.py
> --- a/suites/libvirt-cim/cimtest/ElementConforms/01_forward.py	Tue Nov 11 00:19:20 2008 -0800
> +++ b/suites/libvirt-cim/cimtest/ElementConforms/01_forward.py	Thu Nov 13 15:35:37 2008 -0800
> @@ -23,10 +23,8 @@
>  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
>  #
>
> -# This tc is used to verify the EnabledState, HealthState, EnabledDefault and
> -# the Classname are set appropriately for the results returned by the 
> -# ElementConformsToProfile association for the RegisteredProfile class
> -# and ManagedElement Class
> +# This tc is used to verify the results of the ElementConformsToProfile 
> +# association.  This test focuses on RegisteredProfile -> ManagedElement
>  # 
>  #   "CIM:DSP1042-SystemVirtualization-1.0.0" ,
>  #   "CIM:DSP1057-VirtualSystem-1.0.0a"
> @@ -45,98 +43,69 @@
>  from XenKvmLib.classes import get_typed_class
>  from XenKvmLib import vxml
>  from CimTest import Globals 
> -from XenKvmLib.common_util import print_field_error, check_sblim
> -from CimTest.Globals import logger, CIM_ERROR_ASSOCIATORS, CIM_ERROR_ENUMERATE
> -from XenKvmLib.const import do_main 
> -from CimTest.ReturnCodes import PASS, FAIL, XFAIL_RC
> +from XenKvmLib.common_util import print_field_error, check_sblim, get_host_info 
> +from CimTest.Globals import logger, CIM_ERROR_ENUMERATE
> +from XenKvmLib.const import do_main, get_provider_version 
> +from CimTest.ReturnCodes import PASS, FAIL, XFAIL, XFAIL_RC
>  from XenKvmLib.enumclass import EnumInstances
> -from XenKvmLib.const import default_network_name, default_pool_name 
> -from XenKvmLib.const import get_provider_version
> -
>
>  sup_types = ['Xen', 'XenFV', 'KVM', 'LXC']
>  test_dom = "domU"
>  bug_sblim = '00007'
> -libvirt_cim_ectp_changes = 680
> +libvirt_cim_ectp_changes = 686
>
> -def pool_init(verify_list, pool_cn, pool_name, virt):
> -    ccn = get_typed_class(virt, pool_cn)
> -    instid = '%s/%s' %(pool_cn, pool_name)
> -    verify_list[ccn]= {'InstanceID' : instid }
> -    return verify_list
> -   
>  def  init_vs_pool_values(server, virt):
> -    verify_ectp_list = { }
> -    hs_ccn = get_typed_class(virt, 'HostSystem')
> -    host = live.hostname(server)
> -    cs_fields = {
> -                  'CreationClassName'    : hs_ccn,
> -                  'Name'                 : host
> -                }
> +    verify_ectp_list = {} 
>
> -    verify_ectp_list[hs_ccn] = cs_fields
> +    cn_names = ["ComputerSystem"]
>
> -    cs_ccn = get_typed_class(virt, 'ComputerSystem')
> -    verify_ectp_list[cs_ccn] = cs_fields.copy()
> -    verify_ectp_list[cs_ccn]['CreationClassName']   = cs_ccn
> -    verify_ectp_list[cs_ccn]['Name']   = test_dom
> +    curr_cim_rev, changeset = get_provider_version(virt, server)
> +    if curr_cim_rev >= libvirt_cim_ectp_changes:
> +        cn_names2 = ["VirtualSystemMigrationService", "DiskPool", "NetworkPool",
> +                     "ProcessorPool", "MemoryPool"]
> +        cn_names.extend(cn_names2)
>
> -    vs_ccn = get_typed_class(virt, 'VirtualSystemMigrationService')
> -    verify_ectp_list[vs_ccn] = cs_fields.copy()
> -    verify_ectp_list[vs_ccn]['CreationClassName']   = vs_ccn
> -    verify_ectp_list[vs_ccn]['SystemCreationClassName']   =  hs_ccn
> -    verify_ectp_list[vs_ccn]['SystemName']   =  host
> -    verify_ectp_list[vs_ccn]['Name']   =  'MigrationService'
> +    status, host_name, host_ccn = get_host_info(server, virt)
> +    if status != PASS:
> +        logger.error("Unable to get host system instance objects")
> +        return FAIL, verify_ectp_list
>
> -    verify_ectp_list = pool_init(verify_ectp_list, 'DiskPool', 
> -                                 default_pool_name, virt)
> -    verify_ectp_list = pool_init(verify_ectp_list, 'NetworkPool', 
> -                                 default_network_name, virt)
> -    verify_ectp_list = pool_init(verify_ectp_list, 'ProcessorPool', 0, virt)
> -    verify_ectp_list = pool_init(verify_ectp_list, 'MemoryPool', 0, virt)
> +    #FIXME - get_host_info() should be updated to return the host instance
> +    insts = EnumInstances(server, host_ccn, True)
> +    if len(insts) < 1: 
> +        logger.error("Expected 1 %s instance", host_ccn)
> +        return FAIL, verify_ectp_list
>
>   
The test case will fail for the case where we have sblim-base-provider 
installed with the following error.
--------------------------------------------------------------------
ElementConforms - 01_forward.py: FAIL
ERROR - Expected 1 Linux_ComputerSystem instance
ERROR - Exception: Failed to get instances needed for verification
CIM_ERR_INVALID_CLASS: Linux_ComputerSystem
--------------------------------------------------------------------

This is because we are querying for the Linux_CoumputerSystem with 
'root/virt' namespace.
We need to store the previous namespace and change the namespace to 
"Globals.CIM_NS = 'root/cimv2'" depending on if the machine has 
sblim-base-provider installed before enumerating for 
Linux_ComputerSystem and then restore back to the previous namespace.

> -                       
> -    return verify_ectp_list
> +    verify_ectp_list[host_ccn] = insts
>
> -def verify_fields(assoc_val, pllst_index, vs_pool_values):
> +    for cn_base in cn_names:
> +        cn = get_typed_class(virt, cn_base)
> +        insts = EnumInstances(server, cn, True)
> +         
> +        if len(insts) < 1: 
> +            logger.error("Expected at least 1 %s instance", cn)
> +            return FAIL, verify_ectp_list
> +
> +        verify_ectp_list[cn] = insts
> +
> +    return PASS, verify_ectp_list
> +
> +def verify_fields(assoc_val, managed_ele_values):
>      try:
> -        field_names  = vs_pool_values[pllst_index].keys()
> -        values = vs_pool_values[pllst_index]
> -        for field in field_names:
> -            if values[field] != assoc_val[field]:
> -                print_field_error(field,  assoc_val[field], values[field]) 
> -                return FAIL
> +        cn = assoc_val.classname
> +        elements = managed_ele_values[cn]
> +
> +        for ele in elements:
> +            if assoc_val.items() == ele.items():
> +                managed_ele_values[cn].remove(ele)
> +                return PASS, managed_ele_values
> +
>      except Exception, details:
> -        logger.error("Exception: In fn verify_fields() %s", details)
> -        return FAIL
> +        logger.error("verify_fields() exception: %s", details)
> +        return FAIL, managed_ele_values
>        
> -    return PASS
> -
> -def verify_cs_hs_mig_fields(assoc_info, vs_pool_values):
> -    try:
> -        pllst_index = assoc_info[0]['CreationClassName']
> -        assoc_val   = None 
> -        if 'HostSystem' in pllst_index or \
> -           'VirtualSystemMigrationService' in pllst_index:
> -            if len(assoc_info) != 1:
> -                logger.error("'%s' returned '%d' records, expected 1", 
> -                              pllst_index, len(assoc_info)) 
> -                return FAIL
> -            assoc_val = assoc_info[0]
> -        else: 
> -            # For ComputerSystem info
> -            for inst in assoc_info:
> -                if inst['Name'] == test_dom:
> -                    assoc_val = inst
> -                    break
> -    except Exception, details:
> -        logger.error("Exception: In fn verify_cs_hs_mig_fields() %s", details)
> -        return FAIL
> -
> -    if assoc_val == None:
> -       return FAIL
> -
> -    return verify_fields(assoc_val, pllst_index, vs_pool_values)
> +    logger.error("%s not in expected list %s", assoc_val, elements)
> +    return FAIL, managed_ele_values
>
>  def get_proflist(server, reg_classname, virt):
>      profiles_instid_list = []
> @@ -150,8 +119,8 @@
>              len_prof_list = 7 
>          if len(proflist) < len_prof_list:
>              logger.error("'%s' returned '%d' '%s' objects, expected atleast %d",
> -                          reg_classname, len(proflist), 'Profile', len_prof_list)
> -            status = FAIL
> +                         reg_classname, len(proflist), 'Profile', len_prof_list)
> +            return FAIL, profiles_instid_list
>
>      except Exception, detail:
>          logger.error(CIM_ERROR_ENUMERATE, reg_classname)
> @@ -161,54 +130,17 @@
>      if status != PASS:
>          return status, profiles_instid_list
>
> -    profiles_instid_list = [ profile.InstanceID for profile in proflist ] 
> +    unsupp_prof = []
> +    if curr_cim_rev < libvirt_cim_ectp_changes:
> +        unsupp_prof = ["CIM:DSP1059-GenericDeviceResourceVirtualization-1.0.0",
> +                       "CIM:DSP1045-MemoryResourceVirtualization-1.0.0",
> +                       "CIM:DSP1081-VirtualSystemMigration-0.8.1"]
> +
> +    for profile in proflist:
> +        if profile.InstanceID not in unsupp_prof:
> +            profiles_instid_list.append(profile.InstanceID)
>
>      return status, profiles_instid_list 
> -
> -
> -def verify_ectp_assoc(server, virt):
> -    reg_classname = get_typed_class(virt, "RegisteredProfile")
> -    an = get_typed_class(virt,"ElementConformsToProfile")
> -
> -    status, inst_lst = get_proflist(server, reg_classname, virt)
> -    if status != PASS:
> -        return status
> -
> -    verify_ectp_list = init_vs_pool_values(server, virt)
> -    for devid in inst_lst :
> -        logger.info("Verifying '%s' with '%s'", an, devid)
> -        try:
> -            assoc_info = assoc.Associators(server, 
> -                                           an, 
> -                                           reg_classname,
> -                                           InstanceID = devid)  
> -            if len(assoc_info) < 1:
> -                ret_val, linux_cs = check_sblim(server, virt)
> -                if ret_val != PASS:
> -                    logger.error(" '%s' returned (%d) '%s' objects", an, 
> -                                 len(assoc_info), reg_classname)
> -                    return FAIL
> -                else:
> -                    return XFAIL_RC(bug_sblim) 
> -                break
> -
> -            if 'DSP1059' in devid or 'DSP1045' in devid:
> -                instid        = assoc_info[0]['InstanceID']
> -                index, other  = instid.split("/")
> -                cn = get_typed_class(virt, index)
> -                status = verify_fields(assoc_info[0], cn, verify_ectp_list)
> -            else:
> -                ccn = assoc_info[0]['CreationClassName']
> -                status = verify_cs_hs_mig_fields(assoc_info, verify_ectp_list)
> -
> -            if status != PASS:
> -                break
> -
> -        except Exception, detail:
> -            logger.error(CIM_ERROR_ASSOCIATORS, an)
> -            logger.error("Exception: %s" % detail)
> -            status = FAIL
> -    return status
>
>  @do_main(sup_types)
>  def main():
> @@ -216,7 +148,7 @@
>      server  = options.ip
>      virt    = options.virt
>    
> -    status = PASS
> +    status = None 
>      destroy_and_undefine_all(options.ip, options.virt)
>
>      virt_xml = vxml.get_class(options.virt)
> @@ -232,11 +164,52 @@
>          logger.error('Unable to start domain %s' % test_dom)
>          return FAIL
>
> -
>      prev_namespace = Globals.CIM_NS
>      Globals.CIM_NS = 'root/interop'
>
> -    status = verify_ectp_assoc(server, virt)
> +    try:
> +        reg_classname = get_typed_class(virt, "RegisteredProfile")
> +        an = get_typed_class(virt,"ElementConformsToProfile")
> +
> +        status, prof_inst_lst = get_proflist(server, reg_classname, virt)
> +        if status != PASS:
> +            raise Exception("Failed to get profile list") 
> +
> +        status, verify_ectp_list = init_vs_pool_values(server, virt)
> +        if status != PASS:
> +            raise Exception("Failed to get instances needed for verification") 
> +
> +        for prof_id in prof_inst_lst:
> +            logger.info("Verifying '%s' with '%s'", an, prof_id)
> +            assoc_info = assoc.Associators(server,
> +                                           an,
> +                                           reg_classname,
> +                                           InstanceID = prof_id)
> +
> +            if len(assoc_info) < 1:
> +                ret_val, linux_cs = check_sblim(server, virt)
> +                if ret_val != PASS:
> +                    status = FAIL
> +                    raise Exception(" '%s' returned (%d) '%s' objects" % \
> +                                    (len(assoc_info), reg_classname))
> +                else:
> +                    status = XFAIL_RC(bug_sblim)
> +                    raise Exception("Known failure")
> +
> +            for inst in assoc_info:
> +                status, verify_ectp_list = verify_fields(inst, verify_ectp_list)
> +                if status != PASS:
> +                    raise Exception("Failed to verify instance") 
> +
> +        if status == PASS:
> +            for k, l in verify_ectp_list.iteritems():
> +                if len(l) != 0:
> +                    status = FAIL
> +                    raise Exception("%s items weren't returned: %s" % (k, l))
> +
> +    except Exception, detail:
> +        logger.error("Exception: %s" % detail)
> +        status = FAIL
>   
Since we are setting the status appropriately in all the cases within 
the try block, I dont think we need to set this explicitly.
>      Globals.CIM_NS = prev_namespace
>      cxml.destroy(server)
>
> _______________________________________________
> Libvirt-cim mailing list
> Libvirt-cim at redhat.com
> https://www.redhat.com/mailman/listinfo/libvirt-cim
>   




More information about the Libvirt-cim mailing list