Skip to main content

Run your BMI implementation in a separate process and expose it as BMI-python with GRPC

Project description

[![DOI](https://zenodo.org/badge/130237165.svg)](https://zenodo.org/badge/latestdoi/130237165)

# grpc4bmi

## Purpose

This software allows you to wrap your BMI implementation (https://github.com/csdms/bmi) in a server process and communicate with it via the included python client. The communication is serialized to protocol buffers by GRPC (https://grpc.io/) and occurs over network ports.

## Installation

Optionally, create your virtual environment and activate it, Then, run
```
pip install grpc4bmi
```
on the client (python) side. If your server model is implemented in Python, do the same in the server environment (e.g. docker container). If the model is implemented in R, run instead
```bash
pip install grpc4bmi[R]
```
in the server environment. For bleeding edge version from GitHub use
```bash
pip install git+https://github.com/eWaterCycle/grpc4bmi.git#egg=grpc4bmi
```
Finally if the model is implemented in C or C++, clone this git repo and run
```bash
make ; make install
```
in the cpp folder.

## Usage

### Model written in Python
For inspiration look at the example in the test directory. To start a server process that allows calls to your BMI implementation, type
```bash
run-bmi-server --name <PACKAGE>.<MODULE>.<CLASS> --port <PORT> --path <PATH>
```
where ```<PACKAGE>, <MODULE>``` are the python package and module containing your implementation, ```<CLASS>``` is your
bmi model class name, ```<PORT>``` is any available port on the host system, and optionally ```<PATH>``` denotes an
additional path that should be added to the system path to make your implementation work. The name option above is
optional, and if not provided the script will look at the environment variables ```BMI_PACKAGE```, ```BMI_MODULE``` and
```BMI_CLASS```. Similarly, the port can be defined by the environment variable ```BMI_PORT```.
This software assumes that your implementation constructor has no parameters.

### Model written in C/C++ (beta)
Create an executable along the lines of cpp/run-bmi-server.cc. You can copy the file and replace the function
```C++
Bmi* create_model_instance()
{
/* Return your new BMI instance pointer here... */
}
```
with the instantiation of your model BMI. The model needs to implement the csdms BMI for C, but you may also implement our more object-oriented C++ interface [BmiCppExtension](https://github.com/eWaterCycle/grpc4bmi/blob/master/cpp/bmi_cpp_extension.h).

### Model written in R
The grpc4bmi Python package can also run BMI models written in R if the model is a subclass of [AbstractBmi](https://github.com/eWaterCycle/bmi-r/blob/master/R/abstract-bmi.R#L9)
See https://github.com/eWaterCycle/bmi-r for instruction on R and Docker.

Run the R model a server with
```bash
run-bmi-server --lang R [--path <R file with BMI model>] --name [<PACKAGE>::]<CLASS> --port <PORT>
```

For example with [WALRUS](https://github.com/eWaterCycle/grpc4bmi-examples/tree/master/walrus) use
```bash
run-bmi-server --lang R --path ~/git/eWaterCycle/grpc4bmi-examples/walrus/walrus-bmi.r --name WalrusBmi --port 50051
```

### The client side
The client side has only a Python implementation. The default BMI client assumes a running server process on a given port.
```python
from grpc4bmi.bmi_grpc_client import BmiClient
mymodel = BmiClient(grpc.insecure_channel("localhost:<PORT>"))
print mymodel.get_component_name()
mymodel.initialize(<FILEPATH>)
...further BMI calls...
```

The package contains also client implementation that own the server process, either as a python subprocess or a docker
image running the ```run-bmi-server``` script. For instance
```python
from grpc4bmi.bmi_client_subproc import BmiClientSubProcess
mymodel = BmiClientSubProcess(<PACKAGE>.<MODULE>.<CLASS>)
```
will automatically launch the server in a sub-process and
```python
from grpc4bmi.bmi_client_subproc import BmiClientDocker
mymodel = BmiClientDocker(<IMAGE>,<PORT>)

```
will launch a docker container, assuming that a GRPC BMI server will start and exposes the port ```<PORT>```.

## Development: generating the grpc code

When developers change the proto-file, it is necessary to install grpc tools python packages in your python environment:
```bash
pip install -r requirements.txt
pip install -e .
# For R integration also install the R extras with
pip install -e .[R]

```
and install the C++ runtime and `protoc` command as described in <https://github.com/google/protobuf/blob/master/src/README.md>.
After this, simply executing the `proto_gen.sh` script should do the job.

## Future work

More language bindings are underway.


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

grpc4bmi-0.2.tar.gz (20.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

grpc4bmi-0.2-py2-none-any.whl (24.8 kB view details)

Uploaded Python 2

File details

Details for the file grpc4bmi-0.2.tar.gz.

File metadata

  • Download URL: grpc4bmi-0.2.tar.gz
  • Upload date:
  • Size: 20.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.12.4 setuptools/39.1.0 requests-toolbelt/0.8.0 tqdm/4.23.3 CPython/2.7.15rc1

File hashes

Hashes for grpc4bmi-0.2.tar.gz
Algorithm Hash digest
SHA256 a7ade3950d5cdefde16ba4307b292d4196c7fc51baa3f489d244c9c9d892bd00
MD5 48cd568136e8c849b38c6430574f10c8
BLAKE2b-256 e66d7760b5ad1bbcdfd73fca17903e2703250a8a36f228b707ee528db6f32d07

See more details on using hashes here.

File details

Details for the file grpc4bmi-0.2-py2-none-any.whl.

File metadata

  • Download URL: grpc4bmi-0.2-py2-none-any.whl
  • Upload date:
  • Size: 24.8 kB
  • Tags: Python 2
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.12.4 setuptools/39.1.0 requests-toolbelt/0.8.0 tqdm/4.23.3 CPython/2.7.15rc1

File hashes

Hashes for grpc4bmi-0.2-py2-none-any.whl
Algorithm Hash digest
SHA256 a0eea6e85cbaf5ddf61c9504952e474ae98cc09df2680d1aa69803650144f979
MD5 2bcb74f08136b6095b241bfb6f6333d2
BLAKE2b-256 b75fc34b8e1c9c861cd221ec90dfc108602fb1108b9944b3e1bd2c8b4f75f3f4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page