The GraphSense REST Interface provides access to denormalized views computed by the graphsense-transformation pipeline. It is used by the graphsense-dashboard component.
It is based on a server stub generated by the OpenAPI Generator project against the graphsense-openapi specification version 1.7.0. It uses the Connexion library on top of aiohttp.
Note: This README.md is also generated. Changes must be made in
templates/README.mustache.
Copy the configuration file template instance/config.yaml.template
cp instance/config.yaml.template instance/config.yaml
Open instance/config.yaml and configure the database connection.
Make sure you are running Python 3.9 or Python 3.10.
python3 --version
Create a Python environment for required dependencies
python3 -m venv venv
Activate the environment
. venv/bin/activate
Install the requirements
pip install -r requirements.txt
You need access to GraphSense raw and transformed keyspaces. See Graphsense Transformation Pipeline for further details.
Run the REST interface
python -m aiohttp.web -H localhost -P 5000 openapi_server:main
Test the service in your browser:
http://localhost:5000
In order to utilize multiple cores, you may run the REST interface through Gunicorn.
Install gunicorn:
pip install gunicorn
If unspecified gunicorn is run with a number of workers and threads both equal to the number of CPUs x 2.
Run production server, overriding number of workers and threads through command line options (4 workers, 4 threads). Specify the aiohttp specific WebWorker class to leverage the full power of lightweight threads:
gunicorn -w 4 --threads 4 "openapi_server:main()" --worker-class aiohttp.GunicornWebWorker
To run the server on a Docker container, please execute the following from the root directory:
Build the image
docker build -t openapi_server .
You may specifiy the number of workers and threads through the environments variables NUM_WORKERS and NUM_THREADS respectively.
Start up a container with 4 workers and 4 threads:
docker run -e NUM_WORKERS=4 -e NUM_THREADS=4 -p 9000:9000 openapi_server
Flask configuration parameters can be added at the top level of
instance/config.yaml. A configuration template file is provided in
conf/config.yaml.template.
You may define ALLOWED_ORIGINS in instance/config.yaml if the REST
interface is to be consumed by a Web browser, e.g.
by graphsense-dashboard.
REST log messages can be delivered via mail. See instance/config.yaml.template for an example.
BRANCH=master
docker run --rm \
-v "${PWD}:/build" \
-v "${PWD}/templates:/templates" \
openapitools/openapi-generator-cli \
generate -i "https://raw.githubusercontent.com/graphsense/graphsense-openapi/${BRANCH}/graphsense.yaml" \
-g python-aiohttp -o /build -t /templatesThe service implementation (gsrest/service) should use the generated models
located in openapi_server/models.
Source code generation is based on templates. See the templates directory for
currently used templates. If you need more templates, retrieve them from the
generator like so:
docker run --rm -v "/tmp/templates:/templates" openapitools/openapi-generator-cli author template -g python-aiohttp -o /templates
Templates are written to /tmp/templates. Copy the needed ones to this
project's templates directory.
Service tests are located in gsrest/test. These are called from generated
controller tests located in openapi_server/test/.
To launch the integration tests, use tox:
pip install tox
tox
This launches a mockup Cassandra database instance and ingests test data from
tests/data. See tox.ini (templates/tox.mustache respectively) and
tests/Makefile for further details on test configuration and setup.
Test instance configuration template can be found in tests/config.yaml.template.
The test instance configuration is generated automatically from the template.
You may only need to edit the template if you add more test keyspaces.
You may use tests/fetch_data.sh to fetch live data and customize for testing.
In order to have a reproducible test environment, tests can also be run via docker.
export UID # in order to inject user id into the docker container and avoid permission issues
cd tests
make test
On OS X you need to install GNU sed and link it on your system as sed.