From ced154cb546a0c5d92f30e53ed8cc945175f84bc Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 22 Mar 2010 18:45:09 +0000 Subject: [PATCH] Introduce a update-device command in virsh Support the new virDomainUpdateDeviceFlags API in virsh by adding a new 'update-device' command. In the future this should be augmented with an explicit 'change-disk' command for media change to make it end user discoverable, as attach-disk is. * tools/virsh.c: Add 'update-device' command --- tools/virsh.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/tools/virsh.c b/tools/virsh.c index 32895b26ac..35bdbf1b8c 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -6676,6 +6676,73 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd) } +/* + * "update-device" command + */ +static const vshCmdInfo info_update_device[] = { + {"help", N_("update device from an XML file")}, + {"desc", N_("Update device from an XML .")}, + {NULL, NULL} +}; + +static const vshCmdOptDef opts_update_device[] = { + {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")}, + {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("XML file")}, + {"persistent", VSH_OT_BOOL, 0, N_("persist device update")}, + {NULL, 0, 0, NULL} +}; + +static int +cmdUpdateDevice(vshControl *ctl, const vshCmd *cmd) +{ + virDomainPtr dom; + char *from; + char *buffer; + int ret = TRUE; + int found; + unsigned int flags; + + if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) + return FALSE; + + if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) + return FALSE; + + from = vshCommandOptString(cmd, "file", &found); + if (!found) { + vshError(ctl, "%s", _("update-device: Missing option")); + virDomainFree(dom); + return FALSE; + } + + if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0) { + virDomainFree(dom); + return FALSE; + } + + if (vshCommandOptBool(cmd, "persistent")) { + flags = VIR_DOMAIN_DEVICE_MODIFY_CONFIG; + if (virDomainIsActive(dom) == 1) + flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE; + } else { + flags = VIR_DOMAIN_DEVICE_MODIFY_LIVE; + } + ret = virDomainUpdateDeviceFlags(dom, buffer, flags); + VIR_FREE(buffer); + + if (ret < 0) { + vshError(ctl, _("Failed to update device from %s"), from); + virDomainFree(dom); + return FALSE; + } else { + vshPrint(ctl, "%s", _("Device updated successfully\n")); + } + + virDomainFree(dom); + return TRUE; +} + + /* * "attach-interface" command */ @@ -7891,6 +7958,7 @@ static const vshCmdDef commands[] = { {"suspend", cmdSuspend, opts_suspend, info_suspend}, {"ttyconsole", cmdTTYConsole, opts_ttyconsole, info_ttyconsole}, {"undefine", cmdUndefine, opts_undefine, info_undefine}, + {"update-device", cmdUpdateDevice, opts_update_device, info_update_device}, {"uri", cmdURI, NULL, info_uri}, {"vol-create", cmdVolCreate, opts_vol_create, info_vol_create},