mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-09 09:14:57 +00:00
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
This commit is contained in:
parent
6bb4986b0b
commit
ced154cb54
@ -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 <file>.")},
|
||||||
|
{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 <file> 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
|
* "attach-interface" command
|
||||||
*/
|
*/
|
||||||
@ -7891,6 +7958,7 @@ static const vshCmdDef commands[] = {
|
|||||||
{"suspend", cmdSuspend, opts_suspend, info_suspend},
|
{"suspend", cmdSuspend, opts_suspend, info_suspend},
|
||||||
{"ttyconsole", cmdTTYConsole, opts_ttyconsole, info_ttyconsole},
|
{"ttyconsole", cmdTTYConsole, opts_ttyconsole, info_ttyconsole},
|
||||||
{"undefine", cmdUndefine, opts_undefine, info_undefine},
|
{"undefine", cmdUndefine, opts_undefine, info_undefine},
|
||||||
|
{"update-device", cmdUpdateDevice, opts_update_device, info_update_device},
|
||||||
{"uri", cmdURI, NULL, info_uri},
|
{"uri", cmdURI, NULL, info_uri},
|
||||||
|
|
||||||
{"vol-create", cmdVolCreate, opts_vol_create, info_vol_create},
|
{"vol-create", cmdVolCreate, opts_vol_create, info_vol_create},
|
||||||
|
Loading…
Reference in New Issue
Block a user