mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-21 21:25:25 +00:00
e67bca23e4
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>
185 lines
6.2 KiB
C
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)
|