<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/20601">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  pespin: Looks good to me, approved; Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">{enb,epc,ms}_srs: refactor start/stop and KPI helpers<br><br>refactor some of the functionality to srslte_common<br><br>Change-Id: I2ff36df6f1a07ed8ddac39d296d62fe44a215283<br>---<br>M src/osmo_gsm_tester/obj/enb_srs.py<br>M src/osmo_gsm_tester/obj/epc_srs.py<br>M src/osmo_gsm_tester/obj/ms_srs.py<br>M src/osmo_gsm_tester/obj/srslte_common.py<br>4 files changed, 57 insertions(+), 24 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/obj/enb_srs.py b/src/osmo_gsm_tester/obj/enb_srs.py</span><br><span>index 13d18f3..ec2d1fc 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/enb_srs.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/enb_srs.py</span><br><span>@@ -51,6 +51,7 @@</span><br><span> </span><br><span>     def __init__(self, testenv, conf):</span><br><span>         super().__init__(testenv, conf, srsENB.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        srslte_common.__init__(self)</span><br><span>         self.ue = None</span><br><span>         self.run_dir = None</span><br><span>         self.gen_conf = None</span><br><span>@@ -73,6 +74,7 @@</span><br><span>         self.metrics_file = None</span><br><span>         self.stop_sleep_time = 6 # We require at most 5s to stop</span><br><span>         self.testenv = testenv</span><br><span style="color: hsl(120, 100%, 40%);">+        self.kpis = None</span><br><span>         self._additional_args = []</span><br><span>         if not rf_type_valid(conf.get('rf_dev_type', None)):</span><br><span>             raise log.Error('Invalid rf_dev_type=%s' % conf.get('rf_dev_type', None))</span><br><span>@@ -100,12 +102,6 @@</span><br><span>         # Collect KPIs for each TC</span><br><span>         self.testenv.test().set_kpis(self.get_kpis())</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def sleep_after_stop(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        # Only sleep once</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.stop_sleep_time > 0:</span><br><span style="color: hsl(0, 100%, 40%);">-            MainLoop.sleep(self.stop_sleep_time)</span><br><span style="color: hsl(0, 100%, 40%);">-            self.stop_sleep_time = 0</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     def start(self, epc):</span><br><span>         self.log('Starting srsENB')</span><br><span>         self._epc = epc</span><br><span>diff --git a/src/osmo_gsm_tester/obj/epc_srs.py b/src/osmo_gsm_tester/obj/epc_srs.py</span><br><span>index 44e06a5..dae8a56 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/epc_srs.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/epc_srs.py</span><br><span>@@ -23,6 +23,7 @@</span><br><span> from ..core import log, util, config, template, process, remote</span><br><span> from ..core import schema</span><br><span> from . import epc</span><br><span style="color: hsl(120, 100%, 40%);">+from .srslte_common import srslte_common</span><br><span> </span><br><span> def on_register_schemas():</span><br><span>     config_schema = {</span><br><span>@@ -31,7 +32,7 @@</span><br><span>         }</span><br><span>     schema.register_config_schema('epc', config_schema)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-class srsEPC(epc.EPC):</span><br><span style="color: hsl(120, 100%, 40%);">+class srsEPC(epc.EPC, srslte_common):</span><br><span> </span><br><span>     REMOTE_DIR = '/osmo-gsm-tester-srsepc'</span><br><span>     BINFILE = 'srsepc'</span><br><span>@@ -42,6 +43,7 @@</span><br><span> </span><br><span>     def __init__(self, testenv, run_node):</span><br><span>         super().__init__(testenv, run_node, 'srsepc')</span><br><span style="color: hsl(120, 100%, 40%);">+        srslte_common.__init__(self)</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>         self.db_file = None</span><br><span>@@ -55,6 +57,7 @@</span><br><span>         self.remote_log_file = None</span><br><span>         self.remote_pcap_file = None</span><br><span>         self.enable_pcap = False</span><br><span style="color: hsl(120, 100%, 40%);">+        self.kpis = None</span><br><span>         self.subscriber_list = []</span><br><span> </span><br><span>     def cleanup(self):</span><br><span>diff --git a/src/osmo_gsm_tester/obj/ms_srs.py b/src/osmo_gsm_tester/obj/ms_srs.py</span><br><span>index 1c0f728..b5f5d70 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/ms_srs.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/ms_srs.py</span><br><span>@@ -24,7 +24,6 @@</span><br><span> from ..core import log, util, config, template, process, remote</span><br><span> from ..core import schema</span><br><span> from .run_node import RunNode</span><br><span style="color: hsl(0, 100%, 40%);">-from ..core.event_loop import MainLoop</span><br><span> from .ms import MS</span><br><span> from .srslte_common import srslte_common</span><br><span> </span><br><span>@@ -77,6 +76,7 @@</span><br><span>     def __init__(self, testenv, conf):</span><br><span>         self._run_node = RunNode.from_conf(conf.get('run_node', {}))</span><br><span>         super().__init__('srsue_%s' % self.addr(), conf)</span><br><span style="color: hsl(120, 100%, 40%);">+        srslte_common.__init__(self)</span><br><span>         self.enb = None</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>@@ -92,9 +92,9 @@</span><br><span>         self.remote_log_file = None</span><br><span>         self.remote_pcap_file = None</span><br><span>         self.remote_metrics_file = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.stop_sleep_time = 6 # We require at most 5s to stop</span><br><span>         self.enable_pcap = False</span><br><span>         self.num_carriers = 1</span><br><span style="color: hsl(120, 100%, 40%);">+        self.kpis = None</span><br><span>         self.testenv = testenv</span><br><span>         self._additional_args = []</span><br><span>         if not rf_type_valid(conf.get('rf_dev_type', None)):</span><br><span>@@ -150,16 +150,6 @@</span><br><span>     def netns(self):</span><br><span>         return "srsue1"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def sleep_after_stop(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        # Only sleep once</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.stop_sleep_time > 0:</span><br><span style="color: hsl(0, 100%, 40%);">-            MainLoop.sleep(self.stop_sleep_time)</span><br><span style="color: hsl(0, 100%, 40%);">-            self.stop_sleep_time = 0</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def stop(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.testenv.stop_process(self.process)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.sleep_after_stop()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     def connect(self, enb):</span><br><span>         self.log('Starting srsue')</span><br><span>         self.enb = enb</span><br><span>diff --git a/src/osmo_gsm_tester/obj/srslte_common.py b/src/osmo_gsm_tester/obj/srslte_common.py</span><br><span>index 33f12d4..9619fb6 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/srslte_common.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/srslte_common.py</span><br><span>@@ -18,6 +18,7 @@</span><br><span> # along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span> </span><br><span> from ..core import log</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core.event_loop import MainLoop</span><br><span> </span><br><span> class srslte_common(): # don't inherit from log.Origin here but instead use .name() from whoever inherits from us</span><br><span> </span><br><span>@@ -25,21 +26,64 @@</span><br><span>     self.log_file = None</span><br><span>     self.process = None</span><br><span>     self.metrics_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+    self.stop_sleep_time = 6 # We require at most 5s to stop</span><br><span style="color: hsl(120, 100%, 40%);">+    self.kpis = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  def sleep_after_stop(self):</span><br><span style="color: hsl(120, 100%, 40%);">+    # Only sleep once</span><br><span style="color: hsl(120, 100%, 40%);">+    if self.stop_sleep_time > 0:</span><br><span style="color: hsl(120, 100%, 40%);">+        MainLoop.sleep(self.stop_sleep_time)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.stop_sleep_time = 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  def stop(self):</span><br><span style="color: hsl(120, 100%, 40%);">+      self.testenv.stop_process(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+      self.sleep_after_stop()</span><br><span> </span><br><span>   def get_kpis(self):</span><br><span style="color: hsl(120, 100%, 40%);">+      ''' Return all KPI '''</span><br><span style="color: hsl(120, 100%, 40%);">+      if self.kpis is None:</span><br><span style="color: hsl(120, 100%, 40%);">+          self.extract_kpis()</span><br><span style="color: hsl(120, 100%, 40%);">+      return self.kpis</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  def get_log_kpis(self):</span><br><span style="color: hsl(120, 100%, 40%);">+      ''' Return KPIs extracted from log '''</span><br><span style="color: hsl(120, 100%, 40%);">+      if self.kpis is None:</span><br><span style="color: hsl(120, 100%, 40%);">+          self.extract_kpis()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      # Use log KPIs if they exist for this node</span><br><span style="color: hsl(120, 100%, 40%);">+      if "log_" + self.name() in self.kpis:</span><br><span style="color: hsl(120, 100%, 40%);">+          log_kpi = self.kpis["log_" + self.name()]</span><br><span style="color: hsl(120, 100%, 40%);">+      else:</span><br><span style="color: hsl(120, 100%, 40%);">+          log_kpi = {}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      # Make sure we have the errors and warnings counter in the dict</span><br><span style="color: hsl(120, 100%, 40%);">+      if 'total_errors' not in log_kpi:</span><br><span style="color: hsl(120, 100%, 40%);">+          log_kpi['total_errors'] = 0</span><br><span style="color: hsl(120, 100%, 40%);">+      if 'total_warnings' not in log_kpi:</span><br><span style="color: hsl(120, 100%, 40%);">+          log_kpi['total_warnings'] = 0</span><br><span style="color: hsl(120, 100%, 40%);">+      return log_kpi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  def extract_kpis(self):</span><br><span>       ''' Use the srsLTE KPI analyzer module (part of srsLTE.git) if available to collect KPIs '''</span><br><span style="color: hsl(0, 100%, 40%);">-      kpis = {}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      # Stop application, copy back logs and process them</span><br><span style="color: hsl(120, 100%, 40%);">+      if self.running():</span><br><span style="color: hsl(120, 100%, 40%);">+          self.stop()</span><br><span style="color: hsl(120, 100%, 40%);">+          self.cleanup()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      self.kpis = {}</span><br><span>       try:</span><br><span>           # Please make sure the srsLTE scripts folder is included in your PYTHONPATH env variable</span><br><span>           from kpi_analyzer import kpi_analyzer</span><br><span>           analyzer = kpi_analyzer(self.name())</span><br><span>           if self.log_file is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-              kpis["log_" + self.name()] = analyzer.get_kpi_from_logfile(self.log_file)</span><br><span style="color: hsl(120, 100%, 40%);">+              self.kpis["log_" + self.name()] = analyzer.get_kpi_from_logfile(self.log_file)</span><br><span>           if self.process.get_output_file('stdout') is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-              kpis["stdout_" + self.name()] = analyzer.get_kpi_from_stdout(self.process.get_output_file('stdout'))</span><br><span style="color: hsl(120, 100%, 40%);">+              self.kpis["stdout_" + self.name()] = analyzer.get_kpi_from_stdout(self.process.get_output_file('stdout'))</span><br><span>           if self.metrics_file is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-              kpis["csv_" + self.name()] = analyzer.get_kpi_from_csv(self.metrics_file)</span><br><span style="color: hsl(120, 100%, 40%);">+              self.kpis["csv_" + self.name()] = analyzer.get_kpi_from_csv(self.metrics_file)</span><br><span>       except ImportError:</span><br><span>           self.log("Can't load KPI analyzer module.")</span><br><span style="color: hsl(120, 100%, 40%);">+          self.kpis = {}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      return kpis</span><br><span style="color: hsl(120, 100%, 40%);">+      return self.kpis</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/20601">change 20601</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/20601"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-gsm-tester </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I2ff36df6f1a07ed8ddac39d296d62fe44a215283 </div>
<div style="display:none"> Gerrit-Change-Number: 20601 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: srs_andre <andre@softwareradiosystems.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>