HIL supports a simple extension mechanism, to allow external plugins to implement things we don't want in the HIL core. One obvious example of this is drivers.
Extensions are python modules. The extensions
section in hil.cfg
specifies a list of modules to import on startup, for example:
[extensions] hil.ext.driver.switch.dell = hil.ext.driver.switch.complex_vlan = hil.ext.driver.obm.ipmi = some_3rd_party.hil.drivers.obm.robotic_power_button_pusher
If the extension requires any kind of initialization, it may define a function
setup
, which will be executed after all extensions have been loaded.
This function must accept arbitrary arguments (for forwards compatibility),
but at present must not rely on the presence or value of any argument.
If the extension needs its own configuration options, it may read them from a section with the same name as the module, e.g.:
[extensions] some_3rd_party.hil.drivers.obm.robotic_power_button_pusher
[some_3rd_party.hil.drivers.obm.robotic_power_button_pusher] push_duration = 3 seconds
Extensions should not make use any part of the HIL source tree that does not explicitly invite it (i.e. everything by default is Private). Components which may be used from extensions will explicitly say so in their documentation, (and describe in detail how they may be used). Extension-approved components currently include:
- Most of hil.network_allocator
- hil.auth
- From hil.model:
- db.Model
- Switch
- The migration framework; see Migrations for an overview.
See the docstrings for each component for details.
Additionally, extensions may add wsgi middleware to the flask
application from their setup
function. For example:
app.wsgi_app = my_middleware(app.wsgi_app)
Note that the order in which the setup
functions are run is not
defined. As such, if multiple extensions add wsgi middleware the
order in which they are applied is also undefined. Using more than one
such extension is discouraged. An ordering may be defined in the
future.