libvirt/tests/virmigtest.c
Martin Kletzander c69915ccaf peer2peer migration: allow connecting to local sockets
Local socket connections were outright disabled because there was no "server"
part in the URI.  However, given how requirements and usage scenarios are
evolving, some management apps might need the source libvirt daemon to connect
to the destination daemon over a UNIX socket for peer2peer migration.  Since we
cannot know where the socket leads (whether the same daemon or not) let's decide
that based on whether the socket path is non-standard, or rather explicitly
specified in the URI.  Checking non-standard path would require to ask the
daemon for configuration and the only misuse that it would prevent would be a
pretty weird one.  And that's not worth it.  The assumption is that whenever
someone uses explicit UNIX socket paths in the URI for migration they better
know what they are doing.

Partially resolves: https://bugzilla.redhat.com/1638889

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
2020-09-04 10:20:49 +02:00

92 lines
2.0 KiB
C

/*
* Copyright (C) 2020 Red Hat, Inc.
*
* 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, see
* <http://www.gnu.org/licenses/>.
*/
#include <config.h>
#include "libvirt_internal.h"
#include "testutils.h"
#include "virlog.h"
#include "viruri.h"
#define VIR_FROM_THIS VIR_FROM_RPC
VIR_LOG_INIT("tests.migtest");
struct migLocalData {
const char *uri;
bool fail;
};
static int
testMigNotLocal(const void *args)
{
int ret = -1;
const struct migLocalData *data = args;
ret = virDomainMigrateCheckNotLocal(data->uri);
if (ret == -1) {
if (data->fail) {
virResetLastError();
return 0;
}
return -1;
}
if (data->fail) {
VIR_TEST_DEBUG("passed instead of expected failure");
return -1;
}
return ret;
}
static int
mymain(void)
{
int ret = 0;
#define TEST_FULL(uri, fail) \
do { \
const struct migLocalData data = { \
uri, fail \
}; \
if (virTestRun("Test URI " # uri, testMigNotLocal, &data) < 0) \
ret = -1; \
} while (0)
#define TEST(uri) TEST_FULL(uri, false)
#define TEST_FAIL(uri) TEST_FULL(uri, true)
TEST_FAIL("qemu:///system");
TEST_FAIL("//localhost");
TEST_FAIL("tcp://localhost.localdomain/");
TEST("scheme://some.cryptorandom.fqdn.tld");
TEST("hehe+unix:///?socket=/path/to/some-sock");
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
VIR_TEST_MAIN(mymain)