On-behalf-of: SAP stefan.kober@sap.com
Signed-off-by: Stefan Kober <stefan.kober@cyberus-technology.de>
---
src/ch/ch_driver.c | 44 +++++++++++++++++++++++++++++++++++++++++
src/ch/ch_hotplug.c | 48 ++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 87 insertions(+), 5 deletions(-)
diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c
index cf6874f22e..4f4783efb1 100644
--- a/src/ch/ch_driver.c
+++ b/src/ch/ch_driver.c
@@ -25,6 +25,7 @@
#include "ch_conf.h"
#include "ch_domain.h"
#include "ch_driver.h"
+#include "ch_hotplug.h"
#include "ch_monitor.h"
#include "ch_process.h"
#include "domain_cgroup.h"
@@ -2344,6 +2345,47 @@ chDomainInterfaceAddresses(virDomain *dom,
return ret;
}
+static int
+chDomainAttachDeviceFlags(virDomainPtr dom,
+ const char *xml,
+ unsigned int flags)
+{
+ virCHDriver *driver = dom->conn->privateData;
+ virDomainObj *vm = NULL;
+ int ret = -1;
+
+ if (!(vm = virCHDomainObjFromDomain(dom)))
+ goto cleanup;
+
+ if (virDomainAttachDeviceFlagsEnsureACL(dom->conn, vm->def, flags) < 0)
+ goto cleanup;
+
+ if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
+ goto cleanup;
+
+ if (virDomainObjUpdateModificationImpact(vm, &flags) < 0)
+ goto endjob;
+
+ if (chDomainAttachDeviceLiveAndUpdateConfig(vm, driver, xml, flags) < 0) {
+ goto endjob;
+ }
+
+ ret = 0;
+
+ endjob:
+ virDomainObjEndJob(vm);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+static int
+chDomainAttachDevice(virDomainPtr dom,
+ const char *xml)
+{
+ return chDomainAttachDeviceFlags(dom, xml, VIR_DOMAIN_AFFECT_LIVE);
+}
/* Function Tables */
static virHypervisorDriver chHypervisorDriver = {
@@ -2406,6 +2448,8 @@ static virHypervisorDriver chHypervisorDriver = {
.connectDomainEventRegisterAny = chConnectDomainEventRegisterAny, /* 10.10.0 */
.connectDomainEventDeregisterAny = chConnectDomainEventDeregisterAny, /* 10.10.0 */
.domainInterfaceAddresses = chDomainInterfaceAddresses, /* 11.0.0 */
+ .domainAttachDevice = chDomainAttachDevice, /* 11.8.0 */
+ .domainAttachDeviceFlags = chDomainAttachDeviceFlags, /* 11.8.0 */
};
static virConnectDriver chConnectDriver = {
diff --git a/src/ch/ch_hotplug.c b/src/ch/ch_hotplug.c
index 7de688dc44..524355b93c 100644
--- a/src/ch/ch_hotplug.c
+++ b/src/ch/ch_hotplug.c
@@ -50,7 +50,6 @@ chDomainAddDisk(virCHMonitor *mon, virDomainObj *vm, virDomainDiskDef *disk)
return 0;
}
-G_GNUC_UNUSED
static int
chDomainAttachDeviceLive(virDomainObj *vm,
virDomainDeviceDef *dev)
@@ -108,13 +107,52 @@ chDomainAttachDeviceLive(virDomainObj *vm,
}
int
-chDomainAttachDeviceLiveAndUpdateConfig(virDomainObj *vm G_GNUC_UNUSED,
- virCHDriver *driver G_GNUC_UNUSED,
- const char *xml G_GNUC_UNUSED,
+chDomainAttachDeviceLiveAndUpdateConfig(virDomainObj *vm,
+ virCHDriver *driver,
+ const char *xml,
unsigned int flags)
{
+ unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE |
+ VIR_DOMAIN_DEF_PARSE_ABI_UPDATE;
+ g_autoptr(virDomainDeviceDef) devLive = NULL;
+ g_autoptr(virDomainDef) vmdef = NULL;
+ g_autoptr(virCHDriverConfig) cfg = NULL;
+ g_autoptr(virDomainDeviceDef) devConf = NULL;
+
virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
VIR_DOMAIN_AFFECT_CONFIG, -1);
- return -1;
+ cfg = virCHDriverGetConfig(driver);
+
+ if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+ _("Persistent domain state changes are not supported"));
+ return -1;
+ }
+
+ if (flags & VIR_DOMAIN_AFFECT_LIVE) {
+ if (!(devLive = virDomainDeviceDefParse(xml, vm->def,
+ driver->xmlopt, NULL,
+ parse_flags))) {
+ return -1;
+ }
+
+ if (virDomainDeviceValidateAliasForHotplug(vm, devLive,
+ VIR_DOMAIN_AFFECT_LIVE) < 0)
+ return -1;
+
+ if (virDomainDefCompatibleDevice(vm->def, devLive, NULL,
+ VIR_DOMAIN_DEVICE_ACTION_ATTACH,
+ true) < 0) {
+ return -1;
+ }
+
+ if (chDomainAttachDeviceLive(vm, devLive) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Failed to add device"));
+ return -1;
+ }
+ }
+
+ return 0;
}
--
2.50.1