diff options
| author | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2021-10-26 16:19:55 +0200 |
|---|---|---|
| committer | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2022-04-04 12:48:04 +0200 |
| commit | f0c472b1792779e63fdeb97a470b46300de00050 (patch) | |
| tree | 99646cf4448f4f73c2c98ede338df19a1497f9b5 /opendc-web/opendc-web-api/app.py | |
| parent | 8f958c5a578dc11b890c96c0dc48e3e3f92a4d07 (diff) | |
feat(web/api): Initial API implementation in Kotlin
This change adds the initial implementation of the new API server in Kotlin,
replacing the old API written in Python. The implementation uses Quarkus,
RESTEasy, and Hibernate to implement the new API endpoints.
The reason for replacing the old API server is unifying the build and
deployment toolchains, reducing the number of technologies necessary to
work with OpenDC. Furthermore, we envision bundling the entire OpenDC
project into a single distributions, allowing users to launch their own
deployment trivially.
Diffstat (limited to 'opendc-web/opendc-web-api/app.py')
| -rwxr-xr-x | opendc-web/opendc-web-api/app.py | 137 |
1 files changed, 0 insertions, 137 deletions
diff --git a/opendc-web/opendc-web-api/app.py b/opendc-web/opendc-web-api/app.py deleted file mode 100755 index 36c80b7a..00000000 --- a/opendc-web/opendc-web-api/app.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/env python3 -import mimetypes -import os - -from dotenv import load_dotenv -from flask import Flask, jsonify, redirect -from flask_compress import Compress -from flask_cors import CORS -from flask_restful import Api -from flask_swagger_ui import get_swaggerui_blueprint -from marshmallow import ValidationError - -from opendc.api.jobs import JobList, Job -from opendc.api.portfolios import Portfolio, PortfolioScenarios -from opendc.api.prefabs import Prefab, PrefabList -from opendc.api.projects import ProjectList, Project, ProjectTopologies, ProjectPortfolios -from opendc.api.scenarios import Scenario -from opendc.api.schedulers import SchedulerList -from opendc.api.topologies import Topology -from opendc.api.traces import TraceList, Trace -from opendc.auth import AuthError -from opendc.util import JSONEncoder - - -# Load environmental variables from dotenv file -load_dotenv() - - -def setup_sentry(): - """ - Setup the Sentry integration for Flask if a DSN is supplied via the environmental variables. - """ - if 'SENTRY_DSN' not in os.environ: - return - - import sentry_sdk - from sentry_sdk.integrations.flask import FlaskIntegration - - sentry_sdk.init( - integrations=[FlaskIntegration()], - traces_sample_rate=0.1 - ) - - -def setup_api(app): - """ - Setup the API interface. - """ - api = Api(app) - # Map to ('string', 'ObjectId') passing type and format - api.add_resource(ProjectList, '/projects/') - api.add_resource(Project, '/projects/<string:project_id>') - api.add_resource(ProjectTopologies, '/projects/<string:project_id>/topologies') - api.add_resource(ProjectPortfolios, '/projects/<string:project_id>/portfolios') - api.add_resource(Topology, '/topologies/<string:topology_id>') - api.add_resource(PrefabList, '/prefabs/') - api.add_resource(Prefab, '/prefabs/<string:prefab_id>') - api.add_resource(Portfolio, '/portfolios/<string:portfolio_id>') - api.add_resource(PortfolioScenarios, '/portfolios/<string:portfolio_id>/scenarios') - api.add_resource(Scenario, '/scenarios/<string:scenario_id>') - api.add_resource(TraceList, '/traces/') - api.add_resource(Trace, '/traces/<string:trace_id>') - api.add_resource(SchedulerList, '/schedulers/') - api.add_resource(JobList, '/jobs/') - api.add_resource(Job, '/jobs/<string:job_id>') - - @app.errorhandler(AuthError) - def handle_auth_error(ex): - response = jsonify(ex.error) - response.status_code = ex.status_code - return response - - @app.errorhandler(ValidationError) - def handle_validation_error(ex): - return {'message': 'Input validation failed', 'errors': ex.messages}, 400 - - return api - - -def setup_swagger(app): - """ - Setup Swagger UI - """ - SWAGGER_URL = '/docs' - API_URL = '../schema.yml' - - swaggerui_blueprint = get_swaggerui_blueprint( - SWAGGER_URL, - API_URL, - config={ - 'app_name': "OpenDC API v2" - }, - oauth_config={ - 'clientId': os.environ.get("AUTH0_DOCS_CLIENT_ID", ""), - 'additionalQueryStringParams': {'audience': os.environ.get("AUTH0_AUDIENCE", "https://api.opendc.org/v2/")}, - } - ) - app.register_blueprint(swaggerui_blueprint) - - -def create_app(testing=False): - app = Flask(__name__, static_url_path='/') - app.config['TESTING'] = testing - app.config['SECRET_KEY'] = os.environ['OPENDC_FLASK_SECRET'] - app.config['RESTFUL_JSON'] = {'cls': JSONEncoder} - app.json_encoder = JSONEncoder - - # Define YAML content type - mimetypes.add_type('text/yaml', '.yml') - - # Setup Sentry if DSN is specified - setup_sentry() - - # Set up CORS support - CORS(app) - - # Setup compression - compress = Compress() - compress.init_app(app) - - setup_api(app) - setup_swagger(app) - - @app.route('/') - def index(): - """ - Redirect the user to the API documentation if it accesses the API root. - """ - return redirect('docs/') - - return app - - -application = create_app(testing="OPENDC_FLASK_TESTING" in os.environ) - -if __name__ == '__main__': - application.run() |
