8156af3a1ab6bf4f3edad69b32dca5166b816dbf
[ric-app/ad.git] / ad / main.py
1 # ==================================================================================
2 #  Copyright (c) 2020 HCL Technologies Limited.
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 import warnings
18 import json
19 import os
20 from ricxappframe.xapp_frame import Xapp
21 import pandas as pd
22 from ad_model.tb_format import parse
23 from ad_model.ad_model import HDB_PREDICT
24 import schedule, time
25 from ad_train import train
26
27 def entry(self):
28     """
29      If RF model is not present in the path, run train() to train the model for the prediction.
30      Calls predict function for every 1 second(for now as we are using simulated data).
31     """
32     if not os.path.isfile('/tmp/ad/RF'):
33         train()
34     schedule.every(1).seconds.do(predict, self)
35     while True:
36         schedule.run_pending()
37
38 def predict(self):
39     """
40      Read the input csv file that has both normal and anomalous data.
41      Simulate diff UEIDs that participate in the anomaly by randomly selecting records from this scoring data set
42      Send the UEID and timestamp for the anomalous entries to the Traffic Steering (rmr with the message type as 30003)
43      Get the acknowledgement message from the traffic steering.
44     """
45
46     #The read_csv logic will be modified when we are going to fetch the data from database via sdl api.
47     #Read the input csv file 
48     ue_data = pd.read_csv('/tmp/ad/ue_test.csv')
49
50     #Parse the ue data and predict the anomaly records for the randomly selected UEID
51     data = parse(ue_data)
52     db_df = HDB_PREDICT(data)
53     db_df = db_df.loc[db_df['Anomaly'] == 1][['UEID','MeasTimestampRF' ]].head(1)    
54     db_df['MeasTimestampRF'] = db_df['MeasTimestampRF'].apply(lambda x : str(x)) # converts into string format
55     #print("db_df: ", db_df) # For debug purpose, we can enable this print statement
56
57     # rmr send 30003(TS_ANOMALY_UPDATE), should trigger registered callback
58     result = json.loads(db_df.to_json(orient = 'records'))    
59     val = json.dumps(result).encode()
60
61     if len(val) > 2 :
62         print("val: ", val)
63         self.rmr_send(val, 30003)
64
65         # rmr receive to get the acknowledgement message from the traffic steering.
66         for (summary, sbuf) in self.rmr_get_messages():
67             print("TS_ANOMALY_ACK: {}".format(summary))
68             self.rmr_free(sbuf)
69     
70 # Initiates xapp api and runs the entry() using xapp.run()
71 xapp = Xapp(entrypoint=entry, rmr_port=4560, use_fake_sdl=True)
72 xapp.run()
73