[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