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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">{srs,amarisoft}enb:Move shared code to parent generic class eNodeB<br><br>Change-Id: Ica0f1d4179a905d6dfc77d3e8eb08ac6cd5c3d2e<br>---<br>M src/osmo_gsm_tester/amarisoft_enb.py<br>M src/osmo_gsm_tester/enb.py<br>M src/osmo_gsm_tester/srs_enb.py<br>3 files changed, 57 insertions(+), 100 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/amarisoft_enb.py b/src/osmo_gsm_tester/amarisoft_enb.py</span><br><span>index e16fe7f..99b0ace 100644</span><br><span>--- a/src/osmo_gsm_tester/amarisoft_enb.py</span><br><span>+++ b/src/osmo_gsm_tester/amarisoft_enb.py</span><br><span>@@ -59,7 +59,6 @@</span><br><span>     def __init__(self, suite_run, conf):</span><br><span>         super().__init__(suite_run, conf, 'amarisoftenb')</span><br><span>         self.ue = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.epc = None</span><br><span>         self.run_dir = None</span><br><span>         self._bin_prefix = None</span><br><span>         self.config_file = None</span><br><span>@@ -76,8 +75,6 @@</span><br><span>         self.remote_config_rf_file = None</span><br><span>         self.remote_config_drb_file = None</span><br><span>         self.remote_log_file = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self._num_prb = 0</span><br><span style="color: hsl(0, 100%, 40%);">-        self._txmode = 0</span><br><span>         self.suite_run = suite_run</span><br><span>         self.remote_user = conf.get('remote_user', None)</span><br><span>         if not rf_type_valid(conf.get('rf_dev_type', None)):</span><br><span>@@ -105,7 +102,7 @@</span><br><span> </span><br><span>     def start(self, epc):</span><br><span>         self.log('Starting AmarisoftENB')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.epc = epc</span><br><span style="color: hsl(120, 100%, 40%);">+        self._epc = epc</span><br><span>         self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span>         self._start()</span><br><span>@@ -138,7 +135,6 @@</span><br><span>             f.write(r)</span><br><span> </span><br><span>     def configure(self):</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         self.inst = util.Dir(os.path.abspath(self.bin_prefix()))</span><br><span>         lib = self.inst.child('lib')</span><br><span>         if not self.inst.isfile('', AmarisoftENB.BINFILE):</span><br><span>@@ -164,19 +160,9 @@</span><br><span>             self.remote_config_drb_file = remote_run_dir.child(AmarisoftENB.CFGFILE_DRB)</span><br><span>             self.remote_log_file = remote_run_dir.child(AmarisoftENB.LOGFILE)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        values = dict(enb=config.get_defaults('enb'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(enb=config.get_defaults('amarisoftenb')))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(enb=self.suite_run.config().get('enb', {})))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(enb=self._conf))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(enb={ 'mme_addr': self.epc.addr() }))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        self._num_prb = int(values['enb'].get('num_prb', None))</span><br><span style="color: hsl(0, 100%, 40%);">-        assert self._num_prb</span><br><span style="color: hsl(0, 100%, 40%);">-        self._txmode = int(values['enb'].get('transmission_mode', None))</span><br><span style="color: hsl(0, 100%, 40%);">-        assert self._txmode</span><br><span style="color: hsl(120, 100%, 40%);">+        values = super().configure('amarisoftenb')</span><br><span>         self._num_cells = int(values['enb'].get('num_cells', None))</span><br><span>         assert self._num_cells</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(enb={ 'num_ports': self.num_ports() }))</span><br><span> </span><br><span>         logfile = self.log_file if self.setup_runs_locally() else self.remote_log_file</span><br><span>         config.overlay(values, dict(enb=dict(log_filename=logfile)))</span><br><span>@@ -205,38 +191,4 @@</span><br><span>     def running(self):</span><br><span>         return not self.process.terminated()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def num_prb(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self._num_prb</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def num_ports(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        if self._txmode == 1:</span><br><span style="color: hsl(0, 100%, 40%);">-            return 1</span><br><span style="color: hsl(0, 100%, 40%);">-        return 2</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def ue_max_rate(self, downlink=True):</span><br><span style="color: hsl(0, 100%, 40%);">-        # The max rate for a single UE per PRB configuration in TM1</span><br><span style="color: hsl(0, 100%, 40%);">-        max_phy_rate_tm1_dl = { 6 : 3.5e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               15 : 11e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               25 : 18e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               50 : 36e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               75 : 55e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               100 : 75e6 }</span><br><span style="color: hsl(0, 100%, 40%);">-        max_phy_rate_tm1_ul = { 6 : 0.9e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               15 : 4.7e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               25 : 10e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               50 : 23e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               75 : 34e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               100 : 51e6 }</span><br><span style="color: hsl(0, 100%, 40%);">-        if downlink:</span><br><span style="color: hsl(0, 100%, 40%);">-            max_rate = max_phy_rate_tm1_dl[self.num_prb()]</span><br><span style="color: hsl(0, 100%, 40%);">-        else:</span><br><span style="color: hsl(0, 100%, 40%);">-            max_rate = max_phy_rate_tm1_ul[self.num_prb()]</span><br><span style="color: hsl(0, 100%, 40%);">-        #TODO: calculate for non-standard prb numbers.</span><br><span style="color: hsl(0, 100%, 40%);">-        if self._txmode > 2:</span><br><span style="color: hsl(0, 100%, 40%);">-            max_rate *= 2</span><br><span style="color: hsl(0, 100%, 40%);">-        # We use 3 control symbols for 6, 15 and 25 PRBs which results in lower max rate</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.num_prb() < 50:</span><br><span style="color: hsl(0, 100%, 40%);">-          max_rate *= 0.9</span><br><span style="color: hsl(0, 100%, 40%);">-        return max_rate</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> # vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/enb.py b/src/osmo_gsm_tester/enb.py</span><br><span>index f6b7722..197ad25 100644</span><br><span>--- a/src/osmo_gsm_tester/enb.py</span><br><span>+++ b/src/osmo_gsm_tester/enb.py</span><br><span>@@ -18,7 +18,7 @@</span><br><span> # along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span> </span><br><span> from abc import ABCMeta, abstractmethod</span><br><span style="color: hsl(0, 100%, 40%);">-from . import log</span><br><span style="color: hsl(120, 100%, 40%);">+from . import log, config</span><br><span> </span><br><span> </span><br><span> class eNodeB(log.Origin, metaclass=ABCMeta):</span><br><span>@@ -33,6 +33,28 @@</span><br><span>         if self._addr is None:</span><br><span>             raise log.Error('addr not set')</span><br><span>         self.set_name('%s_%s' % (name, self._addr))</span><br><span style="color: hsl(120, 100%, 40%);">+        self._txmode = 0</span><br><span style="color: hsl(120, 100%, 40%);">+        self._num_prb = 0</span><br><span style="color: hsl(120, 100%, 40%);">+        self._epc = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def configure(self, default_specifics):</span><br><span style="color: hsl(120, 100%, 40%);">+        values = dict(enb=config.get_defaults('enb'))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(enb=config.get_defaults(default_specifics)))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(enb=self.suite_run.config().get('enb', {})))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(enb=self._conf))</span><br><span style="color: hsl(120, 100%, 40%);">+        self._num_prb = int(values['enb'].get('num_prb', None))</span><br><span style="color: hsl(120, 100%, 40%);">+        assert self._num_prb</span><br><span style="color: hsl(120, 100%, 40%);">+        self._txmode = int(values['enb'].get('transmission_mode', None))</span><br><span style="color: hsl(120, 100%, 40%);">+        assert self._txmode</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(enb={ 'num_ports': self.num_ports() }))</span><br><span style="color: hsl(120, 100%, 40%);">+        assert self._epc is not None</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(enb={ 'mme_addr': self._epc.addr() }))</span><br><span style="color: hsl(120, 100%, 40%);">+        return values</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def num_ports(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._txmode == 1:</span><br><span style="color: hsl(120, 100%, 40%);">+            return 1</span><br><span style="color: hsl(120, 100%, 40%);">+        return 2</span><br><span> </span><br><span> ########################</span><br><span> # PUBLIC - INTERNAL API</span><br><span>@@ -41,6 +63,9 @@</span><br><span>         'Nothing to do by default. Subclass can override if required.'</span><br><span>         pass</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def num_prb(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return self._num_prb</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> ###################</span><br><span> # PUBLIC (test API included)</span><br><span> ###################</span><br><span>@@ -64,4 +89,30 @@</span><br><span>     def addr(self):</span><br><span>         return self._addr</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def ue_max_rate(self, downlink=True):</span><br><span style="color: hsl(120, 100%, 40%);">+        # The max rate for a single UE per PRB configuration in TM1</span><br><span style="color: hsl(120, 100%, 40%);">+        max_phy_rate_tm1_dl = { 6 : 3.5e6,</span><br><span style="color: hsl(120, 100%, 40%);">+                               15 : 11e6,</span><br><span style="color: hsl(120, 100%, 40%);">+                               25 : 18e6,</span><br><span style="color: hsl(120, 100%, 40%);">+                               50 : 36e6,</span><br><span style="color: hsl(120, 100%, 40%);">+                               75 : 55e6,</span><br><span style="color: hsl(120, 100%, 40%);">+                               100 : 75e6 }</span><br><span style="color: hsl(120, 100%, 40%);">+        max_phy_rate_tm1_ul = { 6 : 0.9e6,</span><br><span style="color: hsl(120, 100%, 40%);">+                               15 : 4.7e6,</span><br><span style="color: hsl(120, 100%, 40%);">+                               25 : 10e6,</span><br><span style="color: hsl(120, 100%, 40%);">+                               50 : 23e6,</span><br><span style="color: hsl(120, 100%, 40%);">+                               75 : 34e6,</span><br><span style="color: hsl(120, 100%, 40%);">+                               100 : 51e6 }</span><br><span style="color: hsl(120, 100%, 40%);">+        if downlink:</span><br><span style="color: hsl(120, 100%, 40%);">+            max_rate = max_phy_rate_tm1_dl[self.num_prb()]</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            max_rate = max_phy_rate_tm1_ul[self.num_prb()]</span><br><span style="color: hsl(120, 100%, 40%);">+        #TODO: calculate for non-standard prb numbers.</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._txmode > 2:</span><br><span style="color: hsl(120, 100%, 40%);">+            max_rate *= 2</span><br><span style="color: hsl(120, 100%, 40%);">+        # We use 3 control symbols for 6, 15 and 25 PRBs which results in lower max rate</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.num_prb() < 50:</span><br><span style="color: hsl(120, 100%, 40%);">+          max_rate *= 0.9</span><br><span style="color: hsl(120, 100%, 40%);">+        return max_rate</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/srs_enb.py b/src/osmo_gsm_tester/srs_enb.py</span><br><span>index d4bdcaa..91881c0 100644</span><br><span>--- a/src/osmo_gsm_tester/srs_enb.py</span><br><span>+++ b/src/osmo_gsm_tester/srs_enb.py</span><br><span>@@ -59,7 +59,6 @@</span><br><span>     def __init__(self, suite_run, conf):</span><br><span>         super().__init__(suite_run, conf, srsENB.BINFILE)</span><br><span>         self.ue = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.epc = None</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>         self.config_sib_file = None</span><br><span>@@ -75,8 +74,6 @@</span><br><span>         self.remote_config_drb_file = None</span><br><span>         self.remote_log_file = None</span><br><span>         self.remote_pcap_file = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self._num_prb = 0</span><br><span style="color: hsl(0, 100%, 40%);">-        self._txmode = 0</span><br><span>         self.enable_pcap = False</span><br><span>         self.suite_run = suite_run</span><br><span>         self.remote_user = conf.get('remote_user', None)</span><br><span>@@ -104,7 +101,7 @@</span><br><span> </span><br><span>     def start(self, epc):</span><br><span>         self.log('Starting srsENB')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.epc = epc</span><br><span style="color: hsl(120, 100%, 40%);">+        self._epc = epc</span><br><span>         self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span>         if self.remote_user:</span><br><span>@@ -190,27 +187,18 @@</span><br><span>             f.write(r)</span><br><span> </span><br><span>     def configure(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        values = dict(enb=config.get_defaults('enb'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(enb=config.get_defaults('srsenb')))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(enb=self.suite_run.config().get('enb', {})))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(enb=self._conf))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(enb={ 'mme_addr': self.epc.addr() }))</span><br><span style="color: hsl(120, 100%, 40%);">+        values = super().configure('srsenb')</span><br><span> </span><br><span>         # Convert parsed boolean string to Python boolean:</span><br><span>         self.enable_pcap = util.str2bool(values['enb'].get('enable_pcap', 'false'))</span><br><span>         config.overlay(values, dict(enb={'enable_pcap': self.enable_pcap}))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        self._num_prb = int(values['enb'].get('num_prb', None))</span><br><span style="color: hsl(0, 100%, 40%);">-        assert self._num_prb</span><br><span style="color: hsl(0, 100%, 40%);">-        self._txmode = int(values['enb'].get('transmission_mode', None))</span><br><span style="color: hsl(0, 100%, 40%);">-        assert self._txmode</span><br><span>         self._num_cells = int(values['enb'].get('num_cells', None))</span><br><span>         assert self._num_cells</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(enb={ 'num_ports': self.num_ports() }))</span><br><span> </span><br><span>         # We need to set some specific variables programatically here to match IP addresses:</span><br><span>         if self._conf.get('rf_dev_type') == 'zmq':</span><br><span style="color: hsl(0, 100%, 40%);">-            base_srate = num_prb2base_srate(self._num_prb)</span><br><span style="color: hsl(120, 100%, 40%);">+            base_srate = num_prb2base_srate(self.num_prb())</span><br><span>             rf_dev_args = 'fail_on_disconnect=true' \</span><br><span>                         + ',tx_port=tcp://' + self.addr() + ':2000' \</span><br><span>                         + ',tx_port2=tcp://' + self.addr() + ':2002' \</span><br><span>@@ -240,38 +228,4 @@</span><br><span>     def running(self):</span><br><span>         return not self.process.terminated()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def num_prb(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self._num_prb</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def num_ports(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        if self._txmode == 1:</span><br><span style="color: hsl(0, 100%, 40%);">-            return 1</span><br><span style="color: hsl(0, 100%, 40%);">-        return 2</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def ue_max_rate(self, downlink=True):</span><br><span style="color: hsl(0, 100%, 40%);">-        # The max rate for a single UE per PRB configuration in TM1</span><br><span style="color: hsl(0, 100%, 40%);">-        max_phy_rate_tm1_dl = { 6 : 3.5e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               15 : 11e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               25 : 18e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               50 : 36e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               75 : 55e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               100 : 75e6 }</span><br><span style="color: hsl(0, 100%, 40%);">-        max_phy_rate_tm1_ul = { 6 : 0.9e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               15 : 4.7e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               25 : 10e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               50 : 23e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               75 : 34e6,</span><br><span style="color: hsl(0, 100%, 40%);">-                               100 : 51e6 }</span><br><span style="color: hsl(0, 100%, 40%);">-        if downlink:</span><br><span style="color: hsl(0, 100%, 40%);">-            max_rate = max_phy_rate_tm1_dl[self.num_prb()]</span><br><span style="color: hsl(0, 100%, 40%);">-        else:</span><br><span style="color: hsl(0, 100%, 40%);">-            max_rate = max_phy_rate_tm1_ul[self.num_prb()]</span><br><span style="color: hsl(0, 100%, 40%);">-        #TODO: calculate for non-standard prb numbers.</span><br><span style="color: hsl(0, 100%, 40%);">-        if self._txmode > 2:</span><br><span style="color: hsl(0, 100%, 40%);">-            max_rate *= 2</span><br><span style="color: hsl(0, 100%, 40%);">-        # We use 3 control symbols for 6, 15 and 25 PRBs which results in lower max rate</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.num_prb() < 50:</span><br><span style="color: hsl(0, 100%, 40%);">-          max_rate *= 0.9</span><br><span style="color: hsl(0, 100%, 40%);">-        return max_rate</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> # vim: expandtab tabstop=4 shiftwidth=4</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/17688">change 17688</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/+/17688"/><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: Ica0f1d4179a905d6dfc77d3e8eb08ac6cd5c3d2e </div>
<div style="display:none"> Gerrit-Change-Number: 17688 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </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>