<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18482">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">enb: Reuse run_node to hold run info<br><br>Change-Id: If396940f154813d42ff3d3364c44b8979179127f<br>---<br>M doc/examples/4g_srsLTE/resources.conf<br>M src/osmo_gsm_tester/obj/enb.py<br>M src/osmo_gsm_tester/obj/enb_amarisoft.py<br>M src/osmo_gsm_tester/obj/enb_srs.py<br>M src/osmo_gsm_tester/obj/run_node.py<br>M sysmocom/resources.conf.prod<br>6 files changed, 58 insertions(+), 50 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/82/18482/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/examples/4g_srsLTE/resources.conf b/doc/examples/4g_srsLTE/resources.conf</span><br><span>index a1bdcbc..f0db3c0 100644</span><br><span>--- a/doc/examples/4g_srsLTE/resources.conf</span><br><span>+++ b/doc/examples/4g_srsLTE/resources.conf</span><br><span>@@ -11,15 +11,21 @@</span><br><span> - label: srsENB-zmq</span><br><span>   type: srsenb</span><br><span>   rf_dev_type: zmq</span><br><span style="color: hsl(0, 100%, 40%);">-  remote_user: jenkins</span><br><span style="color: hsl(0, 100%, 40%);">-  addr: 172.18.50.101</span><br><span style="color: hsl(120, 100%, 40%);">+  run_node:</span><br><span style="color: hsl(120, 100%, 40%);">+    run_type: ssh</span><br><span style="color: hsl(120, 100%, 40%);">+    run_addr: 172.18.50.101</span><br><span style="color: hsl(120, 100%, 40%);">+    ssh_user: jenkins</span><br><span style="color: hsl(120, 100%, 40%);">+    ssh_addr: 172.18.50.101</span><br><span> </span><br><span> - label: srsENB-B200</span><br><span>   type: srsenb</span><br><span>   rf_dev_type: uhd</span><br><span>   rf_dev_args: 'type=b200,serial=317B9FE'</span><br><span style="color: hsl(0, 100%, 40%);">-  remote_user: jenkins</span><br><span style="color: hsl(0, 100%, 40%);">-  addr: 172.18.50.102</span><br><span style="color: hsl(120, 100%, 40%);">+  run_node:</span><br><span style="color: hsl(120, 100%, 40%);">+    run_type: ssh</span><br><span style="color: hsl(120, 100%, 40%);">+    run_addr: 172.18.50.102</span><br><span style="color: hsl(120, 100%, 40%);">+    ssh_user: jenkins</span><br><span style="color: hsl(120, 100%, 40%);">+    ssh_addr: 172.18.50.102</span><br><span> </span><br><span> modem:</span><br><span> - label: srsUE-zmq</span><br><span>diff --git a/src/osmo_gsm_tester/obj/enb.py b/src/osmo_gsm_tester/obj/enb.py</span><br><span>index 42ff647..3c4f48f 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/enb.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/enb.py</span><br><span>@@ -20,13 +20,12 @@</span><br><span> from abc import ABCMeta, abstractmethod</span><br><span> from ..core import log, config</span><br><span> from ..core import schema</span><br><span style="color: hsl(120, 100%, 40%);">+from . import run_node</span><br><span> </span><br><span> def on_register_schemas():</span><br><span>     resource_schema = {</span><br><span>         'label': schema.STR,</span><br><span>         'type': schema.STR,</span><br><span style="color: hsl(0, 100%, 40%);">-        'remote_user': schema.STR,</span><br><span style="color: hsl(0, 100%, 40%);">-        'addr': schema.IPV4,</span><br><span>         'gtp_bind_addr': schema.IPV4,</span><br><span>         'id': schema.UINT,</span><br><span>         'num_prb': schema.UINT,</span><br><span>@@ -60,6 +59,8 @@</span><br><span>         'cell_list[].dl_rfemu.addr': schema.IPV4,</span><br><span>         'cell_list[].dl_rfemu.ports[]': schema.UINT,</span><br><span>         }</span><br><span style="color: hsl(120, 100%, 40%);">+    for key, val in run_node.RunNode.schema().items():</span><br><span style="color: hsl(120, 100%, 40%);">+        resource_schema['run_node.%s' % key] = val</span><br><span>     schema.register_resource_schema('enb', resource_schema)</span><br><span> </span><br><span> class eNodeB(log.Origin, metaclass=ABCMeta):</span><br><span>@@ -70,13 +71,11 @@</span><br><span>     def __init__(self, testenv, conf, name):</span><br><span>         super().__init__(log.C_RUN, '%s' % name)</span><br><span>         self._conf = conf</span><br><span style="color: hsl(0, 100%, 40%);">-        self._addr = conf.get('addr', None)</span><br><span style="color: hsl(0, 100%, 40%);">-        if self._addr is None:</span><br><span style="color: hsl(0, 100%, 40%);">-            raise log.Error('addr not set')</span><br><span style="color: hsl(120, 100%, 40%);">+        self._run_node = run_node.RunNode.from_conf(conf.get('run_node', {}))</span><br><span>         self._gtp_bind_addr = conf.get('gtp_bind_addr', None)</span><br><span>         if self._gtp_bind_addr is None:</span><br><span style="color: hsl(0, 100%, 40%);">-            self._gtp_bind_addr = self._addr</span><br><span style="color: hsl(0, 100%, 40%);">-        self.set_name('%s_%s' % (name, self._addr))</span><br><span style="color: hsl(120, 100%, 40%);">+            self._gtp_bind_addr = self._run_node.run_addr()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.set_name('%s_%s' % (name, self._run_node.run_addr()))</span><br><span>         self._txmode = 0</span><br><span>         self._id = None</span><br><span>         self._num_prb = 0</span><br><span>@@ -99,6 +98,7 @@</span><br><span>         assert self._txmode</span><br><span>         config.overlay(values, dict(enb={ 'num_ports': self.num_ports() }))</span><br><span>         assert self._epc is not None</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(enb={ 'addr': self.addr() }))</span><br><span>         config.overlay(values, dict(enb={ 'mme_addr': self._epc.addr() }))</span><br><span>         config.overlay(values, dict(enb={ 'gtp_bind_addr': self._gtp_bind_addr }))</span><br><span>         self._num_cells = int(values['enb'].get('num_cells', None))</span><br><span>@@ -235,7 +235,7 @@</span><br><span>         pass</span><br><span> </span><br><span>     def addr(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self._addr</span><br><span style="color: hsl(120, 100%, 40%);">+        return self._run_node.run_addr()</span><br><span> </span><br><span>     def ue_max_rate(self, downlink=True):</span><br><span>         # The max rate for a single UE per PRB configuration in TM1</span><br><span>diff --git a/src/osmo_gsm_tester/obj/enb_amarisoft.py b/src/osmo_gsm_tester/obj/enb_amarisoft.py</span><br><span>index fa79cbf..c331cd8 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/enb_amarisoft.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/enb_amarisoft.py</span><br><span>@@ -69,7 +69,6 @@</span><br><span>         self.remote_log_file = None</span><br><span>         self.enable_measurements = False</span><br><span>         self.testenv = testenv</span><br><span style="color: hsl(0, 100%, 40%);">-        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>             raise log.Error('Invalid rf_dev_type=%s' % conf.get('rf_dev_type', None))</span><br><span> </span><br><span>@@ -83,7 +82,7 @@</span><br><span>     def cleanup(self):</span><br><span>         if self.process is None:</span><br><span>             return</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.setup_runs_locally():</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span>             return</span><br><span>         # copy back files (may not exist, for instance if there was an early error of process):</span><br><span>         try:</span><br><span>@@ -91,10 +90,6 @@</span><br><span>         except Exception as e:</span><br><span>             self.log(repr(e))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    def setup_runs_locally(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self.remote_user is None</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     def start(self, epc):</span><br><span>         self.log('Starting AmarisoftENB')</span><br><span>         self._epc = epc</span><br><span>@@ -107,7 +102,7 @@</span><br><span>         self.process.stdin_write('t\n')</span><br><span> </span><br><span>     def _start(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.setup_runs_locally():</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span>             env = { 'LD_LIBRARY_PATH': util.prepend_library_path(self.inst) }</span><br><span>             binary = self.inst.child('.', AmarisoftENB.BINFILE)</span><br><span>             self.dbg(run_dir=self.run_dir, binary=binary, env=env)</span><br><span>@@ -141,8 +136,8 @@</span><br><span>         self.config_drb_file = self.run_dir.child(AmarisoftENB.CFGFILE_DRB)</span><br><span>         self.log_file = self.run_dir.child(AmarisoftENB.LOGFILE)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if not self.setup_runs_locally():</span><br><span style="color: hsl(0, 100%, 40%);">-            self.rem_host = remote.RemoteHost(self.run_dir, self.remote_user, self._addr)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())</span><br><span>             remote_prefix_dir = util.Dir(AmarisoftENB.REMOTE_DIR)</span><br><span>             self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst))))</span><br><span>             remote_run_dir = util.Dir(remote_prefix_dir.child(AmarisoftENB.BINFILE))</span><br><span>@@ -186,7 +181,7 @@</span><br><span> </span><br><span>                 config.overlay(values, dict(enb=dict(rf_dev_args=rf_dev_args)))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        logfile = self.log_file if self.setup_runs_locally() else self.remote_log_file</span><br><span style="color: hsl(120, 100%, 40%);">+        logfile = self.log_file if self._run_node.is_local() else self.remote_log_file</span><br><span>         config.overlay(values, dict(enb=dict(log_filename=logfile)))</span><br><span> </span><br><span>         # rf driver is shared between amarisoft enb and ue, so it has a</span><br><span>@@ -205,7 +200,7 @@</span><br><span>         self.gen_conf_file(self.config_rf_file, AmarisoftENB.CFGFILE_RF, values)</span><br><span>         self.gen_conf_file(self.config_drb_file, AmarisoftENB.CFGFILE_DRB, values)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if not self.setup_runs_locally():</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span>             self.rem_host.recreate_remote_dir(self.remote_inst)</span><br><span>             self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir)</span><br><span>             self.rem_host.recreate_remote_dir(remote_run_dir)</span><br><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 47b373e..9e93541 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>@@ -68,7 +68,6 @@</span><br><span>         self.remote_pcap_file = None</span><br><span>         self.enable_pcap = False</span><br><span>         self.testenv = testenv</span><br><span style="color: hsl(0, 100%, 40%);">-        self.remote_user = conf.get('remote_user', 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>@@ -76,7 +75,7 @@</span><br><span>     def cleanup(self):</span><br><span>         if self.process is None:</span><br><span>             return</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.setup_runs_locally():</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span>             return</span><br><span>         # copy back files (may not exist, for instance if there was an early error of process):</span><br><span>         try:</span><br><span>@@ -89,18 +88,15 @@</span><br><span>             except Exception as e:</span><br><span>                 self.log(repr(e))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def setup_runs_locally(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self.remote_user is None</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>         self.run_dir = util.Dir(self.testenv.test().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.remote_user:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.start_remotely()</span><br><span style="color: hsl(0, 100%, 40%);">-        else:</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span>             self.start_locally()</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_remotely()</span><br><span> </span><br><span>         # send t+Enter to enable console trace</span><br><span>         self.dbg('Enabling console trace')</span><br><span>@@ -149,8 +145,8 @@</span><br><span>         self.log_file = self.run_dir.child(srsENB.LOGFILE)</span><br><span>         self.pcap_file = self.run_dir.child(srsENB.PCAPFILE)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if not self.setup_runs_locally():</span><br><span style="color: hsl(0, 100%, 40%);">-            self.rem_host = remote.RemoteHost(self.run_dir, self.remote_user, self._addr)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())</span><br><span>             remote_prefix_dir = util.Dir(srsENB.REMOTE_DIR)</span><br><span>             self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst))))</span><br><span>             self.remote_run_dir = util.Dir(remote_prefix_dir.child(srsENB.BINFILE))</span><br><span>@@ -164,11 +160,11 @@</span><br><span> </span><br><span>         values = super().configure(['srsenb'])</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        sibfile = self.config_sib_file if self.setup_runs_locally() else self.remote_config_sib_file</span><br><span style="color: hsl(0, 100%, 40%);">-        rrfile = self.config_rr_file if self.setup_runs_locally() else self.remote_config_rr_file</span><br><span style="color: hsl(0, 100%, 40%);">-        drbfile = self.config_drb_file if self.setup_runs_locally() else self.remote_config_drb_file</span><br><span style="color: hsl(0, 100%, 40%);">-        logfile = self.log_file if self.setup_runs_locally() else self.remote_log_file</span><br><span style="color: hsl(0, 100%, 40%);">-        pcapfile = self.pcap_file if self.setup_runs_locally() else self.remote_pcap_file</span><br><span style="color: hsl(120, 100%, 40%);">+        sibfile = self.config_sib_file if self._run_node.is_local() else self.remote_config_sib_file</span><br><span style="color: hsl(120, 100%, 40%);">+        rrfile = self.config_rr_file if self._run_node.is_local() else self.remote_config_rr_file</span><br><span style="color: hsl(120, 100%, 40%);">+        drbfile = self.config_drb_file if self._run_node.is_local() else self.remote_config_drb_file</span><br><span style="color: hsl(120, 100%, 40%);">+        logfile = self.log_file if self._run_node.is_local() else self.remote_log_file</span><br><span style="color: hsl(120, 100%, 40%);">+        pcapfile = self.pcap_file if self._run_node.is_local() else self.remote_pcap_file</span><br><span>         config.overlay(values, dict(enb=dict(sib_filename=sibfile,</span><br><span>                                              rr_filename=rrfile,</span><br><span>                                              drb_filename=drbfile,</span><br><span>@@ -209,7 +205,7 @@</span><br><span>         self.gen_conf_file(self.config_rr_file, srsENB.CFGFILE_RR, values)</span><br><span>         self.gen_conf_file(self.config_drb_file, srsENB.CFGFILE_DRB, values)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if not self.setup_runs_locally():</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span>             self.rem_host.recreate_remote_dir(self.remote_inst)</span><br><span>             self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir)</span><br><span>             self.rem_host.recreate_remote_dir(self.remote_run_dir)</span><br><span>diff --git a/src/osmo_gsm_tester/obj/run_node.py b/src/osmo_gsm_tester/obj/run_node.py</span><br><span>index bd502af..6a030ac 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/run_node.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/run_node.py</span><br><span>@@ -21,13 +21,7 @@</span><br><span> from ..core import schema</span><br><span> </span><br><span> def on_register_schemas():</span><br><span style="color: hsl(0, 100%, 40%);">-    resource_schema = {</span><br><span style="color: hsl(0, 100%, 40%);">-        'run_type': schema.STR,</span><br><span style="color: hsl(0, 100%, 40%);">-        'run_addr': schema.IPV4,</span><br><span style="color: hsl(0, 100%, 40%);">-        'ssh_user': schema.STR,</span><br><span style="color: hsl(0, 100%, 40%);">-        'ssh_addr': schema.IPV4,</span><br><span style="color: hsl(0, 100%, 40%);">-        'run_label': schema.STR,</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(120, 100%, 40%);">+    resource_schema = RunNode.schema()</span><br><span>     schema.register_resource_schema('run_node', resource_schema)</span><br><span> </span><br><span> </span><br><span>@@ -63,6 +57,17 @@</span><br><span>                    conf.get('ssh_user', None), conf.get('ssh_addr', None),</span><br><span>                    conf.get('run_label', None))</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+    def schema(cls):</span><br><span style="color: hsl(120, 100%, 40%);">+        resource_schema = {</span><br><span style="color: hsl(120, 100%, 40%);">+            'run_type': schema.STR,</span><br><span style="color: hsl(120, 100%, 40%);">+            'run_addr': schema.IPV4,</span><br><span style="color: hsl(120, 100%, 40%);">+            'ssh_user': schema.STR,</span><br><span style="color: hsl(120, 100%, 40%);">+            'ssh_addr': schema.IPV4,</span><br><span style="color: hsl(120, 100%, 40%);">+            'run_label': schema.STR,</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+        return resource_schema</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def is_local(self):</span><br><span>         return self._type == RunNode.T_LOCAL</span><br><span> </span><br><span>diff --git a/sysmocom/resources.conf.prod b/sysmocom/resources.conf.prod</span><br><span>index c66cafa..ec148f3 100644</span><br><span>--- a/sysmocom/resources.conf.prod</span><br><span>+++ b/sysmocom/resources.conf.prod</span><br><span>@@ -159,15 +159,21 @@</span><br><span>   type: srsenb</span><br><span>   rf_dev_type: zmq</span><br><span>   rf_dev_args: auto</span><br><span style="color: hsl(0, 100%, 40%);">-  remote_user: jenkins</span><br><span style="color: hsl(0, 100%, 40%);">-  addr: 10.42.42.117</span><br><span style="color: hsl(120, 100%, 40%);">+  run_node:</span><br><span style="color: hsl(120, 100%, 40%);">+    run_type: ssh</span><br><span style="color: hsl(120, 100%, 40%);">+    run_addr: 10.42.42.117</span><br><span style="color: hsl(120, 100%, 40%);">+    ssh_user: jenkins</span><br><span style="color: hsl(120, 100%, 40%);">+    ssh_addr: 10.42.42.117</span><br><span> </span><br><span> - label: srsENB-B200</span><br><span>   type: srsenb</span><br><span>   rf_dev_type: uhd</span><br><span>   rf_dev_args: "type=b200,serial=306BD11"</span><br><span style="color: hsl(0, 100%, 40%);">-  remote_user: jenkins</span><br><span style="color: hsl(0, 100%, 40%);">-  addr: 10.42.42.117</span><br><span style="color: hsl(120, 100%, 40%);">+  run_node:</span><br><span style="color: hsl(120, 100%, 40%);">+    run_type: ssh</span><br><span style="color: hsl(120, 100%, 40%);">+    run_addr: 10.42.42.117</span><br><span style="color: hsl(120, 100%, 40%);">+    ssh_user: jenkins</span><br><span style="color: hsl(120, 100%, 40%);">+    ssh_addr: 10.42.42.117</span><br><span> </span><br><span> arfcn:</span><br><span>   - arfcn: 512</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18482">change 18482</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/+/18482"/><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: If396940f154813d42ff3d3364c44b8979179127f </div>
<div style="display:none"> Gerrit-Change-Number: 18482 </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-MessageType: newchange </div>