xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Philipp Hahn <hahn@univention.de>
Cc: xen-devel <xen-devel@lists.xen.org>
Subject: Re: [BUG, PATCH] xen-4.1-3 xend/XendDomainInfo.py#device_configure() TypeError
Date: Tue, 28 May 2013 11:25:52 -0400	[thread overview]
Message-ID: <20130528152552.GA4695@phenom.dumpdata.com> (raw)
In-Reply-To: <201305241953.10495.hahn@univention.de>

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@univention.de
> 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@lists.xen.org
> http://lists.xen.org/xen-devel

  reply	other threads:[~2013-05-28 15:25 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-24 17:53 [BUG, PATCH] xen-4.1-3 xend/XendDomainInfo.py#device_configure() TypeError Philipp Hahn
2013-05-28 15:25 ` Konrad Rzeszutek Wilk [this message]
2013-05-29  5:47   ` Philipp Hahn
2013-06-05 18:52     ` Konrad Rzeszutek Wilk

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130528152552.GA4695@phenom.dumpdata.com \
    --to=konrad.wilk@oracle.com \
    --cc=hahn@univention.de \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).