test: nodedev: fill active_config at driver startup time

Commit v10.0.0-265-ge67bca23e4 added a `active_config` and
`defined_config` to nodedev mdev internal XML handling.
`defined_config` can be filled at XML parse time, but `active_config`
must be filled in by nodedev driver. This wasn't implemented for the
test driver however, which caused virt-manager test suite regressions.

Working example:

```
$ virsh --connect test:///home/crobinso/src/virt-manager/tests/data/testdriver/testdriver.xml nodedev-dumpxml mdev_8e37ee90_2b51_45e3_9b25_bf8283c03110
<device>
  <name>mdev_8e37ee90_2b51_45e3_9b25_bf8283c03110</name>
  <path>/sys/devices/css0/0.0.0023/8e37ee90-2b51-45e3-9b25-bf8283c03110</path>
  <parent>css_0_0_0023</parent>
  <capability type='mdev'>
    <type id='vfio_ccw-io'/>
    <iommuGroup number='0'/>
  </capability>
</device>
```

Broken example:

```
$ virsh --connect test:///home/crobinso/src/virt-manager/tests/data/testdriver/testdriver.xml nodedev-dumpxml mdev_8e37ee90_2b51_45e3_9b25_bf8283c03110
<device>
  <name>mdev_8e37ee90_2b51_45e3_9b25_bf8283c03110</name>
  <path>/sys/devices/css0/0.0.0023/8e37ee90-2b51-45e3-9b25-bf8283c03110</path>
  <parent>css_0_0_0023</parent>
  <capability type='mdev'>
    <iommuGroup number='0'/>
  </capability>
</device>
```

There's already code that does what we want in the test suite.
Move it to a shared function, and call it in test driver when
creating a nodedev from driver startup XML.

Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
Cole Robinson 2024-04-06 15:13:40 -04:00
parent 8ee34bb551
commit 948d496d25
5 changed files with 32 additions and 15 deletions

View File

@ -2804,6 +2804,30 @@ virNodeDeviceCapsListExport(virNodeDeviceDef *def,
return ncaps; return ncaps;
} }
void
virNodeDeviceSyncMdevActiveConfig(virNodeDeviceDef *def)
{
size_t i;
virNodeDevCapsDef *caps;
for (caps = def->caps; caps; caps = caps->next) {
virNodeDevCapData *data = &caps->data;
if (caps->data.type != VIR_NODE_DEV_CAP_MDEV)
continue;
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);
}
}
}
#ifdef __linux__ #ifdef __linux__

View File

@ -470,3 +470,6 @@ virNodeDeviceUpdateCaps(virNodeDeviceDef *def);
int int
virNodeDeviceCapsListExport(virNodeDeviceDef *def, virNodeDeviceCapsListExport(virNodeDeviceDef *def,
virNodeDevCapType **list); virNodeDevCapType **list);
void
virNodeDeviceSyncMdevActiveConfig(virNodeDeviceDef *def);

View File

@ -888,6 +888,7 @@ virNodeDeviceGetPCIDynamicCaps;
virNodeDeviceGetSCSIHostCaps; virNodeDeviceGetSCSIHostCaps;
virNodeDeviceGetSCSITargetCaps; virNodeDeviceGetSCSITargetCaps;
virNodeDeviceGetWWNs; virNodeDeviceGetWWNs;
virNodeDeviceSyncMdevActiveConfig;
virNodeDeviceUpdateCaps; virNodeDeviceUpdateCaps;

View File

@ -1272,6 +1272,7 @@ testParseNodedevs(testDriver *privconn,
virNodeDeviceObjSetPersistent(obj, true); virNodeDeviceObjSetPersistent(obj, true);
virNodeDeviceObjSetActive(obj, true); virNodeDeviceObjSetActive(obj, true);
virNodeDeviceObjSetSkipUpdateCaps(obj, true); virNodeDeviceObjSetSkipUpdateCaps(obj, true);
virNodeDeviceSyncMdevActiveConfig(def);
virNodeDeviceObjEndAPI(&obj); virNodeDeviceObjEndAPI(&obj);
} }

View File

@ -24,7 +24,6 @@ testCompareXMLToXMLFiles(const char *xml, const char *outfile, unsigned int flag
int ret = -1; int ret = -1;
virNodeDeviceDef *dev = NULL; virNodeDeviceDef *dev = NULL;
virNodeDevCapsDef *caps; virNodeDevCapsDef *caps;
size_t i;
if (virTestLoadFile(xml, &xmlData) < 0) if (virTestLoadFile(xml, &xmlData) < 0)
goto fail; goto fail;
@ -52,22 +51,11 @@ testCompareXMLToXMLFiles(const char *xml, const char *outfile, unsigned int flag
data->storage.logical_block_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 (!(flags & VIR_NODE_DEVICE_XML_INACTIVE))
virNodeDeviceSyncMdevActiveConfig(dev);
if (!(actual = virNodeDeviceDefFormat(dev, flags))) if (!(actual = virNodeDeviceDefFormat(dev, flags)))
goto fail; goto fail;