[libvirt] [PATCH 9/9] Modify virsh commands
Daniel P. Berrange
berrange at redhat.com
Wed Jan 27 11:21:42 UTC 2010
On Mon, Jan 25, 2010 at 04:30:45PM -0700, Jim Fehlig wrote:
> Daniel P. Berrange wrote:
> > On Thu, Jan 14, 2010 at 10:42:46AM -0700, Jim Fehlig wrote:
> >
> >> 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) {
> >>
> >
> >
> > This has the same subtle compatability problem that the public API
> > entry point suffers from. New virsh won't be able to modify guests
> > from an existing libvirtd. I think that if flags == 0, then we should
> > use the existing API method, and only use the new virDomainAttachDeviceFlags
> > if flags != 0. I think we probably want to default to 0, and only set
> > the VIR_DOMAIN_DEVICE_MODIFY_LIVE flag if a '--live' flag is given.
> > Basically we need to try & ensure compatability with existing operation
> > if at all possible
> >
>
> The existing behavior is essentially VIR_DOMAIN_DEVICE_MODIFY_LIVE.
> qemu fails the operation if domain is inactive. Attach works on
> inactive Xen domains, but detach does not. vbox has an impl for
> inactive domains, but I haven't tested it.
>
> I kept the existing behavior by only calling
> vir{Attach,Detach}DeviceFlags() only when the new virsh flag
> "persistent" is specified. Revised patch below.
>
> Thanks,
> Jim
>
> commit 4e52e0d49d96958facab3e99b6b6f8519d2d9c76
> Author: Jim Fehlig <jfehlig at novell.com>
> Date: Wed Jan 13 18:54:58 2010 -0700
>
> Modify virsh commands
>
> 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.
>
> V2: Only invoke virDomain{Attach,Detach}DeviceFlags() if
> "--persistent" flag is specified. Otherwise invoke
> virDomain{Attach,Detach}Device() to retain current behavior.
>
> diff --git a/tools/virsh.c b/tools/virsh.c
> index 1fae5e6..0763dcc 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;
> + unsigned int flags;
>
> if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
> return FALSE;
> @@ -6315,7 +6317,14 @@ cmdAttachDevice(vshControl *ctl, const vshCmd *cmd)
> return FALSE;
> }
>
> - ret = virDomainAttachDevice(dom, buffer);
> + if (vshCommandOptBool(cmd, "persistent")) {
> + flags = VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
> + if (virDomainIsActive(dom) == 1)
> + flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
> + ret = virDomainAttachDeviceFlags(dom, buffer, flags);
> + } else {
> + ret = virDomainAttachDevice(dom, buffer);
> + }
> VIR_FREE(buffer);
>
> if (ret < 0) {
> @@ -6343,6 +6352,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 +6364,7 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
> char *buffer;
> int ret = TRUE;
> int found;
> + unsigned int flags;
>
> if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
> return FALSE;
> @@ -6373,7 +6384,14 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
> return FALSE;
> }
>
> - ret = virDomainDetachDevice(dom, buffer);
> + if (vshCommandOptBool(cmd, "persistent")) {
> + flags = VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
> + if (virDomainIsActive(dom) == 1)
> + flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
> + ret = virDomainDetachDeviceFlags(dom, buffer, flags);
> + } else {
> + ret = virDomainDetachDevice(dom, buffer);
> + }
> VIR_FREE(buffer);
>
> if (ret < 0) {
> @@ -6405,6 +6423,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 +6434,7 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd)
> char *mac, *target, *script, *type, *source;
> int typ, ret = FALSE;
> char *buf = NULL, *tmp = NULL;
> + unsigned int flags;
>
> if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
> goto cleanup;
> @@ -6489,13 +6509,22 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd)
> if (!buf) goto cleanup;
> strcat(buf, " </interface>\n");
>
> - if (virDomainAttachDevice(dom, buf)) {
> - goto cleanup;
> + if (vshCommandOptBool(cmd, "persistent")) {
> + flags = VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
> + if (virDomainIsActive(dom) == 1)
> + flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
> + ret = virDomainAttachDeviceFlags(dom, buf, flags);
> } else {
> - vshPrint(ctl, "%s", _("Interface attached successfully\n"));
> + ret = virDomainAttachDevice(dom, buf);
> }
>
> - ret = TRUE;
> + if (ret != 0) {
> + vshError(ctl, _("Failed to attach interface"));
> + ret = FALSE;
> + } else {
> + vshPrint(ctl, "%s", _("Interface attached successfully\n"));
> + ret = TRUE;
> + }
>
> cleanup:
> if (dom)
> @@ -6518,6 +6547,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 +6564,7 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
> char *doc, *mac =NULL, *type;
> char buf[64];
> int i = 0, diff_mac, ret = FALSE;
> + unsigned int flags;
>
> if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
> goto cleanup;
> @@ -6605,10 +6636,21 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
> goto cleanup;
> }
>
> - ret = virDomainDetachDevice(dom, (char *)xmlBufferContent(xml_buf));
> - if (ret != 0)
> + if (vshCommandOptBool(cmd, "persistent")) {
> + flags = VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
> + if (virDomainIsActive(dom) == 1)
> + flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
> + ret = virDomainDetachDeviceFlags(dom,
> + (char *)xmlBufferContent(xml_buf),
> + flags);
> + } else {
> + ret = virDomainDetachDevice(dom, (char *)xmlBufferContent(xml_buf));
> + }
> +
> + if (ret != 0) {
> + vshError(ctl, _("Failed to detach interface"));
> ret = FALSE;
> - else {
> + } else {
> vshPrint(ctl, "%s", _("Interface detached successfully\n"));
> ret = TRUE;
> }
> @@ -6642,6 +6684,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 +6695,7 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd)
> char *source, *target, *driver, *subdriver, *type, *mode;
> int isFile = 0, ret = FALSE;
> char *buf = NULL, *tmp = NULL;
> + unsigned int flags;
>
> if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
> goto cleanup;
> @@ -6767,12 +6811,22 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd)
> if (!buf) goto cleanup;
> strcat(buf, " </disk>\n");
>
> - if (virDomainAttachDevice(dom, buf))
> - goto cleanup;
> - else
> - vshPrint(ctl, "%s", _("Disk attached successfully\n"));
> + if (vshCommandOptBool(cmd, "persistent")) {
> + flags = VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
> + if (virDomainIsActive(dom) == 1)
> + flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
> + ret = virDomainAttachDeviceFlags(dom, buf, flags);
> + } else {
> + ret = virDomainAttachDevice(dom, buf);
> + }
>
> - ret = TRUE;
> + if (ret != 0) {
> + vshError(ctl, _("Failed to attach disk"));
> + ret = FALSE;
> + } else {
> + vshPrint(ctl, "%s", _("Disk attached successfully\n"));
> + ret = TRUE;
> + }
>
> cleanup:
> if (dom)
> @@ -6794,6 +6848,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 +6864,7 @@ cmdDetachDisk(vshControl *ctl, const vshCmd *cmd)
> virDomainPtr dom = NULL;
> char *doc, *target;
> int i = 0, diff_tgt, ret = FALSE;
> + unsigned int flags;
>
> if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
> goto cleanup;
> @@ -6874,10 +6930,21 @@ cmdDetachDisk(vshControl *ctl, const vshCmd *cmd)
> goto cleanup;
> }
>
> - ret = virDomainDetachDevice(dom, (char *)xmlBufferContent(xml_buf));
> - if (ret != 0)
> + if (vshCommandOptBool(cmd, "persistent")) {
> + flags = VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
> + if (virDomainIsActive(dom) == 1)
> + flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
> + ret = virDomainDetachDeviceFlags(dom,
> + (char *)xmlBufferContent(xml_buf),
> + flags);
> + } else {
> + ret = virDomainDetachDevice(dom, (char *)xmlBufferContent(xml_buf));
> + }
> +
> + if (ret != 0) {
> + vshError(ctl, _("Failed to detach disk"));
> ret = FALSE;
> - else {
> + } else {
> vshPrint(ctl, "%s", _("Disk detached successfully\n"));
> ret = TRUE;
> }
ACK
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list