Skip to content

Commit

Permalink
app-emulation/ganeti: now with QEMU Guest Agent support (merged upstr…
Browse files Browse the repository at this point in the history
…eam for 2.16, not yet released).

Package-Manager: portage-2.3.2
  • Loading branch information
robbat2 committed Jan 7, 2017
1 parent de6a4b5 commit 5c38f0d
Show file tree
Hide file tree
Showing 7 changed files with 734 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
From c3697936405ed8c95b674a7d412886e364306f5f Mon Sep 17 00:00:00 2001
Message-Id: <c3697936405ed8c95b674a7d412886e364306f5f.1483650125.git.robbat2@gentoo.org>
From: "Robin H. Johnson" <[email protected]>
Date: Thu, 29 Sep 2016 08:57:28 -0700
Subject: [PATCH-2.15] kvm: use_guest_agent: QEMU Guest Agent support

Implement the QEMU Guest Agent sockets, so that code/scripts on the
hypervisors can communicate with guest operating systems easily.

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
From 16a08ecb268062a2634dbfc081b4729cb749b7b4 Mon Sep 17 00:00:00 2001
Message-Id: <16a08ecb268062a2634dbfc081b4729cb749b7b4.1483650125.git.robbat2@gentoo.org>
From: "Robin H. Johnson" <[email protected]>
Date: Thu, 29 Sep 2016 08:57:28 -0700
Subject: [PATCH-2.16] kvm: use_guest_agent: QEMU Guest Agent support

Implement the QEMU Guest Agent sockets, so that code/scripts on the
hypervisors can communicate with guest operating systems easily.

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 ac02ff56c..b865d6f3a 100644
--- a/lib/hypervisor/hv_kvm/__init__.py
+++ b/lib/hypervisor/hv_kvm/__init__.py
@@ -497,6 +497,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),
@@ -750,6 +751,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
@@ -836,6 +844,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)
@@ -1544,6 +1553,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(bus_slots[_PCI_BUS], reserve=True)
+ qga_pci_info = "bus=%s,addr=%s" % (_PCI_BUS, 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 283392cc8..493ae929d 100644
--- a/man/gnt-instance.rst
+++ b/man/gnt-instance.rst
@@ -545,6 +545,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 420ccb6cd..4aa5edf63 100644
--- a/src/Ganeti/Constants.hs
+++ b/src/Ganeti/Constants.hs
@@ -1814,6 +1814,9 @@ hvUsbMouse = "usb_mouse"
hvUseBootloader :: String
hvUseBootloader = "use_bootloader"

+hvUseGuestAgent :: String
+hvUseGuestAgent = "use_guest_agent"
+
hvUseLocaltime :: String
hvUseLocaltime = "use_localtime"

@@ -1948,6 +1951,7 @@ hvsParameterTypes = Map.fromList
, (hvUsbDevices, VTypeString)
, (hvUsbMouse, VTypeString)
, (hvUseBootloader, VTypeBool)
+ , (hvUseGuestAgent, VTypeBool)
, (hvUseLocaltime, VTypeBool)
, (hvVga, VTypeString)
, (hvVhostNet, VTypeBool)
@@ -4099,6 +4103,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

Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
From e91ae73f593115dba1f77af6a3af30cf2219f880 Mon Sep 17 00:00:00 2001
Message-Id: <e91ae73f593115dba1f77af6a3af30cf2219f880.1483650125.git.robbat2@gentoo.org>
From: "Robin H. Johnson" <[email protected]>
Date: Thu, 29 Sep 2016 08:57:28 -0700
Subject: [PATCH-2.17] kvm: use_guest_agent: QEMU Guest Agent support

Implement the QEMU Guest Agent sockets, so that code/scripts on the
hypervisors can communicate with guest operating systems easily.

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 ac02ff56c..b865d6f3a 100644
--- a/lib/hypervisor/hv_kvm/__init__.py
+++ b/lib/hypervisor/hv_kvm/__init__.py
@@ -497,6 +497,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),
@@ -750,6 +751,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
@@ -836,6 +844,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)
@@ -1544,6 +1553,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(bus_slots[_PCI_BUS], reserve=True)
+ qga_pci_info = "bus=%s,addr=%s" % (_PCI_BUS, 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 283392cc8..493ae929d 100644
--- a/man/gnt-instance.rst
+++ b/man/gnt-instance.rst
@@ -545,6 +545,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 13bff2e71..7f43f89f9 100644
--- a/src/Ganeti/Constants.hs
+++ b/src/Ganeti/Constants.hs
@@ -1821,6 +1821,9 @@ hvUsbMouse = "usb_mouse"
hvUseBootloader :: String
hvUseBootloader = "use_bootloader"

+hvUseGuestAgent :: String
+hvUseGuestAgent = "use_guest_agent"
+
hvUseLocaltime :: String
hvUseLocaltime = "use_localtime"

@@ -1955,6 +1958,7 @@ hvsParameterTypes = Map.fromList
, (hvUsbDevices, VTypeString)
, (hvUsbMouse, VTypeString)
, (hvUseBootloader, VTypeBool)
+ , (hvUseGuestAgent, VTypeBool)
, (hvUseLocaltime, VTypeBool)
, (hvVga, VTypeString)
, (hvVhostNet, VTypeBool)
@@ -4111,6 +4115,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

Loading

0 comments on commit 5c38f0d

Please sign in to comment.