Somewhere between stable-2.10 and master I missed commit 24d3d8d

  QMP: always return the command result

So please consider the following interdiff:

diff --git a/lib/hypervisor/hv_kvm/monitor.py b/lib/hypervisor/hv_kvm/monitor.py
index ceb42a9..b47d183 100644
--- a/lib/hypervisor/hv_kvm/monitor.py
+++ b/lib/hypervisor/hv_kvm/monitor.py
@@ -438,7 +438,7 @@ class QmpConnection(MonitorSocket):
       fdsend.sendfds(self.sock, serializer.Dump(command), fds=fds)
       # Get the response out of the buffer
       response = self._GetResponse("add-fd")
-      fdset = response[self._RETURN_KEY]["fdset-id"]
+      fdset = response["fdset-id"]
       logging.info("Sent fds %s and added to fdset %s", fds, fdset)
     except errors.HypervisorError, err:
       # In case _GetResponse() fails

Thanks,
dimara


* Dimitris Aragiorgis <[email protected]> [2014-07-25 16:11:55 +0300]:

> ..through qemu monitor sockets using fdsend.
> 
> For the hmp the `get-fd` command is used while for the qmp the
> `add-fd` command is used, where the fd is added to the first
> available fdset. Currently the first one is used during NIC hot-add
> while the second will be used during disk hot-add.
> 
> Add also RemoveFdset() method for cleaning up fdsets.
> 
> Signed-off-by: Dimitris Aragiorgis <[email protected]>
> ---
>  lib/hypervisor/hv_kvm/monitor.py |   74 
> ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 74 insertions(+)
> 
> diff --git a/lib/hypervisor/hv_kvm/monitor.py 
> b/lib/hypervisor/hv_kvm/monitor.py
> index 7667730..ceb42a9 100644
> --- a/lib/hypervisor/hv_kvm/monitor.py
> +++ b/lib/hypervisor/hv_kvm/monitor.py
> @@ -29,6 +29,11 @@ import stat
>  import errno
>  import socket
>  import StringIO
> +import logging
> +try:
> +  import fdsend   # pylint: disable=F0401
> +except ImportError:
> +  fdsend = None
>  
>  from ganeti import errors
>  from ganeti import utils
> @@ -181,6 +186,16 @@ class MonitorSocket(object):
>      """
>      self.sock.close()
>  
> +  def GetFd(self, fds, kvm_devid):
> +    """Pass file descriptor to kvm process via monitor socket using 
> SCM_RIGHTS
> +
> +    """
> +    self._check_connection()
> +
> +    command = "getfd %s\n" % kvm_devid
> +    logging.info("Passing %s fds to %s", fds, self.monitor_filename)
> +    fdsend.sendfds(self.sock, command, fds=fds)
> +
>  
>  class QmpConnection(MonitorSocket):
>    """Connection to the QEMU Monitor using the QEMU Monitor Protocol (QMP).
> @@ -369,6 +384,16 @@ class QmpConnection(MonitorSocket):
>        message[self._ARGUMENTS_KEY] = arguments
>      self._Send(message)
>  
> +    return self._GetResponse(command)
> +
> +  def _GetResponse(self, command):
> +    """Parse the QMP response
> +
> +    If error key found in the response message raise HypervisorError.
> +    Ignore any async event and thus return the response message
> +    related to command.
> +
> +    """
>      # According the the QMP specification, there are only two reply types to 
> a
>      # command: either error (containing the "error" key) or success 
> (containing
>      # the "return" key). There is also a third possibility, that of an
> @@ -389,3 +414,52 @@ class QmpConnection(MonitorSocket):
>          continue
>  
>        return response[self._RETURN_KEY]
> +
> +  def AddFd(self, fds):
> +    """Pass file descriptor to kvm process via qmp socket using SCM_RIGHTS
> +
> +    Add the fds to an fdset so that they can be used later by hot-add 
> commands
> +
> +    @type fds: list
> +    @param fds: The list of file descriptors to pass
> +
> +    @return: The fdset ID that the fds have been added to
> +      (None if operation fails)
> +
> +    """
> +    self._check_connection()
> +
> +    if not fdsend or "add-fd" not in self.supported_commands:
> +      return None
> +
> +    try:
> +      # Omit fdset-id and let qemu create a new one (see qmp-commands.hx)
> +      command = {"execute": "add-fd"}
> +      fdsend.sendfds(self.sock, serializer.Dump(command), fds=fds)
> +      # Get the response out of the buffer
> +      response = self._GetResponse("add-fd")
> +      fdset = response[self._RETURN_KEY]["fdset-id"]
> +      logging.info("Sent fds %s and added to fdset %s", fds, fdset)
> +    except errors.HypervisorError, err:
> +      # In case _GetResponse() fails
> +      fdset = None
> +      logging.info("Sending fds %s failed: %s", fds, err)
> +
> +    return fdset
> +
> +  def RemoveFdset(self, fdset):
> +    """Remove the file descriptor previously passed
> +
> +    After qemu has dup'd the fd (e.g. during disk hotplug),
> +    it can be safely removed.
> +
> +    """
> +    self._check_connection()
> +    # Omit the fd to cleanup all fds in the fdset (see qmp-commands.hx)
> +    command = "remove-fd"
> +    arguments = {"fdset-id": fdset}
> +    logging.info("Removing fdset %s", fdset)
> +    try:
> +      self.Execute(command, arguments=arguments)
> +    except errors.HypervisorError, err:
> +      logging.info("Removing %s fdset failed: %s", fdset, err)
> -- 
> 1.7.10.4

Attachment: signature.asc
Description: Digital signature

Reply via email to