decisionai_plugin/common/plugin_model_api.py (92 lines of code) (raw):
import time
import traceback
from telemetry import log
from flask import Flask, request, g, jsonify, make_response
from flask_restful import Resource, Api
from .plugin_service import PluginService
from .util.constant import STATUS_SUCCESS, STATUS_FAIL
import logging
app = Flask(__name__)
api = Api(app)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
def try_except(fn):
def wrapped(*args, **kwargs):
try:
return fn(*args, **kwargs)
except Exception as e:
error_message = str(e) + '\n' + traceback.format_exc()
return make_response(jsonify(dict(result=STATUS_FAIL, message='Unknown error, please check your request. ' + error_message)), 502)
return wrapped
@app.route('/', methods=['GET'])
def index():
return "Welcome to TSANA Computing Platform"
@app.before_request
def before_request():
g.start = time.time()
@app.after_request
def after_request(response):
# TODO log here
request_log = '\nRequest begin-----------------------------'
request_log += '\n'
request_log += ' url: ' + str(request.url)
request_log += '\n'
request_log += ' response status: ' + str(response.status)
request_log += '\n'
request_log += 'Request end-----------------------------'
log.info(request_log)
total_time = (time.time() - g.start)
url_rule = str(request.url_rule)
url = str(request.path)
status = str(response.status_code)
log.duration("tsg_plugin_api_request_duration", total_time, url_rule=url_rule, url=url, response_code=status)
log.count("tsg_plugin_api_request_count", 1, url_rule=url_rule, url=url, response_code=status)
return response
class PluginModelIndexAPI(Resource):
def put(self):
return "Welcome to TSANA Computing Platform"
api.add_resource(PluginModelIndexAPI, '/')
class PluginModelAPI(Resource): # The API class that handles a single user
def __init__(self, plugin_service: PluginService):
self.__plugin_service = plugin_service
@try_except
def get(self, model_id):
pass
@try_except
def post(self, model_id):
return self.__plugin_service.state(request, model_id)
@try_except
def put(self, model_id):
pass
@try_except
def delete(self, model_id):
return self.__plugin_service.delete(request, model_id)
class PluginModelTrainAPI(Resource):
def __init__(self, plugin_service: PluginService):
self.__plugin_service = plugin_service
@try_except
def post(self):
return self.__plugin_service.train(request)
class PluginModelInferenceAPI(Resource):
def __init__(self, plugin_service: PluginService):
self.__plugin_service = plugin_service
@try_except
def post(self, model_id):
return self.__plugin_service.inference(request, model_id)
class PluginModelParameterAPI(Resource):
def __init__(self, plugin_service: PluginService):
self.__plugin_service = plugin_service
@try_except
def post(self):
return self.__plugin_service.verify(request)
class PluginModelListAPI(Resource):
def __init__(self, plugin_service: PluginService):
self.__plugin_service = plugin_service
@try_except
def get(self):
return self.__plugin_service.list_models(request)
def api_init(plugin_service:PluginService):
api.add_resource(PluginModelListAPI, '/models', resource_class_kwargs={'plugin_service': plugin_service})
api.add_resource(PluginModelAPI, '/models/<model_id>', resource_class_kwargs={'plugin_service': plugin_service})
api.add_resource(PluginModelTrainAPI, '/models/train', resource_class_kwargs={'plugin_service': plugin_service})
api.add_resource(PluginModelInferenceAPI, '/models/<model_id>/inference', resource_class_kwargs={'plugin_service': plugin_service})
api.add_resource(PluginModelParameterAPI, '/parameters', resource_class_kwargs={'plugin_service': plugin_service})