Adding Bouncer code for RIC-Benchmarking
[ric-app/bouncer.git] / Bouncer / init / init_script.py
diff --git a/Bouncer/init/init_script.py b/Bouncer/init/init_script.py
new file mode 100644 (file)
index 0000000..d645227
--- /dev/null
@@ -0,0 +1,132 @@
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==================================================================================
+
+# This initialization script reads in a json from the specified config map path
+# to set up the initializations (route config map, variables etc) for the main
+# xapp process
+
+import json;
+import sys;
+import os;
+import signal;
+import time;
+import ast;
+
+def signal_handler(signum, frame):
+    print("Received signal {0}\n".format(signum));
+    if(xapp_subprocess == None or xapp_pid == None):
+        print("No xapp running. Quiting without sending signal to xapp\n");
+    else:
+        print("Sending signal {0} to xapp ...".format(signum));
+        xapp_subprocess.send_signal(signum);
+        
+
+def parseConfigJson(config):
+    
+    for k1 in config.keys():
+        if k1 in ParseSection:
+            result = ParseSection[k1](config);
+            if result == False:
+                    return False;
+
+        
+#        for k2 in config[k1].keys():
+            #print(k2);
+#            if k2 in ParseSection:
+#                result = ParseSection[k2](config[k1]);
+#                if result == False:
+#                    return False;
+
+
+        
+def getMessagingInfo(config):
+     if 'messaging' in config.keys() and 'ports' in config['messaging'].keys():
+        port_list = config['messaging']['ports']
+        for portdesc in port_list :
+            if 'port' in portdesc.keys() and 'name' in portdesc.keys() and portdesc['name'] == 'rmr-data':
+                lport = portdesc['port']
+                # Set the environment variable
+                os.environ["BOUNCER_PORT"] = str(lport)
+                return True;
+     if lport == 0:
+         print("Error! No valid listening port");
+         return False;
+
+def getXappName(config):
+    myKey = "xapp_name";
+    if myKey not in config.keys():
+        print(("Error ! No information found for {0} in config\n".format(myKey)));
+        return False;
+
+    xapp_name = config[myKey];
+    print("Xapp Name is: " + xapp_name); 
+    os.environ["XAPP_NAME"] = xapp_name;
+
+default_routing_file = "/tmp/routeinfo/routes.txt";
+lport = 0;
+ParseSection = {};
+ParseSection["xapp_name"] = getXappName;
+ParseSection["messaging"] = getMessagingInfo;
+
+
+#================================================================
+if __name__ == "__main__":
+
+    import subprocess;
+    cmd = ["/usr/local/bin/b_xapp_main"];
+        
+    if len(sys.argv) > 1:
+        config_file = sys.argv[1];
+    else:
+        print("Error! No configuration file specified\n");
+        sys.exit(1);
+        
+    if len(sys.argv) > 2:
+        cmd[0] = sys.argv[2];
+
+    with open(config_file, 'r') as f:
+         try:
+             config = json.load(f);
+         except Exception as e:
+             print(("Error loading json file from {0}. Reason = {1}\n".format(config_file, e)));
+             sys.exit(1);
+             
+    result = parseConfigJson(config);
+    time.sleep(10);
+    if result == False:
+        print("Error parsing json. Not executing xAPP");
+        sys.exit(1);
+
+    else:
+
+        # Register signal handlers
+        signal.signal(signal.SIGINT, signal_handler);
+        signal.signal(signal.SIGTERM, signal_handler);
+
+        # Start the xAPP
+        #print("Executing xAPP ....");
+        xapp_subprocess = subprocess.Popen(cmd, shell = False, stdin=None, stdout=None, stderr = None);
+        xapp_pid = xapp_subprocess.pid;
+
+        # Periodically poll the process every 5 seconds to check if still alive
+        while(1):
+            xapp_status = xapp_subprocess.poll();
+            if xapp_status == None:
+                time.sleep(5);
+            else:
+                print("XaPP terminated via signal {0}\n".format(-1 * xapp_status));
+                break;
+