The
Enomaly Elastic Computing Platform has an extension module API that allows developers to register new
ECP components. These components include new web controllers, new RESTful API controllers, and so on. One component that cannot be registered are configuration values. Extension modules can be viewed as smaller applications that are executed within
ECP. Therefore, these smaller extension module applications will need to be configured. There are always going to be values that should be configurable within any application such as storage locations. Currently, extension modules must implement their own settings abstractions. This functionality already exists in the
ECP core and the way configuration values are accessed and stored should be consistent and hence the need for the custom settings class. It would make sense for extension modules in
ECP to have the ability to register their own configuration values. This way, configuration values would be accessed and stored in the exact same way across the platform. An additional complication arises when trying to use the configuration editor. The configuration editor is tightly-coupled with
TurboGears widgets and thus requires that all extension modules be tightly-coupled with
TurboGears widgets. Ideally, when configuration values are registered, which currently is not possible, additional meta data suitable for generating a display widget for the configuration value could also be registered.
The current implementation of the
ECP Settings class uses managed
Python attributes to seamlessly save and load configuration values. Every time a managed
Settings attribute is accessed, the
Variable class will attempt to load the variable. Likewise, when a managed
Settings attribute is altered, the
Variable class will attempt to store the configuration value. It is easier to use managed attributes for simple storage and retrieval operations. The alternative is to use the
Variable class directly. In fact, earlier implementations of
ECP did exactly that. Every time a configuration value was needed, we had to invoke
Variable.load() while specifying a default value in case the configuration value didn't exist. The new
Settings class was introduced to help alleviate some of this troubled configuration access. A single instance of the
Settings class is created in the
configuration.py module. This instance can then be used throughout the
ECP application, including extension modules. Configuration categories are also incorporated into the
Settings class. This is done by using the same concept as the
Settings class for each category. This category class is then set as an attribute of
Settings. This allows us to access configuration values in the form of
settings.kvm.bridge. This syntax offers much more readable code when used in context. However, the problem with this method of managing configuration values was soon after realized. There will always be a need to add new configuration values. Most noteably, extension modules are going to need this capability since developers are going to want to access configuration values in the same way as the rest of
ECP. There is a need to be able to register new configuration values. This eliminates the extensibility problem of adding new configuration values. If every time a new configuration value needed by an extension module, or the core application for that matter, needs to be added to the
Settings class, it will grow exponentially and become very challenging to maintain. Additionally, the configuration editor is very tightly coupled to
TurboGears widgets because extension modules need to display these configuration values in the configuration editor. This is done by the extension module defining a hook that passes in
TurboGears widgets used to display the configuration values for the extension module in the configuration editor. This isn't the ideal method since this also couples the extension modules to
ECP dependencies (
TurboGears). Ideally, the widgets for displaying configuration values should be generated by the configuration editor based on minimal meta-data provided by the extension module at registration time.
The new approach to
ECP configuration value management is to have configuration values registered in the
Settings class. The same approach of using managed attributes to access and store configuration values is still used. What is different is the ability to register a value and have these managed attributes automatically built for the developer. This is accomplished by introducing a new
MetaSettings class. The purpose behind this new class is to dynamically construct new categorization classes and methods that will become attributes of the
settings instance. There is also a new
settings.register() method that can be used to register new configuration values. The end result of using
settings.register() to register a new configuration value is the same syntax as before when using the configuration values. The name of the module passed to
settings.register() will become an attribute of the
settings instance. There are also meta-data parameters in the
settings.register() method that allow developers to specify a title and description of the configuration value. In the current ECP configuration management implementation, this information must be specified in the
TurboGears widget. With the new implementation, the managed attribute functionality found in the
ECP core no longer needs to be duplicated. There is now a much more uniform interface.
With this new configuration registration functionality in place, there is now an opportunity for great improvements in the configuration editor. We could now potentially eliminate the coupling to
TurboGears widgets and have each configuration widget generated automatically. Grouping by extension module is now also possible in the configuration editor.