Loading simu/data/subscriptions.csv 0 → 100644 +1 −0 Original line number Diff line number Diff line subscription_id,corr_id,address,callback,ue_event_criteria,resourceURL simu/mec_database.py +67 −3 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ from datetime import datetime, time class mec_database: """ Private properties """ __path__ = "/Users/yanng/OneDrive/Documents/Python/Mec/data/" # To be updated according to the local settings __path__ = "/Users/yanng/Documents/workspace_titan/STF569_Mec/simu/data/" # To be updated according to the local settings __subscribers__ = None __registered_list__ = None __zones__ = None Loading @@ -14,6 +14,7 @@ class mec_database: __location_info__ = None __cells__ = None __associated__ = None __subscribions__ = None def __init__(self): """ Default ctor: Open Pandas database. """ Loading @@ -24,6 +25,7 @@ class mec_database: self.__location_info__ = pd.DataFrame(pd.read_csv(self.__path__ + 'location_info.csv', index_col = 'accessPointId')) self.__cells__ = pd.DataFrame(pd.read_csv(self.__path__ + 'cells.csv', encoding = 'utf-8', index_col = 'cellId')) self.__associated__ = pd.DataFrame(pd.read_csv(self.__path__ + 'associated.csv', encoding = 'utf-8', index_col = 'cellId')) self.__subscriptions__ = pd.DataFrame(pd.read_csv(self.__path__ + 'subscriptions.csv', encoding = 'utf-8', index_col = 'subscription_id')) #self.dump() # End of __init__ Loading @@ -36,10 +38,16 @@ class mec_database: print("LocationInfo: ", self.__location_info__.head()) print("Cells: ", self.__cells__.head()) print("Associated: ", self.__associated__.head()) print("subscriptions: ", self.__subscribions__.head()) # End of dump def __to_accessPoint__(self, p_access_point, p_location): """ Build an AccessPointLocation Json message. """ """ Build an AccessPointLocation Json message. Keyword arguments: -- p_access_point: Access point identifier -- p_location : Access point geographical location """ print(">>> __to_accessPoint__: ", p_access_point) print("__to_accessPoint__: location= ", p_location['latitude'][0]) i = 0.0 Loading @@ -56,7 +64,11 @@ class mec_database: # End of __to_accessPoint__ def __to_zone__(self, p_zone): """ Build a Zones Json message. """ """ Build a Zones Json message. Keyword arguments: -- p_zone: Zone description """ print(">>> __to_zone__: ", p_zone) resp = "{\t\"zoneId\": \"" + p_zone[0] + "\",\t\"numberOfAccessPoints\": \"" + str(p_zone[1]) + "\",\t\"numberOfUnserviceableAccessPoints\": \"" + str(p_zone[2]) + "\",\t\"numberOfUsers\": \"" + str(p_zone[3]) + "\",\t\"resourceURL\": \"" + p_zone[4] + "\"}" print("__to_zone__: ", resp) Loading @@ -79,6 +91,21 @@ class mec_database: return resp # End of __to_ueIdentityTagInfo__ def __to_subscriptions__(self, p_subscription): """ Build the userTrackingSubscription response """ print(">>> __to_subscriptions__: ", p_subscription) resp = "\t{\"userTrackingSubscription\": {\t\"clientCorrelator\": \"" + p_subscription[1] + "\",\t\"callbackReference\": {\"notifyURL\": \"" + p_subscription[3] + "\"},\t\"address\": \"" + p_subscription[2] + "\",\t\"userEventCriteria\" : [" resp += "\"" + p_subscription[4][0] + "\"" i = 1 while i < len(p_subscription[4]): resp += ",\"" + p_subscription[4][i] + "\"" i += 1 # End of 'while' statement resp += "],\t\"resourceURL\":\"" + p_subscription[5] + "\"\t}}" print("__to_subscriptions__: ", resp) return resp # End of __to_subscriptions__ def getSubscriberList(self, p_uri): """ Build a SubscriberList Json message. """ print(">>> getSubscriberList") Loading Loading @@ -199,6 +226,43 @@ class mec_database: return resp # End of method registerUEidentity def registerSubscription(self, p_json_msg, p_uri): print(">>> registerSubscription: ", p_json_msg, "/", p_uri) resp = None subscription_id = "subscription" + p_json_msg["clientCorrelator"] try: # Check the record does not exist self.__subscriptions__.loc[self.__subscriptions__['subscription_id'] == subscription_id] print("registerSubscription: There is a subscription for ", subscription_id) except KeyError: #print("registerSubscription: Add new row in subscription") resource_url = "http://example.com" + p_uri + "/" + subscription_id row = pd.Series({ 'subscription_id': subscription_id, 'corr_id': p_json_msg["clientCorrelator"], 'address': p_json_msg["address"], 'callback': p_json_msg["callbackReference"]["notifyURL"], 'ue_event_criteria': p_json_msg["userEventCriteria"], 'resourceURL': resource_url }) #print("registerSubscription: row: ", row) self.__subscriptions__ = self.__subscriptions__.append(row, ignore_index=True).reindex() #print("registerSubscription: ", self.__subscriptions__.head()) r = tuple(self.__subscriptions__.loc[self.__subscriptions__['subscription_id'] == subscription_id].to_records()) #print("registerSubscription: New added row: ", r[0]) resp = self.__to_subscriptions__(r[0]) return resp # End of registerSubscription def unregisterSubscription(self, p_subscription_id): print(">>> unregisterSubscription: ", p_subscription_id) resp = None try: # Check the record exists r = self.__subscriptions__.loc[self.__subscriptions__['subscription_id'] == p_subscription_id] t = tuple(r.to_records()) print("unregisterSubscription: Find row: ", t) resp = self.__to_subscriptions__(t[0]) # Remove it self.__subscriptions__.drop(r.index) except KeyError: print("unregisterSubscription: No subscription for ", p_subscription_id) return resp # End of unregisterSubscription def getBwAllocationAppInst(self, p_app_inst, p_ue_identity_tag): print(">>> getBwAllocationAppInst: ", p_app_inst, ", ", p_ue_identity_tag) resp = None Loading simu/mec_http_server.py +45 −25 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): # Handler for the GET requests def do_GET(self): print(">>> do_GET: ", self.path) print('>>> do_GET: ', self.path) self.protocol_version = self.request_version # Check HTTP end_headers if self.__check_http_headers__() == False: Loading @@ -16,7 +16,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): self.send_response(400, 'Bad Request') self.send_header('Host', self.headers.get('Host')) self.send_header('Authorization', self.headers.get('Authorization')) self.send_header('Content-Type', "application/problem+json") self.send_header('Content-Type', 'application/problem+json') l = len(resp) self.send_header('Content-Length', str(l)) self.end_headers() Loading @@ -24,7 +24,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): return resp, content_type = self.__process__() print("do_GET: resp= ", resp, ", Content_Type= ", content_type) print('do_GET: resp= ', resp, ', Content_Type= ', content_type) if (resp == None): self.send_response(404, 'Not Found') self.send_header('Host', self.headers.get('Host')) Loading Loading @@ -61,7 +61,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): self.send_response(400, 'Bad Request') self.send_header('Host', self.headers.get('Host')) self.send_header('Authorization', self.headers.get('Authorization')) self.send_header('Content-Type', "application/problem+json") self.send_header('Content-Type', 'application/problem+json') l = len(resp) self.send_header('Content-Length', str(l)) self.end_headers() Loading @@ -69,7 +69,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): return resp, content_type = self.__process__() print("do_POST: resp= ", resp, ", Content_Type= ", content_type) print('do_POST: resp= ', resp, ', Content_Type= ', content_type) if (resp == None): self.send_response(404, 'Not Found') self.send_header('Host', self.headers.get('Host')) Loading @@ -84,6 +84,8 @@ class myHandler(http.server.BaseHTTPRequestHandler): self.send_response(403, 'Forbidden') elif resp.find('Bad Request') != -1: self.send_response(400, 'Bad Request') elif resp.find('userTrackingSubscription') != -1: self.send_response(201, 'Created') else: self.send_response(200, 'OK') self.send_header('Host', self.headers.get('Host')) Loading @@ -98,14 +100,14 @@ class myHandler(http.server.BaseHTTPRequestHandler): # Check HTTP headers def __check_http_headers__(self): print (">>> __check_http_headers__") print('>>> __check_http_headers__') result = True host = self.headers.get('Host') if host == None: print("__check_http_headers__: Failed to parse 'Host' header") print("__check_http_headers__: Failed to parse Host header") result = False content_type = self.headers.get('Content-Type') if content_type != "application/json": if content_type != 'application/json': print("__check_http_headers__: Failed to parse 'Content-Type' header") result = False auth = self.headers.get('Authorization') Loading @@ -118,9 +120,9 @@ class myHandler(http.server.BaseHTTPRequestHandler): # Process the request def __process__(self): s = self.path.split('/') print (">>> __process__: ", s) print('>>> __process__: ', s) if s[1] != 'exampleAPI': return None, "application/json" return None, 'application/json' # TODO Check HTTP headers if s[2] == 'location' and ((s[3] == 'v1') or (s[3] == 'v2')): return self.__process__location__api__(s) Loading @@ -131,14 +133,14 @@ class myHandler(http.server.BaseHTTPRequestHandler): elif s[2] == 'bwm' and ((s[3] == 'v1') or (s[3] == 'v2')): return self.__process__bwm__api__(s) else: return None, "application/json" return None, 'application/json' # End of __process__ # Process the LocationAPI request def __process__location__api__(self, p_split): print (">>> __process__location__api__: ", p_split) resp = None content_type = "application/json" content_type = 'application/json' if p_split[4].startswith('users'): # E.g. users?zoneId=zone01 s = p_split[4].split('?') if s.__len__() == 1: # Users list requested Loading Loading @@ -169,6 +171,20 @@ class myHandler(http.server.BaseHTTPRequestHandler): resp = "{\"Unsupported " + p_split[5] + " request\"}" else: resp = "{\"Unsupported " + p_split[4] + " request\"}" elif p_split[4] == 'subscriptions': if p_split.__len__() == 6: # Extract the body if any body = None content_len = int(self.headers.get('Content-Length')) if (content_len != 0): body = self.rfile.read(content_len) json_msg = self.__decode__json__body__(body) if (json_msg == None): resp = "{\"problemDetails\": {\t\"type\": \"Body processing not supported\",\t\"title\": \"UElocationAPI\",\t\"status\": 400,\t\"detail\": \"Unknown request\",\t\"instance\": \"string\"}}" else: resp = self.__db__.registerSubscription(json_msg, self.path) elif p_split.__len__() == 7: resp = self.__db__.unregisterSubscription(p_split[6]) else: resp = "{\"Unsupported " + p_split[4] + " request\"}" Loading @@ -180,7 +196,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): def __process__ue__identity__api__(self, p_split): print (">>> __process__ue__identity__api__: ", p_split) resp = None content_type = "application/json" content_type = 'application/json' if p_split[4] == 'appInst98': # Used for unknown application, e.g. TC_MEC_PLAT_UETAG_003_BI resp = "{\"problemDetails\": {\t\"type\": \"Not Authorized\",\t\"title\": \"UEidentityAPI\",\t\"status\": 403,\t\"detail\": \"Forbidden\",\t\"instance\": \"AppInst98\"}}" else: Loading @@ -206,12 +222,12 @@ class myHandler(http.server.BaseHTTPRequestHandler): resp = self.__db__.getUEidentityTagInfo(p_split[4], s[1]) if (resp == None): resp = "{\"problemDetails\": {\t\"type\": \"Not Found\",\t\"title\": \"UEidentityAPI\",\t\"status\": 404,\t\"detail\": \"Wrong parameters\",\t\"instance\": \"string\"}}" content_type = "application/problem+json" content_type = 'application/problem+json' if (resp == None): resp = "{\"problemDetails\": {\t\"type\": \"Bad Request\",\t\"title\": \"UEidentityAPI\",\t\"status\": 400,\t\"detail\": \"Wrong parameters\",\t\"instance\": \"string\"}}" content_type = "application/problem+json" content_type = 'application/problem+json' elif resp.find('problemDetails') != -1: content_type = "application/problem+json" content_type = 'application/problem+json' print ("<<< __process__ue__identity__api__: ", resp, ", ", content_type) return resp, content_type Loading @@ -219,16 +235,16 @@ class myHandler(http.server.BaseHTTPRequestHandler): # Process the RnisAPI request def __process__rnis__api__(self, p_split): print (">>> __process__rnis__api__: ", p_split) print ('>>> __process__rnis__api__: ', p_split) resp = None content_type = "application/json" content_type = 'application/json' if p_split[4].startswith('subscriptions'): if p_split.__len__() == 6: if p_split[5] == '': resp = self.__db__.getSubscriptionLinkList(self.path) if (resp == None): resp = "{\"problemDetails\": {\t\"type\": \"Not supported\",\t\"title\": \"RnisAPI\",\t\"status\": 400,\t\"detail\": \"Wrong parameters\",\t\"instance\": \"string\"}}" content_type = "application/problem+json" content_type = 'application/problem+json' print ("<<< __process__rnis__api__: ", resp, ", ", content_type) return resp, content_type Loading @@ -238,7 +254,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): def __process__bwm__api__(self, p_split): print (">>> __process__bwm__api__: ", p_split) resp = None content_type = "application/json" content_type = 'application/json' if p_split[4].startswith('bw_allocations'): # E.g. bw_allocation?app_instance_id=InstApp01 s = p_split[4].split('?') if s.__len__() == 1: # ue_identity_tag_info, POST Loading @@ -251,7 +267,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): json_msg = self.__decode__json__body__(body) if (json_msg == None): resp = "{\"problemDetails\": {\t\"type\": \"Body processing not supported\",\t\"title\": \"BwManagementAPI\",\t\"status\": 400,\t\"detail\": \"Unknown request\",\t\"instance\": \"string\"}}" content_type = "application/problem+json" content_type = 'application/problem+json' else: resp = self.__db__.bwAllocation(json_msg) elif s.__len__() == 2: # E.g. app_instance_id=InstApp01 Loading @@ -260,7 +276,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): resp = self.__db__.getBwAllocationAppInst(p_split[4], s[1]) if (resp == None): resp = "{\"problemDetails\": {\t\"type\": \"Not supported\",\t\"title\": \"BwManagementAPI\",\t\"status\": 400,\t\"detail\": \"Wrong parameters\",\t\"instance\": \"string\"}}" content_type = "application/problem+json" content_type = 'application/problem+json' print ("<<< __process__bwm__api__: ", resp, ", ", content_type) return resp, content_type Loading @@ -268,11 +284,15 @@ class myHandler(http.server.BaseHTTPRequestHandler): # Decode a Json HTTP body message def __decode__json__body__(self, p_body): print(">>> __decode__json__body__: ", p_body) json_msg = json.loads(p_body) print("__decode__json__body__: ", type(json_msg)) if ("ueIdentityTags" in json_msg.keys()) == False: return None print("__decode__json__body__: ", json_msg.keys()) if ("ueIdentityTags" in json_msg.keys()) == True: return json_msg.get("ueIdentityTags")[0] elif ("userTrackingSubscription" in json_msg.keys()) == True: return json_msg.get("userTrackingSubscription") return None # End of __decode__json__body__ # End of class SimpleHTTPRequestHandler simu/mec_simulator.py +1 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ if __name__ == '__main__': # Wait forever for incoming http requests in background #server.serve_forever() threading.Thread(target=server.serve_forever).start() # Use keybord entries to trigger notifications # Use keybord entries to trigBger notifications while exit == False: ch = getch() if ch == b'\x03': Loading Loading
simu/data/subscriptions.csv 0 → 100644 +1 −0 Original line number Diff line number Diff line subscription_id,corr_id,address,callback,ue_event_criteria,resourceURL
simu/mec_database.py +67 −3 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ from datetime import datetime, time class mec_database: """ Private properties """ __path__ = "/Users/yanng/OneDrive/Documents/Python/Mec/data/" # To be updated according to the local settings __path__ = "/Users/yanng/Documents/workspace_titan/STF569_Mec/simu/data/" # To be updated according to the local settings __subscribers__ = None __registered_list__ = None __zones__ = None Loading @@ -14,6 +14,7 @@ class mec_database: __location_info__ = None __cells__ = None __associated__ = None __subscribions__ = None def __init__(self): """ Default ctor: Open Pandas database. """ Loading @@ -24,6 +25,7 @@ class mec_database: self.__location_info__ = pd.DataFrame(pd.read_csv(self.__path__ + 'location_info.csv', index_col = 'accessPointId')) self.__cells__ = pd.DataFrame(pd.read_csv(self.__path__ + 'cells.csv', encoding = 'utf-8', index_col = 'cellId')) self.__associated__ = pd.DataFrame(pd.read_csv(self.__path__ + 'associated.csv', encoding = 'utf-8', index_col = 'cellId')) self.__subscriptions__ = pd.DataFrame(pd.read_csv(self.__path__ + 'subscriptions.csv', encoding = 'utf-8', index_col = 'subscription_id')) #self.dump() # End of __init__ Loading @@ -36,10 +38,16 @@ class mec_database: print("LocationInfo: ", self.__location_info__.head()) print("Cells: ", self.__cells__.head()) print("Associated: ", self.__associated__.head()) print("subscriptions: ", self.__subscribions__.head()) # End of dump def __to_accessPoint__(self, p_access_point, p_location): """ Build an AccessPointLocation Json message. """ """ Build an AccessPointLocation Json message. Keyword arguments: -- p_access_point: Access point identifier -- p_location : Access point geographical location """ print(">>> __to_accessPoint__: ", p_access_point) print("__to_accessPoint__: location= ", p_location['latitude'][0]) i = 0.0 Loading @@ -56,7 +64,11 @@ class mec_database: # End of __to_accessPoint__ def __to_zone__(self, p_zone): """ Build a Zones Json message. """ """ Build a Zones Json message. Keyword arguments: -- p_zone: Zone description """ print(">>> __to_zone__: ", p_zone) resp = "{\t\"zoneId\": \"" + p_zone[0] + "\",\t\"numberOfAccessPoints\": \"" + str(p_zone[1]) + "\",\t\"numberOfUnserviceableAccessPoints\": \"" + str(p_zone[2]) + "\",\t\"numberOfUsers\": \"" + str(p_zone[3]) + "\",\t\"resourceURL\": \"" + p_zone[4] + "\"}" print("__to_zone__: ", resp) Loading @@ -79,6 +91,21 @@ class mec_database: return resp # End of __to_ueIdentityTagInfo__ def __to_subscriptions__(self, p_subscription): """ Build the userTrackingSubscription response """ print(">>> __to_subscriptions__: ", p_subscription) resp = "\t{\"userTrackingSubscription\": {\t\"clientCorrelator\": \"" + p_subscription[1] + "\",\t\"callbackReference\": {\"notifyURL\": \"" + p_subscription[3] + "\"},\t\"address\": \"" + p_subscription[2] + "\",\t\"userEventCriteria\" : [" resp += "\"" + p_subscription[4][0] + "\"" i = 1 while i < len(p_subscription[4]): resp += ",\"" + p_subscription[4][i] + "\"" i += 1 # End of 'while' statement resp += "],\t\"resourceURL\":\"" + p_subscription[5] + "\"\t}}" print("__to_subscriptions__: ", resp) return resp # End of __to_subscriptions__ def getSubscriberList(self, p_uri): """ Build a SubscriberList Json message. """ print(">>> getSubscriberList") Loading Loading @@ -199,6 +226,43 @@ class mec_database: return resp # End of method registerUEidentity def registerSubscription(self, p_json_msg, p_uri): print(">>> registerSubscription: ", p_json_msg, "/", p_uri) resp = None subscription_id = "subscription" + p_json_msg["clientCorrelator"] try: # Check the record does not exist self.__subscriptions__.loc[self.__subscriptions__['subscription_id'] == subscription_id] print("registerSubscription: There is a subscription for ", subscription_id) except KeyError: #print("registerSubscription: Add new row in subscription") resource_url = "http://example.com" + p_uri + "/" + subscription_id row = pd.Series({ 'subscription_id': subscription_id, 'corr_id': p_json_msg["clientCorrelator"], 'address': p_json_msg["address"], 'callback': p_json_msg["callbackReference"]["notifyURL"], 'ue_event_criteria': p_json_msg["userEventCriteria"], 'resourceURL': resource_url }) #print("registerSubscription: row: ", row) self.__subscriptions__ = self.__subscriptions__.append(row, ignore_index=True).reindex() #print("registerSubscription: ", self.__subscriptions__.head()) r = tuple(self.__subscriptions__.loc[self.__subscriptions__['subscription_id'] == subscription_id].to_records()) #print("registerSubscription: New added row: ", r[0]) resp = self.__to_subscriptions__(r[0]) return resp # End of registerSubscription def unregisterSubscription(self, p_subscription_id): print(">>> unregisterSubscription: ", p_subscription_id) resp = None try: # Check the record exists r = self.__subscriptions__.loc[self.__subscriptions__['subscription_id'] == p_subscription_id] t = tuple(r.to_records()) print("unregisterSubscription: Find row: ", t) resp = self.__to_subscriptions__(t[0]) # Remove it self.__subscriptions__.drop(r.index) except KeyError: print("unregisterSubscription: No subscription for ", p_subscription_id) return resp # End of unregisterSubscription def getBwAllocationAppInst(self, p_app_inst, p_ue_identity_tag): print(">>> getBwAllocationAppInst: ", p_app_inst, ", ", p_ue_identity_tag) resp = None Loading
simu/mec_http_server.py +45 −25 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): # Handler for the GET requests def do_GET(self): print(">>> do_GET: ", self.path) print('>>> do_GET: ', self.path) self.protocol_version = self.request_version # Check HTTP end_headers if self.__check_http_headers__() == False: Loading @@ -16,7 +16,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): self.send_response(400, 'Bad Request') self.send_header('Host', self.headers.get('Host')) self.send_header('Authorization', self.headers.get('Authorization')) self.send_header('Content-Type', "application/problem+json") self.send_header('Content-Type', 'application/problem+json') l = len(resp) self.send_header('Content-Length', str(l)) self.end_headers() Loading @@ -24,7 +24,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): return resp, content_type = self.__process__() print("do_GET: resp= ", resp, ", Content_Type= ", content_type) print('do_GET: resp= ', resp, ', Content_Type= ', content_type) if (resp == None): self.send_response(404, 'Not Found') self.send_header('Host', self.headers.get('Host')) Loading Loading @@ -61,7 +61,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): self.send_response(400, 'Bad Request') self.send_header('Host', self.headers.get('Host')) self.send_header('Authorization', self.headers.get('Authorization')) self.send_header('Content-Type', "application/problem+json") self.send_header('Content-Type', 'application/problem+json') l = len(resp) self.send_header('Content-Length', str(l)) self.end_headers() Loading @@ -69,7 +69,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): return resp, content_type = self.__process__() print("do_POST: resp= ", resp, ", Content_Type= ", content_type) print('do_POST: resp= ', resp, ', Content_Type= ', content_type) if (resp == None): self.send_response(404, 'Not Found') self.send_header('Host', self.headers.get('Host')) Loading @@ -84,6 +84,8 @@ class myHandler(http.server.BaseHTTPRequestHandler): self.send_response(403, 'Forbidden') elif resp.find('Bad Request') != -1: self.send_response(400, 'Bad Request') elif resp.find('userTrackingSubscription') != -1: self.send_response(201, 'Created') else: self.send_response(200, 'OK') self.send_header('Host', self.headers.get('Host')) Loading @@ -98,14 +100,14 @@ class myHandler(http.server.BaseHTTPRequestHandler): # Check HTTP headers def __check_http_headers__(self): print (">>> __check_http_headers__") print('>>> __check_http_headers__') result = True host = self.headers.get('Host') if host == None: print("__check_http_headers__: Failed to parse 'Host' header") print("__check_http_headers__: Failed to parse Host header") result = False content_type = self.headers.get('Content-Type') if content_type != "application/json": if content_type != 'application/json': print("__check_http_headers__: Failed to parse 'Content-Type' header") result = False auth = self.headers.get('Authorization') Loading @@ -118,9 +120,9 @@ class myHandler(http.server.BaseHTTPRequestHandler): # Process the request def __process__(self): s = self.path.split('/') print (">>> __process__: ", s) print('>>> __process__: ', s) if s[1] != 'exampleAPI': return None, "application/json" return None, 'application/json' # TODO Check HTTP headers if s[2] == 'location' and ((s[3] == 'v1') or (s[3] == 'v2')): return self.__process__location__api__(s) Loading @@ -131,14 +133,14 @@ class myHandler(http.server.BaseHTTPRequestHandler): elif s[2] == 'bwm' and ((s[3] == 'v1') or (s[3] == 'v2')): return self.__process__bwm__api__(s) else: return None, "application/json" return None, 'application/json' # End of __process__ # Process the LocationAPI request def __process__location__api__(self, p_split): print (">>> __process__location__api__: ", p_split) resp = None content_type = "application/json" content_type = 'application/json' if p_split[4].startswith('users'): # E.g. users?zoneId=zone01 s = p_split[4].split('?') if s.__len__() == 1: # Users list requested Loading Loading @@ -169,6 +171,20 @@ class myHandler(http.server.BaseHTTPRequestHandler): resp = "{\"Unsupported " + p_split[5] + " request\"}" else: resp = "{\"Unsupported " + p_split[4] + " request\"}" elif p_split[4] == 'subscriptions': if p_split.__len__() == 6: # Extract the body if any body = None content_len = int(self.headers.get('Content-Length')) if (content_len != 0): body = self.rfile.read(content_len) json_msg = self.__decode__json__body__(body) if (json_msg == None): resp = "{\"problemDetails\": {\t\"type\": \"Body processing not supported\",\t\"title\": \"UElocationAPI\",\t\"status\": 400,\t\"detail\": \"Unknown request\",\t\"instance\": \"string\"}}" else: resp = self.__db__.registerSubscription(json_msg, self.path) elif p_split.__len__() == 7: resp = self.__db__.unregisterSubscription(p_split[6]) else: resp = "{\"Unsupported " + p_split[4] + " request\"}" Loading @@ -180,7 +196,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): def __process__ue__identity__api__(self, p_split): print (">>> __process__ue__identity__api__: ", p_split) resp = None content_type = "application/json" content_type = 'application/json' if p_split[4] == 'appInst98': # Used for unknown application, e.g. TC_MEC_PLAT_UETAG_003_BI resp = "{\"problemDetails\": {\t\"type\": \"Not Authorized\",\t\"title\": \"UEidentityAPI\",\t\"status\": 403,\t\"detail\": \"Forbidden\",\t\"instance\": \"AppInst98\"}}" else: Loading @@ -206,12 +222,12 @@ class myHandler(http.server.BaseHTTPRequestHandler): resp = self.__db__.getUEidentityTagInfo(p_split[4], s[1]) if (resp == None): resp = "{\"problemDetails\": {\t\"type\": \"Not Found\",\t\"title\": \"UEidentityAPI\",\t\"status\": 404,\t\"detail\": \"Wrong parameters\",\t\"instance\": \"string\"}}" content_type = "application/problem+json" content_type = 'application/problem+json' if (resp == None): resp = "{\"problemDetails\": {\t\"type\": \"Bad Request\",\t\"title\": \"UEidentityAPI\",\t\"status\": 400,\t\"detail\": \"Wrong parameters\",\t\"instance\": \"string\"}}" content_type = "application/problem+json" content_type = 'application/problem+json' elif resp.find('problemDetails') != -1: content_type = "application/problem+json" content_type = 'application/problem+json' print ("<<< __process__ue__identity__api__: ", resp, ", ", content_type) return resp, content_type Loading @@ -219,16 +235,16 @@ class myHandler(http.server.BaseHTTPRequestHandler): # Process the RnisAPI request def __process__rnis__api__(self, p_split): print (">>> __process__rnis__api__: ", p_split) print ('>>> __process__rnis__api__: ', p_split) resp = None content_type = "application/json" content_type = 'application/json' if p_split[4].startswith('subscriptions'): if p_split.__len__() == 6: if p_split[5] == '': resp = self.__db__.getSubscriptionLinkList(self.path) if (resp == None): resp = "{\"problemDetails\": {\t\"type\": \"Not supported\",\t\"title\": \"RnisAPI\",\t\"status\": 400,\t\"detail\": \"Wrong parameters\",\t\"instance\": \"string\"}}" content_type = "application/problem+json" content_type = 'application/problem+json' print ("<<< __process__rnis__api__: ", resp, ", ", content_type) return resp, content_type Loading @@ -238,7 +254,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): def __process__bwm__api__(self, p_split): print (">>> __process__bwm__api__: ", p_split) resp = None content_type = "application/json" content_type = 'application/json' if p_split[4].startswith('bw_allocations'): # E.g. bw_allocation?app_instance_id=InstApp01 s = p_split[4].split('?') if s.__len__() == 1: # ue_identity_tag_info, POST Loading @@ -251,7 +267,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): json_msg = self.__decode__json__body__(body) if (json_msg == None): resp = "{\"problemDetails\": {\t\"type\": \"Body processing not supported\",\t\"title\": \"BwManagementAPI\",\t\"status\": 400,\t\"detail\": \"Unknown request\",\t\"instance\": \"string\"}}" content_type = "application/problem+json" content_type = 'application/problem+json' else: resp = self.__db__.bwAllocation(json_msg) elif s.__len__() == 2: # E.g. app_instance_id=InstApp01 Loading @@ -260,7 +276,7 @@ class myHandler(http.server.BaseHTTPRequestHandler): resp = self.__db__.getBwAllocationAppInst(p_split[4], s[1]) if (resp == None): resp = "{\"problemDetails\": {\t\"type\": \"Not supported\",\t\"title\": \"BwManagementAPI\",\t\"status\": 400,\t\"detail\": \"Wrong parameters\",\t\"instance\": \"string\"}}" content_type = "application/problem+json" content_type = 'application/problem+json' print ("<<< __process__bwm__api__: ", resp, ", ", content_type) return resp, content_type Loading @@ -268,11 +284,15 @@ class myHandler(http.server.BaseHTTPRequestHandler): # Decode a Json HTTP body message def __decode__json__body__(self, p_body): print(">>> __decode__json__body__: ", p_body) json_msg = json.loads(p_body) print("__decode__json__body__: ", type(json_msg)) if ("ueIdentityTags" in json_msg.keys()) == False: return None print("__decode__json__body__: ", json_msg.keys()) if ("ueIdentityTags" in json_msg.keys()) == True: return json_msg.get("ueIdentityTags")[0] elif ("userTrackingSubscription" in json_msg.keys()) == True: return json_msg.get("userTrackingSubscription") return None # End of __decode__json__body__ # End of class SimpleHTTPRequestHandler
simu/mec_simulator.py +1 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,7 @@ if __name__ == '__main__': # Wait forever for incoming http requests in background #server.serve_forever() threading.Thread(target=server.serve_forever).start() # Use keybord entries to trigger notifications # Use keybord entries to trigBger notifications while exit == False: ch = getch() if ch == b'\x03': Loading