Enamel is a proposal for an OpenStack wide API which provides the porcelain to the plumbing APIs that could be presented by Nova, Neutron, Glance and Cinder. Porcelain (versus plumbing) is a term that gained popularity in the Git community as a way to distinguish tools or commands that were for human consumption versus the commands that should be used for scripting (machine consumption) or creating other porcelain.
In the OpenStack universe a porcelain API could be designed to support tasks and actions which an end user wants to accomplish, in an encapsulated and clean form, while allowing the service APIs to focus on the plumbing. In this context "the plumbing" is fairly granular actions such as "create a volume" or "boot a specified server" but not "boot a server with an attached volume (that may or may not need to be created)".
The current Nova API supports the latter. The claim from the Enamel project is that Nova should not. Instead Enamel should be using the Cinder and Nova APIs to accomplish what it needs. This means that the Enamel API is effectively a layer that orchestrates the functionality provided by the other APIs.
Besides providing a better user experience this would allow several additional opportunities:
- Complex code in the plumbing APIs (especially Nova) that orchestrates multi-step activity poorly can be frozen and, after a period of deprecation, removed.
- At the porcelain layer, multi-step activities can be managed as proper task flows with a diversity of retry and failure policies, depending on both task and user choice.
- The new user-facing API can be designed, from the outset, using everything that has been learned in the development of the existing APIs, for example microversions.
- A modern web framework can be used.
- Once established, a porcelain layer can allow the plumbing layer to evolve independently.
Post Notes
The things that matter in terms of convincing:
- tracking
- retrying
- composition
See also the end of this etherpad.