]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virCommandSetDryRun: Add flags to linebreak and strip prefix from the command buffer
authorPeter Krempa <pkrempa@redhat.com>
Tue, 6 Apr 2021 08:56:23 +0000 (10:56 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 12 Apr 2021 13:55:10 +0000 (15:55 +0200)
virCommandToStringFull used internally when virCommandSetDryRun is
requested allows to strip command path and wrap lines nicely. Expose
these via virCommandSetDryRun so that tests can use those features
instead of local hacks.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
src/util/vircommand.c
src/util/vircommandpriv.h
tests/networkxml2firewalltest.c
tests/nodedevmdevctltest.c
tests/nwfilterebiptablestest.c
tests/nwfilterxml2firewalltest.c
tests/sysinfotest.c
tests/virfirewalltest.c
tests/viriscsitest.c
tests/virkmodtest.c
tests/virnetdevbandwidthtest.c

index 192613ed0a62fb5e83253499b6fe5063401da6f5..e4f6eba148c4975c16a706f3dbfbbaf6da845058 100644 (file)
@@ -158,6 +158,8 @@ struct _virCommand {
 
 /* See virCommandSetDryRun for description for this variable */
 static virBufferPtr dryRunBuffer;
+static bool dryRunBufferArgLinebreaks;
+static bool dryRunBufferCommandStripPath;
 static virCommandDryRunCallback dryRunCallback;
 static void *dryRunOpaque;
 #ifndef WIN32
@@ -2573,18 +2575,18 @@ virCommandRunAsync(virCommandPtr cmd, pid_t *pid)
         goto cleanup;
     }
 
-    str = virCommandToString(cmd, false);
     if (dryRunBuffer || dryRunCallback) {
+        g_autofree char *cmdstr = NULL;
         dryRunStatus = 0;
-        if (!str) {
-            /* error already reported by virCommandToString */
+
+        if (!(cmdstr = virCommandToStringFull(cmd, dryRunBufferArgLinebreaks,
+                                              dryRunBufferCommandStripPath)))
             goto cleanup;
-        }
 
         if (dryRunBuffer) {
             VIR_DEBUG("Dry run requested, appending stringified "
                       "command to dryRunBuffer=%p", dryRunBuffer);
-            virBufferAdd(dryRunBuffer, str, -1);
+            virBufferAdd(dryRunBuffer, cmdstr, -1);
             virBufferAddChar(dryRunBuffer, '\n');
         }
         if (dryRunCallback) {
@@ -2597,6 +2599,7 @@ virCommandRunAsync(virCommandPtr cmd, pid_t *pid)
         goto cleanup;
     }
 
+    str = virCommandToString(cmd, false);
     VIR_DEBUG("About to run %s", str ? str : cmd->args[0]);
     ret = virExec(cmd);
     VIR_DEBUG("Command result %d, with PID %d",
@@ -3117,6 +3120,8 @@ void
 virCommandDryRunTokenFree(virCommandDryRunToken *tok)
 {
     dryRunBuffer = NULL;
+    dryRunBufferArgLinebreaks = false;
+    dryRunBufferCommandStripPath = false;
     dryRunCallback = NULL;
     dryRunOpaque = NULL;
     g_free(tok);
@@ -3127,6 +3132,8 @@ virCommandDryRunTokenFree(virCommandDryRunToken *tok)
  * virCommandSetDryRun:
  * @tok: a virCommandDryRunToken obtained from virCommandDryRunTokenNew
  * @buf: buffer to store stringified commands
+ * @bufArgLinebreaks: add linebreaks after command and every argument or argument pair
+ * @bufCommandStripPath: strip leading paths of command
  * @callback: callback to process input/output/args
  *
  * Sometimes it's desired to not actually run given command, but
@@ -3159,6 +3166,8 @@ virCommandDryRunTokenFree(virCommandDryRunToken *tok)
 void
 virCommandSetDryRun(virCommandDryRunToken *tok,
                     virBufferPtr buf,
+                    bool bufArgLinebreaks,
+                    bool bufCommandStripPath,
                     virCommandDryRunCallback cb,
                     void *opaque)
 {
@@ -3166,6 +3175,8 @@ virCommandSetDryRun(virCommandDryRunToken *tok,
         abort();
 
     dryRunBuffer = buf;
+    dryRunBufferArgLinebreaks = bufArgLinebreaks;
+    dryRunBufferCommandStripPath = bufCommandStripPath;
     dryRunCallback = cb;
     dryRunOpaque = opaque;
 }
index d06a8f5e30f0fb31e954e2969ac34f8f9888642c..6e01585766f062359669c9d324432881679818b7 100644 (file)
@@ -43,5 +43,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCommandDryRunToken, virCommandDryRunTokenFree);
 
 void virCommandSetDryRun(virCommandDryRunToken *tok,
                          virBufferPtr buf,
+                         bool bufArgLinebreaks,
+                         bool bufCommandStripPath,
                          virCommandDryRunCallback cb,
                          void *opaque);
index 952c076a1938cd0aea97c80ae6f9b41199dbf43d..2974d3f2af653cb8e669fd4e25f8c4f334fcb325 100644 (file)
@@ -98,7 +98,7 @@ static int testCompareXMLToArgvFiles(const char *xml,
     char *actual;
     g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
 
-    virCommandSetDryRun(dryRunToken, &buf, testCommandDryRun, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, testCommandDryRun, NULL);
 
     if (!(def = virNetworkDefParseFile(xml, NULL)))
         goto cleanup;
index cb9dbe5431a88adfe98b58df2f8721ba77ec499a..48d4f9e81866aafeda7043e9a34cb3cb5151b7ee 100644 (file)
@@ -87,7 +87,7 @@ testMdevctlStartOrDefine(const char *virt_type,
     if (!cmd)
         goto cleanup;
 
-    virCommandSetDryRun(dryRunToken, &buf, testCommandDryRunCallback, &stdinbuf);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, testCommandDryRunCallback, &stdinbuf);
     if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
 
@@ -159,7 +159,7 @@ testMdevctlUuidCommand(const char *uuid, GetStopUndefineCmdFunc func, const char
     if (!cmd)
         goto cleanup;
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
     if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
 
@@ -221,7 +221,7 @@ testMdevctlListDefined(const void *data G_GNUC_UNUSED)
     if (!cmd)
         goto cleanup;
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
     if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
 
index 36df17d1c1ee7909989425d91bdb3d89790336ca..c20b2bed42849ec164631857a420ee89a89f04a9 100644 (file)
@@ -105,7 +105,7 @@ testNWFilterEBIPTablesAllTeardown(const void *opaque G_GNUC_UNUSED)
     int ret = -1;
     g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
 
     if (ebiptables_driver.allTeardown("vnet0") < 0)
         goto cleanup;
@@ -172,7 +172,7 @@ testNWFilterEBIPTablesTearOldRules(const void *opaque G_GNUC_UNUSED)
     int ret = -1;
     g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
 
     if (ebiptables_driver.tearOldRules("vnet0") < 0)
         goto cleanup;
@@ -217,7 +217,7 @@ testNWFilterEBIPTablesRemoveBasicRules(const void *opaque G_GNUC_UNUSED)
     int ret = -1;
     g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
 
     if (ebiptables_driver.removeBasicRules("vnet0") < 0)
         goto cleanup;
@@ -247,7 +247,7 @@ testNWFilterEBIPTablesTearNewRules(const void *opaque G_GNUC_UNUSED)
     int ret = -1;
     g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
 
     if (ebiptables_driver.tearNewRules("vnet0") < 0)
         goto cleanup;
@@ -315,7 +315,7 @@ testNWFilterEBIPTablesApplyBasicRules(const void *opaque G_GNUC_UNUSED)
     virMacAddr mac = { .addr = { 0x10, 0x20, 0x30, 0x40, 0x50, 0x60 } };
     g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
 
     if (ebiptables_driver.applyBasicRules("vnet0", &mac) < 0)
         goto cleanup;
@@ -401,7 +401,7 @@ testNWFilterEBIPTablesApplyDHCPOnlyRules(const void *opaque G_GNUC_UNUSED)
     };
     g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
 
     if (ebiptables_driver.applyDHCPOnlyRules("vnet0", &mac, &val, false) < 0)
         goto cleanup;
@@ -470,7 +470,7 @@ testNWFilterEBIPTablesApplyDropAllRules(const void *opaque G_GNUC_UNUSED)
     int ret = -1;
     g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
 
     if (ebiptables_driver.applyDropAllRules("vnet0") < 0)
         goto cleanup;
index 38f2ab7040bc3b63d514d3c4c8fd22f60f8eb645..f72cd06e58fc49a28a0c803c8ea16bcafd508eec 100644 (file)
@@ -375,7 +375,7 @@ static int testCompareXMLToArgvFiles(const char *xml,
 
     memset(&inst, 0, sizeof(inst));
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
 
     if (!vars)
         goto cleanup;
index 5d028d2fd3899e89a947888875ef689d128939d4..9129b6db7aeb4bedf1cb3f71b73d53c5f3c60455 100644 (file)
@@ -102,7 +102,7 @@ testSysinfo(const void *data)
     cpuinfo = g_strdup_printf("%s/sysinfodata/%scpuinfo.data", abs_srcdir, testdata->name);
     expected = g_strdup_printf("%s/sysinfodata/%ssysinfo.expect", abs_srcdir, testdata->name);
 
-    virCommandSetDryRun(dryRunToken, NULL, testDMIDecodeDryRun, sysinfo);
+    virCommandSetDryRun(dryRunToken, NULL, false, false, testDMIDecodeDryRun, sysinfo);
 
     virSysinfoSetup(sysinfo, cpuinfo);
 
index 5515da4b4dc7b1b86866b16dda8dbc05bf33809d..ba44201fa26e9dac304d88bc6d7e0092b543c91c 100644 (file)
@@ -197,7 +197,7 @@ testFirewallSingleGroup(const void *opaque)
 
     if (data->expectBackend == VIR_FIREWALL_BACKEND_DIRECT ||
         data->expectBackend == VIR_FIREWALL_BACKEND_FIREWALLD)
-        virCommandSetDryRun(dryRunToken, &cmdbuf, NULL, NULL);
+        virCommandSetDryRun(dryRunToken, &cmdbuf, false, false, NULL, NULL);
     else
         fwBuf = &cmdbuf;
 
@@ -251,7 +251,7 @@ testFirewallRemoveRule(const void *opaque)
 
     if (data->expectBackend == VIR_FIREWALL_BACKEND_DIRECT ||
         data->expectBackend == VIR_FIREWALL_BACKEND_FIREWALLD)
-        virCommandSetDryRun(dryRunToken, &cmdbuf, NULL, NULL);
+        virCommandSetDryRun(dryRunToken, &cmdbuf, false, false, NULL, NULL);
     else
         fwBuf = &cmdbuf;
 
@@ -312,7 +312,7 @@ testFirewallManyGroups(const void *opaque G_GNUC_UNUSED)
 
     if (data->expectBackend == VIR_FIREWALL_BACKEND_DIRECT ||
         data->expectBackend == VIR_FIREWALL_BACKEND_FIREWALLD)
-        virCommandSetDryRun(dryRunToken, &cmdbuf, NULL, NULL);
+        virCommandSetDryRun(dryRunToken, &cmdbuf, false, false, NULL, NULL);
     else
         fwBuf = &cmdbuf;
 
@@ -400,7 +400,7 @@ testFirewallIgnoreFailGroup(const void *opaque G_GNUC_UNUSED)
 
     if (data->expectBackend == VIR_FIREWALL_BACKEND_DIRECT ||
         data->expectBackend == VIR_FIREWALL_BACKEND_FIREWALLD) {
-        virCommandSetDryRun(dryRunToken, &cmdbuf, testFirewallRollbackHook, NULL);
+        virCommandSetDryRun(dryRunToken, &cmdbuf, false, false, testFirewallRollbackHook, NULL);
     } else {
         fwBuf = &cmdbuf;
         fwError = true;
@@ -469,7 +469,7 @@ testFirewallIgnoreFailRule(const void *opaque G_GNUC_UNUSED)
 
     if (data->expectBackend == VIR_FIREWALL_BACKEND_DIRECT ||
         data->expectBackend == VIR_FIREWALL_BACKEND_FIREWALLD) {
-        virCommandSetDryRun(dryRunToken, &cmdbuf, testFirewallRollbackHook, NULL);
+        virCommandSetDryRun(dryRunToken, &cmdbuf, false, false, testFirewallRollbackHook, NULL);
     } else {
         fwBuf = &cmdbuf;
         fwError = true;
@@ -535,7 +535,7 @@ testFirewallNoRollback(const void *opaque G_GNUC_UNUSED)
 
     if (data->expectBackend == VIR_FIREWALL_BACKEND_DIRECT ||
         data->expectBackend == VIR_FIREWALL_BACKEND_FIREWALLD) {
-        virCommandSetDryRun(dryRunToken, &cmdbuf, testFirewallRollbackHook, NULL);
+        virCommandSetDryRun(dryRunToken, &cmdbuf, false, false, testFirewallRollbackHook, NULL);
     } else {
         fwBuf = &cmdbuf;
         fwError = true;
@@ -599,7 +599,7 @@ testFirewallSingleRollback(const void *opaque G_GNUC_UNUSED)
 
     if (data->expectBackend == VIR_FIREWALL_BACKEND_DIRECT ||
         data->expectBackend == VIR_FIREWALL_BACKEND_FIREWALLD) {
-        virCommandSetDryRun(dryRunToken, &cmdbuf, testFirewallRollbackHook, NULL);
+        virCommandSetDryRun(dryRunToken, &cmdbuf, false, false, testFirewallRollbackHook, NULL);
     } else {
         fwError = true;
         fwBuf = &cmdbuf;
@@ -679,7 +679,7 @@ testFirewallManyRollback(const void *opaque G_GNUC_UNUSED)
 
     if (data->expectBackend == VIR_FIREWALL_BACKEND_DIRECT ||
         data->expectBackend == VIR_FIREWALL_BACKEND_FIREWALLD) {
-        virCommandSetDryRun(dryRunToken, &cmdbuf, testFirewallRollbackHook, NULL);
+        virCommandSetDryRun(dryRunToken, &cmdbuf, false, false, testFirewallRollbackHook, NULL);
     } else {
         fwBuf = &cmdbuf;
         fwError = true;
@@ -767,7 +767,7 @@ testFirewallChainedRollback(const void *opaque G_GNUC_UNUSED)
 
     if (data->expectBackend == VIR_FIREWALL_BACKEND_DIRECT ||
         data->expectBackend == VIR_FIREWALL_BACKEND_FIREWALLD) {
-        virCommandSetDryRun(dryRunToken, &cmdbuf, testFirewallRollbackHook, NULL);
+        virCommandSetDryRun(dryRunToken, &cmdbuf, false, false, testFirewallRollbackHook, NULL);
     } else {
         fwBuf = &cmdbuf;
         fwError = true;
@@ -963,7 +963,7 @@ testFirewallQuery(const void *opaque G_GNUC_UNUSED)
 
     if (data->expectBackend == VIR_FIREWALL_BACKEND_DIRECT ||
         data->expectBackend == VIR_FIREWALL_BACKEND_FIREWALLD) {
-        virCommandSetDryRun(dryRunToken, &cmdbuf, testFirewallQueryHook, NULL);
+        virCommandSetDryRun(dryRunToken, &cmdbuf, false, false, testFirewallQueryHook, NULL);
     } else {
         fwBuf = &cmdbuf;
         fwError = true;
index e673b69ed647d4c07621366ed8ab54821b731836..37922ba55288e697a495da7d5a5731b8d52aa00f 100644 (file)
@@ -216,7 +216,7 @@ testISCSIGetSession(const void *data)
 
     cbData.output_version = info->output_version;
 
-    virCommandSetDryRun(dryRunToken, NULL, testIscsiadmCb, &cbData);
+    virCommandSetDryRun(dryRunToken, NULL, false, false, testIscsiadmCb, &cbData);
 
     actual_session = virISCSIGetSession(info->device_path, true);
 
@@ -252,7 +252,7 @@ testISCSIScanTargets(const void *data)
     size_t i;
     g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
 
-    virCommandSetDryRun(dryRunToken, NULL, testIscsiadmCb, NULL);
+    virCommandSetDryRun(dryRunToken, NULL, false, false, testIscsiadmCb, NULL);
 
     if (virISCSIScanTargets(info->portal, NULL,
                             false, &ntargets, &targets) < 0)
@@ -299,7 +299,7 @@ testISCSIConnectionLogin(const void *data)
     int ret = -1;
     g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
 
-    virCommandSetDryRun(dryRunToken, NULL, testIscsiadmCb, &cbData);
+    virCommandSetDryRun(dryRunToken, NULL, false, false, testIscsiadmCb, &cbData);
 
     if (virISCSIConnectionLogin(info->portal, info->initiatoriqn, info->target) < 0)
         goto cleanup;
index d278032aec570662fdf55cc041c264176a81a35d..b2dfecb42c798bd4e06da05969bde0c3afabe9fe 100644 (file)
@@ -63,7 +63,7 @@ testKModLoad(const void *args G_GNUC_UNUSED)
     g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
     g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
 
     errbuf = virKModLoad(MODNAME);
     if (errbuf) {
@@ -90,7 +90,7 @@ testKModUnload(const void *args G_GNUC_UNUSED)
     g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
     g_autoptr(virCommandDryRunToken) dryRunToken = virCommandDryRunTokenNew();
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
 
     errbuf = virKModUnload(MODNAME);
     if (errbuf) {
index 52742dff059cfdaf3c347165556028a39b973778..f399c95da036f43d4b616dab6656278524ba5f45 100644 (file)
@@ -79,7 +79,7 @@ testVirNetDevBandwidthSet(const void *data)
     if (!iface)
         iface = "eth0";
 
-    virCommandSetDryRun(dryRunToken, &buf, NULL, NULL);
+    virCommandSetDryRun(dryRunToken, &buf, false, false, NULL, NULL);
 
     if (virNetDevBandwidthSet(iface, band, info->hierarchical_class, true) < 0)
         goto cleanup;