libvirt/tests/nodedevxml2xmltest.c
Boris Fiuczynski e67bca23e4 nodedev: add an active config to mdev
The configuration of a defined mdev can be modified after the mdev is
started. The defined configuration and the active configuration can
therefore run out of sync. Handle this by storing the modifiable data
which is the mdev type and attributes in two separate active and
defined configurations. mdevctl supports with callout scripts to do an
attribute retrieval of started mdevs which is already implemented in
libvirt.

Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Jonathon Jongsma <jjongsma@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2024-02-26 10:59:47 +01:00

185 lines
6.2 KiB
C

#include <config.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include "internal.h"
#include "testutils.h"
#include "node_device_conf.h"
#define VIR_FROM_THIS VIR_FROM_NONE
struct TestData {
const char *filename;
unsigned int flags;
};
static int
testCompareXMLToXMLFiles(const char *xml, const char *outfile, unsigned int flags)
{
g_autofree char *xmlData = NULL;
g_autofree char *actual = NULL;
int ret = -1;
virNodeDeviceDef *dev = NULL;
virNodeDevCapsDef *caps;
size_t i;
if (virTestLoadFile(xml, &xmlData) < 0)
goto fail;
if (!(dev = virNodeDeviceDefParse(xmlData, NULL, EXISTING_DEVICE, NULL,
NULL, NULL, false)))
goto fail;
/* Calculate some things that are not read in */
for (caps = dev->caps; caps; caps = caps->next) {
virNodeDevCapData *data = &caps->data;
if (caps->data.type == VIR_NODE_DEV_CAP_STORAGE) {
if (data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_REMOVABLE) {
if (data->storage.flags &
VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE) {
data->storage.logical_block_size = 2048;
data->storage.num_blocks =
data->storage.removable_media_size /
data->storage.logical_block_size;
}
} else {
data->storage.logical_block_size = 512;
data->storage.num_blocks = data->storage.size /
data->storage.logical_block_size;
}
}
if (caps->data.type == VIR_NODE_DEV_CAP_MDEV &&
!(flags & VIR_NODE_DEVICE_XML_INACTIVE)) {
data->mdev.active_config.type = g_strdup(data->mdev.defined_config.type);
for (i = 0; i < data->mdev.defined_config.nattributes; i++) {
g_autoptr(virMediatedDeviceAttr) attr = g_new0(virMediatedDeviceAttr, 1);
attr->name = g_strdup(data->mdev.defined_config.attributes[i]->name);
attr->value = g_strdup(data->mdev.defined_config.attributes[i]->value);
VIR_APPEND_ELEMENT(data->mdev.active_config.attributes,
data->mdev.active_config.nattributes,
attr);
}
}
}
if (!(actual = virNodeDeviceDefFormat(dev, flags)))
goto fail;
if (virTestCompareToFile(actual, outfile) < 0)
goto fail;
ret = 0;
fail:
virNodeDeviceDefFree(dev);
return ret;
}
static int
testCompareXMLToXMLHelper(const void *data)
{
int result = -1;
const struct TestData *tdata = data;
g_autofree char *xml = NULL;
g_autofree char *outfile = NULL;
xml = g_strdup_printf("%s/nodedevschemadata/%s.xml", abs_srcdir,
tdata->filename);
if (tdata->flags & VIR_NODE_DEVICE_XML_INACTIVE)
outfile = g_strdup_printf("%s/nodedevxml2xmlout/%s_inactive.xml", abs_srcdir,
tdata->filename);
else
outfile = g_strdup_printf("%s/nodedevxml2xmlout/%s.xml", abs_srcdir,
tdata->filename);
result = testCompareXMLToXMLFiles(xml, outfile, tdata->flags);
return result;
}
static int
mymain(void)
{
int ret = 0;
#define DO_TEST_FLAGS(desc, filename, flags) \
do { \
struct TestData data = { filename, flags }; \
if (virTestRun(desc, testCompareXMLToXMLHelper, &data) < 0) \
ret = -1; \
} \
while (0)
#define DO_TEST(name) \
DO_TEST_FLAGS("Node device XML-2-XML " name, name, 0)
#define DO_TEST_INACTIVE(name) \
DO_TEST_FLAGS("Node device XML-2-XML INACTIVE " name, \
name, VIR_NODE_DEVICE_XML_INACTIVE)
DO_TEST("computer");
DO_TEST("DVD_GCC_4247N");
DO_TEST("DVD_with_media");
DO_TEST("net_00_13_02_b9_f9_d3");
DO_TEST("net_00_15_58_2f_e9_55");
DO_TEST("pci_1002_71c4");
DO_TEST("pci_8086_10c9_sriov_pf");
DO_TEST("pci_8086_27c5_scsi_host_0");
DO_TEST("pci_8086_27c5_scsi_host_0_unique_id");
DO_TEST("pci_8086_27c5_scsi_host_scsi_device_lun0");
DO_TEST("pci_8086_27c5_scsi_host_scsi_host");
DO_TEST("pci_8086_27c5_scsi_host");
DO_TEST("storage_serial_SATA_HTS721010G9SA00_MPCZ12Y0GNGWSE");
DO_TEST("storage_serial_3600c0ff000d7a2a5d463ff4902000000");
DO_TEST("usb_device_1d6b_1_0000_00_1d_0_if0");
DO_TEST("usb_device_1d6b_1_0000_00_1d_0");
DO_TEST("pci_8086_4238_pcie_wireless");
DO_TEST("pci_8086_0c0c_snd_hda_intel");
DO_TEST("pci_0000_00_02_0_header_type");
DO_TEST("pci_0000_00_1c_0_header_type");
DO_TEST("scsi_target0_0_0");
DO_TEST("scsi_target1_0_0");
DO_TEST("pci_0000_02_10_7_sriov");
DO_TEST("pci_0000_02_10_7_sriov_vfs");
DO_TEST("pci_0000_02_10_7_sriov_zero_vfs_max_count");
DO_TEST("pci_0000_02_10_7_sriov_pf_vfs_all");
DO_TEST("pci_0000_02_10_7_sriov_pf_vfs_all_header_type");
DO_TEST("drm_renderD129");
DO_TEST("pci_0000_02_10_7_mdev_types");
DO_TEST("pci_0000_42_00_0_vpd");
DO_TEST("mdev_3627463d_b7f0_4fea_b468_f1da537d301b");
DO_TEST_INACTIVE("mdev_3627463d_b7f0_4fea_b468_f1da537d301b");
DO_TEST("ccw_0_0_ffff");
DO_TEST("css_0_0_ffff");
DO_TEST("css_0_0_ffff_channel_dev_addr");
DO_TEST("css_0_0_fffe_mdev_types");
DO_TEST("css_0_0_fffe_mdev_types_channel_dev_addr");
DO_TEST("ap_card07");
DO_TEST("ap_07_0038");
DO_TEST("ap_matrix");
DO_TEST("ap_matrix_mdev_types");
DO_TEST("mdev_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad");
DO_TEST("mdev_d069d019_36ea_4111_8f0a_8c9a70e21366");
DO_TEST("mdev_d2441d39_495e_4243_ad9f_beb3f14c23d9");
DO_TEST("mdev_fedc4916_1ca8_49ac_b176_871d16c13076");
DO_TEST_INACTIVE("mdev_ee0b88c4_f554_4dc1_809d_b2a01e8e48ad");
DO_TEST_INACTIVE("mdev_d069d019_36ea_4111_8f0a_8c9a70e21366");
DO_TEST_INACTIVE("mdev_d2441d39_495e_4243_ad9f_beb3f14c23d9");
DO_TEST_INACTIVE("mdev_fedc4916_1ca8_49ac_b176_871d16c13076");
DO_TEST("hba_vport_ops");
DO_TEST("mdev_c60cc60c_c60c_c60c_c60c_c60cc60cc60c");
DO_TEST_INACTIVE("mdev_c60cc60c_c60c_c60c_c60c_c60cc60cc60c");
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
VIR_TEST_MAIN(mymain)