[libvirt PATCH v3 12/21] api: add virNodeDeviceDefineXML()
Erik Skultety
eskultet at redhat.com
Wed Jan 6 13:48:33 UTC 2021
On Thu, Dec 24, 2020 at 08:14:36AM -0600, Jonathon Jongsma wrote:
> With mediated devices, we can now define persistent node devices that
> can be started and stopped. In order to take advantage of this, we need
> an API to define new node devices.
>
> Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
> ---
...
> diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
> index cf31f937d5..8fae4352ff 100644
> --- a/src/libvirt_public.syms
> +++ b/src/libvirt_public.syms
> @@ -877,6 +877,7 @@ LIBVIRT_6.10.0 {
This will likely be 7.1.0+ - just so that we don't forget to update it :)
> global:
> virDomainAuthorizedSSHKeysGet;
> virDomainAuthorizedSSHKeysSet;
> + virNodeDeviceDefineXML;
> } LIBVIRT_6.0.0;
>
> # .... define new API here using predicted next version number ....
> diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
> index 0bebd534d0..4fbe8743b4 100644
> --- a/src/node_device/node_device_driver.c
> +++ b/src/node_device/node_device_driver.c
> @@ -698,9 +698,13 @@ nodeDeviceFindAddressByName(const char *name)
> }
>
>
> -virCommandPtr
> -nodeDeviceGetMdevctlStartCommand(virNodeDeviceDefPtr def,
> - char **uuid_out)
> +/* the mdevctl 'start' and 'define' commands accept almost the exact same
> + * arguments, so provide a common implementation that can be wrapped by a more
> + * specific function */
> +static virCommandPtr
> +nodeDeviceGetMdevctlDefineStartCommand(virNodeDeviceDefPtr def,
> + const char *subcommand,
> + char **uuid_out)
> {
> virCommandPtr cmd;
> g_autofree char *json = NULL;
> @@ -718,7 +722,7 @@ nodeDeviceGetMdevctlStartCommand(virNodeDeviceDefPtr def,
> return NULL;
> }
>
> - cmd = virCommandNewArgList(MDEVCTL, "start",
> + cmd = virCommandNewArgList(MDEVCTL, subcommand,
> "-p", parent_addr,
> "--jsonfile", "/dev/stdin",
> NULL);
> @@ -729,6 +733,22 @@ nodeDeviceGetMdevctlStartCommand(virNodeDeviceDefPtr def,
> return cmd;
> }
>
> +virCommandPtr
> +nodeDeviceGetMdevctlStartCommand(virNodeDeviceDefPtr def,
> + char **uuid_out)
> +{
> + return nodeDeviceGetMdevctlDefineStartCommand(def, "start", uuid_out);
> +}
> +
^These hunks should be in a separate preparation patch
...
> + .nodeDeviceDefineXML = nodeDeviceDefineXML, /* 6.5.0 */
7.x.0
> .nodeDeviceCreateXML = remoteNodeDeviceCreateXML, /* 0.6.3 */
> + .nodeDeviceDefineXML = remoteNodeDeviceDefineXML, /* 6.5.0 */
7.x.0
> .nodeDeviceDestroy = remoteNodeDeviceDestroy /* 0.6.3 */
> };
>
>
> /* capture stdin passed to command */
> @@ -45,12 +51,17 @@ nodedevCompareToFile(const char *actual,
> return virTestCompareToFile(replacedCmdline, filename);
> }
<HUNK_START
>
> +
> +typedef virCommandPtr (*GetStartDefineCmdFunc)(virNodeDeviceDefPtr, char **);
MdevctlCmdFunc would be probably a better name.
> +
> +
> static int
> testMdevctlStart(const char *virt_type,
> int create,
> + GetStartDefineCmdFunc get_cmd_func,
mdevctl_cmd_func probably?
> const char *mdevxml,
> - const char *startcmdfile,
> - const char *startjsonfile)
> + const char *cmdfile,
> + const char *jsonfile)
> {
> g_autoptr(virNodeDeviceDef) def = NULL;
> virNodeDeviceObjPtr obj = NULL;
> @@ -66,7 +77,7 @@ testMdevctlStart(const char *virt_type,
>
> /* this function will set a stdin buffer containing the json configuration
> * of the device. The json value is captured in the callback above */
> - cmd = nodeDeviceGetMdevctlStartCommand(def, &uuid);
> + cmd = get_cmd_func(def, &uuid);
>
> if (!cmd)
> goto cleanup;
> @@ -78,10 +89,10 @@ testMdevctlStart(const char *virt_type,
> if (!(actualCmdline = virBufferCurrentContent(&buf)))
> goto cleanup;
>
> - if (nodedevCompareToFile(actualCmdline, startcmdfile) < 0)
> + if (nodedevCompareToFile(actualCmdline, cmdfile) < 0)
> goto cleanup;
>
> - if (virTestCompareToFile(stdinbuf, startjsonfile) < 0)
> + if (virTestCompareToFile(stdinbuf, jsonfile) < 0)
> goto cleanup;
>
> ret = 0;
> @@ -96,17 +107,31 @@ static int
> testMdevctlStartHelper(const void *data)
> {
> const struct startTestInfo *info = data;
> + const char *cmd;
> + GetStartDefineCmdFunc func;
> + g_autofree char *mdevxml = NULL;
> + g_autofree char *cmdlinefile = NULL;
> + g_autofree char *jsonfile = NULL;
> +
> + if (info->command == MDEVCTL_CMD_START) {
> + cmd = "start";
> + func = nodeDeviceGetMdevctlStartCommand;
<HUNK_END
^These hunks should be in a separate preparation patch (part of the one I
mentioned earlier in this reply).
> + } else if (info->command == MDEVCTL_CMD_DEFINE) {
> + cmd = "define";
> + func = nodeDeviceGetMdevctlDefineCommand;
> + } else {
> + return -1;
> + }
>
> - g_autofree char *mdevxml = g_strdup_printf("%s/nodedevschemadata/%s.xml",
> - abs_srcdir, info->filename);
> - g_autofree char *cmdlinefile = g_strdup_printf("%s/nodedevmdevctldata/%s-start.argv",
> - abs_srcdir, info->filename);
> - g_autofree char *jsonfile = g_strdup_printf("%s/nodedevmdevctldata/%s-start.json",
> - abs_srcdir, info->filename);
> + mdevxml = g_strdup_printf("%s/nodedevschemadata/%s.xml", abs_srcdir,
> + info->filename);
> + cmdlinefile = g_strdup_printf("%s/nodedevmdevctldata/%s-%s.argv",
> + abs_srcdir, info->filename, cmd);
> + jsonfile = g_strdup_printf("%s/nodedevmdevctldata/%s-%s.json", abs_srcdir,
> + info->filename, cmd);
>
> - return testMdevctlStart(info->virt_type,
> - info->create, mdevxml, cmdlinefile,
> - jsonfile);
> + return testMdevctlStart(info->virt_type, info->create, func,
> + mdevxml, cmdlinefile, jsonfile);
> }
The same applies to ^these hunks as well.
>
> static int
> @@ -347,15 +372,18 @@ mymain(void)
> if (virTestRun(desc, func, info) < 0) \
> ret = -1;
>
> -#define DO_TEST_START_FULL(virt_type, create, filename) \
> +#define DO_TEST_START_FULL(desc, virt_type, create, filename, command) \
At this point I think this wrapper macro should be called DO_TEST_CMD instead.
The API functionality looks okay, ACK.
Erik
More information about the libvir-list
mailing list