| #================================================================================== |
| |
| # Copyright (c) 2018-2019 AT&T Intellectual Property. |
| # |
| # 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. |
| #================================================================================== |
| |
| # |
| # Author : Ashwin Sridharan |
| # Date : Feb 2019 |
| # |
| |
| |
| # 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["HW_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 = ["../src/hw_xapp_main"]; |
| cmd = ["/usr/local/bin/hw_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; |
| |