X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=osdfapp.py;h=eb99fac3e3c4415922cd0195da31968bbd9d8e0e;hb=053c09a2ed1a8fc8aeef3f8185902634feec8000;hp=1cfb8a3afca4a6ac3ed1964f3b351c7735b7f87f;hpb=15a847b3bebd604113414938c1345fe47b2c51b5;p=optf%2Fosdf.git diff --git a/osdfapp.py b/osdfapp.py index 1cfb8a3..eb99fac 100755 --- a/osdfapp.py +++ b/osdfapp.py @@ -21,99 +21,30 @@ OSDF Manager Main Flask Application """ import json -import ssl -import sys -import time -import traceback -from optparse import OptionParser -from threading import Thread # for scaling up, may need celery with RabbitMQ or redis - -import pydevd -import yaml -from flask import Flask, request, Response, g -from requests import RequestException -from schematics.exceptions import DataError -yaml.warnings({'YAMLLoadWarning': False}) +from threading import Thread # for scaling up, may need celery with RabbitMQ or redis -import osdf.adapters.aaf.sms as sms -import osdf.operation.responses +from flask import request, g + +from osdf.apps.baseapp import app, run_app +from apps.nst.models.api.nstSelectionRequest import NSTSelectionAPI +from apps.pci.models.api.pciOptimizationRequest import PCIOptimizationAPI +from apps.nst.optimizers.nst_select_processor import process_nst_selection +from apps.pci.optimizers.pci_opt_processor import process_pci_optimation +from apps.placement.models.api.placementRequest import PlacementAPI +from apps.placement.optimizers.conductor.remote_opt_processor import process_placement_opt +from apps.route.optimizers.inter_domain_route_opt import InterDomainRouteOpt +from apps.route.optimizers.simple_route_opt import RouteOpt +from apps.slice_selection.models.api.nsi_selection_request import NSISelectionAPI +from apps.slice_selection.optimizers.conductor.remote_opt_processor import process_nsi_selection_opt from osdf.adapters.policy.interface import get_policies from osdf.adapters.policy.interface import upload_policy_models from osdf.config.base import osdf_config -from osdf.logging.osdf_logging import MH, audit_log, error_log, debug_log -from osdf.models.api.pciOptimizationRequest import PCIOptimizationAPI -from osdf.models.api.placementRequest import PlacementAPI -from osdf.operation.error_handling import request_exception_to_json_body, internal_error_message -from osdf.operation.exceptions import BusinessException +from osdf.logging.osdf_logging import MH, audit_log from osdf.operation.responses import osdf_response_for_request_accept as req_accept -from osdf.optimizers.pciopt.pci_opt_processor import process_pci_optimation -from osdf.optimizers.placementopt.conductor.remote_opt_processor import process_placement_opt -from osdf.optimizers.routeopt.simple_route_opt import RouteOpt from osdf.utils import api_data_utils -from osdf.utils.mdc_utils import clear_mdc, mdc_from_json from osdf.webapp.appcontroller import auth_basic -ERROR_TEMPLATE = osdf.ERROR_TEMPLATE - -app = Flask(__name__) - -BAD_CLIENT_REQUEST_MESSAGE = 'Client sent an invalid request' - - -@app.errorhandler(BusinessException) -def handle_business_exception(e): - """An exception explicitly raised due to some business rule""" - error_log.error("Synchronous error for request id {} {}".format(g.request_id, traceback.format_exc())) - err_msg = ERROR_TEMPLATE.render(description=str(e)) - response = Response(err_msg, content_type='application/json; charset=utf-8') - response.status_code = 400 - return response - - -@app.errorhandler(RequestException) -def handle_request_exception(e): - """Returns a detailed synchronous message to the calling client - when osdf fails due to a remote call to another system""" - error_log.error("Synchronous error for request id {} {}".format(g.request_id, traceback.format_exc())) - err_msg = request_exception_to_json_body(e) - response = Response(err_msg, content_type='application/json; charset=utf-8') - response.status_code = 400 - return response - - -@app.errorhandler(DataError) -def handle_data_error(e): - """Returns a detailed message to the calling client when the initial synchronous message is invalid""" - error_log.error("Synchronous error for request id {} {}".format(g.request_id, traceback.format_exc())) - - body_dictionary = { - "serviceException": { - "text": BAD_CLIENT_REQUEST_MESSAGE, - "exceptionMessage": str(e.errors), - "errorType": "InvalidClientRequest" - } - } - - body_as_json = json.dumps(body_dictionary) - response = Response(body_as_json, content_type='application/json; charset=utf-8') - response.status_code = 400 - return response - - -@app.before_request -def log_request(): - g.request_start = time.clock() - request_json = request.get_json() - g.request_id = request_json['requestInfo']['requestId'] - mdc_from_json(request_json) - - -@app.after_request -def log_response(response): - clear_mdc() - return response - @app.route("/api/oof/v1/healthcheck", methods=["GET"]) def do_osdf_health_check(): @@ -164,22 +95,46 @@ def placement_rest_api(): version_info=api_version_info, request_status="accepted", status_message="") -@app.route("/api/oof/v1/route", methods=["POST"]) +@app.route("/api/oof/route/v1", methods=["POST"]) def do_route_calc(): """ Perform the basic route calculations and returnn the vpn-bindings """ request_json = request.get_json() audit_log.info("Calculate Route request received!") - return RouteOpt().getRoute(request_json) + response = RouteOpt().get_route(request_json, osdf_config) + return response + +@app.route("/api/oof/mdons/route/v1", methods=["POST"]) +def do_mdons_route_calc(): + """ + Perform the inter domain route calculation + """ + request_json = request.get_json() + audit_log.info("Inter Domain Calculation Route request received!") + response = InterDomainRouteOpt().get_route(request_json, osdf_config) + return response +@app.route("/api/oof/v1/selection/nst", methods=["POST"]) +def do_nst_selection(): + request_json = request.get_json() + req_id = request_json['requestInfo']['requestId'] + NSTSelectionAPI(request_json).validate() + response = process_nst_selection(request_json, osdf_config) + return response @app.route("/api/oof/v1/pci", methods=["POST"]) @app.route("/api/oof/pci/v1", methods=["POST"]) @auth_basic.login_required def do_pci_optimization(): request_json = request.get_json() + audit_log.info('request json obtained==>') + audit_log.info(request_json) + req_id = request_json['requestInfo']['requestId'] + audit_log.info('requestID obtained==>') + audit_log.info(req_id) + g.request_id = req_id audit_log.info(MH.received_request(request.url, request.remote_addr, json.dumps(request_json))) PCIOptimizationAPI(request_json).validate() @@ -189,64 +144,41 @@ def do_pci_optimization(): t = Thread(target=process_pci_optimation, args=(request_json, osdf_config, None)) t.start() audit_log.info(MH.accepted_valid_request(req_id, request)) + audit_log.info('reached upto return') return req_accept(request_id=req_id, transaction_id=request_json['requestInfo']['transactionId'], request_status="accepted", status_message="") -@app.errorhandler(500) -def internal_failure(error): - """Returned when unexpected coding errors occur during initial synchronous processing""" - error_log.error("Synchronous error for request id {} {}".format(g.request_id, traceback.format_exc())) - response = Response(internal_error_message, content_type='application/json; charset=utf-8') - response.status_code = 500 - return response - - -def get_options(argv): - program_version_string = '%%prog %s' % "v1.0" - program_longdesc = "" - program_license = "" - - parser = OptionParser(version=program_version_string, epilog=program_longdesc, description=program_license) - parser.add_option("-l", "--local", dest="local", help="run locally", action="store_true", default=False) - parser.add_option("-t", "--devtest", dest="devtest", help="run in dev/test environment", action="store_true", - default=False) - parser.add_option("-d", "--debughost", dest="debughost", help="IP Address of host running debug server", default='') - parser.add_option("-p", "--debugport", dest="debugport", help="Port number of debug server", type=int, default=5678) - opts, args = parser.parse_args(argv) - - if opts.debughost: - debug_log.debug('pydevd.settrace({}, port={})'.format(opts.debughost, opts.debugport)) - pydevd.settrace(opts.debughost, port=opts.debugport) - return opts +@app.route("/api/oof/selection/nsi/v1", methods=["POST"]) +def do_nsi_selection(): + request_json = request.get_json() + req_id = request_json['requestInfo']['requestId'] + g.request_id = req_id + audit_log.info(MH.received_request(request.url, request.remote_addr, json.dumps(request_json))) + NSISelectionAPI(request_json).validate() + audit_log.info(MH.new_worker_thread(req_id, "[for NSI selection]")) + t = Thread(target=process_nsi_selection_opt, args=(request_json, osdf_config)) + t.start() + return req_accept(request_id=req_id, + transaction_id=request_json['requestInfo']['transactionId'], + request_status="accepted", status_message="") -def build_ssl_context(): - ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) - ssl_context.set_ciphers('ECDHE-RSA-AES128-SHA256:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH') - ssl_context.load_cert_chain(sys_conf['ssl_context'][0], sys_conf['ssl_context'][1]) - return ssl_context +@app.route("/api/oof/selection/nssi/v1", methods=["POST"]) +def do_nssi_selection(): + request_json = request.get_json() + req_id = request_json['requestInfo']['requestId'] + g.request_id = req_id + audit_log.info(MH.received_request(request.url, request.remote_addr, json.dumps(request_json))) + NSSISelectionAPI(request_json).validate() + audit_log.info(MH.new_worker_thread(req_id, "[for NSSI selection]")) + t = Thread(target=process_nsi_selection_opt, args=(request_json, osdf_config)) + t.start() + return req_accept(request_id=req_id, + transaction_id=request_json['requestInfo']['transactionId'], + request_status="accepted", status_message="") if __name__ == "__main__": - - sys_conf = osdf_config['core']['osdf_system'] - ports = sys_conf['osdf_ports'] - internal_port, external_port = ports['internal'], ports['external'] - - local_host = sys_conf['osdf_ip_default'] - common_app_opts = dict(host=local_host, threaded=True, use_reloader=False) - - ssl_opts = sys_conf.get('ssl_context') - if ssl_opts: - common_app_opts.update({'ssl_context': build_ssl_context()}) - - opts = get_options(sys.argv) - # Load secrets from SMS - sms.load_secrets() - if not opts.local and not opts.devtest: # normal deployment - app.run(port=internal_port, debug=False, **common_app_opts) - else: - port = internal_port if opts.local else external_port - app.run(port=port, debug=True, **common_app_opts) + run_app()