The flag causes the XML of the disk that would be attached to be printed
instead.
---
 tools/virsh-domain.c | 46 ++++++++++++++++++++++++++++------------------
 tools/virsh.pod      |  5 ++++-
 2 files changed, 32 insertions(+), 19 deletions(-)

diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 026dac1..829e475 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -317,6 +317,12 @@ static const vshCmdOptDef opts_attach_disk[] = {
      .flags = 0,
      .help = N_("use multifunction pci under specified address")
     },
+    {.name = "print-xml",
+     .type = VSH_OT_BOOL,
+     .flags = 0,
+     .help = N_("print XML document rather than attach the disk")
+    },
+
     {.name = NULL}
 };

@@ -480,11 +486,11 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd)
     unsigned int flags;
     const char *stype = NULL;
     virBuffer buf = VIR_BUFFER_INITIALIZER;
-    char *xml;
+    char *xml = NULL;
     struct stat st;

     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
-        goto cleanup;
+        return false;

     if (vshCommandOptString(cmd, "source", &source) <= 0)
         goto cleanup;
@@ -620,27 +626,31 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd)

     xml = virBufferContentAndReset(&buf);

-    if (vshCommandOptBool(cmd, "config")) {
-        flags = VIR_DOMAIN_AFFECT_CONFIG;
-        if (virDomainIsActive(dom) == 1)
-            flags |= VIR_DOMAIN_AFFECT_LIVE;
-        ret = virDomainAttachDeviceFlags(dom, xml, flags);
-    } else {
-        ret = virDomainAttachDevice(dom, xml);
-    }
-
-    VIR_FREE(xml);
+    if (!vshCommandOptBool(cmd, "print-xml")) {
+        if (vshCommandOptBool(cmd, "config")) {
+            flags = VIR_DOMAIN_AFFECT_CONFIG;
+            if (virDomainIsActive(dom) == 1)
+                flags |= VIR_DOMAIN_AFFECT_LIVE;
+            ret = virDomainAttachDeviceFlags(dom, xml, flags);
+        } else {
+            ret = virDomainAttachDevice(dom, xml);
+        }

-    if (ret != 0) {
-        vshError(ctl, "%s", _("Failed to attach disk"));
+        if (ret != 0) {
+            vshError(ctl, "%s", _("Failed to attach disk"));
+            goto cleanup;
+        } else {
+            vshPrint(ctl, "%s", _("Disk attached successfully\n"));
+        }
     } else {
-        vshPrint(ctl, "%s", _("Disk attached successfully\n"));
-        functionReturn = true;
+        vshPrint(ctl, "%s", xml);
     }

+    functionReturn = true;
+
  cleanup:
-    if (dom)
-        virDomainFree(dom);
+    VIR_FREE(xml);
+    virDomainFree(dom);
     virBufferFreeAndReset(&buf);
     return functionReturn;
 }
diff --git a/tools/virsh.pod b/tools/virsh.pod
index e2a2aec..fd0f762 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -1787,7 +1787,7 @@ needed if the device does not use managed mode.
 [I<--driver driver>] [I<--subdriver subdriver>] [I<--cache cache>]
 [I<--type type>] [I<--mode mode>] [I<--config>] [I<--sourcetype soucetype>]
 [I<--serial serial>] [I<--shareable>] [I<--rawio>] [I<--address address>]
-[I<--multifunction>]
+[I<--multifunction>] [I<--print-xml>]

 Attach a new disk device to the domain.
 I<source> is path for the files and devices. I<target> controls the bus or
@@ -1817,6 +1817,9 @@ scsi:controller.bus.unit or ide:controller.bus.unit.
 I<multifunction> indicates specified pci address is a multifunction pci device
 address.

+If I<--print-xml> is specified, then the XML of the disk that would be attached
+is printed instead.
+
 =item B<attach-interface> I<domain> I<type> I<source>
 [I<--target target>] [I<--mac mac>] [I<--script script>] [I<--model model>]
 [I<--config>] [I<--inbound average,peak,burst>] [I<--outbound 
average,peak,burst>]
-- 
1.8.1.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to