Changeset View
Changeset View
Standalone View
Standalone View
swh/scheduler/api/server.py
# Copyright (C) 2018 The Software Heritage developers | # Copyright (C) 2018 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import logging | import logging | ||||
from flask import request | from flask import request, Flask | ||||
from swh.core import config | from swh.core import config | ||||
from swh.scheduler import get_scheduler as get_scheduler_from | from swh.scheduler import get_scheduler as get_scheduler_from | ||||
from swh.core.api import (SWHServerAPIApp, decode_request, | from swh.core.api import (decode_request, | ||||
error_handler, | error_handler, | ||||
encode_data_server as encode_data) | encode_data_server as encode_data) | ||||
from swh.core.api.negotiate import negotiate | |||||
from swh.core.api import JSONFormatter, MsgpackFormatter | |||||
DEFAULT_CONFIG_PATH = 'backend/scheduler' | DEFAULT_CONFIG_PATH = 'backend/scheduler' | ||||
DEFAULT_CONFIG = { | DEFAULT_CONFIG = { | ||||
'scheduler': ('dict', { | 'scheduler': ('dict', { | ||||
'cls': 'local', | 'cls': 'local', | ||||
'args': { | 'args': { | ||||
'db': 'dbname=softwareheritage-scheduler-dev', | 'db': 'dbname=softwareheritage-scheduler-dev', | ||||
}, | }, | ||||
}) | }) | ||||
} | } | ||||
app = SWHServerAPIApp(__name__) | app = Flask(__name__) | ||||
scheduler = None | scheduler = None | ||||
@app.errorhandler(Exception) | @app.errorhandler(Exception) | ||||
def my_error_handler(exception): | def my_error_handler(exception): | ||||
return error_handler(exception, encode_data) | return error_handler(exception, encode_data) | ||||
def get_sched(): | def get_sched(): | ||||
global scheduler | global scheduler | ||||
if not scheduler: | if not scheduler: | ||||
scheduler = get_scheduler_from(**app.config['scheduler']) | scheduler = get_scheduler_from(**app.config['scheduler']) | ||||
return scheduler | return scheduler | ||||
def has_no_empty_params(rule): | |||||
defaults = rule.defaults if rule.defaults is not None else () | |||||
arguments = rule.arguments if rule.arguments is not None else () | |||||
return len(defaults) >= len(arguments) | |||||
vlorentz: Can be rewritten as:
```
def has_no_empty_params(rule):
return len(rule.defaults or ()) >=… | |||||
@app.route('/') | @app.route('/') | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def index(): | def index(): | ||||
"""main index""" | |||||
return 'SWH Scheduler API server' | return 'SWH Scheduler API server' | ||||
@app.route('/close_connection', methods=['POST']) | @app.route('/close_connection', methods=['GET', 'POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def close_connection(): | def close_connection(): | ||||
return encode_data(get_sched().close_connection()) | return get_sched().close_connection() | ||||
@app.route('/set_status_tasks', methods=['POST']) | @app.route('/set_status_tasks', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def set_status_tasks(): | def set_status_tasks(): | ||||
return encode_data(get_sched().set_status_tasks(**decode_request(request))) | return get_sched().set_status_tasks(**decode_request(request)) | ||||
@app.route('/create_task_type', methods=['POST']) | @app.route('/create_task_type', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def create_task_type(): | def create_task_type(): | ||||
return encode_data(get_sched().create_task_type(**decode_request(request))) | return get_sched().create_task_type(**decode_request(request)) | ||||
@app.route('/get_task_type', methods=['POST']) | @app.route('/get_task_type', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def get_task_type(): | def get_task_type(): | ||||
return encode_data(get_sched().get_task_type(**decode_request(request))) | return get_sched().get_task_type(**decode_request(request)) | ||||
@app.route('/get_task_types', methods=['POST']) | @app.route('/get_task_types', methods=['GET', 'POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def get_task_types(): | def get_task_types(): | ||||
return encode_data(get_sched().get_task_types(**decode_request(request))) | return get_sched().get_task_types(**decode_request(request)) | ||||
@app.route('/create_tasks', methods=['POST']) | @app.route('/create_tasks', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def create_tasks(): | def create_tasks(): | ||||
return encode_data(get_sched().create_tasks(**decode_request(request))) | return get_sched().create_tasks(**decode_request(request)) | ||||
@app.route('/disable_tasks', methods=['POST']) | @app.route('/disable_tasks', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def disable_tasks(): | def disable_tasks(): | ||||
return encode_data(get_sched().disable_tasks(**decode_request(request))) | return get_sched().disable_tasks(**decode_request(request)) | ||||
@app.route('/get_tasks', methods=['POST']) | @app.route('/get_tasks', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def get_tasks(): | def get_tasks(): | ||||
return encode_data(get_sched().get_tasks(**decode_request(request))) | return get_sched().get_tasks(**decode_request(request)) | ||||
@app.route('/search_tasks', methods=['POST']) | @app.route('/search_tasks', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def search_tasks(): | def search_tasks(): | ||||
return encode_data(get_sched().search_tasks(**decode_request(request))) | return get_sched().search_tasks(**decode_request(request)) | ||||
@app.route('/peek_ready_tasks', methods=['POST']) | @app.route('/peek_ready_tasks', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def peek_ready_tasks(): | def peek_ready_tasks(): | ||||
return encode_data(get_sched().peek_ready_tasks(**decode_request(request))) | return get_sched().peek_ready_tasks(**decode_request(request)) | ||||
@app.route('/grab_ready_tasks', methods=['POST']) | @app.route('/grab_ready_tasks', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def grab_ready_tasks(): | def grab_ready_tasks(): | ||||
return encode_data(get_sched().grab_ready_tasks(**decode_request(request))) | return get_sched().grab_ready_tasks(**decode_request(request)) | ||||
@app.route('/schedule_task_run', methods=['POST']) | @app.route('/schedule_task_run', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def schedule_task_run(): | def schedule_task_run(): | ||||
return encode_data(get_sched().schedule_task_run( | return get_sched().schedule_task_run(**decode_request(request)) | ||||
**decode_request(request))) | |||||
@app.route('/mass_schedule_task_runs', methods=['POST']) | @app.route('/mass_schedule_task_runs', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def mass_schedule_task_runs(): | def mass_schedule_task_runs(): | ||||
return encode_data( | return get_sched().mass_schedule_task_runs(**decode_request(request)) | ||||
get_sched().mass_schedule_task_runs(**decode_request(request))) | |||||
@app.route('/start_task_run', methods=['POST']) | @app.route('/start_task_run', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def start_task_run(): | def start_task_run(): | ||||
return encode_data(get_sched().start_task_run(**decode_request(request))) | return get_sched().start_task_run(**decode_request(request)) | ||||
@app.route('/end_task_run', methods=['POST']) | @app.route('/end_task_run', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def end_task_run(): | def end_task_run(): | ||||
return encode_data(get_sched().end_task_run(**decode_request(request))) | return get_sched().end_task_run(**decode_request(request)) | ||||
@app.route('/filter_task_to_archive', methods=['POST']) | @app.route('/filter_task_to_archive', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def filter_task_to_archive(): | def filter_task_to_archive(): | ||||
return encode_data( | return get_sched().filter_task_to_archive(**decode_request(request)) | ||||
get_sched().filter_task_to_archive(**decode_request(request))) | |||||
@app.route('/delete_archived_tasks', methods=['POST']) | @app.route('/delete_archived_tasks', methods=['POST']) | ||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def delete_archived_tasks(): | def delete_archived_tasks(): | ||||
return encode_data( | return get_sched().delete_archived_tasks(**decode_request(request)) | ||||
get_sched().delete_archived_tasks(**decode_request(request))) | |||||
@app.route("/site-map") | |||||
@negotiate(MsgpackFormatter) | |||||
@negotiate(JSONFormatter) | |||||
def site_map(): | |||||
links = [] | |||||
sched = get_sched() | |||||
for rule in app.url_map.iter_rules(): | |||||
if has_no_empty_params(rule) and hasattr(sched, rule.endpoint): | |||||
links.append(dict( | |||||
rule=rule.rule, | |||||
description=getattr(sched, rule.endpoint).__doc__)) | |||||
# links is now a list of url, endpoint tuples | |||||
return links | |||||
vlorentzUnsubmitted Not Done Inline ActionsWhat is this new endpoint for? vlorentz: What is this new endpoint for? | |||||
vlorentzUnsubmitted Not Done Inline ActionsAnd it lacks a test. vlorentz: And it lacks a test. | |||||
def run_from_webserver(environ, start_response, | def run_from_webserver(environ, start_response, | ||||
config_path=DEFAULT_CONFIG_PATH): | config_path=DEFAULT_CONFIG_PATH): | ||||
"""Run the WSGI app from the webserver, loading the configuration.""" | """Run the WSGI app from the webserver, loading the configuration.""" | ||||
cfg = config.load_named_config(config_path, DEFAULT_CONFIG) | cfg = config.load_named_config(config_path, DEFAULT_CONFIG) | ||||
app.config.update(cfg) | app.config.update(cfg) | ||||
handler = logging.StreamHandler() | handler = logging.StreamHandler() | ||||
app.logger.addHandler(handler) | app.logger.addHandler(handler) | ||||
return app(environ, start_response) | return app(environ, start_response) | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
print('Please use the "swh-scheduler api-server" command') | print('Please use the "swh-scheduler api-server" command') |
Can be rewritten as: