xml2vmxtest.c 8.5 KB
Newer Older
1 2 3 4
#include <config.h>

#ifdef WITH_ESX

5 6 7
# include <stdio.h>
# include <string.h>
# include <unistd.h>
8

9 10 11 12
# include "internal.h"
# include "memory.h"
# include "testutils.h"
# include "esx/esx_vmx.h"
13 14 15 16

static char *progname = NULL;
static char *abs_srcdir = NULL;
static virCapsPtr caps = NULL;
17
static esxVMX_Context ctx;
18

19
# define MAX_FILE 4096
20 21

static void
22
testCapsInit(void)
23 24 25 26 27 28 29 30 31
{
    virCapsGuestPtr guest = NULL;

    caps = virCapabilitiesNew("i686", 1, 1);

    if (caps == NULL) {
        return;
    }

32
    virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
33 34
    virCapabilitiesAddHostMigrateTransport(caps, "esx");

35 36
    caps->hasWideScsiBus = true;

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
    /* i686 guest */
    guest =
      virCapabilitiesAddGuest(caps, "hvm", "i686", 32, NULL, NULL, 0, NULL);

    if (guest == NULL) {
        goto failure;
    }

    if (virCapabilitiesAddGuestDomain(guest, "vmware", NULL, NULL, 0,
                                      NULL) == NULL) {
        goto failure;
    }

    /* x86_64 guest */
    guest =
      virCapabilitiesAddGuest(caps, "hvm", "x86_64", 64, NULL, NULL, 0, NULL);

    if (guest == NULL) {
        goto failure;
    }

    if (virCapabilitiesAddGuestDomain(guest, "vmware", NULL, NULL, 0,
                                      NULL) == NULL) {
        goto failure;
    }

    return;

  failure:
    virCapabilitiesFree(caps);
    caps = NULL;
}

static int
71 72
testCompareFiles(const char *xml, const char *vmx,
                 esxVI_ProductVersion productVersion)
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
{
    int result = -1;
    char xmlData[MAX_FILE];
    char vmxData[MAX_FILE];
    char *formatted = NULL;
    char *xmlPtr = &(xmlData[0]);
    char *vmxPtr = &(vmxData[0]);
    virDomainDefPtr def = NULL;

    if (virtTestLoadFile(xml, &xmlPtr, MAX_FILE) < 0) {
        goto failure;
    }

    if (virtTestLoadFile(vmx, &vmxPtr, MAX_FILE) < 0) {
        goto failure;
    }

90
    def = virDomainDefParseString(caps, xmlData, VIR_DOMAIN_XML_INACTIVE);
91 92 93 94 95

    if (def == NULL) {
        goto failure;
    }

96
    formatted = esxVMX_FormatConfig(&ctx, caps, def, productVersion);
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118

    if (formatted == NULL) {
        goto failure;
    }

    if (STRNEQ(vmxData, formatted)) {
        virtTestDifference(stderr, vmxData, formatted);
        goto failure;
    }

    result = 0;

  failure:
    VIR_FREE(formatted);
    virDomainDefFree(def);

    return result;
}

struct testInfo {
    const char *input;
    const char *output;
119
    esxVI_ProductVersion version;
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
};

static int
testCompareHelper(const void *data)
{
    const struct testInfo *info = data;
    char xml[PATH_MAX];
    char vmx[PATH_MAX];

    snprintf(xml, PATH_MAX, "%s/xml2vmxdata/xml2vmx-%s.xml", abs_srcdir,
             info->input);
    snprintf(vmx, PATH_MAX, "%s/xml2vmxdata/xml2vmx-%s.vmx", abs_srcdir,
             info->output);

    return testCompareFiles(xml, vmx, info->version);
}

137 138 139 140 141 142 143 144 145 146 147 148 149 150
static int
testAutodetectSCSIControllerModel(virDomainDiskDefPtr def ATTRIBUTE_UNUSED,
                                  int *model, void *opaque ATTRIBUTE_UNUSED)
{
    *model = VIR_DOMAIN_CONTROLLER_MODEL_LSILOGIC;

    return 0;
}

static char *
testFormatVMXFileName(const char *src, void *opaque ATTRIBUTE_UNUSED)
{
    bool success = false;
    char *datastoreName = NULL;
151
    char *directoryAndFileName = NULL;
152 153 154 155
    char *absolutePath = NULL;

    if (STRPREFIX(src, "[")) {
        /* Found potential datastore path */
156 157
        if (esxUtil_ParseDatastorePath(src, &datastoreName, NULL,
                                       &directoryAndFileName) < 0) {
158 159 160
            goto cleanup;
        }

161 162
        virAsprintf(&absolutePath, "/vmfs/volumes/%s/%s", datastoreName,
                    directoryAndFileName);
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
    } else if (STRPREFIX(src, "/")) {
        /* Found absolute path */
        absolutePath = strdup(src);
    } else {
        /* Found relative path, this is not supported */
        goto cleanup;
    }

    success = true;

  cleanup:
    if (! success) {
        VIR_FREE(absolutePath);
    }

    VIR_FREE(datastoreName);
179
    VIR_FREE(directoryAndFileName);
180 181 182 183

    return absolutePath;
}

184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
static int
mymain(int argc, char **argv)
{
    int result = 0;
    char cwd[PATH_MAX];

    progname = argv[0];

    if (argc > 1) {
        fprintf(stderr, "Usage: %s\n", progname);
        return EXIT_FAILURE;
    }

    abs_srcdir = getenv("abs_srcdir");

    if (abs_srcdir == NULL) {
        abs_srcdir = getcwd(cwd, sizeof(cwd));
    }

    if (argc > 1) {
        fprintf(stderr, "Usage: %s\n", progname);
        return EXIT_FAILURE;
    }

208
# define DO_TEST(_in, _out, _version)                                         \
209 210 211 212 213 214 215 216 217
        do {                                                                  \
            struct testInfo info = { _in, _out, _version };                   \
            virResetLastError();                                              \
            if (virtTestRun("VMware XML-2-VMX "_in" -> "_out, 1,              \
                            testCompareHelper, &info) < 0) {                  \
                result = -1;                                                  \
            }                                                                 \
        } while (0)

218
    testCapsInit();
219 220 221 222 223

    if (caps == NULL) {
        return EXIT_FAILURE;
    }

224 225 226 227 228
    ctx.opaque = NULL;
    ctx.parseFileName = NULL;
    ctx.formatFileName = testFormatVMXFileName;
    ctx.autodetectSCSIControllerModel = testAutodetectSCSIControllerModel;

229 230
    DO_TEST("minimal", "minimal", esxVI_ProductVersion_ESX35);
    DO_TEST("minimal-64bit", "minimal-64bit", esxVI_ProductVersion_ESX35);
231

232
    DO_TEST("graphics-vnc", "graphics-vnc", esxVI_ProductVersion_ESX35);
M
Matthias Bolte 已提交
233

234 235
    DO_TEST("scsi-driver", "scsi-driver", esxVI_ProductVersion_ESX35);
    DO_TEST("scsi-writethrough", "scsi-writethrough", esxVI_ProductVersion_ESX35);
236

237 238
    DO_TEST("harddisk-scsi-file", "harddisk-scsi-file", esxVI_ProductVersion_ESX35);
    DO_TEST("harddisk-ide-file", "harddisk-ide-file", esxVI_ProductVersion_ESX35);
239

240 241 242 243
    DO_TEST("cdrom-scsi-file", "cdrom-scsi-file", esxVI_ProductVersion_ESX35);
    DO_TEST("cdrom-scsi-device", "cdrom-scsi-device", esxVI_ProductVersion_ESX35);
    DO_TEST("cdrom-ide-file", "cdrom-ide-file", esxVI_ProductVersion_ESX35);
    DO_TEST("cdrom-ide-device", "cdrom-ide-device", esxVI_ProductVersion_ESX35);
244

245 246
    DO_TEST("floppy-file", "floppy-file", esxVI_ProductVersion_ESX35);
    DO_TEST("floppy-device", "floppy-device", esxVI_ProductVersion_ESX35);
247

248 249
    DO_TEST("ethernet-e1000", "ethernet-e1000", esxVI_ProductVersion_ESX35);
    DO_TEST("ethernet-vmxnet2", "ethernet-vmxnet2", esxVI_ProductVersion_ESX35);
250

251 252
    DO_TEST("ethernet-custom", "ethernet-custom", esxVI_ProductVersion_ESX35);
    DO_TEST("ethernet-bridged", "ethernet-bridged", esxVI_ProductVersion_ESX35);
253

254 255 256 257
    DO_TEST("ethernet-generated", "ethernet-generated", esxVI_ProductVersion_ESX35);
    DO_TEST("ethernet-static", "ethernet-static", esxVI_ProductVersion_ESX35);
    DO_TEST("ethernet-vpx", "ethernet-vpx", esxVI_ProductVersion_ESX35);
    DO_TEST("ethernet-other", "ethernet-other", esxVI_ProductVersion_ESX35);
258

259 260 261
    DO_TEST("serial-file", "serial-file", esxVI_ProductVersion_ESX35);
    DO_TEST("serial-device", "serial-device", esxVI_ProductVersion_ESX35);
    DO_TEST("serial-pipe", "serial-pipe", esxVI_ProductVersion_ESX35);
262 263
    DO_TEST("serial-network-server", "serial-network-server", esxVI_ProductVersion_ESX41);
    DO_TEST("serial-network-client", "serial-network-client", esxVI_ProductVersion_ESX41);
264

265 266
    DO_TEST("parallel-file", "parallel-file", esxVI_ProductVersion_ESX35);
    DO_TEST("parallel-device", "parallel-device", esxVI_ProductVersion_ESX35);
267

268 269 270 271
    DO_TEST("esx-in-the-wild-1", "esx-in-the-wild-1", esxVI_ProductVersion_ESX35);
    DO_TEST("esx-in-the-wild-2", "esx-in-the-wild-2", esxVI_ProductVersion_ESX35);
    DO_TEST("esx-in-the-wild-3", "esx-in-the-wild-3", esxVI_ProductVersion_ESX35);
    DO_TEST("esx-in-the-wild-4", "esx-in-the-wild-4", esxVI_ProductVersion_ESX35);
272
    DO_TEST("esx-in-the-wild-5", "esx-in-the-wild-5", esxVI_ProductVersion_ESX35);
273

274 275 276 277
    DO_TEST("gsx-in-the-wild-1", "gsx-in-the-wild-1", esxVI_ProductVersion_ESX35);
    DO_TEST("gsx-in-the-wild-2", "gsx-in-the-wild-2", 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);
278

279 280
    DO_TEST("annotation", "annotation", esxVI_ProductVersion_ESX35);

281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
    virCapabilitiesFree(caps);

    return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}

VIRT_TEST_MAIN(mymain)

#else

int main (void)
{
    return 77; /* means 'test skipped' for automake */
}

#endif /* WITH_ESX */