From 99fb78bfca03b97f1bd5b5cbbd5b39db85d702f0 Mon Sep 17 00:00:00 2001 From: Andre Puschmann Date: Mon, 14 Sep 2020 18:14:15 +0200 Subject: [PATCH] {enb,epc,ms}_srs: refactor start/stop and KPI helpers refactor some of the functionality to srslte_common Change-Id: I2ff36df6f1a07ed8ddac39d296d62fe44a215283 --- src/osmo_gsm_tester/obj/enb_srs.py | 8 +--- src/osmo_gsm_tester/obj/epc_srs.py | 5 ++- src/osmo_gsm_tester/obj/ms_srs.py | 14 +----- src/osmo_gsm_tester/obj/srslte_common.py | 54 +++++++++++++++++++++--- 4 files changed, 57 insertions(+), 24 deletions(-) diff --git a/src/osmo_gsm_tester/obj/enb_srs.py b/src/osmo_gsm_tester/obj/enb_srs.py index 13d18f3a..ec2d1fc8 100644 --- a/src/osmo_gsm_tester/obj/enb_srs.py +++ b/src/osmo_gsm_tester/obj/enb_srs.py @@ -51,6 +51,7 @@ class srsENB(enb.eNodeB, srslte_common): def __init__(self, testenv, conf): super().__init__(testenv, conf, srsENB.BINFILE) + srslte_common.__init__(self) self.ue = None self.run_dir = None self.gen_conf = None @@ -73,6 +74,7 @@ class srsENB(enb.eNodeB, srslte_common): self.metrics_file = None self.stop_sleep_time = 6 # We require at most 5s to stop self.testenv = testenv + self.kpis = None self._additional_args = [] if not rf_type_valid(conf.get('rf_dev_type', None)): raise log.Error('Invalid rf_dev_type=%s' % conf.get('rf_dev_type', None)) @@ -100,12 +102,6 @@ class srsENB(enb.eNodeB, srslte_common): # Collect KPIs for each TC self.testenv.test().set_kpis(self.get_kpis()) - def sleep_after_stop(self): - # Only sleep once - if self.stop_sleep_time > 0: - MainLoop.sleep(self.stop_sleep_time) - self.stop_sleep_time = 0 - def start(self, epc): self.log('Starting srsENB') self._epc = epc diff --git a/src/osmo_gsm_tester/obj/epc_srs.py b/src/osmo_gsm_tester/obj/epc_srs.py index 44e06a5d..dae8a567 100644 --- a/src/osmo_gsm_tester/obj/epc_srs.py +++ b/src/osmo_gsm_tester/obj/epc_srs.py @@ -23,6 +23,7 @@ import pprint from ..core import log, util, config, template, process, remote from ..core import schema from . import epc +from .srslte_common import srslte_common def on_register_schemas(): config_schema = { @@ -31,7 +32,7 @@ def on_register_schemas(): } schema.register_config_schema('epc', config_schema) -class srsEPC(epc.EPC): +class srsEPC(epc.EPC, srslte_common): REMOTE_DIR = '/osmo-gsm-tester-srsepc' BINFILE = 'srsepc' @@ -42,6 +43,7 @@ class srsEPC(epc.EPC): def __init__(self, testenv, run_node): super().__init__(testenv, run_node, 'srsepc') + srslte_common.__init__(self) self.run_dir = None self.config_file = None self.db_file = None @@ -55,6 +57,7 @@ class srsEPC(epc.EPC): self.remote_log_file = None self.remote_pcap_file = None self.enable_pcap = False + self.kpis = None self.subscriber_list = [] def cleanup(self): diff --git a/src/osmo_gsm_tester/obj/ms_srs.py b/src/osmo_gsm_tester/obj/ms_srs.py index 1c0f7288..b5f5d70b 100644 --- a/src/osmo_gsm_tester/obj/ms_srs.py +++ b/src/osmo_gsm_tester/obj/ms_srs.py @@ -24,7 +24,6 @@ import re from ..core import log, util, config, template, process, remote from ..core import schema from .run_node import RunNode -from ..core.event_loop import MainLoop from .ms import MS from .srslte_common import srslte_common @@ -77,6 +76,7 @@ class srsUE(MS, srslte_common): def __init__(self, testenv, conf): self._run_node = RunNode.from_conf(conf.get('run_node', {})) super().__init__('srsue_%s' % self.addr(), conf) + srslte_common.__init__(self) self.enb = None self.run_dir = None self.config_file = None @@ -92,9 +92,9 @@ class srsUE(MS, srslte_common): self.remote_log_file = None self.remote_pcap_file = None self.remote_metrics_file = None - self.stop_sleep_time = 6 # We require at most 5s to stop self.enable_pcap = False self.num_carriers = 1 + self.kpis = None self.testenv = testenv self._additional_args = [] if not rf_type_valid(conf.get('rf_dev_type', None)): @@ -150,16 +150,6 @@ class srsUE(MS, srslte_common): def netns(self): return "srsue1" - def sleep_after_stop(self): - # Only sleep once - if self.stop_sleep_time > 0: - MainLoop.sleep(self.stop_sleep_time) - self.stop_sleep_time = 0 - - def stop(self): - self.testenv.stop_process(self.process) - self.sleep_after_stop() - def connect(self, enb): self.log('Starting srsue') self.enb = enb diff --git a/src/osmo_gsm_tester/obj/srslte_common.py b/src/osmo_gsm_tester/obj/srslte_common.py index 33f12d41..9619fb61 100644 --- a/src/osmo_gsm_tester/obj/srslte_common.py +++ b/src/osmo_gsm_tester/obj/srslte_common.py @@ -18,6 +18,7 @@ # along with this program. If not, see . from ..core import log +from ..core.event_loop import MainLoop class srslte_common(): # don't inherit from log.Origin here but instead use .name() from whoever inherits from us @@ -25,21 +26,64 @@ class srslte_common(): # don't inherit from log.Origin here but instead use .nam self.log_file = None self.process = None self.metrics_file = None + self.stop_sleep_time = 6 # We require at most 5s to stop + self.kpis = None + + def sleep_after_stop(self): + # Only sleep once + if self.stop_sleep_time > 0: + MainLoop.sleep(self.stop_sleep_time) + self.stop_sleep_time = 0 + + def stop(self): + self.testenv.stop_process(self.process) + self.sleep_after_stop() def get_kpis(self): + ''' Return all KPI ''' + if self.kpis is None: + self.extract_kpis() + return self.kpis + + def get_log_kpis(self): + ''' Return KPIs extracted from log ''' + if self.kpis is None: + self.extract_kpis() + + # Use log KPIs if they exist for this node + if "log_" + self.name() in self.kpis: + log_kpi = self.kpis["log_" + self.name()] + else: + log_kpi = {} + + # Make sure we have the errors and warnings counter in the dict + if 'total_errors' not in log_kpi: + log_kpi['total_errors'] = 0 + if 'total_warnings' not in log_kpi: + log_kpi['total_warnings'] = 0 + return log_kpi + + def extract_kpis(self): ''' Use the srsLTE KPI analyzer module (part of srsLTE.git) if available to collect KPIs ''' - kpis = {} + + # Stop application, copy back logs and process them + if self.running(): + self.stop() + self.cleanup() + + self.kpis = {} try: # Please make sure the srsLTE scripts folder is included in your PYTHONPATH env variable from kpi_analyzer import kpi_analyzer analyzer = kpi_analyzer(self.name()) if self.log_file is not None: - kpis["log_" + self.name()] = analyzer.get_kpi_from_logfile(self.log_file) + self.kpis["log_" + self.name()] = analyzer.get_kpi_from_logfile(self.log_file) if self.process.get_output_file('stdout') is not None: - kpis["stdout_" + self.name()] = analyzer.get_kpi_from_stdout(self.process.get_output_file('stdout')) + self.kpis["stdout_" + self.name()] = analyzer.get_kpi_from_stdout(self.process.get_output_file('stdout')) if self.metrics_file is not None: - kpis["csv_" + self.name()] = analyzer.get_kpi_from_csv(self.metrics_file) + self.kpis["csv_" + self.name()] = analyzer.get_kpi_from_csv(self.metrics_file) except ImportError: self.log("Can't load KPI analyzer module.") + self.kpis = {} - return kpis + return self.kpis