[requirements][oslo] Inclusion of CONFspirator in openstack/requirements
Adrian Turjak
adriant at catalystcloud.nz
Fri Aug 21 04:59:24 UTC 2020
On 21/08/20 9:16 am, Ben Nemec wrote:
>
> In general, given the complexity of what you're talking about I think
> a driver plugin would be the way to go, as opposed to trying to fit
> this all in with the core oslo.config functionality (assuming you/we
> decide to pursue integrating at all).
>
> There were a few other things you mentioned as features of the
> library. The following are some off-the-cuff thoughts without having
> looked too closely at the library, so if they're nonsense that's my
> excuse.
>
> "because I have plugins that need to dynamically load config on
> startup, which then has to be lazy_loaded"
>
> Something like this could probably be done. I believe this is kind of
> how the castellan driver in oslo.config works. Config values are
> looked up and cached on-demand, as opposed to all at once.
This one is a little weird, but essentially the way this works this in
Adjutant:
I load the config so I can start the app and go through base logic and
loading plugins, but the config groups that are pulled from plugins
aren't added to my config group tree until AFTER the config has already
been loaded. So part of the config is usable, but some hasn't yet fully
been loaded until after the plugins are done, and then that subtree will
lazy_load itself when first accessed. It means that until a given
lazy_loaded group is actually accessed as config, the config tree
underneath it can still have config options added. It's likely not too
crazy to do this in oslo, and have groups only read from the cached
source (loaded file dict) when first accessed.
>
> "I also have weird overlay logic for defaults that can be overridden"
>
> My knee-jerk reaction to this is that oslo.config already supports
> overriding defaults, so I assume there's something about your use case
> that didn't mesh with that functionality? Or is this part of
> oslo.config that you reused?
Sooo, this one is a little special because what this feature lets you do
is take any group in the config tree once loaded, and call the overlay
function on it with either a dict, or another group. The returned value
will be a deep copy of the config tree with the values present in the
given dict/group overlaid on that original group. As in a depth first
dict update, where only keys that exist on the overriding dict will be
updated in the copy of the original dict.
I need to write the docs for this... with a sane example, but here is my
unit test for it:
https://gitlab.com/catalyst-cloud/confspirator/-/blob/master/confspirator/tests/test_configs.py#L211
I use this in Adjutant by having some config groups which are a default
for something, and another place where many things can override that
default via another group in the config, so I create an overlay copy and
pass that to the place that needs the config it it's most specific case
when the code actually pulls values from the conf group I passed it.
See:
https://opendev.org/openstack/adjutant/src/branch/master/adjutant/actions/v1/base.py#L146-L167
I hope that helps, because it is in my mind a little odd to explain, but
it allows some useful things when reusing actions in different tasks.
> "I also have nested config groups that need to be named dynamically to
> allow plugin classes to be extended without subclasses sharing the
> same config group name."
>
> Minus the nesting part, this is also something being done with
> oslo.config today. The config driver feature actually uses dynamically
> named groups, and I believe at least Cinder is using them too. They do
> cause a bit of grief for some config tools, like the validator, but it
> is possible to do something like this.
Cool! yeah I implemented that feature in my code because I ran into a
case of confliciting namespaces and needed to find a better way to
handle subclasses that needed to have different dynamic names for their
config groups.
>
> Now, as to the question of whether we should try to integrate this
> library with oslo.config: I don't know. Helpful, right?
That's mostly where we got to last time I asked in #openstack-oslo!
>
> I think answering that question definitively would take a deeper dive
> into what the new library is doing differently than I can commit to.
> As I noted above, I don't think the things you're doing are so far out
> in left field that it would be unreasonable to consider integrating
> into oslo.config, but the devil is in the details and there are a lot
> of details here that I don't know anything about. For example, will
> the oslo.config data model even accommodate nested groups? I suspect
> it doesn't now, but could it? Probably, but I can't say how
> difficult/disruptive it would be.
I looked into it briefly, and to do what I wanted, while also
maintaining oslo.config how it was... ended up a bit messy, so I gave up
because it would take too long and the politics of trying to get it
merged/reviewed wouldn't be worth the effort most likely.
>
> If someone wanted to make incremental progress toward integration, I
> think writing a basic YAML driver for oslo.config would be a good
> start. It would be generally useful even if this work doesn't go
> anywhere, and it would provide a basis for a hypothetical future
> YAML-based driver providing CONFspirator functionality. From there we
> could start looking to integrate more advanced features one at a time.
>
> Apologies for the wall of text. I hope you got something out of this
> before your eyes glazed over.
>
> -Ben
>
Thanks for the wall of text! It was useful!
I think ultimately it may be safer just maintaining my own separate
library. For people who don't want to use .ini and prefer yaml/toml it's
simpler, and for people who prefer .ini and don't need nesting etc, it's
safer to keep oslo.config as it is. If someone does find anything I've
done that makes sense in oslo.config I'd be happy to work porting it
over, but I don't want to make structural changes to it. I'll always
keep an eye on oslo.config, and may occasionally steal the odd idea if
you add something cool, but I think other than my use of types.py and
some of the Opt classes as a base, my code has diverged quite a bit.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-discuss/attachments/20200821/f61de1e7/attachment.html>
More information about the openstack-discuss
mailing list