mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-06-05 19:33:11 +00:00
Merge pull request #8992 from opensourcerouting/workflow-knobs
workflow: add guidelines for config knobs
This commit is contained in:
commit
226732b19c
@ -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. |
|
| 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
|
Compile-time conditional code
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user