diff --git a/doc/examples/4g_srsLTE/resources.conf b/doc/examples/4g_srsLTE/resources.conf index a1bdcbce..f0db3c0e 100644 --- a/doc/examples/4g_srsLTE/resources.conf +++ b/doc/examples/4g_srsLTE/resources.conf @@ -11,15 +11,21 @@ enb: - label: srsENB-zmq type: srsenb rf_dev_type: zmq - remote_user: jenkins - addr: 172.18.50.101 + run_node: + run_type: ssh + run_addr: 172.18.50.101 + ssh_user: jenkins + ssh_addr: 172.18.50.101 - label: srsENB-B200 type: srsenb rf_dev_type: uhd rf_dev_args: 'type=b200,serial=317B9FE' - remote_user: jenkins - addr: 172.18.50.102 + run_node: + run_type: ssh + run_addr: 172.18.50.102 + ssh_user: jenkins + ssh_addr: 172.18.50.102 modem: - label: srsUE-zmq diff --git a/src/osmo_gsm_tester/obj/enb.py b/src/osmo_gsm_tester/obj/enb.py index 9db0d69c..7004805a 100644 --- a/src/osmo_gsm_tester/obj/enb.py +++ b/src/osmo_gsm_tester/obj/enb.py @@ -20,13 +20,12 @@ from abc import ABCMeta, abstractmethod from ..core import log, config from ..core import schema +from . import run_node def on_register_schemas(): resource_schema = { 'label': schema.STR, 'type': schema.STR, - 'remote_user': schema.STR, - 'addr': schema.IPV4, 'gtp_bind_addr': schema.IPV4, 'id': schema.UINT, 'num_prb': schema.UINT, @@ -60,6 +59,8 @@ def on_register_schemas(): 'cell_list[].dl_rfemu.addr': schema.IPV4, 'cell_list[].dl_rfemu.ports[]': schema.UINT, } + for key, val in run_node.RunNode.schema().items(): + resource_schema['run_node.%s' % key] = val schema.register_resource_schema('enb', resource_schema) class eNodeB(log.Origin, metaclass=ABCMeta): @@ -70,13 +71,11 @@ class eNodeB(log.Origin, metaclass=ABCMeta): def __init__(self, testenv, conf, name): super().__init__(log.C_RUN, '%s' % name) self._conf = conf - self._addr = conf.get('addr', None) - if self._addr is None: - raise log.Error('addr not set') + self._run_node = run_node.RunNode.from_conf(conf.get('run_node', {})) self._gtp_bind_addr = conf.get('gtp_bind_addr', None) if self._gtp_bind_addr is None: - self._gtp_bind_addr = self._addr - self.set_name('%s_%s' % (name, self._addr)) + self._gtp_bind_addr = self._run_node.run_addr() + self.set_name('%s_%s' % (name, self._run_node.run_addr())) self._txmode = 0 self._id = None self._num_prb = 0 @@ -99,6 +98,7 @@ class eNodeB(log.Origin, metaclass=ABCMeta): assert self._txmode config.overlay(values, dict(enb={ 'num_ports': self.num_ports() })) assert self._epc is not None + config.overlay(values, dict(enb={ 'addr': self.addr() })) config.overlay(values, dict(enb={ 'mme_addr': self._epc.addr() })) config.overlay(values, dict(enb={ 'gtp_bind_addr': self._gtp_bind_addr })) self._num_cells = int(values['enb'].get('num_cells', None)) @@ -235,7 +235,7 @@ class eNodeB(log.Origin, metaclass=ABCMeta): pass def addr(self): - return self._addr + return self._run_node.run_addr() def ue_max_rate(self, downlink=True): # The max rate for a single UE per PRB configuration in TM1 with MCS 28 QAM64 diff --git a/src/osmo_gsm_tester/obj/enb_amarisoft.py b/src/osmo_gsm_tester/obj/enb_amarisoft.py index fa79cbf9..c331cd8b 100644 --- a/src/osmo_gsm_tester/obj/enb_amarisoft.py +++ b/src/osmo_gsm_tester/obj/enb_amarisoft.py @@ -69,7 +69,6 @@ class AmarisoftENB(enb.eNodeB): self.remote_log_file = None self.enable_measurements = False self.testenv = testenv - self.remote_user = conf.get('remote_user', None) 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)) @@ -83,7 +82,7 @@ class AmarisoftENB(enb.eNodeB): def cleanup(self): if self.process is None: return - if self.setup_runs_locally(): + if self._run_node.is_local(): return # copy back files (may not exist, for instance if there was an early error of process): try: @@ -91,10 +90,6 @@ class AmarisoftENB(enb.eNodeB): except Exception as e: self.log(repr(e)) - - def setup_runs_locally(self): - return self.remote_user is None - def start(self, epc): self.log('Starting AmarisoftENB') self._epc = epc @@ -107,7 +102,7 @@ class AmarisoftENB(enb.eNodeB): self.process.stdin_write('t\n') def _start(self): - if self.setup_runs_locally(): + if self._run_node.is_local(): env = { 'LD_LIBRARY_PATH': util.prepend_library_path(self.inst) } binary = self.inst.child('.', AmarisoftENB.BINFILE) self.dbg(run_dir=self.run_dir, binary=binary, env=env) @@ -141,8 +136,8 @@ class AmarisoftENB(enb.eNodeB): self.config_drb_file = self.run_dir.child(AmarisoftENB.CFGFILE_DRB) self.log_file = self.run_dir.child(AmarisoftENB.LOGFILE) - if not self.setup_runs_locally(): - self.rem_host = remote.RemoteHost(self.run_dir, self.remote_user, self._addr) + if not self._run_node.is_local(): + self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr()) remote_prefix_dir = util.Dir(AmarisoftENB.REMOTE_DIR) self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst)))) remote_run_dir = util.Dir(remote_prefix_dir.child(AmarisoftENB.BINFILE)) @@ -186,7 +181,7 @@ class AmarisoftENB(enb.eNodeB): config.overlay(values, dict(enb=dict(rf_dev_args=rf_dev_args))) - logfile = self.log_file if self.setup_runs_locally() else self.remote_log_file + logfile = self.log_file if self._run_node.is_local() else self.remote_log_file config.overlay(values, dict(enb=dict(log_filename=logfile))) # rf driver is shared between amarisoft enb and ue, so it has a @@ -205,7 +200,7 @@ class AmarisoftENB(enb.eNodeB): self.gen_conf_file(self.config_rf_file, AmarisoftENB.CFGFILE_RF, values) self.gen_conf_file(self.config_drb_file, AmarisoftENB.CFGFILE_DRB, values) - if not self.setup_runs_locally(): + if not self._run_node.is_local(): self.rem_host.recreate_remote_dir(self.remote_inst) self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir) self.rem_host.recreate_remote_dir(remote_run_dir) diff --git a/src/osmo_gsm_tester/obj/enb_srs.py b/src/osmo_gsm_tester/obj/enb_srs.py index 47b373e8..9e93541b 100644 --- a/src/osmo_gsm_tester/obj/enb_srs.py +++ b/src/osmo_gsm_tester/obj/enb_srs.py @@ -68,7 +68,6 @@ class srsENB(enb.eNodeB): self.remote_pcap_file = None self.enable_pcap = False self.testenv = testenv - self.remote_user = conf.get('remote_user', 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)) @@ -76,7 +75,7 @@ class srsENB(enb.eNodeB): def cleanup(self): if self.process is None: return - if self.setup_runs_locally(): + if self._run_node.is_local(): return # copy back files (may not exist, for instance if there was an early error of process): try: @@ -89,18 +88,15 @@ class srsENB(enb.eNodeB): except Exception as e: self.log(repr(e)) - def setup_runs_locally(self): - return self.remote_user is None - def start(self, epc): self.log('Starting srsENB') self._epc = epc self.run_dir = util.Dir(self.testenv.test().get_run_dir().new_dir(self.name())) self.configure() - if self.remote_user: - self.start_remotely() - else: + if self._run_node.is_local(): self.start_locally() + else: + self.start_remotely() # send t+Enter to enable console trace self.dbg('Enabling console trace') @@ -149,8 +145,8 @@ class srsENB(enb.eNodeB): self.log_file = self.run_dir.child(srsENB.LOGFILE) self.pcap_file = self.run_dir.child(srsENB.PCAPFILE) - if not self.setup_runs_locally(): - self.rem_host = remote.RemoteHost(self.run_dir, self.remote_user, self._addr) + if not self._run_node.is_local(): + self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr()) remote_prefix_dir = util.Dir(srsENB.REMOTE_DIR) self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst)))) self.remote_run_dir = util.Dir(remote_prefix_dir.child(srsENB.BINFILE)) @@ -164,11 +160,11 @@ class srsENB(enb.eNodeB): values = super().configure(['srsenb']) - sibfile = self.config_sib_file if self.setup_runs_locally() else self.remote_config_sib_file - rrfile = self.config_rr_file if self.setup_runs_locally() else self.remote_config_rr_file - drbfile = self.config_drb_file if self.setup_runs_locally() else self.remote_config_drb_file - logfile = self.log_file if self.setup_runs_locally() else self.remote_log_file - pcapfile = self.pcap_file if self.setup_runs_locally() else self.remote_pcap_file + sibfile = self.config_sib_file if self._run_node.is_local() else self.remote_config_sib_file + rrfile = self.config_rr_file if self._run_node.is_local() else self.remote_config_rr_file + drbfile = self.config_drb_file if self._run_node.is_local() else self.remote_config_drb_file + logfile = self.log_file if self._run_node.is_local() else self.remote_log_file + pcapfile = self.pcap_file if self._run_node.is_local() else self.remote_pcap_file config.overlay(values, dict(enb=dict(sib_filename=sibfile, rr_filename=rrfile, drb_filename=drbfile, @@ -209,7 +205,7 @@ class srsENB(enb.eNodeB): self.gen_conf_file(self.config_rr_file, srsENB.CFGFILE_RR, values) self.gen_conf_file(self.config_drb_file, srsENB.CFGFILE_DRB, values) - if not self.setup_runs_locally(): + if not self._run_node.is_local(): self.rem_host.recreate_remote_dir(self.remote_inst) self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir) self.rem_host.recreate_remote_dir(self.remote_run_dir) diff --git a/src/osmo_gsm_tester/obj/run_node.py b/src/osmo_gsm_tester/obj/run_node.py index bd502afc..6a030ac9 100644 --- a/src/osmo_gsm_tester/obj/run_node.py +++ b/src/osmo_gsm_tester/obj/run_node.py @@ -21,13 +21,7 @@ from ..core import log from ..core import schema def on_register_schemas(): - resource_schema = { - 'run_type': schema.STR, - 'run_addr': schema.IPV4, - 'ssh_user': schema.STR, - 'ssh_addr': schema.IPV4, - 'run_label': schema.STR, - } + resource_schema = RunNode.schema() schema.register_resource_schema('run_node', resource_schema) @@ -63,6 +57,17 @@ class RunNode(log.Origin): conf.get('ssh_user', None), conf.get('ssh_addr', None), conf.get('run_label', None)) + @classmethod + def schema(cls): + resource_schema = { + 'run_type': schema.STR, + 'run_addr': schema.IPV4, + 'ssh_user': schema.STR, + 'ssh_addr': schema.IPV4, + 'run_label': schema.STR, + } + return resource_schema + def is_local(self): return self._type == RunNode.T_LOCAL diff --git a/sysmocom/resources.conf.prod b/sysmocom/resources.conf.prod index c66cafa1..ec148f34 100644 --- a/sysmocom/resources.conf.prod +++ b/sysmocom/resources.conf.prod @@ -159,15 +159,21 @@ enb: type: srsenb rf_dev_type: zmq rf_dev_args: auto - remote_user: jenkins - addr: 10.42.42.117 + run_node: + run_type: ssh + run_addr: 10.42.42.117 + ssh_user: jenkins + ssh_addr: 10.42.42.117 - label: srsENB-B200 type: srsenb rf_dev_type: uhd rf_dev_args: "type=b200,serial=306BD11" - remote_user: jenkins - addr: 10.42.42.117 + run_node: + run_type: ssh + run_addr: 10.42.42.117 + ssh_user: jenkins + ssh_addr: 10.42.42.117 arfcn: - arfcn: 512