Write a new provider

The actual implementation gives providers for Static resources, Vagrant, Grid‘5000 and Openstack itself. If you want to support another testbed, then implementing a new provider is easy as 500 lines of Python code.

The new provider should follow the provider.py interface which consists in three methods: init, destroy and default_config. Another good starting point is the simple static implementation.

Init Method

The init method provides resources and provisions the environment. To let the provider knows what kind and how many resources should be provided, the method is fed with the config object that maps the reservations file. So a provider can access the resource description with:

rsc = config['resources']

# Use rsc to book resources ...

At the end of the init, the provider should return a list of host.py that Enos can SSH on, together with a pool of available IP for OpenStack Network.

Destroy Method

The destoy method destroys resources that have been used for the deployment. The provider can rely on the environment variable to get information related to its deployment.

Default Provider Configuration Methods

The default_config specifies keys used to configure the provider with a dict. A key could be optional and so should be provided with a default value, or required and so should be set to None. The user then can override these keys in the reservation file, under the provider key. Keys marked as None in the default_config are automatically tested for overriding in the reservation file.

Provider Instantiation

Enos automatically instantiates a provider based on the name specified in the reservation.yaml. For instance, based on the following reservation file,

provider: "my-provider"

Enos seeks for a file called my-provider.py into enos/provider and instantiates its main class. But sometimes, the provider requires extra information for its initialisation. The good place for this information is to put it under the provider key. In this case, the provider name should be accessible throughout the type key:

provider:
  type: "my-provider"
  extra-var: ...
  ...

Then the provider can access extra-var with config['provider']['extra-var']. Supported extra information is documented into the provider documentation.