Add the fields to support setting tls-creds and tls-hostname during
a migration (either source or target). Modify the query migration
function to check for the presence and set the field for future
consumers to determine which of 3 conditions is being met (NULL,
present and set to "", or present and sent to something). These
correspond to qemu commit id '4af245dc3' which added support to
default the value to "" and allow setting (or resetting) to ""
in order to disable. This reset option allows libvirt to properly
use the tls-creds and tls-hostname parameters.
Modify code paths that either allocate or use stack space in order
to call qemuMigrationParamsClear or qemuMigrationParamsFree for cleanup.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/qemu/qemu_driver.c | 4 +++-
src/qemu/qemu_migration.c | 26 +++++++++++++++++++++++++-
src/qemu/qemu_migration.h | 6 ++++++
src/qemu/qemu_monitor.c | 11 ++++++++---
src/qemu/qemu_monitor.h | 5 +++++
src/qemu/qemu_monitor_json.c | 21 +++++++++++++++++++++
tests/qemumonitorjsontest.c | 25 ++++++++++++++++++++++++-
7 files changed, 92 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 6762952..8f896f5 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -11845,6 +11845,7 @@ qemuDomainMigratePerform(virDomainPtr dom,
flags, dname, resource, false);
cleanup:
+ qemuMigrationParamsClear(&migParams);
VIR_FREE(compression);
return ret;
}
@@ -12253,6 +12254,7 @@ qemuDomainMigratePerform3(virDomainPtr dom,
flags, dname, resource, true);
cleanup:
+ qemuMigrationParamsClear(&migParams);
VIR_FREE(compression);
return ret;
}
@@ -12343,7 +12345,7 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
flags, dname, bandwidth, true);
cleanup:
VIR_FREE(compression);
- VIR_FREE(migParams);
+ qemuMigrationParamsFree(&migParams);
VIR_FREE(migrate_disks);
return ret;
}
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 15ed830..d0603f8 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -3514,6 +3514,28 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver,
}
+void
+qemuMigrationParamsClear(qemuMonitorMigrationParamsPtr migParams)
+{
+ if (!migParams)
+ return;
+
+ VIR_FREE(migParams->migrateTLSAlias);
+ VIR_FREE(migParams->migrateTLSHostname);
+}
+
+
+void
+qemuMigrationParamsFree(qemuMonitorMigrationParamsPtr *migParams)
+{
+ if (!*migParams)
+ return;
+
+ qemuMigrationParamsClear(*migParams);
+ VIR_FREE(*migParams);
+}
+
+
qemuMonitorMigrationParamsPtr
qemuMigrationParams(virTypedParameterPtr params,
int nparams,
@@ -3555,7 +3577,7 @@ qemuMigrationParams(virTypedParameterPtr params,
return migParams;
error:
- VIR_FREE(migParams);
+ qemuMigrationParamsFree(&migParams);
return NULL;
}
@@ -3915,6 +3937,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
virDomainObjRemoveTransientDef(vm);
qemuDomainRemoveInactive(driver, vm);
}
+ qemuMigrationParamsClear(&migParams);
virDomainObjEndAPI(&vm);
qemuDomainEventQueue(driver, event);
qemuMigrationCookieFree(mig);
@@ -5250,6 +5273,7 @@ static int doPeer2PeerMigrate2(virQEMUDriverPtr driver,
virSetError(orig_err);
virFreeError(orig_err);
}
+ qemuMigrationParamsClear(&migParams);
VIR_FREE(uri_out);
VIR_FREE(cookie);
VIR_FREE(compression);
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index bcebf06..4c8f2c9 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -121,6 +121,12 @@ int qemuMigrationCompressionDump(qemuMigrationCompressionPtr
compression,
int *maxparams,
unsigned long *flags);
+void
+qemuMigrationParamsClear(qemuMonitorMigrationParamsPtr migParams);
+
+void
+qemuMigrationParamsFree(qemuMonitorMigrationParamsPtr *migParams);
+
qemuMonitorMigrationParamsPtr
qemuMigrationParams(virTypedParameterPtr params,
int nparams,
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 8218029..8889eae 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -2529,12 +2529,15 @@ qemuMonitorSetMigrationParams(qemuMonitorPtr mon,
{
VIR_DEBUG("compressLevel=%d:%d compressThreads=%d:%d "
"decompressThreads=%d:%d cpuThrottleInitial=%d:%d "
- "cpuThrottleIncrement=%d:%d",
+ "cpuThrottleIncrement=%d:%d tlsAlias=%s "
+ "tlsHostname=%s",
params->compressLevel_set, params->compressLevel,
params->compressThreads_set, params->compressThreads,
params->decompressThreads_set, params->decompressThreads,
params->cpuThrottleInitial_set, params->cpuThrottleInitial,
- params->cpuThrottleIncrement_set, params->cpuThrottleIncrement);
+ params->cpuThrottleIncrement_set, params->cpuThrottleIncrement,
+ NULLSTR(params->migrateTLSAlias),
+ NULLSTR(params->migrateTLSHostname));
QEMU_CHECK_MONITOR_JSON(mon);
@@ -2542,7 +2545,9 @@ qemuMonitorSetMigrationParams(qemuMonitorPtr mon,
!params->compressThreads_set &&
!params->decompressThreads_set &&
!params->cpuThrottleInitial_set &&
- !params->cpuThrottleIncrement_set)
+ !params->cpuThrottleIncrement_set &&
+ !params->migrateTLSAlias &&
+ !params->migrateTLSHostname)
return 0;
return qemuMonitorJSONSetMigrationParams(mon, params);
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 888a03d..b23a98b 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -571,6 +571,11 @@ struct _qemuMonitorMigrationParams {
bool cpuThrottleIncrement_set;
int cpuThrottleIncrement;
+
+ /* Value is either NULL, "", or some string. NULL indicates no support;
+ * whereas, some string value indicates we can support setting/clearing */
+ char *migrateTLSAlias;
+ char *migrateTLSHostname;
};
int qemuMonitorGetMigrationParams(qemuMonitorPtr mon,
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 553544a..e45d5fb 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -2566,6 +2566,7 @@ qemuMonitorJSONGetMigrationParams(qemuMonitorPtr mon,
virJSONValuePtr result;
virJSONValuePtr cmd = NULL;
virJSONValuePtr reply = NULL;
+ const char *tlsStr = NULL;
memset(params, 0, sizeof(*params));
@@ -2595,6 +2596,16 @@ qemuMonitorJSONGetMigrationParams(qemuMonitorPtr mon,
#undef PARSE
+ if ((tlsStr = virJSONValueObjectGetString(result, "tls-creds"))) {
+ if (VIR_STRDUP(params->migrateTLSAlias, tlsStr) < 0)
+ goto cleanup;
+ }
+
+ if ((tlsStr = virJSONValueObjectGetString(result, "tls-hostname"))) {
+ if (VIR_STRDUP(params->migrateTLSHostname, tlsStr) < 0)
+ goto cleanup;
+ }
+
ret = 0;
cleanup:
virJSONValueFree(cmd);
@@ -2637,6 +2648,16 @@ qemuMonitorJSONSetMigrationParams(qemuMonitorPtr mon,
#undef APPEND
+ if (params->migrateTLSAlias &&
+ virJSONValueObjectAppendString(args, "tls-creds",
+ params->migrateTLSAlias) < 0)
+ goto cleanup;
+
+ if (params->migrateTLSHostname &&
+ virJSONValueObjectAppendString(args, "tls-hostname",
+ params->migrateTLSHostname) < 0)
+ goto cleanup;
+
if (virJSONValueObjectAppend(cmd, "arguments", args) < 0)
goto cleanup;
args = NULL;
diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
index d0f9381..0f802eb 100644
--- a/tests/qemumonitorjsontest.c
+++ b/tests/qemumonitorjsontest.c
@@ -1789,7 +1789,9 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationParams(const void
*data)
" \"cpu-throttle-increment\":
10,"
" \"compress-threads\": 8,"
" \"compress-level\": 1,"
- " \"cpu-throttle-initial\":
20"
+ " \"cpu-throttle-initial\":
20,"
+ " \"tls-creds\":
\"tls0\","
+ " \"tls-hostname\":
\"\""
" }"
"}") < 0) {
goto cleanup;
@@ -1821,9 +1823,30 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationParams(const void
*data)
#undef CHECK
+#define CHECK(VAR, FIELD, VALUE) \
+ do { \
+ if (!params.VAR) { \
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s is not set", FIELD); \
+ goto cleanup; \
+ } \
+ if (STRNEQ(params.VAR, VALUE)) { \
+ virReportError(VIR_ERR_INTERNAL_ERROR, \
+ "Invalid %s:'%s', expected '%s'",
\
+ FIELD, params.VAR, VALUE); \
+ goto cleanup; \
+ } \
+ } while (0)
+
+ CHECK(migrateTLSAlias, "tls-creds", "tls0");
+ CHECK(migrateTLSHostname, "tls-hostname", "");
+
+#undef CHECK
+
ret = 0;
cleanup:
+ VIR_FREE(params.migrateTLSAlias);
+ VIR_FREE(params.migrateTLSHostname);
qemuMonitorTestFree(test);
return ret;
}
--
2.9.3