#================================================================================== # 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; 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 key in config: print("Processing ", key); if key in ParseSection: result = ParseSection[key](config); if result == False: return False; def getRMRTable(config): myKey= "rmr"; if myKey not in config: print(("Error ! No information found for {0} in config\n".format(myKey))); return False; # Get the rmr routing table if "file_path" not in config[myKey]: print(("Warning ! No file path specified to store seed routing table. Choosing default = {1}\n".format(default_routing_file))); route_file = default_routing_file; else: route_file = config[myKey]["file_path"]; # Get the rmr routing table contents if "contents" not in config[myKey]: print("No contents for routing table found in config"); return False; else: route_contents = config[myKey]["contents"]; # Get directory : if not exists create it directory = os.path.dirname(route_file); if not os.path.exists(directory): # create directory try: os.mkdir(directory); except OSError as oe: print(("Error making directory {0}. Reason = {1}\n".format(directory, oe))); return False; # Write contents to file try: with open(route_file, "w") as f : f.write(config[myKey]["contents"]); f.close(); except Exception as e: print(("Error writing contents to file {0}. Reason = {1}\n".format(route_file, e))); return False; # Set the environment variable os.environ["RMR_SEED_RT"] = route_file; def getPort(config): myKey = "service_ports"; if myKey not in config: print(("Error ! No information found for {0} in config\n".format(myKey))); return False; port_config = config[myKey]; if "xapp_port" in port_config: try: xapp_port = int(port_config["xapp_port"]); if xapp_port < 1024: raise Exception("Port must be > 1024"); except Exception as e: print(("Error processing xapp port {0}. Reason = {1}\n".format(port_config["xapp_port"], e))); return False; else: xapp_port = 0; def getEnvs(config): myKey = "envs"; if myKey not in config: print(("Error ! No information found for {0} in config\n".format(myKey))); return False; env_config = config[myKey]; for env_key in env_config: os.environ[env_key] = env_config[env_key]; print("Set environment variable {0} = {1}\n".format(env_key, os.environ[env_key])); return True; # Global variables ... xapp_subprocess = None; xapp_pid = None; ParseSection = {}; xapp_port = 0; ParseSection["rmr"] = getRMRTable; ParseSection["envs"] = getEnvs; default_routing_file = "/tmp/routeinfo/routes.txt"; #================================================================ if __name__ == "__main__": import subprocess; cmd = ["/usr/local/bin/adm-ctrl-xapp"]; if xapp_port > 0: cmd.append("-p"); cmd.append(xapp_port); 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); 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;