On Mon, Jun 28, 2021 at 10:45:38AM +0800, Luke Yue wrote:
On Thu, 2021-06-24 at 17:19 +0200, Martin Kletzander wrote:On Thu, Jun 24, 2021 at 06:59:59PM +0800, Luke Yue wrote: > Signed-off-by: Luke Yue <lukedyue@xxxxxxxxx> > --- > src/test/test_driver.c | 53 > ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 53 insertions(+) > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > index 65710b78ef..dff96bceb6 100644 > --- a/src/test/test_driver.c > +++ b/src/test/test_driver.c > @@ -9331,6 +9331,58 @@ > testDomainCheckpointDelete(virDomainCheckpointPtr checkpoint, > return ret; > } > > +static int > +testDomainGetMessages(virDomainPtr dom, > + char ***msgs, > + unsigned int flags) > +{ > + virDomainObj *vm = NULL; > + int rv = -1; > + size_t i, n; > + int nmsgs; > + > + virCheckFlags(VIR_DOMAIN_MESSAGE_DEPRECATION | > + VIR_DOMAIN_MESSAGE_TAINTING, -1); > + > + if (!(vm = testDomObjFromDomain(dom))) > + return -1; > + > + *msgs = NULL; > + nmsgs = 0; > + n = 0; > + > + if (!flags || (flags & VIR_DOMAIN_MESSAGE_TAINTING)) { > + nmsgs += __builtin_popcount(vm->taint); > + *msgs = g_renew(char *, *msgs, nmsgs+1); > + > + for (i = 0; i < VIR_DOMAIN_TAINT_LAST; i++) { > + if (vm->taint & (1 << i)) { > + (*msgs)[n++] = g_strdup_printf( > + _("tainted: %s"), > + _(virDomainTaintMessageTypeToString(i))); > + } > + } > + } > + > + if (!flags || (flags & VIR_DOMAIN_MESSAGE_DEPRECATION)) { > + nmsgs += vm->ndeprecations; > + *msgs = g_renew(char *, *msgs, nmsgs+1); > + > + for (i = 0; i < vm->ndeprecations; i++) { > + (*msgs)[n++] = g_strdup_printf( > + _("deprecated configuration: %s"), > + vm->deprecations[i]); > + } > + } > + > + (*msgs)[nmsgs] = NULL; > + > + rv = nmsgs; > + > + virDomainObjEndAPI(&vm); > + return rv; > +} > + As I mentioned in the review for v1, it is nice that someone can check how this API behaves without spinning up a VM, just using the test driver. However most of this code is copy-paste from the qemu driver and can hence be extracted to a separate function which would be called from both drivers (and maybe more than the ones mentioned here are using the same logic). That would make the codebase smaller, the library smaller, it would keep the test driver updated and it would actually test the codepath used in the qemu driver. >I'm sorry, I forgot that. So if I want to extract a function like below ``` int virDomainGetMessagesFromVM(virDomainObj *vm, char **msgs, unsigned int flags) { size_t i, n; int nmsgs; int rv = -1; *msgs = NULL; nmsgs = 0; n = 0; ... rv = nmsgs; return rv; } ``` Where should I place this function? In `domain_conf.c` or somewhere else?
Good question. We do not have that many cases of such functions, so it does not have one file in the repo, however you can start by looking at what are the main parameters of the function. This one operates on virDomainObj, so it can either be in the driver itself (which we are trying to avoid) and somewhere in src/conf based on further info. Searching for other such functions, I just used a simple grep for this: rg '\(virDomainObj \*' src/conf or: git grep '(virDomainObj \*' src/conf and you can see that it does not fit in domain_event or domain_audit and it will most probably just be in domain.conf just like you suggested. I must admit that it is not a very clean approach as src/conf is mostly handling virDomainDef, but I guess we do not have enough of similar functions that would facilitate another creation of a new file in the directory. I would not stress myself out too much about that as the worst thing that can happen is that someone will have a better idea.
Thanks, Luke
Attachment:
signature.asc
Description: PGP signature