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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ms_{srs,amarisoft}: Reuse run_node to hold run info<br><br>Change-Id: Ifdea48fed0bfc152131c53b87c34b4514c632917<br>---<br>M doc/examples/4g_srsLTE/resources.conf<br>M src/osmo_gsm_tester/obj/ms_amarisoft.py<br>M src/osmo_gsm_tester/obj/ms_srs.py<br>M sysmocom/resources.conf.prod<br>4 files changed, 54 insertions(+), 49 deletions(-)<br><br></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 f0db3c0..cadb1b6 100644</span><br><span>--- a/doc/examples/4g_srsLTE/resources.conf</span><br><span>+++ b/doc/examples/4g_srsLTE/resources.conf</span><br><span>@@ -31,20 +31,26 @@</span><br><span> - label: srsUE-zmq</span><br><span>   type: srsue</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.100</span><br><span>   imsi: '001010123456789'</span><br><span>   ki: '00112233445566778899aabbccddeeff'</span><br><span>   auth_algo: 'xor'</span><br><span>   features: ['4g']</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.100</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.100</span><br><span> </span><br><span> - label: srsUE-B200</span><br><span>   type: srsue</span><br><span>   rf_dev_type: uhd</span><br><span>   rf_dev_args: 'type=b200,serial=3128FF1'</span><br><span style="color: hsl(0, 100%, 40%);">-  remote_user: jenkins</span><br><span style="color: hsl(0, 100%, 40%);">-  addr: 10.12.1.195</span><br><span>   imsi: '001010123456789'</span><br><span>   ki: '00112233445566778899aabbccddeeff'</span><br><span>   auth_algo: 'xor'</span><br><span>   features: ['4g']</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.12.1.195</span><br><span style="color: hsl(120, 100%, 40%);">+    ssh_user: jenkins</span><br><span style="color: hsl(120, 100%, 40%);">+    ssh_addr: 10.12.1.195</span><br><span>diff --git a/src/osmo_gsm_tester/obj/ms_amarisoft.py b/src/osmo_gsm_tester/obj/ms_amarisoft.py</span><br><span>index d79756b..5067048 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/ms_amarisoft.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/ms_amarisoft.py</span><br><span>@@ -27,6 +27,10 @@</span><br><span> from .ms import MS</span><br><span> </span><br><span> def on_register_schemas():</span><br><span style="color: hsl(120, 100%, 40%);">+    resource_schema = {}</span><br><span style="color: hsl(120, 100%, 40%);">+    for key, val in RunNode.schema().items():</span><br><span style="color: hsl(120, 100%, 40%);">+        resource_schema['run_node.%s' % key] = val</span><br><span style="color: hsl(120, 100%, 40%);">+    schema.register_resource_schema('modem', resource_schema)</span><br><span>     config_schema = {</span><br><span>         'license_server_addr': schema.IPV4,</span><br><span>         }</span><br><span>@@ -79,10 +83,8 @@</span><br><span>     IFUPFILE = 'ue-ifup'</span><br><span> </span><br><span>     def __init__(self, testenv, 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(0, 100%, 40%);">-        super().__init__('amarisoftue_%s' % self._addr, conf)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._run_node = RunNode.from_conf(conf.get('run_node', {}))</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__('amarisoftue_%s' % self.addr(), conf)</span><br><span>         self.enb = None</span><br><span>         self.run_dir = None</span><br><span>         self.inst = None</span><br><span>@@ -99,7 +101,6 @@</span><br><span>         self.remote_log_file = None</span><br><span>         self.remote_ifup_file = None</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>@@ -113,7 +114,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>@@ -121,9 +122,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%);">-    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 netns(self):</span><br><span>         return "amarisoftue1"</span><br><span> </span><br><span>@@ -135,7 +133,7 @@</span><br><span>         self.enb = enb</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.setup_runs_locally():</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span>             self.start_locally()</span><br><span>         else:</span><br><span>             self.start_remotely()</span><br><span>@@ -219,8 +217,8 @@</span><br><span>             ''' % (self.netns(), self.netns())</span><br><span>             f.write(r)</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(AmarisoftUE.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(AmarisoftUE.BINFILE))</span><br><span>@@ -235,10 +233,11 @@</span><br><span>         config.overlay(values, dict(ue=self.testenv.suite().config().get('amarisoft', {})))</span><br><span>         config.overlay(values, dict(ue=self.testenv.suite().config().get('modem', {})))</span><br><span>         config.overlay(values, dict(ue=self._conf))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(ue=dict(num_antennas = self.enb.num_ports())))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(ue=dict(addr = self.addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                            num_antennas = self.enb.num_ports())))</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(0, 100%, 40%);">-        ifupfile = self.ifup_file if self.setup_runs_locally() else self.remote_ifup_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%);">+        ifupfile = self.ifup_file if self._run_node.is_local() else self.remote_ifup_file</span><br><span>         config.overlay(values, dict(ue=dict(log_filename=logfile,</span><br><span>                                             ifup_filename=ifupfile)))</span><br><span> </span><br><span>@@ -289,7 +288,7 @@</span><br><span>         self.gen_conf_file(self.config_file, AmarisoftUE.CFGFILE, values)</span><br><span>         self.gen_conf_file(self.config_rf_file, AmarisoftUE.CFGFILE_RF, 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>@@ -309,13 +308,13 @@</span><br><span>         return not self.process.terminated()</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 run_node(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return RunNode(RunNode.T_REM_SSH, self._addr, self.remote_user, self._addr)</span><br><span style="color: hsl(120, 100%, 40%);">+        return self._run_node</span><br><span> </span><br><span>     def run_netns_wait(self, name, popen_args):</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>             proc = process.NetNSProcess(name, self.run_dir.new_dir(name), self.netns(), popen_args, env={})</span><br><span>         else:</span><br><span>             proc = self.rem_host.RemoteNetNSProcess(name, self.netns(), popen_args, env={})</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 389ed6b..1efa7c1 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>@@ -31,8 +31,6 @@</span><br><span> </span><br><span> def on_register_schemas():</span><br><span>     resource_schema = {</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>         'rf_dev_type': schema.STR,</span><br><span>         'rf_dev_args': schema.STR,</span><br><span>         'num_carriers': schema.UINT,</span><br><span>@@ -42,6 +40,8 @@</span><br><span>         'tx_gain': schema.UINT,</span><br><span>         'rx_gain': schema.UINT,</span><br><span>         }</span><br><span style="color: hsl(120, 100%, 40%);">+    for key, val in 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('modem', resource_schema)</span><br><span> </span><br><span>     config_schema = {</span><br><span>@@ -78,10 +78,8 @@</span><br><span>     METRICSFILE = 'srsue_metrics.csv'</span><br><span> </span><br><span>     def __init__(self, testenv, 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(0, 100%, 40%);">-        super().__init__('srsue_%s' % self._addr, conf)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._run_node = RunNode.from_conf(conf.get('run_node', {}))</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__('srsue_%s' % self.addr(), conf)</span><br><span>         self.enb = None</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>@@ -100,7 +98,6 @@</span><br><span>         self.enable_pcap = False</span><br><span>         self.num_carriers = 1</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>@@ -108,7 +105,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> </span><br><span>         # Make sure we give the UE time to tear down</span><br><span>@@ -125,9 +122,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%);">-    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 netns(self):</span><br><span>         return "srsue1"</span><br><span> </span><br><span>@@ -146,7 +140,7 @@</span><br><span>         self.enb = enb</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.setup_runs_locally():</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span>             self.start_locally()</span><br><span>         else:</span><br><span>             self.start_remotely()</span><br><span>@@ -215,8 +209,8 @@</span><br><span>         self.pcap_file = self.run_dir.child(srsUE.PCAPFILE)</span><br><span>         self.metrics_file = self.run_dir.child(srsUE.METRICSFILE)</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(srsUE.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(srsUE.BINFILE))</span><br><span>@@ -230,9 +224,9 @@</span><br><span>         config.overlay(values, dict(ue=self._conf))</span><br><span>         config.overlay(values, dict(ue=dict(num_antennas = self.enb.num_ports())))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        metricsfile = self.metrics_file if self.setup_runs_locally() else self.remote_metrics_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%);">+        metricsfile = self.metrics_file if self._run_node.is_local() else self.remote_metrics_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(ue=dict(metrics_filename=metricsfile,</span><br><span>                                              log_filename=logfile,</span><br><span>                                              pcap_filename=pcapfile)))</span><br><span>@@ -300,7 +294,7 @@</span><br><span>             self.dbg(r)</span><br><span>             f.write(r)</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>@@ -316,13 +310,13 @@</span><br><span>         return not self.process.terminated()</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 run_node(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return RunNode(RunNode.T_REM_SSH, self._addr, self.remote_user, self._addr)</span><br><span style="color: hsl(120, 100%, 40%);">+        return self._run_node</span><br><span> </span><br><span>     def run_netns_wait(self, name, popen_args):</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>             proc = process.NetNSProcess(name, self.run_dir.new_dir(name), self.netns(), popen_args, env={})</span><br><span>         else:</span><br><span>             proc = self.rem_host.RemoteNetNSProcess(name, self.netns(), popen_args, env={})</span><br><span>@@ -348,7 +342,7 @@</span><br><span>         if self.running():</span><br><span>             self.stop()</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>             try:</span><br><span>                 self.rem_host.scpfrom('scp-back-metrics', self.remote_metrics_file, self.metrics_file)</span><br><span>             except Exception as e:</span><br><span>diff --git a/sysmocom/resources.conf.prod b/sysmocom/resources.conf.prod</span><br><span>index ec148f3..e6429a0 100644</span><br><span>--- a/sysmocom/resources.conf.prod</span><br><span>+++ b/sysmocom/resources.conf.prod</span><br><span>@@ -258,23 +258,29 @@</span><br><span>   type: srsue</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.116</span><br><span>   imsi: '001010123456789'</span><br><span>   ki: '00112233445566778899aabbccddeeff'</span><br><span>   auth_algo: 'xor'</span><br><span>   features: ['4g']</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.116</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.116</span><br><span> </span><br><span> - label: srsUE-soapy-lms_1</span><br><span>   type: srsue</span><br><span>   rf_dev_type: soapy</span><br><span>   rf_dev_args: driver=lime,serial=00090706024F0A22,rxant=LNAW,txant=BAND1</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.116</span><br><span>   imsi: '001010123456789'</span><br><span>   ki: '00112233445566778899aabbccddeeff'</span><br><span>   auth_algo: 'xor'</span><br><span>   features: ['4g']</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.116</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.116</span><br><span> </span><br><span> osmocon_phone:</span><br><span>   - serial_device: '/dev/serial/by-id/usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_00897B41-if00-port0'</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18483">change 18483</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/+/18483"/><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: Ifdea48fed0bfc152131c53b87c34b4514c632917 </div>
<div style="display:none"> Gerrit-Change-Number: 18483 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </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>