mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 21:55:25 +00:00
Add VMware Workstation and Player driver
This commit is contained in:
parent
65532f4558
commit
cddd2a0628
1
cfg.mk
1
cfg.mk
@ -388,6 +388,7 @@ msg_gen_function += virXMLError
|
||||
msg_gen_function += virXenInotifyError
|
||||
msg_gen_function += virXenStoreError
|
||||
msg_gen_function += virXendError
|
||||
msg_gen_function += vmwareError
|
||||
msg_gen_function += xenapiSessionErrorHandler
|
||||
msg_gen_function += xenUnifiedError
|
||||
msg_gen_function += xenXMError
|
||||
|
@ -227,6 +227,8 @@ AC_ARG_WITH([uml],
|
||||
AC_HELP_STRING([--with-uml], [add UML support @<:@default=check@:>@]),[],[with_uml=check])
|
||||
AC_ARG_WITH([openvz],
|
||||
AC_HELP_STRING([--with-openvz], [add OpenVZ support @<:@default=yes@:>@]),[],[with_openvz=yes])
|
||||
AC_ARG_WITH([vmware],
|
||||
AC_HELP_STRING([--with-vmware], [add VMware support @<:@default=yes@:>@]),[],[with_vmware=yes])
|
||||
AC_ARG_WITH([libssh2],
|
||||
AC_HELP_STRING([--with-libssh2=@<:@PFX@:>@], [libssh2 location @<:@default=/usr/local/lib@:>@]),[],[with_libssh2=yes])
|
||||
AC_ARG_WITH([phyp],
|
||||
@ -316,6 +318,10 @@ if test "$with_openvz" = "yes"; then
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_OPENVZ], [test "$with_openvz" = "yes"])
|
||||
|
||||
if test "$with_vmware" = "yes"; then
|
||||
AC_DEFINE_UNQUOTED([WITH_VMWARE], 1, [whether VMware driver is enabled])
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_VMWARE], [test "$with_vmware" = "yes"])
|
||||
|
||||
dnl
|
||||
dnl check for XDR
|
||||
@ -2271,6 +2277,7 @@ AC_MSG_NOTICE([ Xen: $with_xen])
|
||||
AC_MSG_NOTICE([ QEMU: $with_qemu])
|
||||
AC_MSG_NOTICE([ UML: $with_uml])
|
||||
AC_MSG_NOTICE([ OpenVZ: $with_openvz])
|
||||
AC_MSG_NOTICE([ VMware: $with_vmware])
|
||||
AC_MSG_NOTICE([ VBox: $with_vbox])
|
||||
AC_MSG_NOTICE([ XenAPI: $with_xenapi])
|
||||
AC_MSG_NOTICE([ LXC: $with_lxc])
|
||||
|
@ -52,6 +52,7 @@ typedef enum {
|
||||
VIR_FROM_TEST, /* Error from test driver */
|
||||
VIR_FROM_REMOTE, /* Error from remote driver */
|
||||
VIR_FROM_OPENVZ, /* Error from OpenVZ driver */
|
||||
VIR_FROM_VMWARE, /* Error from VMware driver */
|
||||
VIR_FROM_XENXM, /* Error at Xen XM layer */
|
||||
VIR_FROM_STATS_LINUX,/* Error in the Linux Stats code */
|
||||
VIR_FROM_LXC, /* Error from Linux Container driver */
|
||||
|
@ -106,6 +106,8 @@ src/util/xml.c
|
||||
src/vbox/vbox_XPCOMCGlue.c
|
||||
src/vbox/vbox_driver.c
|
||||
src/vbox/vbox_tmpl.c
|
||||
src/vmware/vmware_conf.c
|
||||
src/vmware/vmware_driver.c
|
||||
src/xen/xen_driver.c
|
||||
src/xen/xen_hypervisor.c
|
||||
src/xen/xen_inotify.c
|
||||
|
@ -219,8 +219,6 @@ check-local: remote_protocol-structs
|
||||
TEST_DRIVER_SOURCES = \
|
||||
test/test_driver.c test/test_driver.h
|
||||
|
||||
|
||||
|
||||
# Now the Hypervisor specific drivers
|
||||
XEN_DRIVER_SOURCES = \
|
||||
xen/sexpr.c xen/sexpr.h \
|
||||
@ -256,6 +254,10 @@ OPENVZ_DRIVER_SOURCES = \
|
||||
openvz/openvz_conf.c openvz/openvz_conf.h \
|
||||
openvz/openvz_driver.c openvz/openvz_driver.h
|
||||
|
||||
VMWARE_DRIVER_SOURCES = \
|
||||
vmware/vmware_driver.c vmware/vmware.h \
|
||||
vmware/vmware_conf.c vmware/vmware_conf.h
|
||||
|
||||
VBOX_DRIVER_SOURCES = \
|
||||
vbox/vbox_XPCOMCGlue.c vbox/vbox_XPCOMCGlue.h \
|
||||
vbox/vbox_driver.c vbox/vbox_driver.h \
|
||||
@ -608,6 +610,21 @@ endif
|
||||
libvirt_driver_openvz_la_SOURCES = $(OPENVZ_DRIVER_SOURCES)
|
||||
endif
|
||||
|
||||
if WITH_VMWARE
|
||||
if WITH_DRIVER_MODULES
|
||||
mod_LTLIBRARIES += libvirt_driver_vmware.la
|
||||
else
|
||||
noinst_LTLIBRARIES += libvirt_driver_vmware.la
|
||||
libvirt_la_BUILT_LIBADD += libvirt_driver_vmware.la
|
||||
endif
|
||||
libvirt_driver_vmware_la_CFLAGS = \
|
||||
-I@top_srcdir@/src/conf
|
||||
if WITH_DRIVER_MODULES
|
||||
libvirt_driver_vmware_la_LDFLAGS = -module -avoid-version
|
||||
endif
|
||||
libvirt_driver_vmware_la_SOURCES = $(VMWARE_DRIVER_SOURCES)
|
||||
endif
|
||||
|
||||
if WITH_VBOX
|
||||
if WITH_DRIVER_MODULES
|
||||
mod_LTLIBRARIES += libvirt_driver_vbox.la
|
||||
@ -960,7 +977,8 @@ EXTRA_DIST += \
|
||||
$(SECURITY_DRIVER_SELINUX_SOURCES) \
|
||||
$(SECURITY_DRIVER_APPARMOR_SOURCES) \
|
||||
$(SECRET_DRIVER_SOURCES) \
|
||||
$(VBOX_DRIVER_EXTRA_DIST)
|
||||
$(VBOX_DRIVER_EXTRA_DIST) \
|
||||
$(VMWARE_DRIVER_SOURCES)
|
||||
|
||||
check-local: augeas-check
|
||||
|
||||
|
@ -27,7 +27,8 @@ typedef enum {
|
||||
VIR_DRV_ONE = 9,
|
||||
VIR_DRV_ESX = 10,
|
||||
VIR_DRV_PHYP = 11,
|
||||
VIR_DRV_XENAPI = 12
|
||||
VIR_DRV_XENAPI = 12,
|
||||
VIR_DRV_VMWARE = 13
|
||||
} virDrvNo;
|
||||
|
||||
|
||||
|
@ -54,6 +54,9 @@
|
||||
# ifdef WITH_OPENVZ
|
||||
# include "openvz/openvz_driver.h"
|
||||
# endif
|
||||
# ifdef WITH_VMWARE
|
||||
# include "vmware/vmware_driver.h"
|
||||
# endif
|
||||
# ifdef WITH_PHYP
|
||||
# include "phyp/phyp_driver.h"
|
||||
# endif
|
||||
@ -365,6 +368,9 @@ virInitialize(void)
|
||||
# ifdef WITH_OPENVZ
|
||||
virDriverLoadModule("openvz");
|
||||
# endif
|
||||
# ifdef WITH_VMWARE
|
||||
virDriverLoadModule("vmware");
|
||||
# endif
|
||||
# ifdef WITH_VBOX
|
||||
virDriverLoadModule("vbox");
|
||||
# endif
|
||||
@ -387,6 +393,9 @@ virInitialize(void)
|
||||
# ifdef WITH_OPENVZ
|
||||
if (openvzRegister() == -1) return -1;
|
||||
# endif
|
||||
# ifdef WITH_VMWARE
|
||||
if (vmwareRegister() == -1) return -1;
|
||||
# endif
|
||||
# ifdef WITH_PHYP
|
||||
if (phypRegister() == -1) return -1;
|
||||
# endif
|
||||
@ -1120,6 +1129,10 @@ virGetVersion(unsigned long *libVer, const char *type,
|
||||
if (STRCASEEQ(type, "OpenVZ"))
|
||||
*typeVer = LIBVIR_VERSION_NUMBER;
|
||||
# endif
|
||||
# if WITH_VMWARE
|
||||
if (STRCASEEQ(type, "VMware"))
|
||||
*typeVer = LIBVIR_VERSION_NUMBER;
|
||||
# endif
|
||||
# if WITH_VBOX
|
||||
if (STRCASEEQ(type, "VBox"))
|
||||
*typeVer = LIBVIR_VERSION_NUMBER;
|
||||
|
@ -134,6 +134,9 @@ static const char *virErrorDomainName(virErrorDomain domain) {
|
||||
case VIR_FROM_OPENVZ:
|
||||
dom = "OpenVZ ";
|
||||
break;
|
||||
case VIR_FROM_VMWARE:
|
||||
dom = "VMware ";
|
||||
break;
|
||||
case VIR_FROM_XENXM:
|
||||
dom = "Xen XM ";
|
||||
break;
|
||||
|
500
src/vmware/vmware_conf.c
Normal file
500
src/vmware/vmware_conf.c
Normal file
@ -0,0 +1,500 @@
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Copyright 2010, diateam (www.diateam.net)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#include "command.h"
|
||||
#include "cpu/cpu.h"
|
||||
#include "dirname.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"
|
||||
|
||||
/* Free all memory associated with a vmware_driver structure */
|
||||
void
|
||||
vmwareFreeDriver(struct vmware_driver *driver)
|
||||
{
|
||||
if (!driver)
|
||||
return;
|
||||
|
||||
virMutexDestroy(&driver->lock);
|
||||
virDomainObjListDeinit(&driver->domains);
|
||||
virCapabilitiesFree(driver->caps);
|
||||
VIR_FREE(driver);
|
||||
}
|
||||
|
||||
virCapsPtr
|
||||
vmwareCapsInit(void)
|
||||
{
|
||||
struct utsname utsname;
|
||||
virCapsPtr caps = NULL;
|
||||
virCapsGuestPtr guest = NULL;
|
||||
virCPUDefPtr cpu = NULL;
|
||||
union cpuData *data = NULL;
|
||||
|
||||
uname(&utsname);
|
||||
|
||||
if ((caps = virCapabilitiesNew(utsname.machine, 0, 0)) == NULL)
|
||||
goto error;
|
||||
|
||||
if (nodeCapsInitNUMA(caps) < 0)
|
||||
goto error;
|
||||
|
||||
virCapabilitiesSetMacPrefix(caps, (unsigned char[]) {0x52, 0x54, 0x00});
|
||||
|
||||
/* i686 guests are always supported */
|
||||
if ((guest = virCapabilitiesAddGuest(caps,
|
||||
"hvm",
|
||||
"i686",
|
||||
32,
|
||||
NULL, NULL, 0, NULL)) == NULL)
|
||||
goto error;
|
||||
|
||||
if (virCapabilitiesAddGuestDomain(guest,
|
||||
"vmware",
|
||||
NULL, NULL, 0, NULL) == NULL)
|
||||
goto error;
|
||||
|
||||
if (VIR_ALLOC(cpu) < 0
|
||||
|| !(cpu->arch = strdup(utsname.machine))) {
|
||||
virReportOOMError();
|
||||
goto error;
|
||||
}
|
||||
|
||||
cpu->type = VIR_CPU_TYPE_HOST;
|
||||
|
||||
if (!(data = cpuNodeData(cpu->arch))
|
||||
|| cpuDecode(cpu, data, NULL, 0, NULL) < 0) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* x86_64 guests are supported if
|
||||
* - Host arch is x86_64
|
||||
* Or
|
||||
* - Host CPU is x86_64 with virtualization extensions
|
||||
*/
|
||||
if (STREQ(utsname.machine, "x86_64") ||
|
||||
(cpuHasFeature(utsname.machine, data, "lm") &&
|
||||
(cpuHasFeature(utsname.machine, data, "vmx") ||
|
||||
cpuHasFeature(utsname.machine, data, "svm")))) {
|
||||
|
||||
if ((guest = virCapabilitiesAddGuest(caps,
|
||||
"hvm",
|
||||
"x86_64",
|
||||
64,
|
||||
NULL, NULL, 0, NULL)) == NULL)
|
||||
goto error;
|
||||
|
||||
if (virCapabilitiesAddGuestDomain(guest,
|
||||
"vmware",
|
||||
NULL, NULL, 0, NULL) == NULL)
|
||||
goto error;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
virCPUDefFree(cpu);
|
||||
cpuDataFree(utsname.machine, data);
|
||||
|
||||
return caps;
|
||||
|
||||
error:
|
||||
virCapabilitiesFree(caps);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
int
|
||||
vmwareLoadDomains(struct vmware_driver *driver)
|
||||
{
|
||||
virDomainDefPtr vmdef = NULL;
|
||||
virDomainObjPtr vm = NULL;
|
||||
char *vmxPath = NULL;
|
||||
char *vmx = NULL;
|
||||
vmwareDomainPtr pDomain;
|
||||
char *directoryName = NULL;
|
||||
char *fileName = NULL;
|
||||
int ret = -1;
|
||||
esxVMX_Context ctx;
|
||||
char *outbuf = NULL;
|
||||
char *str;
|
||||
char *saveptr = NULL;
|
||||
virCommandPtr cmd;
|
||||
|
||||
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;
|
||||
|
||||
if (virFileReadAll(vmxPath, 10000, &vmx) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if ((vmdef =
|
||||
esxVMX_ParseConfig(&ctx, driver->caps, vmx,
|
||||
esxVI_ProductVersion_ESX4x)) == NULL) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!(vm = virDomainAssignDef(driver->caps,
|
||||
&driver->domains, vmdef, false)))
|
||||
goto cleanup;
|
||||
|
||||
pDomain = vm->privateData;
|
||||
|
||||
pDomain->vmxPath = strdup(vmxPath);
|
||||
if (pDomain->vmxPath == NULL) {
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
vmwareDomainConfigDisplay(pDomain, vmdef);
|
||||
|
||||
if ((vm->def->id = vmwareExtractPid(vmxPath)) < 0)
|
||||
goto cleanup;
|
||||
/* vmrun list only reports running vms */
|
||||
vm->state = VIR_DOMAIN_RUNNING;
|
||||
vm->persistent = 1;
|
||||
|
||||
virDomainObjUnlock(vm);
|
||||
|
||||
vmdef = NULL;
|
||||
vm = NULL;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virCommandFree(cmd);
|
||||
VIR_FREE(outbuf);
|
||||
virDomainDefFree(vmdef);
|
||||
VIR_FREE(directoryName);
|
||||
VIR_FREE(fileName);
|
||||
VIR_FREE(vmx);
|
||||
if (vm)
|
||||
virDomainObjUnref(vm);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
vmwareSetSentinal(const char **prog, const char *key)
|
||||
{
|
||||
const char **tmp = prog;
|
||||
|
||||
while (tmp && *tmp) {
|
||||
if (*tmp == PROGRAM_SENTINAL) {
|
||||
*tmp = key;
|
||||
break;
|
||||
}
|
||||
tmp++;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
vmwareExtractVersion(struct vmware_driver *driver)
|
||||
{
|
||||
unsigned long version = 0;
|
||||
char *tmp;
|
||||
int ret = -1;
|
||||
virCommandPtr cmd;
|
||||
char * outbuf = NULL;
|
||||
const char * bin = (driver->type == TYPE_PLAYER) ? "vmplayer" : "vmware";
|
||||
const char * pattern = (driver->type == TYPE_PLAYER) ?
|
||||
"VMware Player " : "VMware Workstation ";
|
||||
|
||||
cmd = virCommandNewArgList(bin, "-v", NULL);
|
||||
virCommandSetOutputBuffer(cmd, &outbuf);
|
||||
|
||||
if (virCommandRun(cmd, NULL) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if ((tmp = STRSKIP(outbuf, pattern)) == NULL) {
|
||||
vmwareError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("failed to parse %s version"), bin);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virParseVersionString(tmp, &version) < 0) {
|
||||
vmwareError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("version parsing error"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
driver->version = version;
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virCommandFree(cmd);
|
||||
VIR_FREE(outbuf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
vmwareDomainConfigDisplay(vmwareDomainPtr pDomain, virDomainDefPtr def)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
if (def->ngraphics == 0) {
|
||||
pDomain->gui = true;
|
||||
return 0;
|
||||
} else {
|
||||
pDomain->gui = false;
|
||||
for (i = 0; i < def->ngraphics; i++) {
|
||||
if (def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP) {
|
||||
pDomain->gui = true;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
vmwareParsePath(char *path, char **directory, char **filename)
|
||||
{
|
||||
char *separator;
|
||||
|
||||
separator = strrchr(path, '/');
|
||||
|
||||
if (separator != NULL) {
|
||||
*separator++ = '\0';
|
||||
|
||||
if (*separator == '\0') {
|
||||
vmwareError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("path '%s' doesn't reference a file"), path);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((*directory = strdup(path)) == NULL)
|
||||
goto no_memory;
|
||||
if ((*filename = strdup(separator)) == NULL) {
|
||||
VIR_FREE(*directory);
|
||||
goto no_memory;
|
||||
}
|
||||
|
||||
} else {
|
||||
if ((*filename = strdup(path)) == NULL)
|
||||
goto no_memory;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
no_memory:
|
||||
virReportOOMError();
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
vmwareConstructVmxPath(char *directoryName, char *name, char **vmxPath)
|
||||
{
|
||||
if (directoryName != NULL) {
|
||||
if (virAsprintf(vmxPath, "%s/%s.vmx", directoryName, name) < 0) {
|
||||
virReportOOMError();
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (virAsprintf(vmxPath, "%s.vmx", name) < 0) {
|
||||
virReportOOMError();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
vmwareVmxPath(virDomainDefPtr vmdef, char **vmxPath)
|
||||
{
|
||||
virDomainDiskDefPtr disk = NULL;
|
||||
char *directoryName = NULL;
|
||||
char *fileName = NULL;
|
||||
int ret = -1;
|
||||
int i = 0;
|
||||
|
||||
/*
|
||||
* Build VMX URL. Use the source of the first file-based harddisk
|
||||
* to deduce the path for the VMX file. Don't just use the
|
||||
* first disk, because it may be CDROM disk and ISO images are normaly not
|
||||
* located in the virtual machine's directory. This approach
|
||||
* isn't perfect but should work in the majority of cases.
|
||||
*/
|
||||
if (vmdef->ndisks < 1) {
|
||||
vmwareError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("Domain XML doesn't contain any disks, "
|
||||
"cannot deduce datastore and path for VMX file"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
for (i = 0; i < vmdef->ndisks; ++i) {
|
||||
if (vmdef->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
|
||||
vmdef->disks[i]->type == VIR_DOMAIN_DISK_TYPE_FILE) {
|
||||
disk = vmdef->disks[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (disk == NULL) {
|
||||
vmwareError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("Domain XML doesn't contain any file-based harddisks, "
|
||||
"cannot deduce datastore and path for VMX file"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (disk->src == NULL) {
|
||||
vmwareError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("First file-based harddisk has no source, cannot "
|
||||
"deduce datastore and path for VMX file"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (vmwareParsePath(disk->src, &directoryName, &fileName) < 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!virFileHasSuffix(fileName, ".vmdk")) {
|
||||
vmwareError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Expecting source '%s' of first file-based harddisk "
|
||||
"to be a VMDK image"), disk->src);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (vmwareConstructVmxPath(directoryName, vmdef->name, vmxPath) < 0) {
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
VIR_FREE(directoryName);
|
||||
VIR_FREE(fileName);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
vmwareMoveFile(char *srcFile, char *dstFile)
|
||||
{
|
||||
const char *cmdmv[] =
|
||||
{ "mv", PROGRAM_SENTINAL, PROGRAM_SENTINAL, NULL };
|
||||
|
||||
if (!virFileExists(srcFile)) {
|
||||
vmwareError(VIR_ERR_INTERNAL_ERROR, _("file %s does not exist"),
|
||||
srcFile);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (STREQ(srcFile, dstFile))
|
||||
return 0;
|
||||
|
||||
vmwareSetSentinal(cmdmv, srcFile);
|
||||
vmwareSetSentinal(cmdmv, dstFile);
|
||||
if (virRun(cmdmv, NULL) < 0) {
|
||||
vmwareError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("failed to move file to %s "), dstFile);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
vmwareMakePath(char *srcDir, char *srcName, char *srcExt, char **outpath)
|
||||
{
|
||||
if (virAsprintf(outpath, "%s/%s.%s", srcDir, srcName, srcExt) < 0) {
|
||||
virReportOOMError();
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
vmwareExtractPid(const char * vmxPath)
|
||||
{
|
||||
char *vmxDir = NULL;
|
||||
char *logFilePath = NULL;
|
||||
FILE *logFile = NULL;
|
||||
char line[1024];
|
||||
char *tmp = NULL;
|
||||
int pid = -1;
|
||||
|
||||
if ((vmxDir = mdir_name(vmxPath)) == NULL)
|
||||
goto cleanup;
|
||||
|
||||
if (virAsprintf(&logFilePath, "%s/vmware.log",
|
||||
vmxDir) < 0) {
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if ((logFile = fopen(logFilePath, "r")) == NULL)
|
||||
goto cleanup;
|
||||
|
||||
if (!fgets(line, sizeof(line), logFile)) {
|
||||
vmwareError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("unable to read vmware log file"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if ((tmp = strstr(line, " pid=")) == NULL) {
|
||||
vmwareError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("cannot find pid in vmware log file"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
tmp += strlen(" pid=");
|
||||
|
||||
if (virStrToLong_i(tmp, &tmp, 10, &pid) < 0 || *tmp != ' ') {
|
||||
vmwareError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("cannot parse pid in vmware log file"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
VIR_FREE(vmxDir);
|
||||
VIR_FREE(logFilePath);
|
||||
VIR_FORCE_FCLOSE(logFile);
|
||||
return pid;
|
||||
}
|
||||
|
||||
char *
|
||||
esxCopyVMXFileName(const char *datastorePath, void *opaque ATTRIBUTE_UNUSED)
|
||||
{
|
||||
char *path = strdup(datastorePath);
|
||||
|
||||
if (path == NULL) {
|
||||
virReportOOMError();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
83
src/vmware/vmware_conf.h
Normal file
83
src/vmware/vmware_conf.h
Normal file
@ -0,0 +1,83 @@
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Copyright 2010, diateam (www.diateam.net)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef VMWARE_CONF_H
|
||||
# define VMWARE_CONF_H
|
||||
|
||||
# define VMRUN "vmrun"
|
||||
# define NOGUI "nogui"
|
||||
|
||||
# include "internal.h"
|
||||
# include "domain_conf.h"
|
||||
# include "threads.h"
|
||||
|
||||
# define VIR_FROM_THIS VIR_FROM_VMWARE
|
||||
# define PROGRAM_SENTINAL ((char *)0x1)
|
||||
|
||||
# define vmwareError(code, ...) \
|
||||
virReportErrorHelper(NULL, VIR_FROM_VMWARE, code, __FILE__, \
|
||||
__FUNCTION__, __LINE__, __VA_ARGS__)
|
||||
|
||||
# define TYPE_PLAYER 0
|
||||
# define TYPE_WORKSTATION 1
|
||||
|
||||
struct vmware_driver {
|
||||
virMutex lock;
|
||||
virCapsPtr caps;
|
||||
|
||||
virDomainObjList domains;
|
||||
int version;
|
||||
int type;
|
||||
};
|
||||
|
||||
typedef struct _vmwareDomain {
|
||||
char *vmxPath;
|
||||
bool gui;
|
||||
|
||||
} vmwareDomain, *vmwareDomainPtr;
|
||||
|
||||
void vmwareFreeDriver(struct vmware_driver *driver);
|
||||
|
||||
virCapsPtr vmwareCapsInit(void);
|
||||
|
||||
int vmwareLoadDomains(struct vmware_driver *driver);
|
||||
|
||||
void vmwareSetSentinal(const char **prog, const char *key);
|
||||
|
||||
int vmwareExtractVersion(struct vmware_driver *driver);
|
||||
|
||||
int vmwareDomainConfigDisplay(vmwareDomainPtr domain, virDomainDefPtr vmdef);
|
||||
|
||||
int vmwareParsePath(char *path, char **directory, char **filename);
|
||||
|
||||
int vmwareConstructVmxPath(char *directoryName, char *name,
|
||||
char **vmxPath);
|
||||
|
||||
int vmwareVmxPath(virDomainDefPtr vmdef, char **vmxPath);
|
||||
|
||||
int vmwareMoveFile(char *srcFile, char *dstFile);
|
||||
|
||||
int vmwareMakePath(char *srcDir, char *srcName, char *srcExt,
|
||||
char **outpath);
|
||||
|
||||
int vmwareExtractPid(const char * vmxPath);
|
||||
|
||||
char * esxCopyVMXFileName(const char *datastorePath, void *opaque);
|
||||
|
||||
#endif
|
1013
src/vmware/vmware_driver.c
Normal file
1013
src/vmware/vmware_driver.c
Normal file
File diff suppressed because it is too large
Load Diff
25
src/vmware/vmware_driver.h
Normal file
25
src/vmware/vmware_driver.h
Normal file
@ -0,0 +1,25 @@
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Copyright 2010, diateam (www.diateam.net)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef VMWARE_DRIVER_H
|
||||
# define VMWARE_DRIVER_H
|
||||
|
||||
int vmwareRegister(void);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user