Commit 57d425f3 authored by YannGarcia's avatar YannGarcia
Browse files
parents d4d66f28 a83e280d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
subscription_id,corr_id,address,callback,ue_event_criteria,resourceURL
+67 −3
Original line number Diff line number Diff line
@@ -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
@@ -14,6 +14,7 @@ class mec_database:
    __location_info__ = None
    __cells__ = None
    __associated__ = None
    __subscribions__ = None

    def __init__(self):
        """ Default ctor: Open Pandas database. """
@@ -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__

@@ -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
@@ -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)
@@ -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")
@@ -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
+45 −25
Original line number Diff line number Diff line
@@ -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:
@@ -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()
@@ -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'))
@@ -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()
@@ -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'))
@@ -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'))
@@ -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')
@@ -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)
@@ -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
@@ -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\"}"

@@ -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:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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':