[libvirt] [PATCH v4 4/7] add qemu driver support Add qemuDrvDomainAgentCommand() for .qemuDomainArbitraryAgentCommand to qemu driver.
Daniel Veillard
veillard at redhat.com
Thu Aug 23 11:17:31 UTC 2012
On Thu, Aug 23, 2012 at 12:29:24PM +0900, MATSUDA Daiki wrote:
>
> Signed-off-by: MATSUDA Daiki <matsudadik at intellilink.co.jp>
> ---
> src/qemu/qemu_driver.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 71 insertions(+), 0 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 109d18d..a62d1bb 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -13437,6 +13437,76 @@ qemuListAllDomains(virConnectPtr conn,
> return ret;
> }
>
> +static char *
> +qemuDrvDomainAgentCommand(virDomainPtr domain,
> + const char *cmd,
> + int timeout,
> + unsigned int flags)
> +{
> + struct qemud_driver *driver = domain->conn->privateData;
> + virDomainObjPtr vm;
> + int ret = -1;
> + char *result = NULL;
> + qemuDomainObjPrivatePtr priv;
> +
> + virCheckFlags(0, NULL);
> +
> + qemuDriverLock(driver);
> + vm = virDomainFindByUUID(&driver->domains, domain->uuid);
> + qemuDriverUnlock(driver);
> +
> + if (!vm) {
> + char uuidstr[VIR_UUID_STRING_BUFLEN];
> + virUUIDFormat(domain->uuid, uuidstr);
> + virReportError(VIR_ERR_NO_DOMAIN,
> + _("no domain with matching uuid '%s'"), uuidstr);
> + goto cleanup;
> + }
> +
> + priv = vm->privateData;
> +
> + if (!virDomainObjIsActive(vm)) {
> + virReportError(VIR_ERR_OPERATION_INVALID,
> + "%s", _("domain is not running"));
> + goto cleanup;
> + }
> +
> + if (priv->agentError) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("QEMU guest agent is not available due to an error"));
> + goto cleanup;
> + }
> +
> + if (!priv->agent) {
> + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> + _("QEMU guest agent is not configured"));
> + goto cleanup;
> + }
> +
> + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
> + goto cleanup;
> +
> + if (!virDomainObjIsActive(vm)) {
> + virReportError(VIR_ERR_OPERATION_INVALID,
> + "%s", _("domain is not running"));
> + goto endjob;
> + }
> +
> + qemuDomainObjEnterAgent(driver, vm);
> + ret = qemuAgentArbitraryCommand(priv->agent, cmd, &result, timeout);
> + qemuDomainObjExitAgent(driver, vm);
The problem here is that ret is not looked at. I think that part
really need to be improved especially as the possibility to run
any command is far more likely to fail, a better error report is
needed
> +endjob:
> + if (qemuDomainObjEndJob(driver, vm) == 0) {
> + vm = NULL;
> + }
> +
> +cleanup:
> + if (vm)
> + virDomainObjUnlock(vm);
> + return result;
> +}
> +
> static virDriver qemuDriver = {
> .no = VIR_DRV_QEMU,
> .name = QEMU_DRIVER_NAME,
> @@ -13603,6 +13673,7 @@ static virDriver qemuDriver = {
> .domainPMSuspendForDuration = qemuDomainPMSuspendForDuration, /* 0.9.11 */
> .domainPMWakeup = qemuDomainPMWakeup, /* 0.9.11 */
> .domainGetCPUStats = qemuDomainGetCPUStats, /* 0.9.11 */
> + .qemuDomainArbitraryAgentCommand = qemuDrvDomainAgentCommand, /* 0.10.1 */
> };
I squashed that in the meantime but something better need to be done
here, report the domain name and command and if possible an error
message sounds a minimum.
Daniel
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index fc5fa52..3948bef 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13857,6 +13857,11 @@ qemuDrvDomainAgentCommand(virDomainPtr domain,
qemuDomainObjEnterAgent(driver, vm);
ret = qemuAgentArbitraryCommand(priv->agent, cmd, &result, timeout);
qemuDomainObjExitAgent(driver, vm);
+ if (ret < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Failed to execute agent command"));
+ goto endjob;
+ }
endjob:
if (qemuDomainObjEndJob(driver, vm) == 0) {
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list