[libvirt] [PATCH 3/4] Add the monitor type to the domain state XML

Daniel P. Berrange berrange at redhat.com
Thu Jul 9 21:42:12 UTC 2009


On Thu, Jul 09, 2009 at 08:09:45PM +0100, Mark McLoughlin wrote:
> There are no functional changes in this patch apart from adding the
> monitor type to the state XML.
> 
> The patch mostly consists of switching to use virDomainChrDef every
> where to describe the monitor.
> 
> * src/domain_conf.h: replace monitorpath with monitor_chr
> 
> * src/domain_conf.c: handle parsing the monitor type and initializing
>   monitor chr
> 
> * src/qemu_conf.[ch]: make qemudBuildCommandLine take a
>   virDomainChrDefPtr and use that to build the -monitor parameter
> 
> * src/qemu_driver.c: split pty specific and common code from
>   qemudOpenMonitor, have qemudStartVMDaemon() initialize monitor_chr
> 
> * tests/qemuxml2argvtest.c: update for qemudBuildCommandLine() change

Ahh, good forward thinking - I would not have remembered that the
state file needed changing for this.

> ---
>  src/domain_conf.c        |   46 ++++++++++++++++++++--
>  src/domain_conf.h        |    2 +-
>  src/qemu_conf.c          |   12 +++++-
>  src/qemu_conf.h          |    1 +
>  src/qemu_driver.c        |   96 ++++++++++++++++++++++++++++++++-------------
>  tests/qemuxml2argvtest.c |    6 ++-
>  6 files changed, 127 insertions(+), 36 deletions(-)
> 
> diff --git a/src/domain_conf.c b/src/domain_conf.c
> index cc8c3ef..8e8b076 100644
> --- a/src/domain_conf.c
> +++ b/src/domain_conf.c
> @@ -516,7 +516,8 @@ void virDomainObjFree(virDomainObjPtr dom)
>      virDomainDefFree(dom->def);
>      virDomainDefFree(dom->newDef);
>  
> -    VIR_FREE(dom->monitorpath);
> +    virDomainChrDefFree(dom->monitor_chr);
> +
>      VIR_FREE(dom->vcpupids);
>  
>      virMutexDestroy(&dom->lock);
> @@ -2890,6 +2891,7 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn,
>      xmlNodePtr config;
>      xmlNodePtr oldnode;
>      virDomainObjPtr obj;
> +    char *monitorpath;
>  
>      if (!(obj = virDomainObjNew(conn)))
>          return NULL;
> @@ -2927,16 +2929,41 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn,
>      }
>      obj->pid = (pid_t)val;
>  
> -    if(!(obj->monitorpath =
> -         virXPathString(conn, "string(./monitor[1]/@path)", ctxt))) {
> +    if (VIR_ALLOC(obj->monitor_chr) < 0) {
> +        virReportOOMError(conn);
> +        goto error;
> +    }
> +
> +    if (!(monitorpath =
> +          virXPathString(conn, "string(./monitor[1]/@path)", ctxt))) {
>          virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
>                               "%s", _("no monitor path"));
>          goto error;
>      }
>  
> +    tmp = virXPathString(conn, "string(./monitor[1]/@type)", ctxt);
> +    if (tmp)
> +        obj->monitor_chr->type = virDomainChrTypeFromString(tmp);
> +    else
> +        obj->monitor_chr->type = VIR_DOMAIN_CHR_TYPE_PTY;
> +    VIR_FREE(tmp);
> +
> +    switch (obj->monitor_chr->type) {
> +    case VIR_DOMAIN_CHR_TYPE_PTY:
> +        obj->monitor_chr->data.file.path = monitorpath;
> +        break;
> +    default:
> +        VIR_FREE(monitorpath);
> +        virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
> +                             _("unsupported monitor type '%s'"),
> +                             virDomainChrTypeToString(obj->monitor_chr->type));
> +        break;
> +    }
> +
>      return obj;
>  
>  error:
> +    virDomainChrDefFree(obj->monitor_chr);
>      virDomainObjFree(obj);
>      return NULL;
>  }
> @@ -4134,11 +4161,22 @@ char *virDomainObjFormat(virConnectPtr conn,
>  {
>      char *config_xml = NULL, *xml = NULL;
>      virBuffer buf = VIR_BUFFER_INITIALIZER;
> +    const char *monitorpath;
>  
>      virBufferVSprintf(&buf, "<domstatus state='%s' pid='%d'>\n",
>                        virDomainStateTypeToString(obj->state),
>                        obj->pid);
> -    virBufferEscapeString(&buf, "  <monitor path='%s'/>\n", obj->monitorpath);
> +
> +    switch (obj->monitor_chr->type) {
> +    default:
> +    case VIR_DOMAIN_CHR_TYPE_PTY:
> +        monitorpath = obj->monitor_chr->data.file.path;
> +        break;
> +    }
> +
> +    virBufferEscapeString(&buf, "  <monitor path='%s'", monitorpath);
> +    virBufferVSprintf(&buf, " type='%s'/>\n",
> +                      virDomainChrTypeToString(obj->monitor_chr->type));
>  
>      if (!(config_xml = virDomainDefFormat(conn,
>                                            obj->def,
> diff --git a/src/domain_conf.h b/src/domain_conf.h
> index 51dd6d3..6e111fa 100644
> --- a/src/domain_conf.h
> +++ b/src/domain_conf.h
> @@ -538,7 +538,7 @@ struct _virDomainObj {
>      virMutex lock;
>  
>      int monitor;
> -    char *monitorpath;
> +    virDomainChrDefPtr monitor_chr;
>      int monitorWatch;
>      int pid;
>      int state;
> diff --git a/src/qemu_conf.c b/src/qemu_conf.c
> index afa6b3e..414b71b 100644
> --- a/src/qemu_conf.c
> +++ b/src/qemu_conf.c
> @@ -888,6 +888,7 @@ static int qemudBuildCommandLineChrDevStr(virDomainChrDefPtr dev,
>  int qemudBuildCommandLine(virConnectPtr conn,
>                            struct qemud_driver *driver,
>                            virDomainDefPtr def,
> +                          virDomainChrDefPtr monitor_chr,
>                            unsigned int qemuCmdFlags,
>                            const char ***retargv,
>                            const char ***retenv,
> @@ -1118,8 +1119,15 @@ int qemudBuildCommandLine(virConnectPtr conn,
>      if (!def->graphics)
>          ADD_ARG_LIT("-nographic");
>  
> -    ADD_ARG_LIT("-monitor");
> -    ADD_ARG_LIT("pty");
> +    if (monitor_chr) {
> +        char buf[4096];
> +
> +        if (qemudBuildCommandLineChrDevStr(monitor_chr, buf, sizeof(buf)) < 0)
> +            goto error;
> +
> +        ADD_ARG_LIT("-monitor");
> +        ADD_ARG_LIT(buf);
> +    }
>  
>      if (def->localtime)
>          ADD_ARG_LIT("-localtime");
> diff --git a/src/qemu_conf.h b/src/qemu_conf.h
> index 9065821..175173d 100644
> --- a/src/qemu_conf.h
> +++ b/src/qemu_conf.h
> @@ -129,6 +129,7 @@ int         qemudParseHelpStr           (const char *str,
>  int         qemudBuildCommandLine       (virConnectPtr conn,
>                                           struct qemud_driver *driver,
>                                           virDomainDefPtr def,
> +                                         virDomainChrDefPtr monitor_chr,
>                                           unsigned int qemuCmdFlags,
>                                           const char ***retargv,
>                                           const char ***retenv,
> diff --git a/src/qemu_driver.c b/src/qemu_driver.c
> index d74596f..eee8857 100644
> --- a/src/qemu_driver.c
> +++ b/src/qemu_driver.c
> @@ -283,7 +283,6 @@ cleanup:
>  static int qemudOpenMonitor(virConnectPtr conn,
>                              struct qemud_driver* driver,
>                              virDomainObjPtr vm,
> -                            const char *monitor,
>                              int reconnect);
>  
>  
> @@ -297,7 +296,7 @@ qemuReconnectDomain(struct qemud_driver *driver,
>  {
>      int rc;
>  
> -    if ((rc = qemudOpenMonitor(NULL, driver, obj, obj->monitorpath, 1)) != 0) {
> +    if ((rc = qemudOpenMonitor(NULL, driver, obj, 1)) != 0) {
>          VIR_ERROR(_("Failed to reconnect monitor for %s: %d\n"),
>                    obj->def->name, rc);
>          goto error;
> @@ -821,30 +820,24 @@ qemudCheckMonitorPrompt(virConnectPtr conn ATTRIBUTE_UNUSED,
>  }
>  
>  static int
> -qemudOpenMonitor(virConnectPtr conn,
> -                 struct qemud_driver* driver,
> -                 virDomainObjPtr vm,
> -                 const char *monitor,
> -                 int reconnect)
> +qemudOpenMonitorCommon(virConnectPtr conn,
> +                       struct qemud_driver* driver,
> +                       virDomainObjPtr vm,
> +                       int monfd,
> +                       int reconnect)
>  {
> -    int monfd;
>      char buf[1024];
> -    int ret = -1;
> +    int ret;
>  
> -    if ((monfd = open(monitor, O_RDWR)) < 0) {
> -        qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> -                         _("Unable to open monitor path %s"), monitor);
> -        return -1;
> -    }
>      if (virSetCloseExec(monfd) < 0) {
>          qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
>                           "%s", _("Unable to set monitor close-on-exec flag"));
> -        goto error;
> +        return -1;
>      }
>      if (virSetNonBlock(monfd) < 0) {
>          qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
>                           "%s", _("Unable to put monitor into non-blocking mode"));
> -        goto error;
> +        return -1;
>      }
>  
>      if (!reconnect) {
> @@ -862,21 +855,58 @@ qemudOpenMonitor(virConnectPtr conn,
>      }
>  
>      if (ret != 0)
> -         goto error;
> +        return ret;
>  
>      if ((vm->monitorWatch = virEventAddHandle(vm->monitor, 0,
>                                                qemudDispatchVMEvent,
>                                                driver, NULL)) < 0)
> -        goto error;
> +        return -1;
>  
> +    return 0;
> +}
>  
> -    /* Keep monitor open upon success */
> -    if (ret == 0)
> -        return ret;
> +static int
> +qemudOpenMonitorPty(virConnectPtr conn,
> +                    struct qemud_driver* driver,
> +                    virDomainObjPtr vm,
> +                    const char *monitor,
> +                    int reconnect)
> +{
> +    int monfd;
>  
> - error:
> +    if ((monfd = open(monitor, O_RDWR)) < 0) {
> +        qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> +                         _("Unable to open monitor path %s"), monitor);
> +        return -1;
> +    }
> +
> +    if (qemudOpenMonitorCommon(conn, driver, vm, monfd, reconnect) < 0)
> +        goto error;
> +
> +    return 0;
> +
> +error:
>      close(monfd);
> -    return ret;
> +    return -1;
> +}
> +
> +static int
> +qemudOpenMonitor(virConnectPtr conn,
> +                 struct qemud_driver *driver,
> +                 virDomainObjPtr vm,
> +                 int reconnect)
> +{
> +    switch (vm->monitor_chr->type) {
> +    case VIR_DOMAIN_CHR_TYPE_PTY:
> +        return qemudOpenMonitorPty(conn, driver, vm,
> +                                   vm->monitor_chr->data.file.path,
> +                                   reconnect);
> +    default:
> +        qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> +                         _("unable to handle monitor type: %s"),
> +                         virDomainChrTypeToString(vm->monitor_chr->type));
> +        return -1;
> +    }
>  }
>  
>  /* Returns -1 for error, 0 success, 1 continue reading */
> @@ -966,10 +996,11 @@ qemudFindCharDevicePTYs(virConnectPtr conn,
>      }
>  
>      /* Got them all, so now open the monitor console */
> -    if ((ret = qemudOpenMonitor(conn, driver, vm, monitor, 0)) != 0)
> -        goto cleanup;
> +    vm->monitor_chr->data.file.path = monitor;
> +    monitor = NULL;
>  
> -    vm->monitorpath = monitor;
> +    if ((ret = qemudOpenMonitor(conn, driver, vm, 0)) != 0)
> +        goto cleanup;
>  
>      return 0;
>  
> @@ -1414,6 +1445,13 @@ static int qemudStartVMDaemon(virConnectPtr conn,
>      if (qemuPrepareHostDevices(conn, vm->def) < 0)
>          goto cleanup;
>  
> +    if (VIR_ALLOC(vm->monitor_chr) < 0) {
> +        virReportOOMError(conn);
> +        goto cleanup;
> +    }
> +
> +    vm->monitor_chr->type = VIR_DOMAIN_CHR_TYPE_PTY;
> +
>      if ((ret = virFileDeletePid(driver->stateDir, vm->def->name)) != 0) {
>          virReportSystemError(conn, ret,
>                               _("Cannot remove stale PID file for %s"),
> @@ -1428,7 +1466,7 @@ static int qemudStartVMDaemon(virConnectPtr conn,
>      }
>  
>      vm->def->id = driver->nextvmid++;
> -    if (qemudBuildCommandLine(conn, driver, vm->def,
> +    if (qemudBuildCommandLine(conn, driver, vm->def, vm->monitor_chr,
>                                qemuCmdFlags, &argv, &progenv,
>                                &tapfds, &ntapfds, migrateFrom) < 0)
>          goto cleanup;
> @@ -3405,6 +3443,7 @@ static char *qemuDomainXMLToNative(virConnectPtr conn,
>                                     unsigned int flags ATTRIBUTE_UNUSED) {
>      struct qemud_driver *driver = conn->privateData;
>      virDomainDefPtr def = NULL;
> +    virDomainChrDef monitor_chr;
>      const char *emulator;
>      unsigned int qemuCmdFlags;
>      struct stat sb;
> @@ -3483,9 +3522,10 @@ static char *qemuDomainXMLToNative(virConnectPtr conn,
>          goto cleanup;
>      }
>  
> +    monitor_chr.type = VIR_DOMAIN_CHR_TYPE_PTY;
>  
>      if (qemudBuildCommandLine(conn, driver, def,
> -                              qemuCmdFlags,
> +                              &monitor_chr, qemuCmdFlags,
>                                &retargv, &retenv,
>                                NULL, NULL, /* Don't want it to create TAP devices */
>                                NULL) < 0) {
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index 2a93018..ea29200 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -34,6 +34,7 @@ static int testCompareXMLToArgvFiles(const char *xml,
>      const char **tmp = NULL;
>      int ret = -1, len, flags;
>      virDomainDefPtr vmdef = NULL;
> +    virDomainChrDef monitor_chr;
>  
>      if (virtTestLoadFile(cmd, &expectargv, MAX_FILE) < 0)
>          goto fail;
> @@ -47,12 +48,15 @@ static int testCompareXMLToArgvFiles(const char *xml,
>      else
>          vmdef->id = -1;
>  
> +    monitor_chr.type = VIR_DOMAIN_CHR_TYPE_PTY;
> +
>      flags = QEMUD_CMD_FLAG_VNC_COLON |
>          QEMUD_CMD_FLAG_NO_REBOOT |
>          extraFlags;
>  
>      if (qemudBuildCommandLine(NULL, &driver,
> -                              vmdef, flags, &argv, &qenv,
> +                              vmdef, &monitor_chr, flags,
> +                              &argv, &qenv,
>                                NULL, NULL, migrateFrom) < 0)
>          goto fail;
>  

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