MetaGenScope server application.
This readme documents how to run and test the MetaGenScope server as a standalone application. metagenscope-server is part of metagenscope-main and should usually be run as part of the complete stack.
You will also need to have PostgreSQL running locally with the following databases:
CREATE DATABASE metagenscope_prod;
CREATE DATABASE metagenscope_dev;
CREATE DATABASE metagenscope_test;And plugins:
\c metagenscope_prod;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
\c metagenscope_dev;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
\c metagenscope_test;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";All local interactions with the server (developing, running, testing) should be done in a virtual environment:
$ python3.6 -m venv env # Create the environment (only need be performed once)
$ source env/bin/activate # Activate the environmentSet application configuration:
# Environment: development | testing | staging | production
$ export APP_SETTINGS=development
$ export SECRET_KEY=my_precious
$ export DATABASE_URL=postgres://username:password@localhost:5432/metagenscope_dev
$ export DATABASE_TEST_URL=postgres://username:password@localhost:5432/metagenscope_testSpin up server (runs on http://127.0.0.1:5000/):
$ python manage.py runserverA startup script is provided to ensure that the application does not attempt to start before all service dependencis are accepting connections. It can be used like so:
$ ./startup.sh [host:port[, host:port, ...]] -- [command]
An example of waiting for Postgres and Mongo DBs running on localhost before starting the application would look like this:
$ ./startup.sh localhost:5435 localhost:27020 -- python manage.py runserver
The entry point to test suite tools is the Makefile.
Code quality is enforced using pylint, pycodestyle, and pydocstyle. The rules are defined in .pylintrc.
These tools may be run together using:
$ make lintTo run the test suite (will execute lint prior to running tests):
$ make testYou may also run tests checking their coverage:
$ make covMetaGenScope uses the GitFlow branching strategy along with Pull Requests for code reviews. Check out this post by the Dwarves Foundation for more information.
ToolResult modules define database storage and API upload for outputs.
To add a new ToolResult module write your new module app/tool_results/my_new_module following existing conventions. Make sure the main module class inherits from ToolResultModule and is named ending in ResultModule.
DisplayModules provide the backing data for each front-end visualization type. They are in charge of:
- Providing the data model for the visualization backing data
- Enumerating the
ToolResulttypes that are valid data sources (WIP) - The Middleware task that transforms a set of
Samples into the module's data model (WIP)
These modules live in app/display_modules/ and are self-contained: all models, API endpoint definitions, long-running tasks, and tests live within each module.
To add a new DisplayModule module:
- Write your new module
app/display_modules/my_new_modulefollowing existing conventions. Make sure the main module class inherits fromDisplayModuleand is named ending inModule. - Add your module to
all_display_modulesinapp.display_modules.
The test suite is run automatically on CircleCI for each push to Github. You can skip this behavior for a commit by appending [skip ci] to the commit message.
CircleCI does not allow running commands on secondary containers (eg. the database). To get around this, we use custom images for our database images. Changes to either image need to be built, tagged, and pushed to Docker Hub before CI can succeed.
- Postgres - Stock Postgres image with the
uuid-osspextension enabled. Located at./database_docker/postgres_db. - Mongo - Stock Mongo image with a healthcheck script added. Located at
./database_docker/mongo_db.
Steps
From the appropriate database docker subdirectory, build and tag the image:
$ export COMMIT_SHA=`git rev-parse HEAD`
$ docker build -t imagebuildinprocess .
$ docker tag imagebuildinprocess "metagenscope/postgres:${COMMIT_SHA::8}"Push the image:
$ docker login
$ docker push "metagenscope/postgres:${COMMIT_SHA::8}"Clean up:
$ docker rmi imagebuildinprocess "metagenscope/postgres:${COMMIT_SHA::8}"Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.
We use SemVer for versioning. For the versions available, see the tags on this repository.
See CHANGELOG.md.
- Benjamin Chrobot - Initial work - bchrobot
See also the list of contributors who participated in this project.
This project is licensed under the MIT License - see the LICENSE.md file for details.