[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [BUG, PATCH] xen-4.1-3 xend/XendDomainInfo.py#device_configure() TypeError



On Fri, May 24, 2013 at 07:53:10PM +0200, Philipp Hahn wrote:
> Hello,
> 
> I noticed a bug in Xen-4.1-3, which is also still present in xen+git.
> I know that the Python xend is deprecated, but I'm stuck with xen-4.1 until 
> xen is usable with libvirt, so my patch might still be helpful for others.
> This is a follow-up to 
> <http://lists.xen.org/archives/html/xen-users/2012-11/msg00069.html>, which 
> still keeps me busy.
> 
> /xen/xend/server/SrvDomain.py declares, that "dev" is a string:
>     def op_device_configure(self, _, req):
>         return self.call(self.dom.device_configure,
>                          [['config', 'sxpr'],
>                           ['dev',    'str']],
>                          req)
> 
> but in xen/xend/XendDomainInfo.py "devid" is expected to be an integer:
>     def device_configure(self, dev_sxp, devid = None):
>         """Configure an existing device.
> ...
>         @param devid:      device id
>         @type  devid:      int
> 
> This leads to an error when I try to change the media of an CDROM device:
> ERROR (SrvBase:88) Request device_configure failed.
> Traceback (most recent call last):
>   File "/usr/lib/python2.6/dist-packages/xen/web/SrvBase.py", line 85, in 
> perform
>     return op_method(op, req)
>   File "/usr/lib/python2.6/dist-packages/xen/xend/server/SrvDomain.py", line 
> 216, in op_device_configure
>     req)
>   File "/usr/lib/python2.6/dist-packages/xen/xend/server/SrvDomain.py", line 
> 186, in call
>     return FormFn(fn, args)(req.args)
>   File "/usr/lib/python2.6/dist-packages/xen/xend/Args.py", line 166, in 
> __call__
>     return self.call_with_form_args(self.fn, fargs, xargs=xargs)
>   File "/usr/lib/python2.6/dist-packages/xen/xend/Args.py", line 138, in 
> call_with_form_args
>     return fn(*params, **keys)
>   File "/usr/lib/python2.6/dist-packages/xen/xend/XendDomainInfo.py", line 
> 1214, in device_configure
>     raise VmError("Device %s not connected" % devid)
> VmError: Device 768 not connected
> 
> This is because devid="768" != dev=768:
>     def _getDeviceInfo_vbd(self, devid):
>         for dev_type, dev_info in self.info.all_devices_sxpr():
>             if dev_type != 'vbd' and dev_type != 'tap' and dev_type != 'tap2':
>                 continue
>             dev = sxp.child_value(dev_info, 'dev')
>             dev = dev.split(':')[0]
>             dev = 
> self.getDeviceController(dev_type).convertToDeviceNumber(dev)
>             if devid == dev:
>                 return dev_info

Ewwww, that looks buggy. Could you just do 'return dev' ?

> 
> After applying the attached patch, I can successfully change the media using 
> libvirt:
> # virsh change-media ucs31-64-hvm hda --eject --live --config
> # virsh change-media ucs31-64-hvm hda 
> /var/lib/libvirt/images/UCS_3.1-1-amd64.iso --live --config
> 
> Sincerely
> Philipp Hahn
> -- 
> Philipp Hahn           Open Source Software Engineer      hahn@xxxxxxxxxxxxx
> Univention GmbH        be open.                       fon: +49 421 22 232- 0
> Mary-Somerville-Str.1  D-28359 Bremen                 fax: +49 421 22 232-99
>                                                    http://www.univention.de/

> diff --git a/tools/python/xen/xend/XendDomainInfo.py 
> b/tools/python/xen/xend/XendDomainInfo.py
> index e9d3e7e..36dc599 100644
> --- a/tools/python/xen/xend/XendDomainInfo.py
> +++ b/tools/python/xen/xend/XendDomainInfo.py
> @@ -1167,7 +1167,7 @@ class XendDomainInfo:
>          @param dev_config: device configuration
>          @type  dev_config: SXP object (parsed config)
>          @param devid:      device id
> -        @type  devid:      int
> +        @type  devid:      str
>          @return: Returns True if successfully updated device
>          @rtype: boolean
>          """
> @@ -1193,24 +1193,24 @@ class XendDomainInfo:
>  
>          dev_control = self.getDeviceController(dev_class)
>          if devid is None:
> -            dev = dev_config.get('dev', '')
> -            if not dev:
> +            devid = dev_config.get('dev', '')
> +            if not devid:
>                  raise VmError('Block device must have virtual details 
> specified')
> -            if 'ioemu:' in dev:
> -                (_, dev) = dev.split(':', 1)
> +            if 'ioemu:' in devid:
> +                (_, devid) = devid.split(':', 1)
>              try:
> -                (dev, _) = dev.split(':', 1)  # Remove ":disk" or ":cdrom"
> +                (devid, _) = devid.split(':', 1)  # Remove ":disk" or 
> ":cdrom"
>              except ValueError:
>                  pass
> -            devid = dev_control.convertToDeviceNumber(dev)
> -        dev_info = self._getDeviceInfo_vbd(devid)
> +        dev = dev_control.convertToDeviceNumber(devid)
> +        dev_info = self._getDeviceInfo_vbd(dev)
>          if dev_info is None:
>              raise VmError("Device %s not connected" % devid)
>          dev_uuid = sxp.child_value(dev_info, 'uuid')
>  
>          if self.domid is not None:
>              # use DevController.reconfigureDevice to change device config
> -            dev_control.reconfigureDevice(devid, dev_config)
> +            dev_control.reconfigureDevice(dev, dev_config)
>          else:
>              (_, new_b, new_f) = dev_control.getDeviceDetails(dev_config)
>              if (new_f['device-type'] == 'cdrom' and
> @@ -1220,7 +1220,7 @@ class XendDomainInfo:
>                  pass
>              else:
>                  raise VmError('Refusing to reconfigure device %s:%d to %s' %
> -                              (dev_class, devid, dev_config))
> +                              (dev_class, dev, dev_config))
>  
>          # update XendConfig with new device info
>          self.info.device_update(dev_uuid, dev_sxp)

> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.