]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Add TLS params to _qemuMonitorMigrationParams
authorJohn Ferlan <jferlan@redhat.com>
Thu, 16 Feb 2017 23:33:22 +0000 (18:33 -0500)
committerJohn Ferlan <jferlan@redhat.com>
Sat, 25 Mar 2017 12:19:49 +0000 (08:19 -0400)
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>
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c
src/qemu/qemu_migration.h
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
tests/qemumonitorjsontest.c

index 4aba981a85c77067e7de422de915703dbc6ce8de..b09b3a8ac99ecabdd36cc2a81a35b78eaaf2f5ef 100644 (file)
@@ -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;
 }
index f5711bcf744a9e98c3b3945969f30ad44363c2fd..66a5062ba7d5dc1a7453682944a4fe948ca61e18 100644 (file)
@@ -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);
index bcebf064a98eb915097116808ae7f708433d6dd8..4c8f2c9c86dde0cf968ce9d32005a17f8dc52e92 100644 (file)
@@ -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,
index 8218029d007a94944dbcaeb8dcd231639113c805..8889eae8265a2ce0af7cb9a8d51e75ef460dacfb 100644 (file)
@@ -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);
index 888a03d9ef67ea683b28faca5d7f8648343f328d..b23a98b3b574eda9c59a47e975aff9849d9ede3b 100644 (file)
@@ -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,
index 553544aead9f8c65269560ffeae8a8ff8d19bc44..e45d5fbfc7de41eb5cac02a4bf1d355ee38da4d7 100644 (file)
@@ -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;
index d0f9381b3e9c9a3b9b4e5a40cfc2d09576aa95d1..0f802ebc7cad4a531fa9487a32726b33745629f1 100644 (file)
@@ -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;
 }