2012-03-26 17:09:31 +00:00
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
2013-04-16 13:41:44 +00:00
|
|
|
#include "testutils.h"
|
|
|
|
|
2012-03-26 17:09:31 +00:00
|
|
|
#ifdef WITH_LXC
|
|
|
|
|
|
|
|
# include "internal.h"
|
|
|
|
# include "lxc/lxc_conf.h"
|
|
|
|
# include "testutilslxc.h"
|
2013-04-03 10:36:23 +00:00
|
|
|
# include "virstring.h"
|
2012-03-26 17:09:31 +00:00
|
|
|
|
2013-06-07 15:10:28 +00:00
|
|
|
# define VIR_FROM_THIS VIR_FROM_NONE
|
|
|
|
|
2012-03-26 17:09:31 +00:00
|
|
|
static virCapsPtr caps;
|
2013-03-31 18:03:42 +00:00
|
|
|
static virDomainXMLOptionPtr xmlopt;
|
2012-03-26 17:09:31 +00:00
|
|
|
|
|
|
|
struct testInfo {
|
|
|
|
const char *name;
|
|
|
|
int different;
|
|
|
|
bool inactive_only;
|
2016-02-25 14:21:49 +00:00
|
|
|
unsigned int parse_flags;
|
2012-03-26 17:09:31 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static int
|
|
|
|
testCompareXMLToXMLHelper(const void *data)
|
|
|
|
{
|
|
|
|
const struct testInfo *info = data;
|
|
|
|
char *xml_in = NULL;
|
|
|
|
char *xml_out = NULL;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
if (virAsprintf(&xml_in, "%s/lxcxml2xmldata/lxc-%s.xml",
|
|
|
|
abs_srcdir, info->name) < 0 ||
|
|
|
|
virAsprintf(&xml_out, "%s/lxcxml2xmloutdata/lxc-%s.xml",
|
|
|
|
abs_srcdir, info->name) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
2016-01-08 20:55:44 +00:00
|
|
|
ret = testCompareDomXML2XMLFiles(caps, xmlopt, xml_in,
|
|
|
|
info->different ? xml_out : xml_in,
|
2016-01-27 20:55:01 +00:00
|
|
|
!info->inactive_only,
|
2018-03-02 15:58:50 +00:00
|
|
|
info->parse_flags,
|
2016-04-08 16:04:10 +00:00
|
|
|
TEST_COMPARE_DOM_XML2XML_RESULT_SUCCESS);
|
2014-03-25 06:53:44 +00:00
|
|
|
cleanup:
|
2012-03-26 17:09:31 +00:00
|
|
|
VIR_FREE(xml_in);
|
|
|
|
VIR_FREE(xml_out);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
mymain(void)
|
|
|
|
{
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
if ((caps = testLXCCapsInit()) == NULL)
|
2012-03-30 03:17:30 +00:00
|
|
|
return EXIT_FAILURE;
|
2012-03-26 17:09:31 +00:00
|
|
|
|
2013-03-31 18:03:42 +00:00
|
|
|
if (!(xmlopt = lxcDomainXMLConfInit()))
|
2013-03-05 15:17:24 +00:00
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
2017-11-03 12:09:47 +00:00
|
|
|
# define DO_TEST_FULL(name, is_different, inactive, parse_flags) \
|
|
|
|
do { \
|
|
|
|
const struct testInfo info = {name, is_different, inactive, \
|
|
|
|
parse_flags}; \
|
|
|
|
if (virTestRun("LXC XML-2-XML " name, \
|
|
|
|
testCompareXMLToXMLHelper, &info) < 0) \
|
|
|
|
ret = -1; \
|
2012-03-26 17:09:31 +00:00
|
|
|
} while (0)
|
|
|
|
|
|
|
|
# define DO_TEST(name) \
|
2016-02-25 14:21:49 +00:00
|
|
|
DO_TEST_FULL(name, 0, false, 0)
|
2012-03-26 17:09:31 +00:00
|
|
|
|
|
|
|
# define DO_TEST_DIFFERENT(name) \
|
2016-02-25 14:21:49 +00:00
|
|
|
DO_TEST_FULL(name, 1, false, 0)
|
2012-03-26 17:09:31 +00:00
|
|
|
|
|
|
|
/* Unset or set all envvars here that are copied in lxcdBuildCommandLine
|
|
|
|
* using ADD_ENV_COPY, otherwise these tests may fail due to unexpected
|
|
|
|
* values for these envvars */
|
|
|
|
setenv("PATH", "/bin", 1);
|
|
|
|
|
|
|
|
DO_TEST("systemd");
|
2012-11-23 13:50:29 +00:00
|
|
|
DO_TEST("hostdev");
|
2013-04-22 14:06:14 +00:00
|
|
|
DO_TEST("disk-formats");
|
LXC: Fix handling of RAM filesystem size units
Since 76b644c when the support for RAM filesystems was introduced,
libvirt accepted the following XML:
<source usage='1024' unit='KiB'/>
This was parsed correctly and internally stored in bytes, but it
was formatted as (with an extra 's'):
<source usage='1024' units='KiB'/>
When read again, this was treated as if the units were missing,
meaning libvirt was unable to parse its own XML correctly.
The usage attribute was documented as being in KiB, but it was not
scaled if the unit was missing. Transient domains still worked,
because this was balanced by an extra 'k' in the mount options.
This patch:
Changes the parser to use 'units' instead of 'unit', as the latter
was never documented (fixing persistent domains) and some programs
(libvirt-glib, libvirt-sandbox) already parse the 'units' attribute.
Removes the extra 'k' from the tmpfs mount options, which is needed
because now we parse our own XML correctly.
Changes the default input unit to KiB to match documentation, fixing:
https://bugzilla.redhat.com/show_bug.cgi?id=1015689
2013-10-09 12:17:13 +00:00
|
|
|
DO_TEST_DIFFERENT("filesystem-ram");
|
2013-11-07 17:14:32 +00:00
|
|
|
DO_TEST("filesystem-root");
|
2014-01-10 17:40:01 +00:00
|
|
|
DO_TEST("idmap");
|
2014-07-30 09:20:59 +00:00
|
|
|
DO_TEST("capabilities");
|
2015-08-20 13:46:17 +00:00
|
|
|
DO_TEST("sharenet");
|
2016-05-13 17:20:54 +00:00
|
|
|
DO_TEST("ethernet");
|
conf: support host-side IP/route information in <interface>
This is place as a sub-element of <source>, where other aspects of the
host-side connection to the network device are located (network or
bridge name, udp listen port, etc). It's a bit odd that the interface
we're configuring with this info is itself named in <target dev='x'/>,
but that ship sailed long ago:
<interface type='ethernet'>
<mac address='00:16:3e:0f:ef:8a'/>
<source>
<ip address='192.168.122.12' family='ipv4'
prefix='24' peer='192.168.122.1'/>
<ip address='192.168.122.13' family='ipv4' prefix='24'/>
<route family='ipv4' address='0.0.0.0'
gateway='192.168.122.1'/>
<route family='ipv4' address='192.168.124.0' prefix='24'
gateway='192.168.124.1'/>
</source>
</interface>
In practice, this will likely only be useful for type='ethernet', so
its presence in any other type of interface is currently forbidden in
the generic device Validate function (but it's been put into the
general population of virDomainNetDef rather than the
ethernet-specific union member so that 1) we can more easily add the
capability to other types if needed, and 2) we can retain the info
when set to an invalid interface type all the way through to
validation and report a proper error, rather than just ignoring it
(which is currently what happens for many other type-specific
settings).
(NB: The already-existing configuration of IP info for the guest-side
of interfaces is in subelements directly under <interface>, and the
name of the guest-side interface (when configurable) is in <guest
dev='x'/>).
(This patch had been pushed earlier in
commit fe6a77898a38f491403a70cc49925a584101daee, but was reverted in
commit d658456530c1010a49f45865613ed361a0fcc5b4 because it had been
accidentally pushed during the freeze for release 2.0.0)
2016-06-09 19:35:08 +00:00
|
|
|
DO_TEST("ethernet-hostip");
|
2017-05-30 15:03:58 +00:00
|
|
|
DO_TEST("initenv");
|
2017-05-31 13:32:11 +00:00
|
|
|
DO_TEST("initdir");
|
2017-06-06 08:54:16 +00:00
|
|
|
DO_TEST("inituser");
|
2012-03-26 17:09:31 +00:00
|
|
|
|
2013-02-01 12:26:18 +00:00
|
|
|
virObjectUnref(caps);
|
2013-03-31 18:03:42 +00:00
|
|
|
virObjectUnref(xmlopt);
|
2012-03-26 17:09:31 +00:00
|
|
|
|
2014-03-17 09:38:38 +00:00
|
|
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
2012-03-26 17:09:31 +00:00
|
|
|
}
|
|
|
|
|
2017-03-29 14:45:42 +00:00
|
|
|
VIR_TEST_MAIN(mymain)
|
2012-03-26 17:09:31 +00:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
int
|
|
|
|
main(void)
|
|
|
|
{
|
|
|
|
return EXIT_AM_SKIP;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* WITH_LXC */
|