<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>
    </p>
    <div class="moz-text-flowed" style="font-family: -moz-fixed;
      font-size: 12px;" lang="x-unicode">Hey OpenStackers!
      <br>
      <br>
      I'm hoping to add CONFspirator to openstack/requirements as I'm
      using it Adjutant:
      <br>
      <a class="moz-txt-link-freetext"
        href="https://review.opendev.org/#/c/746436/">https://review.opendev.org/#/c/746436/</a>
      <br>
      <br>
      The library has been in Adjutant for a while but I didn't add it
      to openstack/requirements, so I'm trying to remedy that now. I
      think it is different enough from oslo.config and I think the
      features/differences are ones that are unlikely to ever make sense
      in oslo.config without breaking it for people who do use it as it
      is, or adding too much complexity.
      <br>
      <br>
      I wanted to use oslo.config but quickly found that the way I was
      currently doing config in Adjutant was heavily dependent on yaml,
      and the ability to nest things. I was in a bind because I didn't
      have a declarative config system like oslo.config, and the config
      for Adjutant was a mess to maintain and understand (even for me,
      and I wrote it) with random parts of the code pulling config that
      may or may not have been set/declared.
      <br>
      <br>
      After finding oslo.config was not suitable for my rather weird
      needs, I took oslo.config as a starting point and ended up writing
      another library specific to my requirements in Adjutant, and
      rather than keeping it internal to Adjutant, moved it to an
      external library.
      <br>
      <br>
      CONFspirator was built for a weird and complex edge case, because
      I have plugins that need to dynamically load config on startup,
      which then has to be lazy_loaded. I also have weird overlay logic
      for defaults that can be overridden, and building it into the
      library made Adjutant simpler. 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. I
      built something specific to my needs, that just so happens to also
      be a potentially useful library for people wanting something like
      oslo.config but that is targeted towards yaml and toml, and the
      ability to nest groups.
      <br>
      <br>
      The docs are here: <a class="moz-txt-link-freetext"
        href="https://confspirator.readthedocs.io/">https://confspirator.readthedocs.io/</a>
      <br>
      The code is here: <a class="moz-txt-link-freetext"
        href="https://gitlab.com/catalyst-cloud/confspirator">https://gitlab.com/catalyst-cloud/confspirator</a>
      <br>
      <br>
      And for those interested in how I use it in Adjutant here are some
      places of interest (be warned, it may be a rabbit hole):
      <br>
      <a class="moz-txt-link-freetext"
href="https://opendev.org/openstack/adjutant/src/branch/master/adjutant/config">https://opendev.org/openstack/adjutant/src/branch/master/adjutant/config</a>
      <br>
      <a class="moz-txt-link-freetext"
href="https://opendev.org/openstack/adjutant/src/branch/master/adjutant/feature_set.py">https://opendev.org/openstack/adjutant/src/branch/master/adjutant/feature_set.py</a>
      <br>
      <a class="moz-txt-link-freetext"
href="https://opendev.org/openstack/adjutant/src/branch/master/adjutant/core.py">https://opendev.org/openstack/adjutant/src/branch/master/adjutant/core.py</a>
      <br>
      <a class="moz-txt-link-freetext"
href="https://opendev.org/openstack/adjutant/src/branch/master/adjutant/api/v1/openstack.py#L35-L44">https://opendev.org/openstack/adjutant/src/branch/master/adjutant/api/v1/openstack.py#L35-L44</a>
      <br>
      <a class="moz-txt-link-freetext"
href="https://opendev.org/openstack/adjutant/src/branch/master/adjutant/actions/v1/projects.py#L155-L164">https://opendev.org/openstack/adjutant/src/branch/master/adjutant/actions/v1/projects.py#L155-L164</a>
      <br>
      <a class="moz-txt-link-freetext"
href="https://opendev.org/openstack/adjutant/src/branch/master/adjutant/actions/v1/base.py#L146">https://opendev.org/openstack/adjutant/src/branch/master/adjutant/actions/v1/base.py#L146</a>
      <br>
      <a class="moz-txt-link-freetext"
href="https://opendev.org/openstack/adjutant/src/branch/master/adjutant/tasks/v1/base.py#L30">https://opendev.org/openstack/adjutant/src/branch/master/adjutant/tasks/v1/base.py#L30</a>
      <br>
      <a class="moz-txt-link-freetext"
href="https://opendev.org/openstack/adjutant/src/branch/master/adjutant/tasks/v1/base.py#L293">https://opendev.org/openstack/adjutant/src/branch/master/adjutant/tasks/v1/base.py#L293</a>
      <br>
      <br>
      If there are strong opinions about working to add this to
      oslo.config, let's chat, as I'm not against merging this into it
      somehow if we find a way that make sense, but while some aspects
      where similar, I felt that this was cleaner without being part of
      oslo.config because the mindset I was building towards seemed
      different and oslo.config didn't need my complexity.<br>
      <br>
      Cheers,
      <br>
      Adrian
      <br>
    </div>
  </body>
</html>