A1-Simulator - Align with OSC Near-RT-RIC A1 Mediator
[sim/a1-interface.git] / near-rt-ric-simulator / src / OSC_2.1.0 / controllers / a1_mediator_controller.py
@@ -1,5 +1,5 @@
 #  ============LICENSE_START===============================================
-#  Copyright (C) 2021 Nordix Foundation. All rights reserved.
+#  Copyright (C) 2021-2023 Nordix Foundation. All rights reserved.
 #  ========================================================================
 #  Licensed under the Apache License, Version 2.0 (the "License");
 #  you may not use this file except in compliance with the License.
 #
 
 import json
-import datetime
+import datetime
 import time
 
 from datetime import datetime
-from connexion import NoContent
-from flask import Flask, request, Response
+from flask import request, Response
 from jsonschema import validate
-from var_declaration import policy_instances, policy_types, policy_status, policy_fingerprint, forced_settings, hosts_set
+from var_declaration import policy_instances, policy_types, policy_status, policy_fingerprint, callbacks, forced_settings, hosts_set, jobs, data_delivery
+from models.enforceStatus import EnforceStatus
 from utils import calcFingerprint
 from maincommon import extract_host_name, is_duplicate_check
 from payload_logging import is_payload_logging
 
-#Constsants
-APPL_JSON='application/json'
-
+# Constants
+APPL_JSON = 'application/json'
 
 #Helper funtion to log http reponse
 def log_resp_text(msg):
@@ -40,7 +39,7 @@ def log_resp_text(msg):
     print(str(msg))
 
 # API Function: Health check
-def get_healthcheck():
+def a1_controller_get_healthcheck():
 
   extract_host_name(hosts_set, request)
 
@@ -50,8 +49,7 @@ def get_healthcheck():
   return (None, 200)
 
 # API Function: Get all policy type ids
-def get_all_policy_types():
-
+def a1_controller_get_all_policy_types():
   extract_host_name(hosts_set, request)
 
   if ((r := check_modified_response()) is not None):
@@ -62,8 +60,7 @@ def get_all_policy_types():
   return (res, 200)
 
 # API Function: Get a policy type
-def get_policy_type(policy_type_id):
-
+def a1_controller_get_policy_type(policy_type_id):
   extract_host_name(hosts_set, request)
 
   if ((r := check_modified_response()) is not None):
@@ -78,7 +75,7 @@ def get_policy_type(policy_type_id):
   return Response(json.dumps(policy_types[policy_type_id]), 200, mimetype=APPL_JSON)
 
 # API Function: Delete a policy type
-def delete_policy_type(policy_type_id):
+def a1_controller_delete_policy_type(policy_type_id):
 
   extract_host_name(hosts_set, request)
 
@@ -102,7 +99,7 @@ def delete_policy_type(policy_type_id):
 
 
 # API Function: Create a policy type
-def create_policy_type(policy_type_id):
+def a1_controller_create_policy_type(policy_type_id):
 
   extract_host_name(hosts_set, request)
 
@@ -141,7 +138,7 @@ def create_policy_type(policy_type_id):
 
 
 # API Function: Get all policy ids for a type
-def get_all_policy_identities(policy_type_id):
+def  a1_controller_get_all_instances_for_type(policy_type_id):
 
   extract_host_name(hosts_set, request)
 
@@ -156,7 +153,7 @@ def get_all_policy_identities(policy_type_id):
   return (list(policy_instances[policy_type_id].keys()), 200)
 
 # API Function: Get a policy instance
-def get_policy_instance(policy_type_id, policy_instance_id):
+def a1_controller_get_policy_instance(policy_type_id, policy_instance_id):
 
   extract_host_name(hosts_set, request)
 
@@ -176,7 +173,7 @@ def get_policy_instance(policy_type_id, policy_instance_id):
   return Response(json.dumps(policy_instances[policy_type_id][policy_instance_id]), 200, mimetype=APPL_JSON)
 
 # API function: Delete a policy
-def delete_policy_instance(policy_type_id, policy_instance_id):
+def a1_controller_delete_policy_instance(policy_type_id, policy_instance_id):
 
   extract_host_name(hosts_set, request)
 
@@ -201,11 +198,13 @@ def delete_policy_instance(policy_type_id, policy_instance_id):
   del policy_fingerprint[fp_previous]
   del policy_instances[policy_type_id][policy_instance_id]
   del policy_status[policy_instance_id]
+  callbacks.pop(policy_instance_id)
 
   return (None, 202)
 
+
 # API function: Create/update a policy
-def create_or_replace_policy_instance(policy_type_id, policy_instance_id):
+def a1_controller_create_or_replace_policy_instance(policy_type_id, policy_instance_id):
 
   extract_host_name(hosts_set, request)
 
@@ -243,33 +242,35 @@ def create_or_replace_policy_instance(policy_type_id, policy_instance_id):
       log_resp_text("Policy id already exist for other type")
       return (None, 400)
 
-  if (is_duplicate_check()):
-    fp=calcFingerprint(data, policy_type_id)
+  if is_duplicate_check():
+    fp = calcFingerprint(data, policy_type_id)
   else:
-    fp=policy_instance_id
+    fp = policy_instance_id
 
-  if ((fp in policy_fingerprint.keys()) and is_duplicate_check()):
-    p_id=policy_fingerprint[fp]
+  if (fp in policy_fingerprint.keys()) and is_duplicate_check():
+    p_id = policy_fingerprint[fp]
     if (p_id != policy_instance_id):
       log_resp_text("Policy json duplicate of other instance")
       return (None, 400)
 
-  if (fp_previous is not None):
+  if fp_previous is not None:
     del policy_fingerprint[fp_previous]
 
   policy_fingerprint[fp]=policy_instance_id
 
+  noti = request.args.get('notificationDestination')
+  callbacks[policy_instance_id] = noti
+
   policy_instances[policy_type_id][policy_instance_id]=data
-  ps={}
-  ps["instance_status"] = "NOT IN EFFECT"
-  ps["has_been_deleted"] = "false"
-  ps["created_at"] = str(datetime.now().strftime("%m/%d/%Y, %H:%M:%S"))
-  policy_status[policy_instance_id]=ps
 
+  enforceStatus = EnforceStatus("NOT_ENFORCED", "OTHER_REASON")
+  policy_status[policy_instance_id] = enforceStatus.to_dict()
+
+  # return Response(json.dumps(data), 200, mimetype=APPL_JSON)
   return (None, 202)
 
 # API function: Get policy status
-def get_policy_instance_status(policy_type_id, policy_instance_id):
+def a1_controller_get_policy_instance_status(policy_type_id, policy_instance_id):
 
   extract_host_name(hosts_set, request)
 
@@ -287,6 +288,27 @@ def get_policy_instance_status(policy_type_id, policy_instance_id):
 
   return Response(json.dumps(policy_status[policy_instance_id]), 200, mimetype=APPL_JSON)
 
+# API function: Receive a data delivery package
+def a1_controller_data_delivery():
+  extract_host_name(hosts_set, request)
+  if ((r := check_modified_response()) is not None):
+    return r
+
+  try:
+    data = request.data
+    data = json.loads(data)
+    job = data['job']
+    jobs.index(job)
+  except ValueError:
+    log_resp_text("no job id defined for this data delivery")
+    return (None, 404)
+  except Exception:
+    log_resp_text("The data is corrupt or missing.")
+    return (None, 400)
+  data_delivery.append(data)
+  return (None, 200) # Should A1 and the A1 Simulator return 201 for creating a new resource?
+
 # Helper: Create a response object if forced http response code is set
 def get_forced_response():