On Thu, Jan 05, 2017 at 04:46:08PM -0800, Robin H. Johnson wrote:
> Implement the QEMU Guest Agent sockets, so that code/scripts on the
> hypervisors can communicate with guest operating systems easily.

Cool. I see that this is almost the same as the patch for master with some minor
tweaks. As we discussed in the previous review, we won't be able to apply this
to 2.15 because it modifies the RPC format, and we don't want to do this within
a minor version because it means 2.15.x and 2.15.x+1 daemons interoperate during
upgrades.

But it certainly makes sense to have this as an optional patch for your distro
for users who Know What They're Doing.

Thanks,
Brian.

> Signed-off-by: Robin H. Johnson <[email protected]>
> ---
>  lib/hypervisor/hv_kvm/__init__.py | 23 +++++++++++++++++++++++
>  man/gnt-instance.rst              |  7 +++++++
>  src/Ganeti/Constants.hs           |  5 +++++
>  3 files changed, 35 insertions(+)
> 
> diff --git a/lib/hypervisor/hv_kvm/__init__.py 
> b/lib/hypervisor/hv_kvm/__init__.py
> index cd29baa38..89bc18b85 100644
> --- a/lib/hypervisor/hv_kvm/__init__.py
> +++ b/lib/hypervisor/hv_kvm/__init__.py
> @@ -351,6 +351,7 @@ class KVMHypervisor(hv_base.BaseHypervisor):
>      constants.HV_MIGRATION_BANDWIDTH: hv_base.REQ_NONNEGATIVE_INT_CHECK,
>      constants.HV_MIGRATION_DOWNTIME: hv_base.REQ_NONNEGATIVE_INT_CHECK,
>      constants.HV_MIGRATION_MODE: hv_base.MIGRATION_MODE_CHECK,
> +    constants.HV_USE_GUEST_AGENT: hv_base.NO_CHECK,
>      constants.HV_USE_LOCALTIME: hv_base.NO_CHECK,
>      constants.HV_DISK_CACHE:
>        hv_base.ParamInSet(True, constants.HT_VALID_CACHE_TYPES),
> @@ -581,6 +582,13 @@ class KVMHypervisor(hv_base.BaseHypervisor):
>      """
>      return utils.PathJoin(cls._CTRL_DIR, "%s.qmp" % instance_name)
>  
> +  @classmethod
> +  def _InstanceQemuGuestAgentMonitor(cls, instance_name):
> +    """Returns the instance serial QEMU Guest Agent socket name
> +
> +    """
> +    return utils.PathJoin(cls._CTRL_DIR, "%s.qga" % instance_name)
> +
>    @classmethod
>    def _InstanceKvmdMonitor(cls, instance_name):
>      """Returns the instance kvm daemon socket name
> @@ -667,6 +675,7 @@ class KVMHypervisor(hv_base.BaseHypervisor):
>      utils.RemoveFile(cls._InstanceMonitor(instance_name))
>      utils.RemoveFile(cls._InstanceSerial(instance_name))
>      utils.RemoveFile(cls._InstanceQmpMonitor(instance_name))
> +    utils.RemoveFile(cls._InstanceQemuGuestAgentMonitor(instance_name))
>      utils.RemoveFile(cls._InstanceKVMRuntime(instance_name))
>      utils.RemoveFile(cls._InstanceKeymapFile(instance_name))
>      uid_file = cls._InstanceUidFile(instance_name)
> @@ -1376,6 +1385,20 @@ class KVMHypervisor(hv_base.BaseHypervisor):
>      if self._UUID_RE.search(kvmhelp):
>        kvm_cmd.extend(["-uuid", instance.uuid])
>  
> +    # Add guest agent socket
> +    if hvp[constants.HV_USE_GUEST_AGENT]:
> +      qga_addr = utils.GetFreeSlot(pci_reservations, reserve=True)
> +      qga_pci_info = "bus=%s,addr=%s" % ('pci.0', hex(qga_addr))
> +      qga_path = self._InstanceQemuGuestAgentMonitor(instance.name)
> +      logging.info("KVM: Guest Agent available at %s", qga_path)
> +      # The 'qga0' identified can change, but the 'org.qemu.guest_agent.0' 
> string is
> +      # the default expected by the Guest Agent.
> +      kvm_cmd.extend([
> +        "-chardev", "socket,path=%s,server,nowait,id=qga0" % qga_path,
> +        "-device", "virtio-serial,id=qga0,%s" % qga_pci_info,
> +        "-device", "virtserialport,chardev=qga0,name=org.qemu.guest_agent.0",
> +        ])
> +
>      if hvp[constants.HV_KVM_EXTRA]:
>        kvm_cmd.extend(hvp[constants.HV_KVM_EXTRA].split(" "))
>  
> diff --git a/man/gnt-instance.rst b/man/gnt-instance.rst
> index a29fd7972..433b1f3b1 100644
> --- a/man/gnt-instance.rst
> +++ b/man/gnt-instance.rst
> @@ -526,6 +526,13 @@ viridian
>      viridian (Hyper-V) for this instance. The default is false,
>      disabling viridian support.
>  
> +use\_guest\_agent
> +    Valid for the KVM hypervisor.
> +
> +    A boolean option that specifies if the hypervisor should enable
> +    the QEMU Guest Agent protocol for this instance. By default, the
> +    Guest Agent is disabled.
> +
>  use\_localtime
>      Valid for the Xen HVM and KVM hypervisors.
>  
> diff --git a/src/Ganeti/Constants.hs b/src/Ganeti/Constants.hs
> index 09783d4bf..cf5421946 100644
> --- a/src/Ganeti/Constants.hs
> +++ b/src/Ganeti/Constants.hs
> @@ -1806,6 +1806,9 @@ hvUsbMouse = "usb_mouse"
>  hvUseBootloader :: String
>  hvUseBootloader = "use_bootloader"
>  
> +hvUseGuestAgent :: String
> +hvUseGuestAgent = "use_guest_agent"
> +
>  hvUseLocaltime :: String
>  hvUseLocaltime = "use_localtime"
>  
> @@ -1938,6 +1941,7 @@ hvsParameterTypes = Map.fromList
>    , (hvUsbDevices,                      VTypeString)
>    , (hvUsbMouse,                        VTypeString)
>    , (hvUseBootloader,                   VTypeBool)
> +  , (hvUseGuestAgent,                   VTypeBool)
>    , (hvUseLocaltime,                    VTypeBool)
>    , (hvVga,                             VTypeString)
>    , (hvVhostNet,                        VTypeBool)
> @@ -3996,6 +4000,7 @@ hvcDefaults =
>            , (hvMigrationBandwidth,              PyValueEx (32 :: Int))
>            , (hvMigrationDowntime,               PyValueEx (30 :: Int))
>            , (hvMigrationMode,                   PyValueEx htMigrationLive)
> +          , (hvUseGuestAgent,                   PyValueEx False)
>            , (hvUseLocaltime,                    PyValueEx False)
>            , (hvDiskCache,                       PyValueEx htCacheDefault)
>            , (hvSecurityModel,                   PyValueEx htSmNone)
> -- 
> 2.11.0.rc2
> 

Reply via email to