[dev][tc] Part 2: Evaluating projects in relation to OpenStack cloud vision

Chris Dent cdent+os at anticdent.org
Sun Feb 10 21:08:29 UTC 2019


On Sun, 10 Feb 2019, Chris Dent wrote:

> It's not clear at this point whether these sorts of things should be
> documented in projects, or somewhere more central. So perhaps we can
> just talk about it here in email and figure something out. I'll
> followup with some I have for placement, since that's the project
> I've given the most attention.

Conversation on vision reflection for placement [1] is what reminded
me that this part 2 is something we should be doing.

I should disclaim that I'm the author of a lot of the architecture
of placement so I'm hugely biased. Please call me out where my
preferences are clouding reality. Other contributors to placement
probably have other ideas. They would be great to hear.

However, it's been at least two years since we started, so I think we
can extract some useful lessons.

Things have have worked out well (you can probably see a theme):

* Placement is a single purpose service with, until very recently,
   only the WSGI service as the sole moving part. There are now
   placement-manage and placement-status commands, but they are
   rarely used (thankfully). This makes the system easier to reason
   about than something with multiple agents. Obviously some things
   need lots of agents. Placement isn't one of them.

* Using gabbi [2] as the framework for functional tests of the API
   and using them to enable test-driven-development, via those
   functional tests, has worked out really well. It keeps the focus on that
   sole moving part: The API.

* No RPC, no messaging, no notifications.

* Very little configuration, reasonable defaults to that config.
   It's possible to run a working placement service with two config
   settings, if you are not using keystone. Keystone adds a few more,
   but not that much.

* String adherence to WSGI norms (that is, any WSGI server can run a
   placement WSGI app) and avoidance of eventlet, but see below. The
   combination of this with small number of moving parts and little
   configuration make it super easy to deploy placement [3] in lots
   of different setups, from tiny to huge, scaling and robustifying
   those setups as required.

* Declarative URL routing. There's a dict which maps HTTP method:URL
   pairs to python functions. Clear dispatch is a _huge_ help when
   debugging. Look one place, as a computer or human, to find where
   to go.

* microversion-parse [4] has made microversion handling easy.

Things that haven't gone so well (none of these are dire) and would
have been nice to do differently had we but known:

* Because of a combination of "we might need it later", "it's a
   handy tool and constraint" and "that's the way we do things" the
   interface between the placement URL handlers and the database is
   mediated through oslo versioned objects. Since there's no RPC, nor
   inter-version interaction, this is overkill. It also turns out that
   OVO getters and setters are a moderate factor in performance.
   Initially we were versioning the versioned objects, which created
   a lot of cognitive overhead when evolving the system, but we no
   longer do that, now that we've declared RPC isn't going to happen.

* Despite the strict adherence to being a good WSGI citizen
   mentioned above, placement is using a custom (very limited)
   framework for the WSGI application. An initial proof of concept
   used flask but it was decided that introducing flask into the nova
   development environment would be introducing another thing to know
   when decoding nova. I suspect the expected outcome was that
   placement would reuse nova's framework, but the truth is I simply
   couldn't do it. Declarative URL dispatch was a critical feature
   that has proven worth it. The resulting code is relatively
   straightforward but it is unicorn where a boring pony would have
   been the right thing. Boring ponies are very often the right
   thing.

I'm sure there are more here, but I've run out of brain.

[1] https://review.openstack.org/#/c/630216/
[2] https://gabbi.readthedocs.io/
[3] https://anticdent.org/placement-from-pypi.html
[4] https://pypi.org/project/microversion_parse/

-- 
Chris Dent                       ٩◔̯◔۶           https://anticdent.org/
freenode: cdent                                         tw: @anticdent


More information about the openstack-discuss mailing list