# HG changeset patch
# User Deepti B. Kalakeri <deeptik(a)linux.vnet.ibm.com>
# Date 1216384179 25200
# Node ID f8f6995ce08915d738d82600b15559c81fc40095
# Parent 3703b7be5a107c67e901546978e974546b3d5562
[TEST] Enabling 02_reverse.py with XenFV, KVM, LXC and modified logicaldevices.py to work
for all virt types.
Changes:
-------
1) Removed unnecessary import statements.
2) Updated verify_proc_values, verify_mem_values, verify_net_values, verify_disk_values
function of logicaldevices to work with all virt types.
3) Used verify_proc_values, verify_mem_values, verify_net_values, verify_disk_values fn.
4) Removed conf_file(), clean_up_restore(), get_or_bail(), print_error(), init_list(),
get_spec_fields_list(), assoc_values() fns.
5) Removed global status variable.
6) Added verify_eafp_values(), init_pllist(), create_diskpool_conf() fn.
7) Included create_diskpool_conf(), cleanup_restore() fn.
Tested on KVM on rpm, KVM current sources, LXC, XenFV, Xen.
Signed-off-by: Deepti B. Kalakeri <deeptik(a)linux.vnet.ibm.com>
diff -r 3703b7be5a10 -r f8f6995ce089
suites/libvirt-cim/cimtest/ElementAllocatedFromPool/02_reverse.py
--- a/suites/libvirt-cim/cimtest/ElementAllocatedFromPool/02_reverse.py Wed Jul 16
07:23:32 2008 -0700
+++ b/suites/libvirt-cim/cimtest/ElementAllocatedFromPool/02_reverse.py Fri Jul 18
05:29:39 2008 -0700
@@ -20,9 +20,8 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
-
# This tc is used to verify the classname, InstanceID and certian prop are
-# are appropriately set for the domains when verified using the
+# appropriately set for the domains when verified using the
# Xen_ElementAllocatedFromPool asscoiation.
#
# Example command for LogicalDisk w.r.t to Xen_ElementAllocatedFromPool \
@@ -47,111 +46,80 @@
import sys
import os
-from distutils.file_util import move_file
import pywbem
-from VirtLib import utils
-from VirtLib import live
-from XenKvmLib import assoc
-from XenKvmLib import enumclass
-from CimTest import Globals
-from CimTest.Globals import do_main
-from CimTest.ReturnCodes import PASS, FAIL, SKIP
-from XenKvmLib.test_xml import testxml_bridge
-from XenKvmLib.test_doms import test_domain_function, destroy_and_undefine_all
-from VirtLib.live import network_by_bridge
+from XenKvmLib.assoc import Associators
+from XenKvmLib.vxml import get_class
+from CimTest.Globals import do_main, logger, CIM_ERROR_ASSOCIATORS
+from CimTest.ReturnCodes import PASS, FAIL
+from XenKvmLib.test_doms import destroy_and_undefine_all
+from XenKvmLib.classes import get_typed_class
+from XenKvmLib.common_util import create_diskpool_conf, cleanup_restore
+from XenKvmLib.logicaldevices import verify_proc_values, verify_mem_values, \
+verify_net_values, verify_disk_values
-sup_types = ['Xen']
+sup_types = ['Xen' , 'KVM', 'XenFV', 'LXC']
-status = PASS
-test_dom = "hd_domain"
+test_dom = "eafp_domain"
test_mac = "00:11:22:33:44:aa"
test_mem = 128
test_vcpus = 4
-test_disk = "xvdb"
-test_dpath = "foo"
-disk_file = '/tmp/diskpool.conf'
-back_disk_file = disk_file + "." + "02_reverse"
-diskid = "%s/%s" % ("DiskPool", test_dpath)
-memid = "%s/%s" % ("MemoryPool", 0)
-procid = "%s/%s" % ("ProcessorPool", 0)
-def conf_file():
- """
- Creating diskpool.conf file.
- """
- try:
- f = open(disk_file, 'w')
- f.write('%s %s' % (test_dpath, '/'))
- f.close()
- except Exception,detail:
- Globals.logger.error("Exception: %s", detail)
- status = SKIP
- sys.exit(status)
+def init_pllist(virt, vsxml, diskid):
+ keys = {
+ 'MemoryPool' : 'MemoryPool/0',
+ }
+ if virt != 'LXC':
+ virt_network = vsxml.xml_get_net_network()
+ keys['DiskPool'] = diskid
+ keys['ProcessorPool'] = 'ProcessorPool/0'
+ keys['NetworkPool'] = 'NetworkPool/%s' %virt_network
-def clean_up_restore(ip):
- """
- Restoring back the original diskpool.conf
- file.
- """
- try:
- if os.path.exists(back_disk_file):
- os.remove(disk_file)
- move_file(back_disk_file, disk_file)
- except Exception, detail:
- Globals.logger.error("Exception: %s", detail)
- status = SKIP
- ret = test_domain_function(test_dom, ip, \
- cmd = "destroy")
- sys.exit(status)
-
+ pllist = { }
+ for cn, k in keys.iteritems():
+ cn = get_typed_class(virt, cn)
+ pllist[cn] = k
-def get_or_bail(ip, id, pool_class):
- """
- Getinstance for the CLass and return instance on success, otherwise
- exit after cleanup_restore and destroying the guest.
- """
- key_list = { 'InstanceID' : id }
- try:
- instance = enumclass.getInstance(ip, pool_class, key_list)
- except Exception, detail:
- Globals.logger.error(Globals.CIM_ERROR_GETINSTANCE, '%s', pool_class)
- Globals.logger.error("Exception: %s", detail)
- clean_up_restore(ip)
- status = FAIL
- ret = test_domain_function(test_dom, ip, \
- cmd = "destroy")
- sys.exit(status)
- return instance
+ return pllist
-def print_error(field, ret_val, req_val):
- Globals.logger.error("%s Mismatch", field)
- Globals.logger.error("Returned %s instead of %s", ret_val, req_val)
+def eafp_list(virt, test_disk):
+ mcn = get_typed_class(virt, "Memory")
+ mem = {
+ 'SystemName' : test_dom,
+ 'CreationClassName' : mcn,
+ 'DeviceID' : "%s/%s" % (test_dom,
"mem"),
+ 'NumberOfBlocks' : test_mem * 1024
+ }
-def init_list(ip, disk, mem, net, proc):
- """
- Creating the lists that will be used for comparisons.
- """
+ eaf_values = { mcn : mem }
- pllist = {
- "Xen_DiskPool" : disk.InstanceID, \
- "Xen_MemoryPool" : mem.InstanceID, \
- "Xen_NetworkPool" : net.InstanceID, \
- "Xen_ProcessorPool": proc.InstanceID
- }
- cllist = [
- "Xen_LogicalDisk", \
- "Xen_Memory", \
- "Xen_NetworkPort", \
- "Xen_Processor"
- ]
- prop_list = ["%s/%s" % (test_dom, test_disk), test_disk, \
- "%s/%s" % (test_dom, "mem"), test_mem, \
- "%s/%s" % (test_dom, test_mac), test_mac
- ]
- proc_prop = []
- for i in range(test_vcpus):
- proc_prop.append("%s/%s" % (test_dom, i))
- return pllist, cllist, prop_list, proc_prop
+ if virt != 'LXC':
+ dcn = get_typed_class(virt, "LogicalDisk")
+ pcn = get_typed_class(virt, "Processor")
+ ncn = get_typed_class(virt, "NetworkPort")
+
+ disk = {
+ 'SystemName' : test_dom,
+ 'CreationClassName' : dcn,
+ 'DeviceID' : "%s/%s" % (test_dom,
test_disk),
+ 'Name' : test_disk
+ }
+ proc = {
+ 'SystemName' : test_dom,
+ 'CreationClassName' : pcn,
+ 'DeviceID' : None
+ }
+ net = {
+ 'SystemName' : test_dom,
+ 'CreationClassName' : ncn,
+ 'DeviceID' : "%s/%s" % (test_dom,
test_mac),
+ 'NetworkAddresses' : test_mac
+ }
+
+ eaf_values[pcn] = proc
+ eaf_values[dcn] = disk
+ eaf_values[ncn] = net
+
+ return eaf_values
def get_inst_for_dom(assoc_val):
list = []
@@ -162,196 +130,87 @@ def get_inst_for_dom(assoc_val):
return list
-def get_spec_fields_list(inst_list, field_name):
- global status
- specific_fields = { }
- if (len(inst_list)) != 1:
- Globals.logger.error("Got %s record for Memory/Network/LogicalDisk instead
of \
-1", len(inst_list))
- status = FAIL
- return
-# verifying the Name field for LogicalDisk
- try:
- if inst_list[0]['CreationClassName'] != 'Xen_Memory':
- field_value = inst_list[0][field_name]
- if field_name == 'NetworkAddresses':
-# For network we NetworkAddresses is a list of addresses, since we
-# are assigning only one address we are taking field_value[0]
- field_value = field_value[0]
- else:
- field_value = ((int(inst_list[0]['NumberOfBlocks'])*4096)/1024)
- specific_fields = {
- "field_name" : field_name,\
- "field_value" : field_value
- }
- except Exception, detail:
- Globals.logger.error("Exception in get_spec_fields_list(): %s",
detail)
- status = FAIL
- return specific_fields
+def verify_eafp_values(server, virt, in_pllist, test_disk):
+ # Looping through the in_pllist to get association for various pools.
+ eafp_values = eafp_list(virt, test_disk)
+ an = get_typed_class(virt, "ElementAllocatedFromPool")
+ for cn, instid in sorted(in_pllist.iteritems()):
+ try:
+ assoc_info = Associators(server, an, cn, virt, InstanceID = instid)
+ assoc_inst_list = get_inst_for_dom(assoc_info)
+ if len(assoc_inst_list) < 1 :
+ logger.error("'%s' with '%s' did not return any
records for"
+ " domain: '%s'", an, cn, test_dom)
+ return FAIL
-def assoc_values(assoc_list, field , list, index, specific_fields_list=""):
- """
- Verifying the records retruned by the associations.
- """
- global status
- if field == "CreationClassName":
- for i in range(len(assoc_list)):
- if assoc_list[i][field] != list[index]:
- print_error(field, assoc_list[i][field], list[index])
+ assoc_eafp_info = assoc_inst_list[0]
+ CCName = assoc_eafp_info['CreationClassName']
+ if CCName == get_typed_class(virt, 'Processor'):
+ if len(assoc_inst_list) != test_vcpus:
+ logger.error("'%s' should have returned '%i'
Processor"
+ " details, got '%i'", an, test_vcpus,
+ len(assoc_inst_list))
+ return FAIL
+ for i in range(test_vcpus):
+ eafp_values[CCName]['DeviceID'] = "%s/%s" %
(test_dom,i)
+ status = verify_proc_values(assoc_inst_list[i],
+ eafp_values, virt)
+ elif CCName == get_typed_class(virt, 'NetworkPort'):
+ status = verify_net_values(assoc_eafp_info, eafp_values, virt)
+ elif CCName == get_typed_class(virt, 'LogicalDisk'):
+ status = verify_disk_values(assoc_eafp_info, eafp_values, virt)
+ elif CCName == get_typed_class(virt, 'Memory'):
+ status = verify_mem_values(assoc_eafp_info, eafp_values, virt)
+ else:
status = FAIL
if status != PASS:
break
- elif field == "DeviceID":
- if assoc_list[0]['CreationClassName'] == 'Xen_Processor':
-# Verifying the list of DeviceId returned by the association
-# against the list created intially .
- for i in range(len(list)):
- if assoc_list[i]['DeviceID'] != list[i]:
- print_error(field, assoc_list[i]['DeviceID'], list[i])
- status = FAIL
- else:
-# Except for Xen_Processor, we get only once record for a domain for
-# other classes.
- if assoc_list[0]['DeviceID'] != list[index]:
- print_error(field, assoc_list[0]['DeviceID'] , list[index])
- status = FAIL
- else:
- # other specific fields verification
- if assoc_list[0]['CreationClassName'] != 'Xen_Processor':
- spec_field_name = specific_fields_list['field_name']
- spec_field_value = specific_fields_list['field_value']
- if spec_field_value != list[index]:
- print_error(field, spec_field_value, list[index])
- status = FAIL
-
+ except Exception, detail:
+ logger.error(CIM_ERROR_ASSOCIATORS, an)
+ logger.error("Exception: %s", detail)
+ status = FAIL
+ return status
@do_main(sup_types)
def main():
options = main.options
- global status
loop = 0
server = options.ip
- destroy_and_undefine_all(options.ip)
- test_xml, bridge = testxml_bridge(test_dom, mem = test_mem, vcpus = test_vcpus, \
- mac = test_mac, disk = test_disk, server = options.ip)
- if bridge == None:
- Globals.logger.error("Unable to find virtual bridge")
- return SKIP
+ virt = options.virt
+ if virt == 'Xen':
+ test_disk = 'xvdb'
+ else:
+ test_disk = 'hda'
- if test_xml == None:
- Globals.logger.error("Guest xml was not created properly")
+ # Getting the VS list and deleting the test_dom if it already exists.
+ destroy_and_undefine_all(server)
+ virt_type = get_class(virt)
+ if virt == 'LXC':
+ vsxml = virt_type(test_dom, vcpus = test_vcpus)
+ else:
+ vsxml = virt_type(test_dom, mem = test_mem, vcpus = test_vcpus,
+ mac = test_mac, disk = test_disk)
+
+ # Verify DiskPool on machine
+ status, diskid = create_diskpool_conf(server, virt)
+ if status != PASS:
+ return status
+
+ ret = vsxml.create(server)
+ if not ret:
+ logger.error("Failed to Create the dom: '%s'", test_dom)
return FAIL
- virt_network = network_by_bridge(bridge, server)
- if virt_network == None:
- Globals.logger.error("No virtual network found for bridge %s", bridge)
- return SKIP
+ # Get pool list against which the EAFP should be queried
+ pllist = init_pllist(virt, vsxml, diskid)
- ret = test_domain_function(test_xml, server, cmd = "create")
- if not ret:
- Globals.logger.error("Failed to Create the dom: %s", test_dom)
- return FAIL
+
+ status = verify_eafp_values(server, virt, pllist, test_disk)
+ vsxml.destroy(server)
+ cleanup_restore(server, virt)
+ return status
- # Taking care of already existing diskconf file
- # Creating diskpool.conf if it does not exist
- # Otherwise backing up the prev file and create new one.
- os.system("rm -f %s" % back_disk_file )
- if not (os.path.exists(disk_file)):
- conf_file()
- else:
- move_file(disk_file, back_disk_file)
- conf_file()
- try :
- disk = get_or_bail(server, id=diskid, \
- pool_class=enumclass.Xen_DiskPool)
- mem = get_or_bail(server, id = memid, \
- pool_class=enumclass.Xen_MemoryPool)
- netid = "%s/%s" % ("NetworkPool", virt_network)
- net = get_or_bail(server, id = netid, \
- pool_class=enumclass.Xen_NetworkPool)
- proc = get_or_bail(server, id = procid, \
- pool_class=enumclass.Xen_ProcessorPool)
-
- except Exception, detail:
- Globals.logger.error("Exception: %s", detail)
- clean_up_restore(server)
- status = FAIL
- ret = test_domain_function(test_dom, server, \
- cmd = "destroy")
- return status
-
- pllist, cllist, prop_list, proc_prop = init_list(server, disk, mem, net, proc)
-
-# Looping through the pllist to get association for various pools.
- for cn, instid in sorted(pllist.items()):
- try:
- assoc_info = assoc.Associators(server, \
- "Xen_ElementAllocatedFromPool",
\
- cn, \
- InstanceID = instid)
-# Verifying the Creation Class name for all the records returned for each
-# pool class queried
- inst_list = get_inst_for_dom(assoc_info)
- if (len(inst_list)) == 0:
- Globals.logger.error("Association did not return any records for \
-the specified domain: %s", test_dom)
- status = FAIL
- break
-
- assoc_values(assoc_list=inst_list, field="CreationClassName", \
- list=cllist, \
- index=loop)
-# verifying the DeviceID
- if inst_list[0]['CreationClassName'] == 'Xen_Processor':
-# The DeviceID for the processor varies from 0 to (vcpu - 1 )
- list_index = 0
- assoc_values(assoc_list=inst_list, field="DeviceID", \
- list=proc_prop, \
- index=list_index)
- else:
-# For LogicalDisk, Memory and NetworkPort
- if inst_list[0]['CreationClassName'] ==
'Xen_LogicalDisk':
- list_index = 0
- elif inst_list[0]['CreationClassName'] == 'Xen_Memory':
- list_index = 2
- else:
- list_index = 4 # NetworkPort
- assoc_values(assoc_list=inst_list, field="DeviceID", \
- list=prop_list, \
- index=list_index)
- if inst_list[0]['CreationClassName'] ==
'Xen_LogicalDisk':
-# verifying the Name field for LogicalDisk
- specific_fields =
get_spec_fields_list(inst_list,field_name="Name")
- list_index = 1
- elif inst_list[0]['CreationClassName'] == 'Xen_Memory':
-# verifying the NumberOfBlocks allocated for Memory
- specific_fields =
get_spec_fields_list(inst_list,field_name="NumberOfBlocks")
- list_index = 3
- else:
-# verifying the NetworkAddresses for the NetworkPort
- specific_fields =
get_spec_fields_list(inst_list,field_name="NetworkAddresses")
- list_index = 5 # NetworkPort
- assoc_values(assoc_list=inst_list, field="Other", \
- list=prop_list, \
- index=list_index, \
- specific_fields_list=specific_fields)
- if status != PASS:
- break
- else:
-# The loop variable is used to index the cllist to verify the creationclassname
- loop = loop + 1
- except Exception, detail:
- Globals.logger.error(Globals.CIM_ERROR_ASSOCIATORS, \
- 'Xen_ElementAllocatedFromPool')
- Globals.logger.error("Exception: %s", detail)
- clean_up_restore(server)
- status = FAIL
-
- ret = test_domain_function(test_dom, server, \
- cmd = "destroy")
- clean_up_restore(server)
- return status
if __name__ == "__main__":
sys.exit(main())
diff -r 3703b7be5a10 -r f8f6995ce089 suites/libvirt-cim/lib/XenKvmLib/logicaldevices.py
--- a/suites/libvirt-cim/lib/XenKvmLib/logicaldevices.py Wed Jul 16 07:23:32 2008 -0700
+++ b/suites/libvirt-cim/lib/XenKvmLib/logicaldevices.py Fri Jul 18 05:29:39 2008 -0700
@@ -23,6 +23,7 @@ import os
import os
from CimTest.Globals import logger
from CimTest.ReturnCodes import PASS, FAIL, SKIP
+from XenKvmLib.vxml import get_typed_class
# The list_values that is passed should be of the type ..
# disk = {
@@ -53,8 +54,9 @@ def spec_err(fieldvalue, field_list, fie
logger.error("%s Mismatch", fieldname)
logger.error("Returned %s instead of %s", fieldvalue,
field_list[fieldname])
-def verify_proc_values(assoc_info, list_values):
- proc_values = list_values['Xen_Processor']
+def verify_proc_values(assoc_info, list_values, virt='Xen'):
+ cn = get_typed_class(virt, 'Processor')
+ proc_values = list_values[cn]
if assoc_info['CreationClassName'] !=
proc_values['CreationClassName']:
field_err(assoc_info, proc_values, fieldname = 'CreationClassName')
return FAIL
@@ -67,8 +69,9 @@ def verify_proc_values(assoc_info, list_
return FAIL
return PASS
-def verify_mem_values(assoc_info, list_values):
- mem_values = list_values['Xen_Memory']
+def verify_mem_values(assoc_info, list_values, virt='Xen'):
+ cn = get_typed_class(virt, 'Memory')
+ mem_values = list_values[cn]
if assoc_info['CreationClassName'] !=
mem_values['CreationClassName']:
field_err(assoc_info, mem_values, fieldname = 'CreationClassName')
return FAIL
@@ -85,8 +88,9 @@ def verify_mem_values(assoc_info, list_v
return FAIL
return PASS
-def verify_net_values(assoc_info, list_values):
- net_values = list_values['Xen_NetworkPort']
+def verify_net_values(assoc_info, list_values, virt='Xen'):
+ cn = get_typed_class(virt, 'NetworkPort')
+ net_values = list_values[cn]
if assoc_info['CreationClassName'] !=
net_values['CreationClassName']:
field_err(assoc_info, net_values, fieldname = 'CreationClassName')
return FAIL
@@ -97,16 +101,17 @@ def verify_net_values(assoc_info, list_v
if sysname != net_values['SystemName']:
spec_err(sysname, net_values, fieldname = 'SystemName')
return FAIL
-# We are assinging only one mac address and hence we expect only one
-# address in the list
+ # We are assinging only one mac address and hence we expect only one
+ # address in the list
netadd = assoc_info['NetworkAddresses'][0]
if netadd != net_values['NetworkAddresses']:
spec_err(netadd, net_values, fieldname = 'NetworkAddresses')
return FAIL
return PASS
-def verify_disk_values(assoc_info, list_values):
- disk_values = list_values['Xen_LogicalDisk']
+def verify_disk_values(assoc_info, list_values, virt='Xen'):
+ cn = get_typed_class(virt, 'LogicalDisk')
+ disk_values = list_values[cn]
if assoc_info['CreationClassName'] !=
disk_values['CreationClassName']:
field_err(assoc_info, disk_values, fieldname = 'CreationClassName')
return FAIL