2013-02-18 13:43:28 +01:00
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
|
|
#include "internal.h"
|
|
|
|
|
#include "testutils.h"
|
|
|
|
|
#include "datatypes.h"
|
2017-01-11 18:04:15 +01:00
|
|
|
#include "storage/storage_util.h"
|
2013-02-18 13:43:28 +01:00
|
|
|
#include "testutilsqemu.h"
|
2013-04-03 12:36:23 +02:00
|
|
|
#include "virstring.h"
|
2013-02-18 13:43:28 +01:00
|
|
|
|
2013-06-07 17:10:28 +02:00
|
|
|
#define VIR_FROM_THIS VIR_FROM_NONE
|
|
|
|
|
|
2013-02-18 13:43:28 +01:00
|
|
|
const char create_tool[] = "qemu-img";
|
|
|
|
|
|
2013-07-22 15:55:40 +02:00
|
|
|
/* createVol sets this on volume creation */
|
|
|
|
|
static void
|
|
|
|
|
testSetVolumeType(virStorageVolDefPtr vol,
|
|
|
|
|
virStoragePoolDefPtr pool)
|
|
|
|
|
{
|
2013-07-26 13:10:12 +02:00
|
|
|
if (!vol || !pool)
|
2013-07-22 15:55:40 +02:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
switch (pool->type) {
|
|
|
|
|
case VIR_STORAGE_POOL_DIR:
|
|
|
|
|
case VIR_STORAGE_POOL_FS:
|
|
|
|
|
case VIR_STORAGE_POOL_NETFS:
|
|
|
|
|
vol->type = VIR_STORAGE_VOL_FILE;
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
case VIR_STORAGE_POOL_LOGICAL:
|
|
|
|
|
vol->type = VIR_STORAGE_VOL_BLOCK;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-02-18 13:43:28 +01:00
|
|
|
static int
|
|
|
|
|
testCompareXMLToArgvFiles(bool shouldFail,
|
|
|
|
|
const char *poolxml,
|
|
|
|
|
const char *volxml,
|
2013-07-22 15:55:40 +02:00
|
|
|
const char *inputpoolxml,
|
2013-02-18 13:43:28 +01:00
|
|
|
const char *inputvolxml,
|
|
|
|
|
const char *cmdline,
|
|
|
|
|
unsigned int flags,
|
2015-02-17 16:57:02 +01:00
|
|
|
unsigned long parse_flags)
|
2013-02-18 13:43:28 +01:00
|
|
|
{
|
2018-06-20 15:51:47 -04:00
|
|
|
virStorageVolEncryptConvertStep convertStep = VIR_STORAGE_VOL_ENCRYPT_NONE;
|
2013-02-18 13:43:28 +01:00
|
|
|
int ret = -1;
|
2017-05-08 16:02:36 -04:00
|
|
|
virStoragePoolDefPtr def = NULL;
|
|
|
|
|
virStoragePoolObjPtr obj = NULL;
|
2019-02-01 12:03:16 -05:00
|
|
|
VIR_AUTOFREE(char *) actualCmdline = NULL;
|
2019-01-31 09:44:54 -05:00
|
|
|
VIR_AUTOPTR(virStorageVolDef) vol = NULL;
|
|
|
|
|
VIR_AUTOPTR(virStorageVolDef) inputvol = NULL;
|
2019-01-31 10:21:47 -05:00
|
|
|
VIR_AUTOPTR(virStoragePoolDef) inputpool = NULL;
|
2019-01-31 13:16:44 -05:00
|
|
|
VIR_AUTOPTR(virCommand) cmd = NULL;
|
2013-02-18 13:43:28 +01:00
|
|
|
|
2017-05-08 16:02:36 -04:00
|
|
|
if (!(def = virStoragePoolDefParseFile(poolxml)))
|
2013-02-18 13:43:28 +01:00
|
|
|
goto cleanup;
|
|
|
|
|
|
2017-05-08 16:02:36 -04:00
|
|
|
if (!(obj = virStoragePoolObjNew())) {
|
|
|
|
|
virStoragePoolDefFree(def);
|
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
virStoragePoolObjSetDef(obj, def);
|
2013-02-18 13:43:28 +01:00
|
|
|
|
2013-07-22 15:55:40 +02:00
|
|
|
if (inputpoolxml) {
|
2015-04-23 11:10:15 -04:00
|
|
|
if (!(inputpool = virStoragePoolDefParseFile(inputpoolxml)))
|
2013-07-22 15:55:40 +02:00
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-17 16:54:53 +01:00
|
|
|
if (inputvolxml)
|
|
|
|
|
parse_flags |= VIR_VOL_XML_PARSE_NO_CAPACITY;
|
|
|
|
|
|
2017-05-08 16:02:36 -04:00
|
|
|
if (!(vol = virStorageVolDefParseFile(def, volxml, parse_flags)))
|
2013-02-18 13:43:28 +01:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
|
|
if (inputvolxml &&
|
2015-04-23 11:10:15 -04:00
|
|
|
!(inputvol = virStorageVolDefParseFile(inputpool, inputvolxml, 0)))
|
2013-02-18 13:43:28 +01:00
|
|
|
goto cleanup;
|
|
|
|
|
|
2017-05-08 16:02:36 -04:00
|
|
|
testSetVolumeType(vol, def);
|
2013-07-22 15:55:40 +02:00
|
|
|
testSetVolumeType(inputvol, inputpool);
|
|
|
|
|
|
2018-06-20 15:51:47 -04:00
|
|
|
/* Using an input file for encryption requires a multi-step process
|
|
|
|
|
* to create an image of the same size as the inputvol and then to
|
|
|
|
|
* convert the inputvol afterwards. Since we only care about the
|
|
|
|
|
* command line we have to copy code from storageBackendCreateQemuImg
|
|
|
|
|
* and adjust it for the test needs. */
|
2018-08-20 12:25:44 -04:00
|
|
|
if (inputvol && (vol->target.encryption || inputvol->target.encryption))
|
2018-06-20 15:51:47 -04:00
|
|
|
convertStep = VIR_STORAGE_VOL_ENCRYPT_CREATE;
|
|
|
|
|
|
|
|
|
|
do {
|
2019-01-31 13:16:44 -05:00
|
|
|
virCommandFree(cmd);
|
2018-06-20 15:51:47 -04:00
|
|
|
cmd = virStorageBackendCreateQemuImgCmdFromVol(obj, vol,
|
|
|
|
|
inputvol, flags,
|
|
|
|
|
create_tool,
|
|
|
|
|
"/path/to/secretFile",
|
2018-08-20 12:25:44 -04:00
|
|
|
"/path/to/inputSecretFile",
|
2018-06-20 15:51:47 -04:00
|
|
|
convertStep);
|
|
|
|
|
if (!cmd) {
|
|
|
|
|
if (shouldFail) {
|
|
|
|
|
virResetLastError();
|
|
|
|
|
ret = 0;
|
|
|
|
|
}
|
|
|
|
|
goto cleanup;
|
2013-02-18 13:43:28 +01:00
|
|
|
}
|
|
|
|
|
|
2018-06-20 15:51:47 -04:00
|
|
|
if (convertStep != VIR_STORAGE_VOL_ENCRYPT_CONVERT) {
|
2018-12-14 12:07:08 +00:00
|
|
|
if (!(actualCmdline = virCommandToString(cmd, false)))
|
2018-06-20 15:51:47 -04:00
|
|
|
goto cleanup;
|
|
|
|
|
} else {
|
|
|
|
|
char *createCmdline = actualCmdline;
|
2019-02-01 12:03:16 -05:00
|
|
|
VIR_AUTOFREE(char *) cvtCmdline = NULL;
|
2018-06-20 15:51:47 -04:00
|
|
|
int rc;
|
|
|
|
|
|
2018-12-14 12:07:08 +00:00
|
|
|
if (!(cvtCmdline = virCommandToString(cmd, false)))
|
2018-06-20 15:51:47 -04:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
|
|
rc = virAsprintf(&actualCmdline, "%s\n%s",
|
|
|
|
|
createCmdline, cvtCmdline);
|
|
|
|
|
|
|
|
|
|
VIR_FREE(createCmdline);
|
|
|
|
|
if (rc < 0)
|
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (convertStep == VIR_STORAGE_VOL_ENCRYPT_NONE)
|
|
|
|
|
convertStep = VIR_STORAGE_VOL_ENCRYPT_DONE;
|
|
|
|
|
else if (convertStep == VIR_STORAGE_VOL_ENCRYPT_CREATE)
|
|
|
|
|
convertStep = VIR_STORAGE_VOL_ENCRYPT_CONVERT;
|
|
|
|
|
else if (convertStep == VIR_STORAGE_VOL_ENCRYPT_CONVERT)
|
|
|
|
|
convertStep = VIR_STORAGE_VOL_ENCRYPT_DONE;
|
|
|
|
|
|
|
|
|
|
} while (convertStep != VIR_STORAGE_VOL_ENCRYPT_DONE);
|
2013-06-05 10:49:15 +02:00
|
|
|
|
2016-05-26 17:01:53 +02:00
|
|
|
if (virTestCompareToFile(actualCmdline, cmdline) < 0)
|
2013-02-18 13:43:28 +01:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
2014-03-25 07:53:44 +01:00
|
|
|
cleanup:
|
2017-10-08 09:09:09 -04:00
|
|
|
virStoragePoolObjEndAPI(&obj);
|
2013-02-18 13:43:28 +01:00
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct testInfo {
|
|
|
|
|
bool shouldFail;
|
|
|
|
|
const char *pool;
|
|
|
|
|
const char *vol;
|
2013-07-22 15:55:40 +02:00
|
|
|
const char *inputpool;
|
2013-02-18 13:43:28 +01:00
|
|
|
const char *inputvol;
|
|
|
|
|
const char *cmdline;
|
|
|
|
|
unsigned int flags;
|
2015-02-17 16:57:02 +01:00
|
|
|
unsigned long parseflags;
|
2013-02-18 13:43:28 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
testCompareXMLToArgvHelper(const void *data)
|
|
|
|
|
{
|
|
|
|
|
const struct testInfo *info = data;
|
2019-02-01 12:03:16 -05:00
|
|
|
VIR_AUTOFREE(char *) poolxml = NULL;
|
|
|
|
|
VIR_AUTOFREE(char *) inputpoolxml = NULL;
|
|
|
|
|
VIR_AUTOFREE(char *) volxml = NULL;
|
|
|
|
|
VIR_AUTOFREE(char *) inputvolxml = NULL;
|
|
|
|
|
VIR_AUTOFREE(char *) cmdline = NULL;
|
2013-02-18 13:43:28 +01:00
|
|
|
|
|
|
|
|
if (info->inputvol &&
|
2013-07-22 15:44:06 +02:00
|
|
|
virAsprintf(&inputvolxml, "%s/storagevolxml2xmlin/%s.xml",
|
2013-02-18 13:43:28 +01:00
|
|
|
abs_srcdir, info->inputvol) < 0)
|
2019-02-01 12:03:16 -05:00
|
|
|
return -1;
|
2013-07-22 15:55:40 +02:00
|
|
|
if (info->inputpool &&
|
|
|
|
|
virAsprintf(&inputpoolxml, "%s/storagepoolxml2xmlin/%s.xml",
|
|
|
|
|
abs_srcdir, info->inputpool) < 0)
|
2019-02-01 12:03:16 -05:00
|
|
|
return -1;
|
2013-07-22 14:56:26 +02:00
|
|
|
if (virAsprintf(&poolxml, "%s/storagepoolxml2xmlin/%s.xml",
|
2013-02-18 13:43:28 +01:00
|
|
|
abs_srcdir, info->pool) < 0 ||
|
2013-07-22 15:44:06 +02:00
|
|
|
virAsprintf(&volxml, "%s/storagevolxml2xmlin/%s.xml",
|
2013-02-18 13:43:28 +01:00
|
|
|
abs_srcdir, info->vol) < 0) {
|
2019-02-01 12:03:16 -05:00
|
|
|
return -1;
|
2013-02-18 13:43:28 +01:00
|
|
|
}
|
|
|
|
|
if (virAsprintf(&cmdline, "%s/storagevolxml2argvdata/%s.argv",
|
|
|
|
|
abs_srcdir, info->cmdline) < 0 && !info->shouldFail)
|
2019-02-01 12:03:16 -05:00
|
|
|
return -1;
|
2013-02-18 13:43:28 +01:00
|
|
|
|
2019-02-01 12:03:16 -05:00
|
|
|
return testCompareXMLToArgvFiles(info->shouldFail, poolxml, volxml,
|
|
|
|
|
inputpoolxml, inputvolxml,
|
|
|
|
|
cmdline, info->flags,
|
|
|
|
|
info->parseflags);
|
2013-02-18 13:43:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
mymain(void)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
unsigned int flags = VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA;
|
|
|
|
|
|
2015-02-17 16:57:02 +01:00
|
|
|
#define DO_TEST_FULL(shouldFail, parseflags, pool, vol, inputpool, inputvol, \
|
2018-04-17 23:32:23 +02:00
|
|
|
cmdline, flags) \
|
2017-11-03 13:09:47 +01:00
|
|
|
do { \
|
2013-07-22 15:55:40 +02:00
|
|
|
struct testInfo info = { shouldFail, pool, vol, inputpool, inputvol, \
|
2018-04-17 23:00:33 +02:00
|
|
|
cmdline, flags, parseflags }; \
|
2017-11-03 13:09:47 +01:00
|
|
|
if (virTestRun("Storage Vol XML-2-argv " cmdline, \
|
|
|
|
|
testCompareXMLToArgvHelper, &info) < 0) \
|
|
|
|
|
ret = -1; \
|
|
|
|
|
} \
|
2013-02-18 13:43:28 +01:00
|
|
|
while (0);
|
|
|
|
|
|
2017-11-03 13:09:47 +01:00
|
|
|
#define DO_TEST(pool, ...) \
|
2015-02-17 16:57:02 +01:00
|
|
|
DO_TEST_FULL(false, 0, pool, __VA_ARGS__)
|
2013-07-22 09:11:50 +02:00
|
|
|
|
2017-11-03 13:09:47 +01:00
|
|
|
#define DO_TEST_FAIL(pool, ...) \
|
2015-02-17 16:57:02 +01:00
|
|
|
DO_TEST_FULL(true, 0, pool, __VA_ARGS__)
|
2013-07-22 09:11:50 +02:00
|
|
|
|
2013-08-20 17:37:08 +02:00
|
|
|
DO_TEST("pool-dir", "vol-qcow2",
|
|
|
|
|
NULL, NULL,
|
2018-04-17 23:32:23 +02:00
|
|
|
"qcow2-compat", 0);
|
2013-08-20 17:37:08 +02:00
|
|
|
DO_TEST("pool-dir", "vol-qcow2-nobacking",
|
|
|
|
|
NULL, NULL,
|
2018-04-17 23:32:23 +02:00
|
|
|
"qcow2-nobacking-prealloc-compat", flags);
|
2013-08-20 17:37:08 +02:00
|
|
|
DO_TEST("pool-dir", "vol-qcow2-nobacking",
|
|
|
|
|
"pool-dir", "vol-file",
|
2018-04-17 23:32:23 +02:00
|
|
|
"qcow2-nobacking-convert-prealloc-compat", flags);
|
2013-08-20 17:37:08 +02:00
|
|
|
DO_TEST("pool-dir", "vol-qcow2-lazy",
|
|
|
|
|
NULL, NULL,
|
2018-04-17 23:32:23 +02:00
|
|
|
"qcow2-lazy", 0);
|
2013-08-20 17:37:08 +02:00
|
|
|
DO_TEST("pool-dir", "vol-qcow2-1.1",
|
|
|
|
|
NULL, NULL,
|
2018-04-17 23:32:23 +02:00
|
|
|
"qcow2-1.1", 0);
|
2013-08-20 17:37:08 +02:00
|
|
|
DO_TEST_FAIL("pool-dir", "vol-qcow2-0.10-lazy",
|
|
|
|
|
NULL, NULL,
|
2018-04-17 23:32:23 +02:00
|
|
|
"qcow2-0.10-lazy", 0);
|
2013-08-20 17:37:08 +02:00
|
|
|
DO_TEST("pool-dir", "vol-qcow2-nobacking",
|
|
|
|
|
"pool-logical", "vol-logical",
|
2018-04-17 23:32:23 +02:00
|
|
|
"qcow2-from-logical-compat", 0);
|
2013-08-20 17:37:08 +02:00
|
|
|
DO_TEST("pool-logical", "vol-logical",
|
|
|
|
|
"pool-dir", "vol-qcow2-nobacking",
|
2018-04-17 23:32:23 +02:00
|
|
|
"logical-from-qcow2", 0);
|
2014-07-15 16:49:47 +08:00
|
|
|
DO_TEST("pool-dir", "vol-qcow2-nocow",
|
|
|
|
|
NULL, NULL,
|
2018-04-17 23:32:23 +02:00
|
|
|
"qcow2-nocow-compat", 0);
|
2015-02-17 16:54:53 +01:00
|
|
|
DO_TEST("pool-dir", "vol-qcow2-nocapacity",
|
|
|
|
|
"pool-dir", "vol-file",
|
2018-04-17 23:32:23 +02:00
|
|
|
"qcow2-nocapacity-convert-prealloc", flags);
|
2015-06-30 15:19:04 -05:00
|
|
|
DO_TEST("pool-dir", "vol-qcow2-zerocapacity",
|
|
|
|
|
NULL, NULL,
|
2018-04-17 23:32:23 +02:00
|
|
|
"qcow2-zerocapacity", 0);
|
2015-02-17 16:57:02 +01:00
|
|
|
DO_TEST_FULL(false, VIR_VOL_XML_PARSE_OPT_CAPACITY,
|
|
|
|
|
"pool-dir", "vol-qcow2-nocapacity-backing", NULL, NULL,
|
2018-04-17 23:32:23 +02:00
|
|
|
"qcow2-nocapacity", 0);
|
2013-08-20 17:37:08 +02:00
|
|
|
|
2017-03-07 10:50:59 -05:00
|
|
|
DO_TEST("pool-dir", "vol-file-iso",
|
|
|
|
|
NULL, NULL,
|
2018-04-17 23:32:23 +02:00
|
|
|
"iso", 0);
|
2017-03-07 10:50:59 -05:00
|
|
|
DO_TEST("pool-dir", "vol-file",
|
|
|
|
|
"pool-dir", "vol-file-iso",
|
2018-04-17 23:32:23 +02:00
|
|
|
"iso-input", 0);
|
2017-03-07 10:50:59 -05:00
|
|
|
|
2018-06-20 16:21:50 -04:00
|
|
|
DO_TEST_FAIL("pool-dir", "vol-qcow2-encryption",
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
"qcow2-encryption", 0);
|
|
|
|
|
|
2018-06-19 10:59:48 -04:00
|
|
|
DO_TEST("pool-dir", "vol-luks",
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
"luks", 0);
|
|
|
|
|
DO_TEST("pool-dir", "vol-luks-cipher",
|
|
|
|
|
NULL, NULL,
|
|
|
|
|
"luks-cipher", 0);
|
|
|
|
|
|
2018-06-20 15:51:47 -04:00
|
|
|
DO_TEST("pool-dir", "vol-luks-convert",
|
|
|
|
|
"pool-dir", "vol-file",
|
|
|
|
|
"luks-convert", 0);
|
|
|
|
|
|
2018-08-21 09:53:12 -04:00
|
|
|
DO_TEST("pool-dir", "vol-luks-convert",
|
|
|
|
|
"pool-dir", "vol-file-qcow2",
|
|
|
|
|
"luks-convert-qcow2", 0);
|
|
|
|
|
|
2018-08-20 12:25:44 -04:00
|
|
|
DO_TEST("pool-dir", "vol-encrypt2",
|
|
|
|
|
"pool-dir", "vol-encrypt1",
|
|
|
|
|
"luks-convert-encrypt", 0);
|
|
|
|
|
|
|
|
|
|
DO_TEST("pool-dir", "vol-file",
|
|
|
|
|
"pool-dir", "vol-encrypt2",
|
|
|
|
|
"luks-convert-encrypt2fileraw", 0);
|
|
|
|
|
|
|
|
|
|
DO_TEST("pool-dir", "vol-file-qcow2",
|
|
|
|
|
"pool-dir", "vol-encrypt2",
|
|
|
|
|
"luks-convert-encrypt2fileqcow2", 0);
|
|
|
|
|
|
2014-03-17 10:38:38 +01:00
|
|
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
2013-02-18 13:43:28 +01:00
|
|
|
}
|
|
|
|
|
|
2017-03-29 16:45:42 +02:00
|
|
|
VIR_TEST_MAIN(mymain)
|