X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=osdfapp.py;h=ed518b2e9c5a28392fa0d37d6b82927341ef3669;hb=134a18e619772b6cb21000c97291d7966d5598eb;hp=eb14530d7a2a4f48d6e053b3cc122de1ae159ff3;hpb=ed70b5c6d6589e4e1ce80229612ea5b680736c4c;p=optf%2Fosdf.git diff --git a/osdfapp.py b/osdfapp.py index eb14530..ed518b2 100755 --- a/osdfapp.py +++ b/osdfapp.py @@ -20,31 +20,33 @@ OSDF Manager Main Flask Application """ +import json import sys +import traceback +from optparse import OptionParser from threading import Thread # for scaling up, may need celery with RabbitMQ or redis +import pydevd from flask import Flask, request, Response, g +from requests import RequestException +from schematics.exceptions import DataError -import osdf -import pydevd -import json -import osdf.adapters.policy.interface -import osdf.config.credentials -import osdf.config.loader -import osdf.operation.error_handling +import osdf.adapters.aaf.sms as sms import osdf.operation.responses -import traceback 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.optimizers.placementopt.conductor.remote_opt_processor import process_placement_opt -from osdf.webapp.appcontroller import auth_basic -from optparse import OptionParser -from osdf.operation.exceptions import BusinessException -from osdf.operation.error_handling import request_exception_to_json_body, internal_error_message -from requests import RequestException -from schematics.exceptions import DataError 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.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.webapp.appcontroller import auth_basic ERROR_TEMPLATE = osdf.ERROR_TEMPLATE @@ -96,12 +98,26 @@ def handle_data_error(e): @app.route("/api/oof/v1/healthcheck", methods=["GET"]) def do_osdf_health_check(): """Simple health check""" + audit_log.info("A health check request is processed!") + """Upload policy models""" + response = upload_policy_models() + audit_log.info(response) return "OK" @app.route("/api/oof/v1/placement", methods=["POST"]) @auth_basic.login_required def do_placement_opt(): + return placement_rest_api() + + +@app.route("/api/oof/placement/v1", methods=["POST"]) +@auth_basic.login_required +def do_placement_opt_common_versioning(): + return placement_rest_api() + + +def placement_rest_api(): """Perform placement optimization after validating the request and fetching policies Make a call to the call-back URL with the output of the placement request. Note: Call to Conductor for placement optimization may have redirects, so account for them @@ -110,21 +126,46 @@ def do_placement_opt(): 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))) - + api_version_info = api_data_utils.retrieve_version_info(request, req_id) PlacementAPI(request_json).validate() + policies = get_policies(request_json, "placement") + audit_log.info(MH.new_worker_thread(req_id, "[for placement]")) + t = Thread(target=process_placement_opt, args=(request_json, policies, osdf_config)) + t.start() + audit_log.info(MH.accepted_valid_request(req_id, request)) + return req_accept(request_id=req_id, + transaction_id=request_json['requestInfo']['transactionId'], + version_info=api_version_info, request_status="accepted", status_message="") - # Currently policies are being used only during placement, so only fetch them if placement demands is not empty - policies, prov_status = {}, None - if 'placementDemand' in request_json['placementInfo']['demandInfo']: - policies, prov_status = get_policies(request_json, "placement") +@app.route("/api/oof/v1/route", 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) - audit_log.info(MH.new_worker_thread(req_id, "[for placement]")) - t = Thread(target=process_placement_opt, args=(request_json, policies, osdf_config, prov_status)) + +@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() + 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))) + PCIOptimizationAPI(request_json).validate() + # disable policy retrieval + # policies = get_policies(request_json, "pciopt") + audit_log.info(MH.new_worker_thread(req_id, "[for pciopt]")) + t = Thread(target=process_pci_optimation, args=(request_json, osdf_config, None)) t.start() audit_log.info(MH.accepted_valid_request(req_id, request)) - return osdf.operation.responses.osdf_response_for_request_accept( - req_id=req_id, text="Accepted placement request. Response will be posted to callback URL") + return req_accept(request_id=req_id, + transaction_id=request_json['requestInfo']['transactionId'], + request_status="accepted", status_message="") @app.errorhandler(500) @@ -169,6 +210,8 @@ if __name__ == "__main__": common_app_opts.update({'ssl_context': tuple(ssl_opts)}) 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: