[Libvirt-cim] [PATCH 05/10] XenKvmLib: Add controller device

John Ferlan jferlan at redhat.com
Mon Apr 14 15:08:06 UTC 2014



On 04/14/2014 02:51 AM, Xu Wang wrote:
> 
> 于 2014年04月05日 00:12, John Ferlan 写道:
>> Add support to handle a controller device variantly based up on the
>> libvirt-cim revision value
>>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>>   suites/libvirt-cim/lib/XenKvmLib/devices.py        |  6 ++++
>>   suites/libvirt-cim/lib/XenKvmLib/logicaldevices.py |  2 +-
>>   suites/libvirt-cim/lib/XenKvmLib/rasd.py           | 25 ++++++++++++++
>>   suites/libvirt-cim/lib/XenKvmLib/vsms.py           | 24 +++++++++++++
>>   suites/libvirt-cim/lib/XenKvmLib/vxml.py           | 39 +++++++++++++++++-----
>>   5 files changed, 86 insertions(+), 10 deletions(-)
>>
>> diff --git a/suites/libvirt-cim/lib/XenKvmLib/devices.py b/suites/libvirt-cim/lib/XenKvmLib/devices.py
>> index 0ddccbb..5f26fa9 100755
>> --- a/suites/libvirt-cim/lib/XenKvmLib/devices.py
>> +++ b/suites/libvirt-cim/lib/XenKvmLib/devices.py
>> @@ -33,6 +33,7 @@ from XenKvmLib.enumclass import EnumInstances
>>
>>   graphics_dev_rev = 725
>>   input_dev_rev = 745
>> +controller_dev_rev = 1310
>>
>>   def get_class(classname):
>>       return eval(classname)
>> @@ -99,6 +100,8 @@ def dev_cn_to_rasd_cn(dev_cn, virt):
>>           return get_typed_class(virt, "GraphicsResourceAllocationSettingData")
>>       elif dev_cn.find('PointingDevice') >= 0:
>>           return get_typed_class(virt, "InputResourceAllocationSettingData")
>> +    elif dev_cn.find('Controller') >= 0:
>> +        return get_typed_class(virt, "ControllerResourceAllocationSettingData")
>>       else:
>>           return None
>>
>> @@ -112,6 +115,9 @@ def enum_dev(virt, ip):
>>       if curr_cim_rev >= input_dev_rev:
>>           dev_list.append('PointingDevice')
>>
>> +    if curr_cim_rev >= controller_dev_rev and virt == 'KVM':
>> +        dev_list.append('Controller')
>> +
>>       dev_insts = {}
>>
>>       try:
>> diff --git a/suites/libvirt-cim/lib/XenKvmLib/logicaldevices.py b/suites/libvirt-cim/lib/XenKvmLib/logicaldevices.py
>> index 744e864..5db36ca 100644
>> --- a/suites/libvirt-cim/lib/XenKvmLib/logicaldevices.py
>> +++ b/suites/libvirt-cim/lib/XenKvmLib/logicaldevices.py
>> @@ -57,7 +57,7 @@ def spec_err(fieldvalue, field_list, fieldname):
>>
>>   def verify_device_values(assoc_info, list_values, virt='Xen'):
>>       dev_cnames = ['LogicalDisk', 'Memory', 'NetworkPort', 'Processor', \
>> -                  'DisplayController', 'PointingDevice']
>> +                  'DisplayController', 'PointingDevice', 'Controller']
>>       for i in range(len(dev_cnames)):
>>           dev_cnames[i] = get_typed_class(virt, dev_cnames[i])
>>
>> diff --git a/suites/libvirt-cim/lib/XenKvmLib/rasd.py b/suites/libvirt-cim/lib/XenKvmLib/rasd.py
>> index 4d4240a..21dd7e4 100644
>> --- a/suites/libvirt-cim/lib/XenKvmLib/rasd.py
>> +++ b/suites/libvirt-cim/lib/XenKvmLib/rasd.py
>> @@ -40,6 +40,7 @@ dasd_cn = 'DiskResourceAllocationSettingData'
>>   masd_cn = 'MemResourceAllocationSettingData'
>>   dcrasd_cn = 'GraphicsResourceAllocationSettingData'
>>   irasd_cn = 'InputResourceAllocationSettingData'
>> +ctlrasd_cn = 'ControllerResourceAllocationSettingData'
>>   dpasd_cn = 'DiskPoolResourceAllocationSettingData'
>>   npasd_cn = 'NetPoolResourceAllocationSettingData'
>>   svrasd_cn = 'StorageVolumeResourceAllocationSettingData'
>> @@ -51,6 +52,7 @@ netcn  =  'NetworkPort'
>>   diskcn =  'LogicalDisk'
>>   dccn = 'DisplayController'
>>   pdcn = 'PointingDevice'
>> +ctlcn = 'Controller'
>>
>>   libvirt_rasd_storagepool_changes = 934
>>
>> @@ -65,12 +67,14 @@ def rasd_init_list(vsxml, virt, t_disk, t_dom, t_mac, t_mem, server):
>>       disk_cn = get_typed_class(virt, diskcn)
>>       dc_cn = get_typed_class(virt, dccn)
>>       pd_cn = get_typed_class(virt, pdcn)
>> +    ctl_cn = get_typed_class(virt, ctlcn)
>>
>>       in_list = { 'proc'    :      proc_cn,
>>                   'mem'     :      mem_cn,
>>                   'net'     :      net_cn,
>>                   'disk'    :      disk_cn,
>>                   'display' :      dc_cn,
>> +                'controller' :   ctl_cn,
>>                   'point'    :     pd_cn
>>                  }
>>       try:
>> @@ -113,6 +117,18 @@ def rasd_init_list(vsxml, virt, t_disk, t_dom, t_mac, t_mem, server):
>>                           dc_cn   : {
>>                                       "InstanceID" : "%s/%s" %(t_dom, "vnc")
>>                                     },
>> +                        # There can be more than one controller defined for
>> +                        # any system - usually there are 3, one each for usb,
>> +                        # pci, and ide. The InstanceID is formatted using
>> +                        # the string "controller" and the type/string of the
>> +                        # controller, and the index id found.  That index can
>> +                        # vary. Thus our verify_controllerrasd_values will
>> +                        # just ensure the "base" is valid - that is the
>> +                        # guest name and "controller" string.
>> +                        ctl_cn   : {
>> +                                     "InstanceID" : "%s/%s:" \
>> +                                             %(t_dom, "controller")
>> +                                  },
>>                           pd_cn   : {
>>                                       "InstanceID" : point_device
>>                                     }
>> @@ -143,6 +159,15 @@ def InstId_err(assoc_info, list):
>>       logger.error("Returned %s instead of %s",
>>                     assoc_info['InstanceID'], list['InstanceID'])
>>
>> +def verify_controllerrasd_values(assoc_info, controllerrasd_list):
>> +    status = PASS
>> +    print 'assoc', assoc_info['InstanceID']
>> +    print 'ctrlr', controllerrasd_list['InstanceID']
>> +    if controllerrasd_list['InstanceID'] not in assoc_info['InstanceID']:
>> +        InstId_err(assoc_info, controllerrasd_list)
>> +        status = FAIL
>> +    return status
>> +
>>   def verify_displayrasd_values(assoc_info, displayrasd_list):
>>       status = PASS
>>       if assoc_info['InstanceID'] != displayrasd_list['InstanceID']:
>> diff --git a/suites/libvirt-cim/lib/XenKvmLib/vsms.py b/suites/libvirt-cim/lib/XenKvmLib/vsms.py
>> index d7f33f9..3da309c 100755
>> --- a/suites/libvirt-cim/lib/XenKvmLib/vsms.py
>> +++ b/suites/libvirt-cim/lib/XenKvmLib/vsms.py
>> @@ -36,6 +36,7 @@ RASD_TYPE_DISK = 17
>>   RASD_TYPE_GRAPHICS = 24
>>   RASD_TYPE_INPUT = 13
>>   RASD_TYPE_STOREVOL = 32768
>> +RASD_TYPE_CONTROLLER = 32771
>>
>>   VIRT_DISK_TYPE_DISK = 0
>>   VIRT_DISK_TYPE_CDROM = 1
>> @@ -324,6 +325,29 @@ class LXC_InputResourceAllocationSettingData(CIM_InputResourceAllocationSettingD
>>   def get_iasd_class(virt):
>>       pass
>>     
>> +class CIM_ControllerResourceAllocationSettingData(CIMClassMOF):
>> +    def __init__(self, name, ctl_sub_type=None, ctl_index=-1, ctl_model=None):
>> +        self.InstanceID = '%s/controller:' % name
>> +        self.ResourceType = RASD_TYPE_CONTROLLER
>> +
>> +        if ctl_sub_type is not None:
>> +            self.ResourceSubType = ctl_sub_type
>> +            self.InstanceID += '%s' % ctl_sub_type
>> +
>> +        if ctl_index >= 0:
>> +            self.Index = ctl_index
>> +            self.InstanceID += ':%d' % ctl_index
>> +
>> +        if ctl_model is not None:
>> +            self.Model = ctl_model
>> +
>> +class KVM_ControllerResourceAllocationSettingData(CIM_ControllerResourceAllocationSettingData):
>> +    pass
>> +
>> + at eval_cls('ControllerResourceAllocationSettingData')
>> +def get_ctlasd_class(virt):
>> +    pass
>> +
>>   def default_vssd_rasd_str(dom_name='test_domain',
>>                             disk_dev='xvda',
>>                             disk_source=const.Xen_disk_path,
>> diff --git a/suites/libvirt-cim/lib/XenKvmLib/vxml.py b/suites/libvirt-cim/lib/XenKvmLib/vxml.py
>> index 74c4f23..ad80aae 100644
>> --- a/suites/libvirt-cim/lib/XenKvmLib/vxml.py
>> +++ b/suites/libvirt-cim/lib/XenKvmLib/vxml.py
>> @@ -53,6 +53,8 @@ from XenKvmLib.const import get_provider_version
>>
>>   vsms_graphics_sup = 763
>>   vsms_inputdev_sup = 771
>> +vsms_controller_sup = 1310
>> +
>>
>>   class XMLClass:
>>       xml_string = ""
>> @@ -598,7 +600,8 @@ class VirtCIM:
>>       def __init__(self, virt, dom_name, uuid, pae, acpi, apic, disk_dev,
>>                    disk_source, net_type, net_name, net_mac, vcpus, mem,
>>                    mem_allocunits, emu_type, grstype, ip,
>> -                 is_ipv6_only, port_num, kmap, irstype, btype, vnc_passwd):
>> +                 is_ipv6_only, port_num, kmap, irstype, btype, vnc_passwd,
>> +                 ctltype, ctlindex, ctlmodel):
>>           self.virt = virt
>>           self.domain_name = dom_name
>>           self.err_rc = None
>> @@ -629,6 +632,14 @@ class VirtCIM:
>>           self.iasd = vsms.get_iasd_class(virt)(name=dom_name,
>>                                                 res_sub_type=irstype,
>>                                                 bus_type=btype)
>> +        if virt == 'KVM':
>> +            self.ctlasd = vsms.get_ctlasd_class(virt)(name=dom_name,
>> +                                                      ctl_sub_type=ctltype,
>> +                                                      ctl_index=ctlindex,
>> +                                                      ctl_model=ctlmodel)
>> +        else:
>> +            self.ctlasd = None
>> +
>>           self.res_settings = []
>>
>>       def cim_define(self, ip, ref_conf=None):
>> @@ -658,6 +669,9 @@ class VirtCIM:
>>               if self.iasd is not None:
>>                   res_settings.append(str(self.iasd))
>>
>> +        if curr_cim_rev > vsms_controller_sup and self.ctlasd is not None:
>> +            res_settings.append(str(self.ctlasd))
>> +
> Here I got a similar error, curr_cim_rev=1309 but 
> vsms_controller_sup=1310. Hence
> I got the following result,
> # CIM_NS=root/virt CIM_USER=root CIM_PASS=****** ./runtests libvirt-cim 
> -i localhost -c -d -v KVM -g RASD -t 03_rasd_errs.py
> Starting test suite: libvirt-cim
> Cleaned log files.
> 
> Testing KVM hypervisor
> --------------------------------------------------------------------
> RASD - 03_rasd_errs.py: FAIL
> ERROR - Expected 6 RASDs, got 7
> --------------------------------------------------------------------
> 
> Do I need to update value of @curren_cim_rev and how to change it?
> 
> Thanks,
> Xu Wang

That's probably the cause - my response in the controller patches stream
should help - but essentially it's running autoconfiscate.sh and then
rebuilding/reinstalling the repo

John
>>           if ref_conf is None:
>>                ref_conf = ' '
>>
>> @@ -849,7 +863,8 @@ class XenXML(VirtXML, VirtCIM):
>>                          emu_type=None, grstype="vnc", address=None,
>>                          is_ipv6_only=None,
>>                          port_num='-1', keymap="en-us", irstype="mouse",
>> -                       btype="xen", vnc_passwd=None):
>> +                       btype="xen", vnc_passwd=None,
>> +                       ctltype=None, ctlindex=-1, ctlmodel=None):
>>           if not (os.path.exists(const.Xen_kernel_path) \
>>                   and os.path.exists(const.Xen_init_path)):
>>               logger.error('ERROR: Either the kernel image '
>> @@ -863,7 +878,7 @@ class XenXML(VirtXML, VirtCIM):
>>                            disk_file_path, ntype, net_name, mac, vcpus, mem,
>>                            mem_allocunits, emu_type, grstype, address,
>>                            is_ipv6_only, port_num, keymap, irstype, btype,
>> -                         vnc_passwd)
>> +                         vnc_passwd, ctltype, ctlindex, ctlmodel)
>>
>>       def _os(self, os_kernel, os_initrd):
>>           os = self.get_node('/domain/os')
>> @@ -920,7 +935,10 @@ class KVMXML(VirtXML, VirtCIM):
>>                          emu_type=None, grstype="vnc", address=None,
>>                          is_ipv6_only=None,
>>                          port_num='-1', keymap="en-us", irstype="mouse",
>> -                       btype="ps2", vnc_passwd=None):
>> +                       btype="ps2", vnc_passwd=None,
>> +                       ctltype="pci", ctlindex=0, ctlmodel="pci-root"):
>> +                       # Optionally the following works too:
>> +                       #ctltype="usb", ctlindex=0, ctlmodel=None):
>>           if not os.path.exists(disk_file_path):
>>               logger.error('Error: Disk image %s does not exist', disk_file_path)
>>               sys.exit(1)
>> @@ -929,7 +947,7 @@ class KVMXML(VirtXML, VirtCIM):
>>                            disk_file_path, ntype, net_name, mac, vcpus, mem,
>>                            mem_allocunits, emu_type, grstype, address,
>>                            is_ipv6_only, port_num, keymap, irstype, btype,
>> -                         vnc_passwd)
>> +                         vnc_passwd, ctltype, ctlindex, ctlmodel)
>>           self._os()
>>           self._devices(const.KVM_default_emulator, ntype,
>>                         disk_file_path, disk, mac, net_name)
>> @@ -983,7 +1001,8 @@ class XenFVXML(VirtXML, VirtCIM):
>>                          emu_type=None, grstype="vnc",
>>                          address=None, is_ipv6_only=None, port_num='-1',
>>                          keymap="en-us",
>> -                       irstype="mouse", btype="ps2", vnc_passwd=None):
>> +                       irstype="mouse", btype="ps2", vnc_passwd=None,
>> +                       ctltype=None, ctlindex=-1, ctlmodel=None):
>>           if not os.path.exists(disk_file_path):
>>               logger.error('Error: Disk image %s does not exist', disk_file_path)
>>               sys.exit(1)
>> @@ -992,7 +1011,8 @@ class XenFVXML(VirtXML, VirtCIM):
>>                            disk_file_path, ntype, net_name, mac, vcpus, mem,
>>                            mem_allocunits, emu_type, grstype, address,
>>                            is_ipv6_only, port_num,
>> -                         keymap, irstype, btype, vnc_passwd)
>> +                         keymap, irstype, btype, vnc_passwd,
>> +                         ctltype, ctlindex, ctlmodel)
>>           self._os(const.XenFV_default_loader)
>>           self._devices(const.XenFV_default_emulator,
>>                         ntype, mac, net_name, disk_file_path, disk)
>> @@ -1036,7 +1056,8 @@ class LXCXML(VirtXML, VirtCIM):
>>                          tty=const.LXC_default_tty, grstype="vnc",
>>                          address=None, is_ipv6_only=None, port_num='-1',
>>                          keymap="en-us",
>> -                       irstype="mouse", btype="usb", vnc_passwd=None):
>> +                       irstype="mouse", btype="usb", vnc_passwd=None,
>> +                       ctltype=None, ctlindex=-1, ctlmodel=None):
>>           VirtXML.__init__(self, 'lxc', test_dom, set_uuid(), mem, vcpus)
>>           # pae, acpi and apic parameters doesn't make sense here, so we
>>           # statically set them to False (a.k.a. ignore them)
>> @@ -1045,7 +1066,7 @@ class LXCXML(VirtXML, VirtCIM):
>>                            ntype, net_name, mac, vcpus, mem,
>>                            const.default_mallocunits, None, grstype,
>>                            address, is_ipv6_only, port_num, keymap, irstype,
>> -                         btype, vnc_passwd)
>> +                         btype, vnc_passwd, ctltype, ctlindex, ctlmodel)
>>           self._os(const.LXC_init_path)
>>           self._devices(const.LXC_default_emulator, mac, ntype, net_name, const.LXC_default_tty)
>>           self.create_lxc_file(CIM_IP, const.LXC_init_path)
> 
> _______________________________________________
> 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