[libvirt] [PATCH 9/9] Modify virsh commands

Jim Fehlig jfehlig at novell.com
Thu Jan 14 17:42:46 UTC 2010


Change all virsh commands that invoke virDomain{Attach,Detach}Device()
to use virDomain{Attach,Detach}DeviceFlags() instead.

Add a "--persistent" flag to these virsh commands, allowing user to
specify that the domain persisted config be modified as well.
---
 tools/virsh.c |   55 +++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index 1fae5e6..a082b89 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -6285,6 +6285,7 @@ static const vshCmdInfo info_attach_device[] = {
 static const vshCmdOptDef opts_attach_device[] = {
     {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {"file",   VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("XML file")},
+    {"persistent", VSH_OT_BOOL, 0, gettext_noop("persist device attachment")},
     {NULL, 0, 0, NULL}
 };
 
@@ -6296,6 +6297,7 @@ cmdAttachDevice(vshControl *ctl, const vshCmd *cmd)
     char *buffer;
     int ret = TRUE;
     int found;
+    int flags = VIR_DOMAIN_DEVICE_MODIFY_CURRENT;
 
     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         return FALSE;
@@ -6309,13 +6311,18 @@ cmdAttachDevice(vshControl *ctl, const vshCmd *cmd)
         virDomainFree(dom);
         return FALSE;
     }
+    if (vshCommandOptBool(cmd, "persistent"))
+        flags |= VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0) {
         virDomainFree(dom);
         return FALSE;
     }
 
-    ret = virDomainAttachDevice(dom, buffer);
+    if (virDomainIsActive(dom))
+       flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
+
+    ret = virDomainAttachDeviceFlags(dom, buffer, flags);
     VIR_FREE(buffer);
 
     if (ret < 0) {
@@ -6343,6 +6350,7 @@ static const vshCmdInfo info_detach_device[] = {
 static const vshCmdOptDef opts_detach_device[] = {
     {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {"file",   VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("XML file")},
+    {"persistent", VSH_OT_BOOL, 0, gettext_noop("persist device detachment")},
     {NULL, 0, 0, NULL}
 };
 
@@ -6354,6 +6362,7 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
     char *buffer;
     int ret = TRUE;
     int found;
+    int flags = VIR_DOMAIN_DEVICE_MODIFY_CURRENT;
 
     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         return FALSE;
@@ -6367,13 +6376,18 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
         virDomainFree(dom);
         return FALSE;
     }
+    if (vshCommandOptBool(cmd, "persistent"))
+        flags |= VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0) {
         virDomainFree(dom);
         return FALSE;
     }
 
-    ret = virDomainDetachDevice(dom, buffer);
+    if (virDomainIsActive(dom))
+       flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
+
+    ret = virDomainDetachDeviceFlags(dom, buffer, flags);
     VIR_FREE(buffer);
 
     if (ret < 0) {
@@ -6405,6 +6419,7 @@ static const vshCmdOptDef opts_attach_interface[] = {
     {"target", VSH_OT_DATA, 0, gettext_noop("target network name")},
     {"mac",    VSH_OT_DATA, 0, gettext_noop("MAC address")},
     {"script", VSH_OT_DATA, 0, gettext_noop("script used to bridge network interface")},
+    {"persistent", VSH_OT_BOOL, 0, gettext_noop("persist interface attachment")},
     {NULL, 0, 0, NULL}
 };
 
@@ -6415,6 +6430,7 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd)
     char *mac, *target, *script, *type, *source;
     int typ, ret = FALSE;
     char *buf = NULL, *tmp = NULL;
+    int flags = VIR_DOMAIN_DEVICE_MODIFY_CURRENT;
 
     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         goto cleanup;
@@ -6429,6 +6445,8 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd)
     target = vshCommandOptString(cmd, "target", NULL);
     mac = vshCommandOptString(cmd, "mac", NULL);
     script = vshCommandOptString(cmd, "script", NULL);
+    if (vshCommandOptBool(cmd, "persistent"))
+        flags |= VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
 
     /* check interface type */
     if (STREQ(type, "network")) {
@@ -6489,7 +6507,10 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd)
     if (!buf) goto cleanup;
     strcat(buf, "    </interface>\n");
 
-    if (virDomainAttachDevice(dom, buf)) {
+    if (virDomainIsActive(dom))
+       flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
+
+    if (virDomainAttachDeviceFlags(dom, buf, flags)) {
         goto cleanup;
     } else {
         vshPrint(ctl, "%s", _("Interface attached successfully\n"));
@@ -6518,6 +6539,7 @@ static const vshCmdOptDef opts_detach_interface[] = {
     {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {"type",   VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("network interface type")},
     {"mac",    VSH_OT_STRING, 0, gettext_noop("MAC address")},
+    {"persistent", VSH_OT_BOOL, 0, gettext_noop("persist interface detachment")},
     {NULL, 0, 0, NULL}
 };
 
@@ -6534,6 +6556,7 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
     char *doc, *mac =NULL, *type;
     char buf[64];
     int i = 0, diff_mac, ret = FALSE;
+    int flags = VIR_DOMAIN_DEVICE_MODIFY_CURRENT;
 
     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         goto cleanup;
@@ -6545,6 +6568,8 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
         goto cleanup;
 
     mac = vshCommandOptString(cmd, "mac", NULL);
+    if (vshCommandOptBool(cmd, "persistent"))
+        flags |= VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
 
     doc = virDomainGetXMLDesc(dom, 0);
     if (!doc)
@@ -6605,7 +6630,10 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
         goto cleanup;
     }
 
-    ret = virDomainDetachDevice(dom, (char *)xmlBufferContent(xml_buf));
+    if (virDomainIsActive(dom))
+       flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
+
+    ret = virDomainDetachDeviceFlags(dom, (char *)xmlBufferContent(xml_buf), flags);
     if (ret != 0)
         ret = FALSE;
     else {
@@ -6642,6 +6670,7 @@ static const vshCmdOptDef opts_attach_disk[] = {
     {"subdriver", VSH_OT_STRING, 0, gettext_noop("subdriver of disk device")},
     {"type",    VSH_OT_STRING, 0, gettext_noop("target device type")},
     {"mode",    VSH_OT_STRING, 0, gettext_noop("mode of device reading and writing")},
+    {"persistent", VSH_OT_BOOL, 0, gettext_noop("persist disk attachment")},
     {NULL, 0, 0, NULL}
 };
 
@@ -6652,6 +6681,7 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd)
     char *source, *target, *driver, *subdriver, *type, *mode;
     int isFile = 0, ret = FALSE;
     char *buf = NULL, *tmp = NULL;
+    int flags = VIR_DOMAIN_DEVICE_MODIFY_CURRENT;
 
     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         goto cleanup;
@@ -6669,6 +6699,8 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd)
     subdriver = vshCommandOptString(cmd, "subdriver", NULL);
     type = vshCommandOptString(cmd, "type", NULL);
     mode = vshCommandOptString(cmd, "mode", NULL);
+    if (vshCommandOptBool(cmd, "persistent"))
+        flags |=  VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
 
     if (driver) {
         if (STREQ(driver, "file") || STREQ(driver, "tap")) {
@@ -6767,7 +6799,10 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd)
     if (!buf) goto cleanup;
     strcat(buf, "    </disk>\n");
 
-    if (virDomainAttachDevice(dom, buf))
+    if (virDomainIsActive(dom))
+       flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
+
+    if (virDomainAttachDeviceFlags(dom, buf, flags))
         goto cleanup;
     else
         vshPrint(ctl, "%s", _("Disk attached successfully\n"));
@@ -6794,6 +6829,7 @@ static const vshCmdInfo info_detach_disk[] = {
 static const vshCmdOptDef opts_detach_disk[] = {
     {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {"target", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("target of disk device")},
+    {"persistent", VSH_OT_BOOL, 0, gettext_noop("persist disk detachment")},
     {NULL, 0, 0, NULL}
 };
 
@@ -6809,6 +6845,7 @@ cmdDetachDisk(vshControl *ctl, const vshCmd *cmd)
     virDomainPtr dom = NULL;
     char *doc, *target;
     int i = 0, diff_tgt, ret = FALSE;
+    int flags = VIR_DOMAIN_DEVICE_MODIFY_CURRENT;
 
     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         goto cleanup;
@@ -6819,6 +6856,9 @@ cmdDetachDisk(vshControl *ctl, const vshCmd *cmd)
     if (!(target = vshCommandOptString(cmd, "target", NULL)))
         goto cleanup;
 
+    if (vshCommandOptBool(cmd, "persistent"))
+        flags |= VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
+
     doc = virDomainGetXMLDesc(dom, 0);
     if (!doc)
         goto cleanup;
@@ -6874,7 +6914,10 @@ cmdDetachDisk(vshControl *ctl, const vshCmd *cmd)
         goto cleanup;
     }
 
-    ret = virDomainDetachDevice(dom, (char *)xmlBufferContent(xml_buf));
+    if (virDomainIsActive(dom))
+       flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
+
+    ret = virDomainDetachDeviceFlags(dom, (char *)xmlBufferContent(xml_buf), flags);
     if (ret != 0)
         ret = FALSE;
     else {
-- 
1.6.0.2




More information about the libvir-list mailing list