diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4aba981a85..b09b3a8ac9 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 f5711bcf74..66a5062ba7 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3508,6 +3508,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, @@ -3549,7 +3571,7 @@ qemuMigrationParams(virTypedParameterPtr params, return migParams; error: - VIR_FREE(migParams); + qemuMigrationParamsFree(&migParams); return NULL; } @@ -3909,6 +3931,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, virDomainObjRemoveTransientDef(vm); qemuDomainRemoveInactive(driver, vm); } + qemuMigrationParamsClear(&migParams); virDomainObjEndAPI(&vm); qemuDomainEventQueue(driver, event); qemuMigrationCookieFree(mig); @@ -5244,6 +5267,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 bcebf064a9..4c8f2c9c86 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 8218029d00..8889eae826 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 888a03d9ef..b23a98b3b5 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 553544aead..e45d5fbfc7 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 d0f9381b3e..0f802ebc7c 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; @@ -1819,11 +1821,32 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationParams(const void *data) CHECK(cpuThrottleInitial, "cpu-throttle-initial", 20); CHECK(cpuThrottleIncrement, "cpu-throttle-increment", 10); +#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; }