srs-enb: runs the given list of scripts before and after launching the eNodeB.

Allows to run given scripts before and after the execution of the SRS
eNodeB. The scripts are retrieved as a list from the resource.conf file.

Change-Id: I5017caae933809b89b32ea132be8552d6554e20e
This commit is contained in:
AlaiaL 2021-05-10 17:04:40 +02:00 committed by Alejandro Leal Conejos
parent 2cedd82cad
commit f2e9e980ca
1 changed files with 72 additions and 0 deletions

View File

@ -29,6 +29,12 @@ from .srslte_common import srslte_common
from ..core import schema from ..core import schema
def on_register_schemas(): def on_register_schemas():
resource_schema = {
'prerun_scripts[]': schema.STR,
'postrun_scripts[]': schema.STR,
}
schema.register_resource_schema('enb', resource_schema)
config_schema = { config_schema = {
'enable_pcap': schema.BOOL_STR, 'enable_pcap': schema.BOOL_STR,
'enable_tracing': schema.BOOL_STR, 'enable_tracing': schema.BOOL_STR,
@ -100,6 +106,10 @@ class srsENB(enb.eNodeB, srslte_common):
# Make sure we give the UE time to tear down # Make sure we give the UE time to tear down
self.sleep_after_stop() self.sleep_after_stop()
# Execute the post run tasks.
if not self.postrun_tasks():
self.log('Could not execute the post run tasks')
# copy back files (may not exist, for instance if there was an early error of process): # copy back files (may not exist, for instance if there was an early error of process):
self.scp_back_metrics(raiseException=False) self.scp_back_metrics(raiseException=False)
@ -151,11 +161,73 @@ class srsENB(enb.eNodeB, srslte_common):
else: else:
self.dbg('Metrics have already been copied back') self.dbg('Metrics have already been copied back')
def run_task(self, task):
# Get the arguments.
args_index = task.find('args=')
args = ()
# No arguments, all the string is the script.
if args_index == -1:
index = task.rfind('/')
task_name = task [index + 1:]
run_dir = util.Dir(self.run_dir.new_dir(task_name))
args = (task,)
self.log(f'task name is: {task_name}')
self.log(f'Running the script: {task} in the run dir: {run_dir}')
else:
ntask = task[:args_index - 1]
index = ntask.rfind('/')
task_name = ntask [index + 1:]
run_dir = util.Dir(self.run_dir.new_dir(task_name))
args = (ntask,)
args += tuple(task[args_index + 5:].split(','))
self.log(f'task name is: {task_name}')
self.log(f'Running the script: {task} in the run dir: {run_dir} with args: {args}')
proc = process.Process(task_name, run_dir, args)
# Set the timeout to a high value 20 minutes.
proc.set_default_wait_timeout(1200)
returncode = proc.launch_sync()
if returncode != 0:
raise log.Error('Error executing the pre run scripts. Aborting')
return False
return True
# Runs all the tasks that are intended to run before the execution of the eNodeb.
def prerun_tasks(self):
prerun_tasklist = self._conf.get('prerun_scripts', None)
if not prerun_tasklist:
return True
for task in prerun_tasklist:
if not self.run_task(task):
return False
return True
# Runs all the tasks that are intended to run after the execution of the eNodeb.
def postrun_tasks(self):
postrun_tasklist = self._conf.get('postrun_scripts', None)
if not postrun_tasklist:
return True
for task in postrun_tasklist:
if not self.run_task(task):
return False
return True
def start(self, epc): def start(self, epc):
self.log('Starting srsENB') self.log('Starting srsENB')
self._epc = epc self._epc = epc
self.run_dir = util.Dir(self.testenv.test().get_run_dir().new_dir(self.name())) self.run_dir = util.Dir(self.testenv.test().get_run_dir().new_dir(self.name()))
self.configure() self.configure()
if not self.prerun_tasks():
self.log('Pre run tasks failed. Aborting')
return
if self._run_node.is_local(): if self._run_node.is_local():
self.start_locally() self.start_locally()
else: else: