Merge pull request #8992 from opensourcerouting/workflow-knobs

workflow: add guidelines for config knobs
This commit is contained in:
Russ White 2021-07-13 18:41:52 -04:00 committed by GitHub
commit 226732b19c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -880,6 +880,104 @@ doesn't warrant an update to checkpatch, it is documented here.
| should be wrapped in parentheses | all usages of the macro, which would be highly disruptive. |
+------------------------------------------+---------------------------------------------------------------+
Types of configurables
----------------------
.. note::
This entire section essentially just argues to not make configuration
unnecessarily involved for the user. Rather than rules, this is more of
a list of conclusions intended to help make FRR usable for operators.
Almost every feature FRR has comes with its own set of switches and options.
There are several stages at which configuration can be applied. In order of
preference, these are:
- at configuration/runtime, through YANG.
This is the preferred way for all FRR knobs. Not all daemons and features
are fully YANGified yet, so in some cases new features cannot rely on a
YANG interface. If a daemon already implements a YANG interface (even
partial), new CLI options must be implemented through a YANG model.
.. warning::
Unlike everything else in this section being guidelines with some slack,
implementing and using a YANG interface for new CLI options in (even
partially!) YANGified daemons is a hard requirement.
- at configuration/runtime, through the CLI.
The "good old" way for all regular configuration. More involved for users
to automate *correctly* than YANG.
- at startup, by loading additional modules.
If a feature introduces a dependency on additional libraries (e.g. libsnmp,
rtrlib, etc.), this is the best way to encapsulate the dependency. Having
a separate module allows the distribution to create a separate package
with the extra dependency, so FRR can still be installed without pulling
everything in.
A module may also be appropriate if a feature is large and reasonably well
isolated. Reducing the amount of running the code is a security benefit,
so even if there are no new external dependencies, modules can be useful.
While modules cannot currently be loaded at runtime, this is a tradeoff
decision that was made to allow modules to change/extend code that is very
hard to (re)adjust at runtime. If there is a case for runtime (un)loading
of modules, this tradeoff can absolutely be reevaluated.
- at startup, with command line options.
This interface is only appropriate for options that have an effect very
early in FRR startup, i.e. before configuration is loaded. Anything that
affects configuration load itself should be here, as well as options
changing the environment FRR runs in.
If a tunable can be changed at runtime, a command line option is only
acceptable if the configured value has an effect before configuration is
loaded (e.g. zebra reads routes from the kernel before loading config, so
the netlink buffer size is an appropriate command line option.)
- at compile time, with ``./configure`` options.
This is the absolute last preference for tunables, since the distribution
needs to make the decision for the user and/or the user needs to rebuild
FRR in order to change the option.
"Good" configure options do one of three things:
- set distribution-specific parameters, most prominently all the path
options. File system layout is a distribution/packaging choice, so the
user would hopefully never need to adjust these.
- changing toolchain behavior, e.g. instrumentation, warnings,
optimizations and sanitizers.
- enabling/disabling parts of the build, especially if they need
additional dependencies. Being able to build only parts of FRR, or
without some library, is useful. **The only effect these options should
have is adding or removing files from the build result.** If a knob
in this category causes the same binary to exist in different variants,
it is likely implemented incorrectly!
.. note::
This last guideline is currently ignored by several configure options.
``vtysh`` in general depends on the entire list of enabled daemons,
and options like ``--enable-bgp-vnc`` and ``--enable-ospfapi`` change
daemons internally. Consider this more of an "ideal" than a "rule".
Whenever adding new knobs, please try reasonably hard to go up as far as
possible on the above list. Especially ``./configure`` flags are often enough
the "easy way out" but should be avoided when at all possible. To a lesser
degree, the same applies to command line options.
Compile-time conditional code
-----------------------------