mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-03 03:25:20 +00:00
esx: Map the .vmx annotation to the domain XML description
Take care of escaping '"' and '|' (the escape character). Add tests for this.
This commit is contained in:
parent
1fe2927a34
commit
4aad5fbb96
@ -843,6 +843,8 @@ esxVMX_ParseConfig(esxVMX_Context *ctx, virCapsPtr caps, const char *vmx,
|
|||||||
long long numvcpus = 0;
|
long long numvcpus = 0;
|
||||||
char *sched_cpu_affinity = NULL;
|
char *sched_cpu_affinity = NULL;
|
||||||
char *guestOS = NULL;
|
char *guestOS = NULL;
|
||||||
|
char *tmp1;
|
||||||
|
char *tmp2;
|
||||||
int controller;
|
int controller;
|
||||||
int bus;
|
int bus;
|
||||||
int port;
|
int port;
|
||||||
@ -947,6 +949,36 @@ esxVMX_ParseConfig(esxVMX_Context *ctx, virCapsPtr caps, const char *vmx,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* vmx:annotation -> def:description */
|
||||||
|
if (esxUtil_GetConfigString(conf, "annotation", &def->description,
|
||||||
|
true) < 0) {
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unescape '|XX' where X is a hex digit */
|
||||||
|
if (def->description != NULL) {
|
||||||
|
tmp1 = def->description; /* reading from this one */
|
||||||
|
tmp2 = def->description; /* writing to this one */
|
||||||
|
|
||||||
|
while (*tmp1 != '\0') {
|
||||||
|
if (*tmp1 == '|') {
|
||||||
|
if (!c_isxdigit(tmp1[1]) || !c_isxdigit(tmp1[2])) {
|
||||||
|
ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("VMX entry 'annotation' contains invalid "
|
||||||
|
"escape sequence"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
*tmp2++ = virHexToBin(tmp1[1]) * 16 + virHexToBin(tmp1[2]);
|
||||||
|
tmp1 += 3;
|
||||||
|
} else {
|
||||||
|
*tmp2++ = *tmp1++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*tmp2 = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
/* vmx:memsize -> def:maxmem */
|
/* vmx:memsize -> def:maxmem */
|
||||||
if (esxUtil_GetConfigLong(conf, "memsize", &memsize, 32, true) < 0) {
|
if (esxUtil_GetConfigLong(conf, "memsize", &memsize, 32, true) < 0) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -2314,10 +2346,15 @@ char *
|
|||||||
esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
||||||
esxVI_ProductVersion productVersion)
|
esxVI_ProductVersion productVersion)
|
||||||
{
|
{
|
||||||
|
char *vmx = NULL;
|
||||||
int i;
|
int i;
|
||||||
int sched_cpu_affinity_length;
|
int sched_cpu_affinity_length;
|
||||||
unsigned char zero[VIR_UUID_BUFLEN];
|
unsigned char zero[VIR_UUID_BUFLEN];
|
||||||
virBuffer buffer = VIR_BUFFER_INITIALIZER;
|
virBuffer buffer = VIR_BUFFER_INITIALIZER;
|
||||||
|
size_t length;
|
||||||
|
char *tmp1;
|
||||||
|
char *tmp2;
|
||||||
|
char *annotation = NULL;
|
||||||
bool scsi_present[4] = { false, false, false, false };
|
bool scsi_present[4] = { false, false, false, false };
|
||||||
int scsi_virtualDev[4] = { -1, -1, -1, -1 };
|
int scsi_virtualDev[4] = { -1, -1, -1, -1 };
|
||||||
bool floppy_present[2] = { false, false };
|
bool floppy_present[2] = { false, false };
|
||||||
@ -2361,7 +2398,7 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
default:
|
default:
|
||||||
ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
|
ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("Unexpected product version"));
|
_("Unexpected product version"));
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* def:arch -> vmx:guestOS */
|
/* def:arch -> vmx:guestOS */
|
||||||
@ -2373,7 +2410,7 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
|
ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Expecting domain XML attribute 'arch' of entry 'os/type' "
|
_("Expecting domain XML attribute 'arch' of entry 'os/type' "
|
||||||
"to be 'i686' or 'x86_64' but found '%s'"), def->os.arch);
|
"to be 'i686' or 'x86_64' but found '%s'"), def->os.arch);
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* def:uuid -> vmx:uuid.action, vmx:uuid.bios */
|
/* def:uuid -> vmx:uuid.action, vmx:uuid.bios */
|
||||||
@ -2392,13 +2429,53 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
/* def:name -> vmx:displayName */
|
/* def:name -> vmx:displayName */
|
||||||
virBufferVSprintf(&buffer, "displayName = \"%s\"\n", def->name);
|
virBufferVSprintf(&buffer, "displayName = \"%s\"\n", def->name);
|
||||||
|
|
||||||
|
/* def:description -> vmx:annotation */
|
||||||
|
if (def->description != NULL) {
|
||||||
|
/* Escape '"' as '|22' and '|' as '|7C' */
|
||||||
|
length = 1; /* 1 byte for termination */
|
||||||
|
tmp1 = def->description;
|
||||||
|
|
||||||
|
while (*tmp1 != '\0') {
|
||||||
|
if (*tmp1 == '"' || *tmp1 == '|') {
|
||||||
|
length += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
++tmp1;
|
||||||
|
++length;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (VIR_ALLOC_N(annotation, length) < 0) {
|
||||||
|
virReportOOMError();
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp1 = def->description; /* reading from this one */
|
||||||
|
tmp2 = annotation; /* writing to this one */
|
||||||
|
|
||||||
|
while (*tmp1 != '\0') {
|
||||||
|
if (*tmp1 == '"') {
|
||||||
|
*tmp2++ = '|'; *tmp2++ = '2'; *tmp2++ = '2';
|
||||||
|
} else if (*tmp1 == '|') {
|
||||||
|
*tmp2++ = '|'; *tmp2++ = '7'; *tmp2++ = 'C';
|
||||||
|
} else {
|
||||||
|
*tmp2++ = *tmp1;
|
||||||
|
}
|
||||||
|
|
||||||
|
++tmp1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*tmp2 = '\0';
|
||||||
|
|
||||||
|
virBufferVSprintf(&buffer, "annotation = \"%s\"\n", annotation);
|
||||||
|
}
|
||||||
|
|
||||||
/* def:maxmem -> vmx:memsize */
|
/* def:maxmem -> vmx:memsize */
|
||||||
if (def->maxmem <= 0 || def->maxmem % 4096 != 0) {
|
if (def->maxmem <= 0 || def->maxmem % 4096 != 0) {
|
||||||
ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
|
ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Expecting domain XML entry 'memory' to be an unsigned "
|
_("Expecting domain XML entry 'memory' to be an unsigned "
|
||||||
"integer (multiple of 4096) but found %lld"),
|
"integer (multiple of 4096) but found %lld"),
|
||||||
(unsigned long long)def->maxmem);
|
(unsigned long long)def->maxmem);
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scale from kilobytes to megabytes */
|
/* Scale from kilobytes to megabytes */
|
||||||
@ -2412,7 +2489,7 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
_("Expecting domain XML entry 'currentMemory' to be an "
|
_("Expecting domain XML entry 'currentMemory' to be an "
|
||||||
"unsigned integer (multiple of 1024) but found %lld"),
|
"unsigned integer (multiple of 1024) but found %lld"),
|
||||||
(unsigned long long)def->memory);
|
(unsigned long long)def->memory);
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scale from kilobytes to megabytes */
|
/* Scale from kilobytes to megabytes */
|
||||||
@ -2426,7 +2503,7 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
_("Expecting domain XML entry 'vcpu' to be an unsigned "
|
_("Expecting domain XML entry 'vcpu' to be an unsigned "
|
||||||
"integer (1 or a multiple of 2) but found %d"),
|
"integer (1 or a multiple of 2) but found %d"),
|
||||||
(int)def->vcpus);
|
(int)def->vcpus);
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
virBufferVSprintf(&buffer, "numvcpus = \"%d\"\n", (int)def->vcpus);
|
virBufferVSprintf(&buffer, "numvcpus = \"%d\"\n", (int)def->vcpus);
|
||||||
@ -2448,7 +2525,7 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
_("Expecting domain XML attribute 'cpuset' of entry "
|
_("Expecting domain XML attribute 'cpuset' of entry "
|
||||||
"'vcpu' to contains at least %d CPU(s)"),
|
"'vcpu' to contains at least %d CPU(s)"),
|
||||||
(int)def->vcpus);
|
(int)def->vcpus);
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < def->cpumasklen; ++i) {
|
for (i = 0; i < def->cpumasklen; ++i) {
|
||||||
@ -2471,7 +2548,7 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
switch (def->graphics[i]->type) {
|
switch (def->graphics[i]->type) {
|
||||||
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
|
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
|
||||||
if (esxVMX_FormatVNC(def->graphics[i], &buffer) < 0) {
|
if (esxVMX_FormatVNC(def->graphics[i], &buffer) < 0) {
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -2480,7 +2557,7 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
|
ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Unsupported graphics type '%s'"),
|
_("Unsupported graphics type '%s'"),
|
||||||
virDomainGraphicsTypeToString(def->graphics[i]->type));
|
virDomainGraphicsTypeToString(def->graphics[i]->type));
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2488,13 +2565,13 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
for (i = 0; i < def->ndisks; ++i) {
|
for (i = 0; i < def->ndisks; ++i) {
|
||||||
if (esxVMX_VerifyDiskAddress(caps, def->disks[i]) < 0 ||
|
if (esxVMX_VerifyDiskAddress(caps, def->disks[i]) < 0 ||
|
||||||
esxVMX_HandleLegacySCSIDiskDriverName(def, def->disks[i]) < 0) {
|
esxVMX_HandleLegacySCSIDiskDriverName(def, def->disks[i]) < 0) {
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (esxVMX_GatherSCSIControllers(ctx, def, scsi_virtualDev,
|
if (esxVMX_GatherSCSIControllers(ctx, def, scsi_virtualDev,
|
||||||
scsi_present) < 0) {
|
scsi_present) < 0) {
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 4; ++i) {
|
for (i = 0; i < 4; ++i) {
|
||||||
@ -2513,14 +2590,14 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
switch (def->disks[i]->device) {
|
switch (def->disks[i]->device) {
|
||||||
case VIR_DOMAIN_DISK_DEVICE_DISK:
|
case VIR_DOMAIN_DISK_DEVICE_DISK:
|
||||||
if (esxVMX_FormatHardDisk(ctx, def->disks[i], &buffer) < 0) {
|
if (esxVMX_FormatHardDisk(ctx, def->disks[i], &buffer) < 0) {
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_DISK_DEVICE_CDROM:
|
case VIR_DOMAIN_DISK_DEVICE_CDROM:
|
||||||
if (esxVMX_FormatCDROM(ctx, def->disks[i], &buffer) < 0) {
|
if (esxVMX_FormatCDROM(ctx, def->disks[i], &buffer) < 0) {
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -2528,7 +2605,7 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
|
case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
|
||||||
if (esxVMX_FormatFloppy(ctx, def->disks[i], &buffer,
|
if (esxVMX_FormatFloppy(ctx, def->disks[i], &buffer,
|
||||||
floppy_present) < 0) {
|
floppy_present) < 0) {
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -2537,7 +2614,7 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
|
ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Unsupported disk device type '%s'"),
|
_("Unsupported disk device type '%s'"),
|
||||||
virDomainDiskDeviceTypeToString(def->disks[i]->device));
|
virDomainDiskDeviceTypeToString(def->disks[i]->device));
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2554,7 +2631,7 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
/* def:nets */
|
/* def:nets */
|
||||||
for (i = 0; i < def->nnets; ++i) {
|
for (i = 0; i < def->nnets; ++i) {
|
||||||
if (esxVMX_FormatEthernet(def->nets[i], i, &buffer) < 0) {
|
if (esxVMX_FormatEthernet(def->nets[i], i, &buffer) < 0) {
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2570,29 +2647,33 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps, virDomainDefPtr def,
|
|||||||
/* def:serials */
|
/* def:serials */
|
||||||
for (i = 0; i < def->nserials; ++i) {
|
for (i = 0; i < def->nserials; ++i) {
|
||||||
if (esxVMX_FormatSerial(ctx, def->serials[i], &buffer) < 0) {
|
if (esxVMX_FormatSerial(ctx, def->serials[i], &buffer) < 0) {
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* def:parallels */
|
/* def:parallels */
|
||||||
for (i = 0; i < def->nparallels; ++i) {
|
for (i = 0; i < def->nparallels; ++i) {
|
||||||
if (esxVMX_FormatParallel(ctx, def->parallels[i], &buffer) < 0) {
|
if (esxVMX_FormatParallel(ctx, def->parallels[i], &buffer) < 0) {
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get final VMX output */
|
/* Get final VMX output */
|
||||||
if (virBufferError(&buffer)) {
|
if (virBufferError(&buffer)) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto failure;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
return virBufferContentAndReset(&buffer);
|
vmx = virBufferContentAndReset(&buffer);
|
||||||
|
|
||||||
failure:
|
cleanup:
|
||||||
virBufferFreeAndReset(&buffer);
|
if (vmx == NULL) {
|
||||||
|
virBufferFreeAndReset(&buffer);
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
VIR_FREE(annotation);
|
||||||
|
|
||||||
|
return vmx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
3
tests/vmx2xmldata/vmx2xml-annotation.vmx
Normal file
3
tests/vmx2xmldata/vmx2xml-annotation.vmx
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
config.version = "8"
|
||||||
|
virtualHW.version = "4"
|
||||||
|
annotation = "Some |7Ctext|7C to test the |22escaping|22: |7C|7C|22|22|7C|7C|22|7C |45|73|63|61|70|65|64|21"
|
16
tests/vmx2xmldata/vmx2xml-annotation.xml
Normal file
16
tests/vmx2xmldata/vmx2xml-annotation.xml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<domain type='vmware'>
|
||||||
|
<uuid>00000000-0000-0000-0000-000000000000</uuid>
|
||||||
|
<description>Some |text| to test the "escaping": ||""||"| Escaped!</description>
|
||||||
|
<memory>32768</memory>
|
||||||
|
<currentMemory>32768</currentMemory>
|
||||||
|
<vcpu>1</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='i686'>hvm</type>
|
||||||
|
</os>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
@ -280,6 +280,8 @@ mymain(int argc, char **argv)
|
|||||||
DO_TEST("gsx-in-the-wild-3", "gsx-in-the-wild-3", esxVI_ProductVersion_ESX35);
|
DO_TEST("gsx-in-the-wild-3", "gsx-in-the-wild-3", esxVI_ProductVersion_ESX35);
|
||||||
DO_TEST("gsx-in-the-wild-4", "gsx-in-the-wild-4", esxVI_ProductVersion_ESX35);
|
DO_TEST("gsx-in-the-wild-4", "gsx-in-the-wild-4", esxVI_ProductVersion_ESX35);
|
||||||
|
|
||||||
|
DO_TEST("annotation", "annotation", esxVI_ProductVersion_ESX35);
|
||||||
|
|
||||||
virCapabilitiesFree(caps);
|
virCapabilitiesFree(caps);
|
||||||
|
|
||||||
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||||
|
10
tests/xml2vmxdata/xml2vmx-annotation.vmx
Normal file
10
tests/xml2vmxdata/xml2vmx-annotation.vmx
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
config.version = "8"
|
||||||
|
virtualHW.version = "4"
|
||||||
|
guestOS = "other"
|
||||||
|
uuid.bios = "56 4d 9b ef ac d9 b4 e0-c8 f0 ae a8 b9 10 35 15"
|
||||||
|
displayName = "annotation"
|
||||||
|
annotation = "Some |7Ctext|7C to test the |22escaping|22: |7C|7C|22|22|7C|7C|22|7C Unescaped!"
|
||||||
|
memsize = "4"
|
||||||
|
numvcpus = "1"
|
||||||
|
floppy0.present = "false"
|
||||||
|
floppy1.present = "false"
|
9
tests/xml2vmxdata/xml2vmx-annotation.xml
Normal file
9
tests/xml2vmxdata/xml2vmx-annotation.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<domain type='vmware'>
|
||||||
|
<name>annotation</name>
|
||||||
|
<uuid>564d9bef-acd9-b4e0-c8f0-aea8b9103515</uuid>
|
||||||
|
<description>Some |text| to test the "escaping": ||""||"| Unescaped!</description>
|
||||||
|
<memory>4096</memory>
|
||||||
|
<os>
|
||||||
|
<type>hvm</type>
|
||||||
|
</os>
|
||||||
|
</domain>
|
@ -280,6 +280,8 @@ mymain(int argc, char **argv)
|
|||||||
DO_TEST("gsx-in-the-wild-3", "gsx-in-the-wild-3", esxVI_ProductVersion_ESX35);
|
DO_TEST("gsx-in-the-wild-3", "gsx-in-the-wild-3", esxVI_ProductVersion_ESX35);
|
||||||
DO_TEST("gsx-in-the-wild-4", "gsx-in-the-wild-4", esxVI_ProductVersion_ESX35);
|
DO_TEST("gsx-in-the-wild-4", "gsx-in-the-wild-4", esxVI_ProductVersion_ESX35);
|
||||||
|
|
||||||
|
DO_TEST("annotation", "annotation", esxVI_ProductVersion_ESX35);
|
||||||
|
|
||||||
virCapabilitiesFree(caps);
|
virCapabilitiesFree(caps);
|
||||||
|
|
||||||
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||||
|
Loading…
Reference in New Issue
Block a user