[Avocado-devel] RFC: Configuration by convention

Beraldo Leal bleal at redhat.com
Mon Dec 2 18:56:44 UTC 2019


Hi Lukáš,

My comments are below. If I didn't reply to a specific topic is because
I'm waiting for more replies to take into consideration.

On Mon, Dec 02, 2019 at 04:57:28PM +0100, Lukáš Doktor wrote:
> Dne 02. 12. 19 v 15:30 Beraldo Leal napsal(a):
> > On Thu, Nov 28, 2019 at 04:00:17PM +0100, Lukáš Doktor wrote:
> >> Dne 21. 11. 19 v 22:23 Beraldo Leal napsal(a):
> >>> Motivation
> >>> ##########
> >>>
> >>> An Avocado Job is primarily executed through the `avocado run` command line.
> >>> The behavior of such an Avocado Job is determined by parsing the following
> >>> settings (listed in parsed order):
> >>>
> >>>  1) Default values in source code
> >>>  2) Configuration file contents
> >>>  3) Command-line options
> >>>
> >>
> >> I'm missing in this RFC some kind of mapping the above. I think if we
> >> are to do those intrusive changes, we should spend some time on
> >> specifying the relations. (but maybe I just missed it)
> > 
> > Not sure if I understood. What kind of relations do you suggest? Maybe
> > now, I'm missing something. The idea was to simply show the order that
> > options are parsed and overridden, just to give some context.
> > 
> 
> While talking about standardization of args/conf options I though it'd
> be nice to define some standard mapping to override configuration
> options from cmdline arguments. What I mean is eg the `--sysinfo`.
> Obviously it whouldn't fit everything, but would be nice to know that:
> 
> --sysinfo $VALUE
> 
> is the same as
> 
> ```
> [sysinfo.collect]
> enabled = $VALUE
> ```
> 
> and maps to:
> 
> {sysinfo: $VALUE}
> 
> job param. Obviously there would be exceptions, but we could create
> guidelines to cover most cases. Additionally even discussing this
> might help identify the sections/arguments.

Yes, I see and agree with you. The idea was to add this in a
"Configuration Reference" section in one of our guides. That was what I
tried to explain in the "How to Teach This".

> The default comes from /etc. You can checkout the `avocado/plugins/run.py` for details:
> 
>         sysinfo_default = settings.get_value('sysinfo.collect',
>                                              'enabled',
>                                              key_type='bool',
>                                              default=True)
>         sysinfo_default = 'on' if sysinfo_default is True else 'off'
>         parser.add_argument('--sysinfo', choices=('on', 'off'),
>                             default=sysinfo_default, help="Enable or disable "
>                             "system information (hardware details, profilers, "
>                             "etc.). Current:  %(default)s")
> 
> 1. `--sysinfo on` => force-enable
> 2. `--sysinfo off` => force-disable
> 3. no `--sysinfo` => use the value from /etc

IIUC, the default comes from the source code:

  settings.get_value(..., default=True)

If the option is missing on config file and there is no --sysinfo option
on command line, the default will be "True", right?

So, there are 3 ways to use, but the possible values are "on" or "off",
right? Fix-me if I'm wrong, but what is the third option other than,
"on" and "off"? The key_type is still a bool, right?

The default option, IMO, should be in source code, not /etc. In that
way, the user can have a minimum config file or an empty one. And I
think that is what is implemented, today.

> >>     avocado run --loaders LOADERS [LOADERS ...]
> >>
> >> is that acceptable?
> > 
> > Yes, and I liked this one, it is better than my suggestions.
> > 
> 
> Great, thanks and +1 to this one. Also note there is one caveat, it
> must not be used for main arguments, otherwise you won't be able to
> specify the `subcommand`. This is why the `--show` accepts only a
> single argument and uses custom split (`,`). Something like:
> 
>     avocado --show foo bar baz run passtest.py
> 
> is not possible, because the argparse can't decide which is the
> subcommand and which is the `--show` argument. For subcommand options
> it is possible, because one can use `--` to indicate end of the
> options:
> 
>     avocado run --loaders foo bar -- passtest.py
> 
> or simply add another option that consumes given amount of arguments
> (but it is hackish :-) ):
> 
>     avocado run --loaders foo bar --sysinfo on passtest.py

Noted and I will take this in consideration. Thanks.

> >>> Presentation
> >>> ------------
> >>>
> >>> As the avocado trend is to have more and more plugins, I believe that to make
> >>> it easier for the user to find where each configuration is, we should split the
> >>> file into smaller files, leaving one file for each plugin. Avocado already
> >>> supports that with the conf.d directory. What do you think?
> >>>
> >>
> >> I'd go with core+core-plugins and plugins, therefor basically the
> >> current situation. I don't think we need to extract the core-plugins
> >> from the core-configuration (talking about the essential set of
> >> plugins like "run").
> > 
> > Not sure if I understood your "formula". Could you please provide an
> > example? And what it is considered "core", in your option?
> > 
> 
> core-plugins are all plugins that are always installed (therefor the
> `avocado.plugins` namespace). So basically we'd only create separate
> files for `optional_plugins` (yaml_loader) or the plugins that live
> outside of our repository (eg. avocado-vt).

I see. Let's wait for more comments on this.

> > I'm sorry it was not clear. I must have expressed myself wrong. This is
> > not about the Job API yet. Just a preparation for that.
> > 
> > This RFC is about a convention for our configuration options:
> > 
> >   1. "implicit" (default values);
> >   2. "more permanent" (config files);
> >   3. "temporary/runtime" (argument options)
> > 
> > This section is about how to teach this new convention to new users. I
> > could not find a detailed configuration reference on our docs, with all
> > default options, for instance.
> > 
> 
> For me the important part is to have the correct defaults in `--help`
> and list of all setting in `avocado config`. As for the documentation,
> perhaps we can generate the `avocado config` output on readthedocs.io,
> if you think it's important to keep them somewhere, but the runtime
> options are more important to me.

We are on the same page here.

Regards,
Beraldo





More information about the Avocado-devel mailing list