On Mon, 2021-06-28 at 16:12 +0200, Martin Kletzander wrote:
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(a)gmail.com>
> > > ---
> > > 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 so much! I learned a lot from you.
So I will implement the function and put it in domain_conf.c until
someone gives a better solution.
And I have another question, as it's freeze for 7.5.0, should I change
the version number in comments to 7.6.0 in the new patches? Thanks!