18bc03bd865ffaacf5ab89c2801c0382a1b7adda
[sim/a1-interface.git] / near-rt-ric-simulator / src / OSC_2.1.0 / main.py
1 #  ============LICENSE_START===============================================
2 #  Copyright (C) 2021 Nordix Foundation. All rights reserved.
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 #  ============LICENSE_END=================================================
16 #
17
18 import connexion
19 import json
20 import sys
21 import os
22 import requests
23
24 from pathlib import Path
25 from flask import Flask, escape, request, Response, jsonify
26 from jsonschema import validate
27 from var_declaration import policy_instances, policy_types, policy_status, policy_fingerprint, forced_settings, hosts_set, app
28 from maincommon import check_apipath, apipath, get_supported_interfaces_response, extract_host_name
29 from time import sleep
30
31 #Constants
32 TEXT_PLAIN='text/plain'
33
34 check_apipath()
35
36 # app is created in var_declarations
37
38 import payload_logging   # app var need to be initialized
39
40 #Check alive function
41 @app.route('/', methods=['GET'])
42 def test():
43
44     return Response("OK", 200, mimetype=TEXT_PLAIN)
45
46 @app.route('/ip', methods=['GET'])
47 def get_ip():
48     if request.environ.get('HTTP_X_FORWARDED_FOR') is None:
49         return jsonify({'ip': request.environ['REMOTE_ADDR']}), 200
50     else:
51         return jsonify({'ip': request.environ['HTTP_X_FORWARDED_FOR']}), 200
52
53 #Return the current and all supported yamls for the this container
54 @app.route('/container_interfaces', methods=['GET'])
55 def container_interfaces():
56
57     return get_supported_interfaces_response()
58
59 #Delete all created instances and status
60 @app.route('/deleteinstances', methods=['POST'])
61 def deleteinstances():
62
63   for i in policy_instances.keys():
64     policy_instances[i]={}
65
66   policy_status.clear()
67   forced_settings.clear()
68   forced_settings['code']=None
69   forced_settings['delay']=None
70   policy_fingerprint.clear()
71   return Response("All policy instances deleted", 200, mimetype=TEXT_PLAIN)
72
73 #Delete all - all reset
74 @app.route('/deleteall', methods=['POST'])
75 def deleteall():
76
77   policy_instances.clear()
78   policy_types.clear()
79   policy_status.clear()
80   forced_settings['code']=None
81   forced_settings['delay']=None
82   policy_fingerprint.clear()
83   return Response("All policy instances and types deleted", 200, mimetype=TEXT_PLAIN)
84
85 #Load a policy type
86 @app.route('/policytype', methods=['PUT'])
87 def policytype():
88
89   policy_type_id=request.args.get('id')
90   if (policy_type_id is None):
91     return Response('Parameter <id> missing in request', status=400, mimetype=TEXT_PLAIN)
92   try:
93     int(policy_type_id)
94   except Exception:
95     return Response("The policy type id is not an int", 400, mimetype=TEXT_PLAIN)
96   try:
97     data = request.data
98     data = json.loads(data)
99   except Exception:
100     return Response("The policy type is corrupt or missing", 400, mimetype=TEXT_PLAIN)
101
102   if ('name' not in data.keys() or 'description' not in data.keys() or 'policy_type_id' not in data.keys() or'create_schema' not in data.keys()):
103     return Response("The policy type missing atributes", 400, mimetype=TEXT_PLAIN)
104
105   retcode=201
106   if (policy_type_id in policy_types.keys()):
107     retcode=200
108     if (len(policy_instances[policy_type_id]) > 0):
109       return Response("The policy type already exists and instances exists", 400, mimetype=TEXT_PLAIN)
110
111   policy_types[policy_type_id]=data
112   policy_instances[policy_type_id]={}
113   return Response("Policy type " + policy_type_id + " is OK.", retcode, mimetype=TEXT_PLAIN)
114
115 #Delete a policy type
116 @app.route('/policytype', methods=['DELETE'])
117 def del_policytype():
118
119   policy_type_id=request.args.get('id')
120   if (policy_type_id is None):
121     return Response('Parameter <id> missing in request', status=400, mimetype=TEXT_PLAIN)
122   try:
123     int(policy_type_id)
124   except Exception:
125     return Response("The policy type id is not an int", 400, mimetype=TEXT_PLAIN)
126
127   if (policy_type_id in policy_types.keys()):
128     if (len(policy_instances[policy_type_id]) > 0):
129       return Response("The policy type already exists and instances exists", 400, mimetype=TEXT_PLAIN)
130
131     del policy_types[policy_type_id]
132     del policy_instances[policy_type_id]
133     return Response("Policy type " + policy_type_id + " is OK.", 204, mimetype=TEXT_PLAIN)
134
135   return Response("Policy type " + policy_type_id + " not found.", 204, mimetype=TEXT_PLAIN)
136
137
138 # Get all policy type ids
139 @app.route('/policytypes', methods=['GET'])
140 def get_policytype_ids():
141
142   return (json.dumps(list(policy_instances.keys())), 200)
143
144 #Set force response for one A1 response
145 #/forceresponse?code=<responsecode>
146 @app.route('/forceresponse', methods=['POST'])
147 def forceresponse():
148
149   try:
150     forced_settings['code']=int(request.args.get('code'))
151   except Exception:
152     forced_settings['code']=None
153   return Response("Force response code: " + str(forced_settings['code']) + " set for one single A1 response", 200, mimetype=TEXT_PLAIN)
154
155 #Set force delay response, in seconds, for all A1 responses
156 #/froceesponse?delay=<seconds>
157 @app.route('/forcedelay', methods=['POST'])
158 def forcedelay():
159
160   try:
161     forced_settings['delay']=int(request.args.get('delay'))
162   except Exception:
163     forced_settings['delay']=None
164   return Response("Force delay: " + str(forced_settings['delay']) + " sec set for all A1 responses", 200, mimetype=TEXT_PLAIN)
165
166
167 #Set status and reason
168 #/status?policyid=<policyid>&status=<status>[&deleted=<boolean>][&created_at=<timestamp>]
169 @app.route('/status', methods=['PUT'])
170 def setstatus():
171
172   policy_id=request.args.get('policyid')
173   if (policy_id is None):
174     return Response('Parameter <policyid> missing in request', status=400, mimetype=TEXT_PLAIN)
175
176   if policy_id not in policy_status.keys():
177     return Response('Policyid: '+policy_id+' not found.', status=404, mimetype=TEXT_PLAIN)
178   status=request.args.get('status')
179   if (status is None):
180     return Response('Parameter <status> missing in request', status=400, mimetype=TEXT_PLAIN)
181   policy_status[policy_id]["instance_status"]=status
182   msg = "Status set to "+status
183   deleted_policy=request.args.get('deleted')
184   if (deleted_policy is not None):
185     policy_status[policy_id]["has_been_deleted"]=deleted_policy
186     msg = msg + " and has_been_deleted set to "+deleted_policy
187   created_at = request.args.get('created_at')
188   if (created_at is not None):
189     policy_status[policy_id]["created_at"]=created_at
190     msg = msg + " and created_at set to "+created_at
191   msg=msg + " for policy: " + policy_id
192   return Response(msg, 200, mimetype=TEXT_PLAIN)
193
194
195 #Metrics function
196 #Get a named counter
197 @app.route('/counter/<string:countername>', methods=['GET'])
198 def getcounter(countername):
199
200   if (countername == "num_instances"):
201     return Response(str(len(policy_fingerprint)), 200, mimetype=TEXT_PLAIN)
202   elif (countername == "num_types"):
203     return Response(str(len(policy_instances)),200, mimetype=TEXT_PLAIN)
204   elif (countername == "interface"):
205     p=Path(os.getcwd())
206     pp=p.parts
207     return Response(str(pp[len(pp)-1]),200, mimetype=TEXT_PLAIN)
208   elif (countername == "remote_hosts"):
209     hosts=",".join(hosts_set)
210     return str(hosts),200
211   elif (countername == "datadelivery"):
212     return Response(str(0),200, mimetype=TEXT_PLAIN)
213   else:
214     return Response("Counter name: "+countername+" not found.",404, mimetype=TEXT_PLAIN)
215
216 port_number = 2222
217 if len(sys.argv) >= 2 :
218   if isinstance(sys.argv[1], int):
219     port_number = sys.argv[1]
220
221 app.add_api('openapi.yaml')
222
223 if __name__ == '__main__':
224   app.run(port=port_number, host="127.0.0.1", threaded=False)