Add a spec for Pluggable do actions
Change-Id: Ia9c07215609c72671ce53e6a1e8e8390f3207c23 blueprint: pluggable-do-actions
This commit is contained in:
parent
209e0ae262
commit
190433c681
143
specs/pluggable-do-actions.rst
Normal file
143
specs/pluggable-do-actions.rst
Normal file
@ -0,0 +1,143 @@
|
||||
..
|
||||
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported License.
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
=================================
|
||||
Pluggable architecture for bareon
|
||||
=================================
|
||||
|
||||
https://blueprints.launchpad.net/bareon/+spec/pluggable-do-actions
|
||||
|
||||
At the current state bareon is monolitic tool.
|
||||
If one wants to add new drivers or do actions, then those changes should be
|
||||
landed into bareon's repo first. There's no convenient way to develop
|
||||
something as a 3rd party component or re-use actual codebase as a framework.
|
||||
That's why we need to introduce pluggable architecture.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Currently, there're few flaws in current bareon architecture:
|
||||
|
||||
* It's purely monolitic tool. It can't be split to few tools like
|
||||
bareon-base, bareon-provisioning, bareon-image-building,
|
||||
bareon-partitioning. The idea is to provide the way to separate these
|
||||
few stages like building OS root file system and putting this root file
|
||||
system on a node. It is easy to imagine when a user wants to install OS
|
||||
building root file system directly on a disk.
|
||||
|
||||
* Like it was said above, there's no convenient way to develop out of core.
|
||||
This is the main stopper for external contributors.
|
||||
|
||||
* It's hard to introduce new functionality or re-use existing one.
|
||||
|
||||
* It glues few do_actions into single combo and prevents from running actions
|
||||
separately. For example, run partitioning without provisioning.
|
||||
|
||||
* Current architecture is not expandable (maybe even maintainable). Pluggable
|
||||
extensions is one of the ways to resolve the problem.
|
||||
|
||||
Therefore, pluggable architecture is really necessary.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
Manager's do actions should be re-introduced as pluggable extensions.
|
||||
Therefore new directory for actions will be created:
|
||||
|
||||
bareon/actions/
|
||||
|
||||
Manager will be improved in order to work with these pluggable do actions.
|
||||
At least, manager should know how to check the presence of pluggable
|
||||
extensions and validate that input data already contains all necessary
|
||||
information for being processed later.
|
||||
|
||||
`stevedore`_ will be used as a convenient extension manager.
|
||||
|
||||
Moving towards with data-driven approach, the base class for all drivers will
|
||||
have only one method used only for initializing the data.
|
||||
Drivers still be free to implement any types of collections (schemes) of
|
||||
objects they needed.
|
||||
|
||||
Regarding data intersections. Sometimes objects are the result of an action.
|
||||
For example when we want to use cloud-init with configdrive for provisioning,
|
||||
we should somehow tell the driver responsible for partitioning to reserve the
|
||||
space for config drive. In order to resolve that:
|
||||
|
||||
* All objects are shared among multiple do actions
|
||||
|
||||
* These objects could be modified in run-time inside any of do action
|
||||
|
||||
* Every do action should have a validate method for these objects, which will
|
||||
asure us that provided data already satisfied all necessary requirements.
|
||||
For example, configdrive action should expect special type of partition to
|
||||
be created by partitioning action. Manager that performs partitioning
|
||||
action, in turn, will check that configdrive action queued and create the
|
||||
partition and reflect that in the objects.
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
The other ways are:
|
||||
|
||||
* Just make every do action independent from others, but then the node we
|
||||
want to only provision will have to have the dependencies for e.g.
|
||||
partitioning also. And it won't be expendable for Users.
|
||||
|
||||
* Create separate project for every usecase, but there will be lots of code
|
||||
duplications and hard to maintain.
|
||||
|
||||
We could use other plugin system like:
|
||||
|
||||
* `PluginBase`_
|
||||
|
||||
* `Yapsy`_
|
||||
|
||||
But they're not part of openstack' ecosystem. The idea is that having all
|
||||
projects use the same approach is more important than the objections to the
|
||||
approach. Sharing code between projects is great, but by also having projects
|
||||
use the same idioms for stuff like this it makes it much easier for people to
|
||||
work on multiple projects. Therefore, stevedore is the essential choice.
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
`Alexander Gordeev`_
|
||||
|
||||
Mandatory Design Reviewers:
|
||||
`Evgeny Li`_
|
||||
`Vladimir Kozhukalov`_
|
||||
|
||||
Milestones
|
||||
----------
|
||||
|
||||
Target Milestone for completion:
|
||||
1.0.0
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
- Introduce pluggable extension.
|
||||
- Rework existing do actions according to the new architecture.
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
Doesn't require new dependencies as stevedore has been already included into
|
||||
dependencies.
|
||||
|
||||
----------
|
||||
References
|
||||
----------
|
||||
|
||||
.. _`Alexander Gordeev`: https://launchpad.net/~a-gordeev
|
||||
.. _`Vladimir Kozhukalov`: https://launchpad.net/~kozhukalov
|
||||
.. _`Evgeny Li`: https://launchpad.net/~rustyrobot
|
||||
.. _`stevedore`: https://launchpad.net/python-stevedore
|
||||
.. _`PluginBase`: http://pluginbase.pocoo.org/
|
||||
.. _`Yapsy`: http://yapsy.sourceforge.net/
|
Loading…
Reference in New Issue
Block a user