2018-12-04 11:16:23 +00:00
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include "internal.h"
|
|
|
|
#include "testutils.h"
|
|
|
|
#include "datatypes.h"
|
|
|
|
#include "storage/storage_util.h"
|
|
|
|
#include "testutilsqemu.h"
|
|
|
|
#include "virstring.h"
|
|
|
|
|
|
|
|
#define VIR_FROM_THIS VIR_FROM_NONE
|
|
|
|
|
2018-12-13 16:11:18 +00:00
|
|
|
#ifndef MOUNT
|
|
|
|
# define MOUNT "/usr/bin/mount"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef VGCHANGE
|
|
|
|
# define VGCHANGE "/usr/sbin/vgchange"
|
|
|
|
#endif
|
2018-12-04 11:16:23 +00:00
|
|
|
|
|
|
|
static int
|
|
|
|
testCompareXMLToArgvFiles(bool shouldFail,
|
|
|
|
const char *poolxml,
|
|
|
|
const char *cmdline)
|
|
|
|
{
|
|
|
|
VIR_AUTOFREE(char *) actualCmdline = NULL;
|
|
|
|
VIR_AUTOFREE(char *) src = NULL;
|
|
|
|
int ret = -1;
|
|
|
|
virCommandPtr cmd = NULL;
|
|
|
|
virStoragePoolDefPtr def = NULL;
|
|
|
|
virStoragePoolObjPtr pool = NULL;
|
|
|
|
|
|
|
|
if (!(def = virStoragePoolDefParseFile(poolxml)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
switch ((virStoragePoolType)def->type) {
|
|
|
|
case VIR_STORAGE_POOL_FS:
|
|
|
|
case VIR_STORAGE_POOL_NETFS:
|
|
|
|
if (!(pool = virStoragePoolObjNew())) {
|
|
|
|
VIR_TEST_DEBUG("pool type %d alloc pool obj fails\n", def->type);
|
|
|
|
virStoragePoolDefFree(def);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
virStoragePoolObjSetDef(pool, def);
|
|
|
|
|
|
|
|
if (!(src = virStorageBackendFileSystemGetPoolSource(pool))) {
|
|
|
|
VIR_TEST_DEBUG("pool type %d has no pool source\n", def->type);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2018-12-13 16:11:18 +00:00
|
|
|
cmd = virStorageBackendFileSystemMountCmd(MOUNT, def, src);
|
2018-12-04 11:16:23 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_STORAGE_POOL_LOGICAL:
|
2018-12-13 16:11:18 +00:00
|
|
|
cmd = virStorageBackendLogicalChangeCmd(VGCHANGE, def, true);
|
2018-12-04 16:12:37 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_STORAGE_POOL_DIR:
|
2018-12-04 11:16:23 +00:00
|
|
|
case VIR_STORAGE_POOL_DISK:
|
|
|
|
case VIR_STORAGE_POOL_ISCSI:
|
|
|
|
case VIR_STORAGE_POOL_ISCSI_DIRECT:
|
|
|
|
case VIR_STORAGE_POOL_SCSI:
|
|
|
|
case VIR_STORAGE_POOL_MPATH:
|
|
|
|
case VIR_STORAGE_POOL_RBD:
|
|
|
|
case VIR_STORAGE_POOL_SHEEPDOG:
|
|
|
|
case VIR_STORAGE_POOL_GLUSTER:
|
|
|
|
case VIR_STORAGE_POOL_ZFS:
|
|
|
|
case VIR_STORAGE_POOL_VSTORAGE:
|
|
|
|
case VIR_STORAGE_POOL_LAST:
|
|
|
|
default:
|
|
|
|
VIR_TEST_DEBUG("pool type %d has no xml2argv test\n", def->type);
|
|
|
|
goto cleanup;
|
|
|
|
};
|
|
|
|
|
qemu: use line breaks in command line args written to log
The QEMU command line arguments are very long and currently all written
on a single line to /var/log/libvirt/qemu/$GUEST.log. This introduces
logic to add line breaks after every env variable and "-" optional
argument, and every positional argument. This will create a clearer log
file, which will in turn present better in bug reports when people cut +
paste from the log into a bug comment.
An example log file entry now looks like this:
2018-12-14 12:57:03.677+0000: starting up libvirt version: 5.0.0, qemu version: 3.0.0qemu-3.0.0-1.fc29, kernel: 4.19.5-300.fc29.x86_64, hostname: localhost.localdomain
LC_ALL=C \
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin \
HOME=/home/berrange \
USER=berrange \
LOGNAME=berrange \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu-system-ppc64 \
-name guest=guest,debug-threads=on \
-S \
-object secret,id=masterKey0,format=raw,file=/home/berrange/.config/libvirt/qemu/lib/domain-33-guest/master-key.aes \
-machine pseries-2.10,accel=tcg,usb=off,dump-guest-core=off \
-m 1024 \
-realtime mlock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c8a74977-ab18-41d0-ae3b-4041c7fffbcd \
-display none \
-no-user-config \
-nodefaults \
-chardev socket,id=charmonitor,fd=23,server,nowait \
-mon chardev=charmonitor,id=monitor,mode=control \
-rtc base=utc \
-no-shutdown \
-boot strict=on \
-device qemu-xhci,id=usb,bus=pci.0,addr=0x1 \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on
2018-12-14 12:57:03.730+0000: shutting down, reason=failed
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2018-12-14 12:07:08 +00:00
|
|
|
if (!(actualCmdline = virCommandToString(cmd, false))) {
|
2018-12-04 11:16:23 +00:00
|
|
|
VIR_TEST_DEBUG("pool type %d failed to get commandline\n", def->type);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
virTestClearCommandPath(actualCmdline);
|
|
|
|
if (virTestCompareToFile(actualCmdline, cmdline) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
virCommandFree(cmd);
|
|
|
|
VIR_FREE(actualCmdline);
|
|
|
|
virStoragePoolObjEndAPI(&pool);
|
|
|
|
if (shouldFail) {
|
|
|
|
virResetLastError();
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct testInfo {
|
|
|
|
bool shouldFail;
|
|
|
|
const char *pool;
|
|
|
|
};
|
|
|
|
|
|
|
|
static int
|
|
|
|
testCompareXMLToArgvHelper(const void *data)
|
|
|
|
{
|
|
|
|
int result = -1;
|
|
|
|
const struct testInfo *info = data;
|
|
|
|
char *poolxml = NULL;
|
|
|
|
char *cmdline = NULL;
|
|
|
|
|
|
|
|
if (virAsprintf(&poolxml, "%s/storagepoolxml2xmlin/%s.xml",
|
|
|
|
abs_srcdir, info->pool) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (virAsprintf(&cmdline, "%s/storagepoolxml2argvdata/%s.argv",
|
|
|
|
abs_srcdir, info->pool) < 0 && !info->shouldFail)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
result = testCompareXMLToArgvFiles(info->shouldFail, poolxml, cmdline);
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
VIR_FREE(poolxml);
|
|
|
|
VIR_FREE(cmdline);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
mymain(void)
|
|
|
|
{
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
#define DO_TEST_FULL(shouldFail, pool) \
|
|
|
|
do { \
|
|
|
|
struct testInfo info = { shouldFail, pool }; \
|
|
|
|
if (virTestRun("Storage Pool XML-2-argv " pool, \
|
|
|
|
testCompareXMLToArgvHelper, &info) < 0) \
|
|
|
|
ret = -1; \
|
|
|
|
} \
|
|
|
|
while (0);
|
|
|
|
|
|
|
|
#define DO_TEST(pool, ...) \
|
|
|
|
DO_TEST_FULL(false, pool)
|
|
|
|
|
|
|
|
#define DO_TEST_FAIL(pool, ...) \
|
|
|
|
DO_TEST_FULL(true, pool)
|
|
|
|
|
|
|
|
DO_TEST_FAIL("pool-dir");
|
|
|
|
DO_TEST_FAIL("pool-dir-naming");
|
|
|
|
DO_TEST("pool-fs");
|
2018-12-04 16:12:37 +00:00
|
|
|
DO_TEST("pool-logical");
|
|
|
|
DO_TEST("pool-logical-nopath");
|
|
|
|
DO_TEST("pool-logical-create");
|
|
|
|
DO_TEST("pool-logical-noname");
|
2018-12-04 11:16:23 +00:00
|
|
|
DO_TEST_FAIL("pool-disk");
|
|
|
|
DO_TEST_FAIL("pool-disk-device-nopartsep");
|
|
|
|
DO_TEST_FAIL("pool-iscsi");
|
|
|
|
DO_TEST_FAIL("pool-iscsi-auth");
|
|
|
|
DO_TEST("pool-netfs");
|
2018-12-04 15:20:59 +00:00
|
|
|
DO_TEST("pool-netfs-auto");
|
2018-12-04 11:16:23 +00:00
|
|
|
DO_TEST("pool-netfs-gluster");
|
|
|
|
DO_TEST("pool-netfs-cifs");
|
|
|
|
DO_TEST_FAIL("pool-scsi");
|
|
|
|
DO_TEST_FAIL("pool-scsi-type-scsi-host");
|
|
|
|
DO_TEST_FAIL("pool-scsi-type-fc-host");
|
|
|
|
DO_TEST_FAIL("pool-scsi-type-fc-host-managed");
|
|
|
|
DO_TEST_FAIL("pool-mpath");
|
|
|
|
DO_TEST_FAIL("pool-iscsi-multiiqn");
|
|
|
|
DO_TEST_FAIL("pool-iscsi-vendor-product");
|
|
|
|
DO_TEST_FAIL("pool-sheepdog");
|
|
|
|
DO_TEST_FAIL("pool-gluster");
|
|
|
|
DO_TEST_FAIL("pool-gluster-sub");
|
|
|
|
DO_TEST_FAIL("pool-scsi-type-scsi-host-stable");
|
|
|
|
DO_TEST_FAIL("pool-zfs");
|
|
|
|
DO_TEST_FAIL("pool-zfs-sourcedev");
|
|
|
|
DO_TEST_FAIL("pool-rbd");
|
|
|
|
DO_TEST_FAIL("pool-vstorage");
|
|
|
|
DO_TEST_FAIL("pool-iscsi-direct-auth");
|
|
|
|
DO_TEST_FAIL("pool-iscsi-direct");
|
|
|
|
|
|
|
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
VIR_TEST_MAIN(mymain)
|