changes in OSDF and optimizer for CCVPN get link requirement.
[optf/osdf.git] / osdfapp.py
1 # -------------------------------------------------------------------------
2 #   Copyright (c) 2015-2017 AT&T Intellectual Property
3 #
4 #   Licensed under the Apache License, Version 2.0 (the "License");
5 #   you may not use this file except in compliance with the License.
6 #   You may obtain a copy of the License at
7 #
8 #       http://www.apache.org/licenses/LICENSE-2.0
9 #
10 #   Unless required by applicable law or agreed to in writing, software
11 #   distributed under the License is distributed on an "AS IS" BASIS,
12 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 #   See the License for the specific language governing permissions and
14 #   limitations under the License.
15 #
16 # -------------------------------------------------------------------------
17 #
18
19 """
20 OSDF Manager Main Flask Application
21 """
22
23 import json
24 import ssl
25 import sys
26 import time
27 import traceback
28 from optparse import OptionParser
29 from threading import Thread  # for scaling up, may need celery with RabbitMQ or redis
30
31 from flask import request, g
32
33 from osdf.apps.baseapp import app, run_app
34 from apps.pci.models.api.pciOptimizationRequest import PCIOptimizationAPI
35 from apps.pci.optimizers.pci_opt_processor import process_pci_optimation
36 from apps.placement.models.api.placementRequest import PlacementAPI
37 from apps.placement.optimizers.conductor.remote_opt_processor import process_placement_opt
38 from apps.route.optimizers.simple_route_opt import RouteOpt
39 from osdf.adapters.policy.interface import get_policies
40 from osdf.adapters.policy.interface import upload_policy_models
41 from osdf.config.base import osdf_config
42 from osdf.logging.osdf_logging import MH, audit_log
43 from osdf.operation.responses import osdf_response_for_request_accept as req_accept
44 from osdf.utils import api_data_utils
45 from osdf.webapp.appcontroller import auth_basic
46
47
48 @app.route("/api/oof/v1/healthcheck", methods=["GET"])
49 def do_osdf_health_check():
50     """Simple health check"""
51     audit_log.info("A health check request is processed!")
52     return "OK"
53
54
55 @app.route("/api/oof/loadmodels/v1", methods=["GET"])
56 def do_osdf_load_policies():
57     audit_log.info("Uploading policy models")
58     """Upload policy models"""
59     response = upload_policy_models()
60     audit_log.info(response)
61     return "OK"
62
63
64 @app.route("/api/oof/v1/placement", methods=["POST"])
65 @auth_basic.login_required
66 def do_placement_opt():
67     return placement_rest_api()
68
69
70 @app.route("/api/oof/placement/v1", methods=["POST"])
71 @auth_basic.login_required
72 def do_placement_opt_common_versioning():
73     return placement_rest_api()
74
75
76 def placement_rest_api():
77     """Perform placement optimization after validating the request and fetching policies
78     Make a call to the call-back URL with the output of the placement request.
79     Note: Call to Conductor for placement optimization may have redirects, so account for them
80     """
81     request_json = request.get_json()
82     req_id = request_json['requestInfo']['requestId']
83     g.request_id = req_id
84     audit_log.info(MH.received_request(request.url, request.remote_addr, json.dumps(request_json)))
85     api_version_info = api_data_utils.retrieve_version_info(request, req_id)
86     PlacementAPI(request_json).validate()
87     policies = get_policies(request_json, "placement")
88     audit_log.info(MH.new_worker_thread(req_id, "[for placement]"))
89     t = Thread(target=process_placement_opt, args=(request_json, policies, osdf_config))
90     t.start()
91     audit_log.info(MH.accepted_valid_request(req_id, request))
92     return req_accept(request_id=req_id,
93                       transaction_id=request_json['requestInfo']['transactionId'],
94                       version_info=api_version_info, request_status="accepted", status_message="")
95
96
97 @app.route("/api/oof/route/v1", methods=["POST"])
98 def do_route_calc():
99     """
100     Perform the basic route calculations and returnn the vpn-bindings
101     """
102     request_json = request.get_json()
103     audit_log.info("Calculate Route request received!")
104     response = RouteOpt().getRoute(request_json)
105     return response
106
107
108 @app.route("/api/oof/v1/pci", methods=["POST"])
109 @app.route("/api/oof/pci/v1", methods=["POST"])
110 @auth_basic.login_required
111 def do_pci_optimization():
112     request_json = request.get_json()
113     audit_log.info('request json obtained==>')
114     audit_log.info(request_json)
115
116     req_id = request_json['requestInfo']['requestId']
117     audit_log.info('requestID obtained==>')
118     audit_log.info(req_id)
119     
120     g.request_id = req_id
121     audit_log.info(MH.received_request(request.url, request.remote_addr, json.dumps(request_json)))
122     PCIOptimizationAPI(request_json).validate()
123     # disable policy retrieval
124     # policies = get_policies(request_json, "pciopt")
125     audit_log.info(MH.new_worker_thread(req_id, "[for pciopt]"))
126     t = Thread(target=process_pci_optimation, args=(request_json, osdf_config, None))
127     t.start()
128     audit_log.info(MH.accepted_valid_request(req_id, request))
129     audit_log.info('reached upto return')
130     return req_accept(request_id=req_id,
131                       transaction_id=request_json['requestInfo']['transactionId'],
132                       request_status="accepted", status_message="")
133
134
135 if __name__ == "__main__":
136     run_app()