Running Integrations as Services¶
In release 1.7.1, the ability to run models as services that can be accessed by integrations running on remote machines was added to yggdrasil. This feature allows models (or sets of models) to be exposed for external use without the need to have the model source code or install it on your local machine. It is intended to make it easier for scientists to share models and foster collaboration. Future releases will include tools for exploring remote models & integrations via visualizations.
Setting Up an Integration as a Service¶
Host Requirements¶
yggdrasil must be installed
A port must be available that can be used to serve a Flask REST API. The port should be either set via the
--port
flag to theintegration-service-manager start
command (last requirement) or in thePORT
environment variable before starting the service manager.The URL that will be used by remote integrations to contact the service manager must be specified either via the
--remote-url
flag to theintegration-service-manager start
command (last requirement) or in theYGGDRASIL_SERVICE_HOST_URL
environment variable before starting the service manager.The integrations that will be requested must be located on the host machine (including YAMLs and source code) and must be registered as services (see below).
A yggdrasil service manager must be started via:
$ yggdrasil integration-service-manager [--port PORT] start [--remote-url REMOTE_URL]
Since the service manager must continue running, in many cases, you will want to start it as a background process.
Registering Integrations¶
In order for an integration to be run on the host machine, it must first be registered via yggdrasil’s integration-service-manager
CLI. Usage is:
$ yggdrasil integration-service-manager register <integration-name> <integration-yamls ...>
integration-name
is a unique name that will be allocated with the integration and used in requests to connect to or query the status of the integration service. integration-yamls
is one ore more YAML specification files defining the integration. Any inputs or outputs that are not connected to another model or file in the YAML, will be available for connection by remote models.
For example, to register the photosynthesis model from the fakeplant example, we would run:
$ yggdrasil integration-service-manager register photosynthesis yggdrasil/examples/fakeplant/photosynthesis.yml
When a remote integration connects to the service manager and requests the photosynthesis
integration service, the model will be started and channels will be opened to its inputs (light_intensity
, temperature
, co2
) and outputs (photosynthesis_rate
). The remote integration can make connections to these channels in the same way it would if the photosynthesis
model (and it’s YAML) were part of the integration.
Note
For security, YAML files located in remote Git repositories will not be allowed as part of integrations that the service manager runs.
Registering Multiple Integrations at Once¶
To save time, yggdrasil also allows you to register multiple integrations at once from a YAML file containing a set of mappings between integration names and the YAML specification files defining them. The example services file below defines two integrations, each specified by one YAML file.
photosynthesis:
- yggdrasil/examples/fakeplant/photosynthesis.yml
rpcFibSrv:
- yggdrasil/examples/rpcFib/rpcFibSrv_c.yml
To register all of the integrations contained in this file, you would run:
$ yggdrasil integration-service-manager register SERVICES_FILE
where SERVICES_FILE
is the full path to the file.
Connecting an Integration to a Remote Service¶
Client Requirements¶
yggdrasil must be installed
You must be able to connect to the remote host’s service manager. You can check the status via:
$ yggdrasil integration-service-manager --address ADDRESS status
The
ADDRESS
field is required and must be the URL for the service manager (i.e. the value set inYGGDRASIL_SERVICE_HOST_URL
or via--remote-url
in the command to start the service manager).
Service YAML Entry¶
Integrations can connect to remote integration services by including service
entries in the YAML integration specification files. For example, the entry below requests the photosynthesis
integration service from the yggdrasil flask service manager located at http://remote_service_manager_url/.
service:
name: photosynthesis
type: flask
address: http://remote_service_manager_url/
This service entry is treated as a placeholder for the photosynthesis
YAML entry. As such, it can be directly swapped for the photosynthesis.yml
file in running the fakeplant
example assuming that all of the other models are locally available. For example, if the service entry were saved to photosynthesis_service.yml
, we could run the fakeplant
example, but using the remote copy of the photosynthesis
model via:
$ yggrun canopy.yml light.yml photosynthesis_service.yml growth_python.yml fakeplant.yml
Multiple services can also be included in the same entry. For example, if there were a growth
service as well that should be used instead of the local growth
model in the fakeplant
example, the YAML entry above would be updated to
services:
- name: photosynthesis
type: flask
address: http://remote_service_manager_url/
- name: growth
type: flask
address: http://another_remote_service_manager_url/
Performance¶
It is important to keep in mind that connecting to remote integrations over an internet connection introduces a great deal of overhead and a certain degree of fragility into integrations that is not present when all models are running locally. Such connections between models make integrations dependent on the speed and reliability of the internet connection both at the host and client. If performant and stable communication times are import for your use case, we advise looking for a way to run the integrations locally.