Python API
The Python API allows you to create a Monoid Protocol-compliant connector by just implementing a pair of simple Python interfaces.
Installing the Python Development Kit
The Monoid Python development kit can be installed with pip:
pip install monoid_pydev
This package includes all the necessary scaffolding to run a connector.
Python Connector Anatomy
A Monoid Python connector has 3 major parts, the implementation of the AbstractSilo abstract class, the implementation(s) of the DataStore abstract class, and a spec.json describing the schema of the
configuration of the connector. A main.py file ties everything together, but can generally just be a couple lines -- all the parsing boilerplate code is handled
for you by monoid_pydev. See the Postgres Connector for an example of the main.py file.
The spec.json file
The monoid_pydev library automatically looks for a spec.json file at the root of your connector
python module, and uses it as the response to the spec protocol message. It should be a JSON schema
compliant description of the expected config schema.
Writing a AbstractSilo subclass
A subclass of the AbstractSilo class must implement 2 methods, the data_stores method, and the validate method. The data_stores method should initialize any necessary connections, and return a list of DataStore subclasses that can utilize those connections. See the implementation in the postgres connector for an example.
The validate method is straightforward -- you must verify that the config passed to the validate method
can make a valid connection with the service you are connecting with (valid password, etc.).
Writing a DataStore subclass
The DataStore abstract class has a few more fields that you'll need to implement. You should create a
new DataStore for any disctinct data model that your connector exposes, for example, relational databases
would have a DataStore for each table of a database (they may, and probably should, share database connections, however). The name and group methods return the name and group of the data store -- for
databases, these would be the name of the table and the name of the database + schema, respectively. The
other functions in the DataStore class that must be implemented are json_schema, run_query_request, run_delete_request, request_status, request_results and scan_records.
The run_query_request and run_delete_request functions should return a
MonoidRequestResult, which includes indicators about the status of the request, and a handle that can be passed to request_status and request_results.
You can populate the data field with any data that is needed in those functions. Generally, if the requests can be performed synchronously, the status returned from these functions should automatically
be complete -- the run_delete_request should perform the deletion, while the run_query_request function
can store the parameters passed to it in the data of the handle, and perform the query in request_results.
The request_results and request_status functions should return a generator of MonoidRecord objects that represent the results of the request (query or delete). Commonly, delete requests wont have any
data returned by the generator.
The scan_records function should return a generator of some records sampled from the data store.
Running the Connector
Once your connector is complete, you should create a Dockerfile that can be used to build an image for
your connector. Look here for an example. You should also add a Makefile that will build and push
your image to the directory, as this is used in our CI pipelines. Once your image is built,
you should add the connector to monoid-config/integration-manifest.yaml, and run go run cmd/tools/discovery/main.go ../monoid-config/integration-manifest.yaml ../monoid-config/integration-spec.yaml from the monoid-api directory. The next time you run the loader (automatically run when you run docker-compose up), your connector should automatically appear in the UI!