[libvirt] [Patch v3] Add VMware Workstation and Player driver

Matthias Bolte matthias.bolte at googlemail.com
Fri Dec 10 19:24:21 UTC 2010


2010/12/8 Jean-Baptiste Rouault <jean-baptiste.rouault at diateam.net>:
> ---
>  cfg.mk                      |    1 +
>  configure.ac                |    7 +
>  include/libvirt/virterror.h |    1 +
>  po/POTFILES.in              |    2 +
>  src/Makefile.am             |   24 +-
>  src/driver.h                |    3 +-
>  src/libvirt.c               |   15 +
>  src/util/virterror.c        |    3 +
>  src/vmware/vmware_conf.c    |  453 +++++++++++++++
>  src/vmware/vmware_conf.h    |   82 +++
>  src/vmware/vmware_driver.c  | 1351 +++++++++++++++++++++++++++++++++++++++++++
>  src/vmware/vmware_driver.h  |   25 +
>  12 files changed, 1963 insertions(+), 4 deletions(-)
>  create mode 100644 src/vmware/vmware_conf.c
>  create mode 100644 src/vmware/vmware_conf.h
>  create mode 100644 src/vmware/vmware_driver.c
>  create mode 100644 src/vmware/vmware_driver.h
>


> diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c
> new file mode 100644
> index 0000000..2255b52
> --- /dev/null
> +++ b/src/vmware/vmware_conf.c

> +#include <config.h>
> +
> +#include <string.h>
> +#include <sys/utsname.h>
> +
> +#include "command.h"
> +#include "cpu/cpu.h"
> +#include "memory.h"
> +#include "nodeinfo.h"
> +#include "util/files.h"
> +#include "uuid.h"
> +#include "virterror_internal.h"
> +#include "../esx/esx_vmx.h"
> +
> +#include "vmware_conf.h"
> +
> +#define VMWARE_MAX_ARG 20

This define is unused.


> +int
> +vmwareLoadDomains(struct vmware_driver *driver)
> +{

> +    ctx.parseFileName = esxCopyVMXFileName;
> +
> +    cmd = virCommandNewArgList(VMRUN, "-T",
> +                               driver->type == TYPE_PLAYER ? "player" : "ws",
> +                               "list", NULL);
> +    virCommandSetOutputBuffer(cmd, &outbuf);
> +    if (virCommandRun(cmd, NULL) < 0)
> +        goto cleanup;
> +
> +    for(str = outbuf ; (vmxPath = strtok_r(str, "\n", &saveptr)) != NULL;
> +        str = NULL) {
> +
> +        if (vmxPath[0] != '/')
> +            continue;
> +
> +        /* remove trailing newline */
> +        len = strlen(vmxPath);
> +        if (len && vmxPath[len-1] == '\n')
> +            vmxPath[len-1] = '\0';
> +
> +        if (virFileReadAll(vmxPath, 10000, &vmx) == -1) {
> +            perror("error reading vmx file");
> +            vmwareError(VIR_ERR_INTERNAL_ERROR,
> +                        _("failed to read vmx file %s"), vmxPath);

We don't use perror in libvirt and virFileReadAll already reports and
error when it fails. So just remove the perror and vmwareError calls.

Yes, I know it's hard to tell which functions already report errors
and which don't :)

> +            goto cleanup;
> +        }


> diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c
> new file mode 100644
> index 0000000..5d8a8d5
> --- /dev/null
> +++ b/src/vmware/vmware_driver.c

> +static int
> +vmwareDomainRestore(virConnectPtr conn, const char *path)
> +{

> +    ctx.parseFileName = esxCopyVMXFileName;
> +
> +    if (!virFileExists(path)) {
> +        vmwareError(VIR_ERR_INTERNAL_ERROR,
> +                    _("file %s does not exist"), path);
> +        goto cleanup;
> +    }
> +    if (virFileHasSuffix(path, ".vmx")) {       //we want to restore a vm saved in its default directory
> +        if((tvmx = strdup(path)) == NULL) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +
> +        if((copypath = strdup(path)) == NULL) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +
> +        if (vmwareParsePath(copypath, &fDirectoryName, &fFileName) < 0)
> +            goto cleanup;
> +
> +        sep = strrchr(fFileName, '.');
> +        if (sep != NULL)
> +            *sep = '\0';
> +
> +        if (vmwareMakePath(fFileName, fFileName, (char *) "vmss", &fvmss) < 0)
> +            goto cleanup;
> +
> +        baseVmss = basename(fvmss);
> +    } else {                    //we want to restore a vm saved elsewhere
> +        if (virFileReadAll(path, 1024, &vmxPath) < 0) {
> +            vmwareError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                        _("failed to read vmxPath"));

virFileReadAll already reports an error.

> +            goto cleanup;
> +        }
> +
> +        if (!virFileHasSuffix(vmxPath, ".vmx")) {
> +            vmwareError(VIR_ERR_INTERNAL_ERROR,
> +                        _("%s is not a .vmx file"), vmxPath);
> +            goto cleanup;
> +        }
> +
> +        /* move files */
> +        if((copyvmxPath = strdup(vmxPath)) == NULL) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +
> +        if((copypath = strdup(path)) == NULL) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +
> +        if (vmwareParsePath(copypath, &fDirectoryName, &fFileName) < 0)
> +            goto cleanup;
> +
> +        if (vmwareParsePath(copyvmxPath, &tDirectoryName, &tFileName) < 0)
> +            goto cleanup;
> +
> +        sep = strrchr(tFileName, '.');
> +        if (sep != NULL)
> +            *sep = '\0';
> +
> +        if (virFileMakePath(tDirectoryName) != 0) {
> +            vmwareError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                        _("make path error"));
> +            goto cleanup;
> +        }
> +
> +        if (vmwareMakePath(fDirectoryName, tFileName,(char *) "vmss", &fvmss) < 0)
> +            goto cleanup;
> +        if (vmwareMakePath(tDirectoryName, tFileName, (char *) "vmss", &tvmss) < 0)
> +            goto cleanup;
> +        if (vmwareMakePath(fDirectoryName, tFileName, (char *) "vmem", &fvmem) < 0)
> +            goto cleanup;
> +        if (vmwareMakePath(tDirectoryName, tFileName, (char *) "vmem", &tvmem) < 0)
> +            goto cleanup;
> +        if (vmwareMakePath(fDirectoryName, tFileName, (char *) "vmx", &fvmx) < 0)
> +            goto cleanup;
> +        if (vmwareMakePath(tDirectoryName, tFileName, (char *) "vmx", &tvmx) < 0)
> +            goto cleanup;
> +
> +        if ((vmwareMoveFile(fvmss, tvmss) < 0)
> +            || (vmwareMoveFile(fvmem, tvmem) < 0)
> +            || (vmwareMoveFile(fvmx, tvmx) < 0)) {
> +            goto cleanup;
> +        }
> +
> +        baseVmss = basename(tvmss);
> +    }
> +
> +    if (virFileReadAll(tvmx, 10000, &vmx) == -1) {
> +        perror("error reading vmx file");
> +        vmwareError(VIR_ERR_INTERNAL_ERROR,
> +                    _("failed to read vmx file %s"), tvmx);

virFileReadAll already reports an error.

Matthias




More information about the libvir-list mailing list