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@redhat.com>
flags, dname, resource, false);
cleanup:
+ qemuMigrationParamsClear(&migParams);
VIR_FREE(compression);
return ret;
}
flags, dname, resource, true);
cleanup:
+ qemuMigrationParamsClear(&migParams);
VIR_FREE(compression);
return ret;
}
flags, dname, bandwidth, true);
cleanup:
VIR_FREE(compression);
- VIR_FREE(migParams);
+ qemuMigrationParamsFree(&migParams);
VIR_FREE(migrate_disks);
return ret;
}
}
+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,
return migParams;
error:
- VIR_FREE(migParams);
+ qemuMigrationParamsFree(&migParams);
return NULL;
}
virDomainObjRemoveTransientDef(vm);
qemuDomainRemoveInactive(driver, vm);
}
+ qemuMigrationParamsClear(&migParams);
virDomainObjEndAPI(&vm);
qemuDomainEventQueue(driver, event);
qemuMigrationCookieFree(mig);
virSetError(orig_err);
virFreeError(orig_err);
}
+ qemuMigrationParamsClear(&migParams);
VIR_FREE(uri_out);
VIR_FREE(cookie);
VIR_FREE(compression);
int *maxparams,
unsigned long *flags);
+void
+qemuMigrationParamsClear(qemuMonitorMigrationParamsPtr migParams);
+
+void
+qemuMigrationParamsFree(qemuMonitorMigrationParamsPtr *migParams);
+
qemuMonitorMigrationParamsPtr
qemuMigrationParams(virTypedParameterPtr params,
int nparams,
{
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);
!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);
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,
virJSONValuePtr result;
virJSONValuePtr cmd = NULL;
virJSONValuePtr reply = NULL;
+ const char *tlsStr = NULL;
memset(params, 0, sizeof(*params));
#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);
#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;
" \"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;
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;
}