Transfer CDM files using Remote Procedure Calls.
Project description
pygcdm
A python API for transferring Common Data Model (CDM) files using Remote Procedure Calls.
Installation
Create a new virtual environment using conda. If you don't have conda installed on your machine, install if following these instructions. Note that pygcdm requires python>=3.9 so we specify that explicitly. We can then use pip for installation after activating the conda environment.
conda create --name [environment name] python=3.9
conda activate [environment name]
pip install pygcdm
Usage
Transfer Files using gRPC
This demonstrates how to implement the python encode/decode API and transmit netCDF files via gRPC. Start by opening up two separate tabs in your terminal. Make sure that whatever python environment you installed the requirements into is active in both. Navigate to the examples folder in this repo.
In the first tab, start the gRPC server by running the following command:
python grpc_netcdf_server.py
If it is working properly you should see something that says starting server....
In the second tab, make a client request by running the following command:
python grpc_netcdf_client.py
Something resembling an xarray dataset should print to the terminal if everything is working. Feel free to modify the loc and variable_spec variables in grpc_netcdf_client.py to modify what data is transmitted.
Encode/Decode API
This demonstrates how to encode/decode gRPC messages within a python shell:
# import/instantiate encoder object
from pygcdm.netcdf_encode import netCDF_Encode
encoder = netCDF_Encode()
# import and define header request
import pygcdm.protogen.gcdm_netcdf_pb2 as grpc_msg
file_loc = "test/data/test3.nc"
header_request = grpc_msg.HeaderRequest(location=file_loc)
header_response = encoder.generate_header_from_request(header_request)
# define data request
var_spec = "analysed_sst"
data_request = grpc_msg.DataRequest(location=file_loc, variable_spec=var_spec)
data_response = encoder.generate_data_from_request(data_request)
# decode header/data into xarray object
from pygcdm.netcdf_decode import netCDF_Decode
decoder = netCDF_Decode()
ds = decoder.generate_file_from_response(header_response, data_response)
Message Types
pygcdm has two message types HeaderRequest and DataRequest which have corresponding response types (HeaderResponse, DataResponse respectively). These messages can be learned about here and are defined in protos/pygcdm/protogen/gcdm_netcdf.proto. The main idea is that you pack your request messages with the information you want and unpack the response messages (pygcdm does this packing/unpacking for you). The .proto messages are pretty human readable but a description is provided here:
HeaderRequest:
location(string): file location where netCDF file is found on machine delivering response
DataRequest:
location(string): file location where netCDF file is found on machine delivering responsevariable_spec(string): desctribes what netCDF variable/variable slices you want to request (seevariable_specsection in this README)
variable_spec Definition
variable_spec is how you define which variable/data slices you want from the remote netCDF file. It follows Backus-Naur form according to the following definition, which was adopted from netcdf-java which is documented here:
section specification := selector | selector '.' selector
selector := varName ['(' dims ')']
varName := ESCAPED_STRING
dims := dim | dim, dims
dim := ':' | slice | start ':' end | start ':' end ':' stride
slice := INTEGER
start := INTEGER
stride := INTEGER
end := INTEGER
ESCAPED_STRING : must escape characters = ".("
In practice, this means that variable_spec can look like the following examples. Slicing notation is analogous to numpy slicing (but not identical).
analysed_sstanalysed_sst(:, :, :)analysed_sst(0,0:719:10,0:1439:10)analysed_sst(0,200:700:10,1300:1400:10)
Note that these examples are derived from some of the tests in test/.
Utilities
Rebuilding the Package Locally
If you modify the package locally and want to rebuild the package for testing you can run the following command from the root folder:
pip install .
(You can verify installation by running pip show -f pygcdm).
Committing the Package to PyPi
If you have the priviledges to do so, you can commit the package to PyPi by running the following command in the root folder:
python setup.py upload
which will prompt you what type of upload you want: test or real, where test uploads to https://test.pypi.org/project/pygcdm/ and real uploads to https://pypi.org/project/pygcdm/. You'll then be prompted to include your login credentials.
Generating Python Source Code from proto Files
In order to generate the grpc python source code from the .proto files in protos/src/protogen, we need to use the protoc compiler (the reason for the weird subfolder structure is so that protoc generates files with proper import namespaces). The python package with protoc can be installed by following the instructions here.
To compile our code, and put the resulting functions into src/protogen/, we can use the following commands (from the root directory where this README is located):
$ python -m grpc_tools.protoc -I protos/ --python_out=. --grpc_python_out=. protos/pygcdm/protogen/*.proto
More information on the protoc compiler can be found by loading the module in python and using the help command:
$ python
>>> import grpc_tools.protoc
>>> help(grpc_tools.protoc)
Run Tests Locally
If you want to run the tests locally, make sure you have the pytest module installed. Then, from the root directory run the following command:
pytest test/*.py
If you are testing to verify any changes make sure you rebuild the package locally using the instructions above.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pygcdm-0.1.0.tar.gz.
File metadata
- Download URL: pygcdm-0.1.0.tar.gz
- Upload date:
- Size: 26.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c73abadd21707d202d4fe2aca5ae046d9a2ceca04646ccf05f725375a9837e96
|
|
| MD5 |
d8b5d52711b2448b29096f34e26cbbe9
|
|
| BLAKE2b-256 |
2876450bf45eac96591415f171acfdda14d27c066d61fea8a71bb3405f98f9d6
|
File details
Details for the file pygcdm-0.1.0-py2.py3-none-any.whl.
File metadata
- Download URL: pygcdm-0.1.0-py2.py3-none-any.whl
- Upload date:
- Size: 25.6 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a9a9cbeea5f37a81a6609a768aa3465fe0afcfa4fd39efefeb5b63ef8c4220f4
|
|
| MD5 |
cf2a92ed9fe420f09bf366248f6b5b0c
|
|
| BLAKE2b-256 |
825e4d566051a1f902816823a908318a0ad5c73d08a5dc9571ccebdc5289823a
|