<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18045">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Update obj classes in obj/ to use testenv instead of suite_run<br><br>Change-Id: Idf41243a497de7bc507b9f1cd1b38640f456f815<br>---<br>M src/osmo_gsm_tester/core/suite.py<br>M src/osmo_gsm_tester/core/test.py<br>M src/osmo_gsm_tester/obj/bsc_osmo.py<br>M src/osmo_gsm_tester/obj/bts.py<br>M src/osmo_gsm_tester/obj/bts_nanobts.py<br>M src/osmo_gsm_tester/obj/bts_oc2g.py<br>M src/osmo_gsm_tester/obj/bts_octphy.py<br>M src/osmo_gsm_tester/obj/bts_osmo.py<br>M src/osmo_gsm_tester/obj/bts_osmotrx.py<br>M src/osmo_gsm_tester/obj/bts_osmovirtual.py<br>M src/osmo_gsm_tester/obj/bts_sysmo.py<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/epc.py<br>M src/osmo_gsm_tester/obj/epc_amarisoft.py<br>M src/osmo_gsm_tester/obj/epc_srs.py<br>M src/osmo_gsm_tester/obj/ggsn_osmo.py<br>M src/osmo_gsm_tester/obj/hlr_osmo.py<br>M src/osmo_gsm_tester/obj/iperf3.py<br>M src/osmo_gsm_tester/obj/mgcpgw_osmo.py<br>M src/osmo_gsm_tester/obj/mgw_osmo.py<br>M src/osmo_gsm_tester/obj/ms.py<br>M src/osmo_gsm_tester/obj/ms_amarisoft.py<br>M src/osmo_gsm_tester/obj/ms_driver.py<br>M src/osmo_gsm_tester/obj/ms_ofono.py<br>M src/osmo_gsm_tester/obj/ms_srs.py<br>M src/osmo_gsm_tester/obj/msc_osmo.py<br>M src/osmo_gsm_tester/obj/nitb_osmo.py<br>M src/osmo_gsm_tester/obj/osmocon.py<br>M src/osmo_gsm_tester/obj/pcap_recorder.py<br>M src/osmo_gsm_tester/obj/pcu.py<br>M src/osmo_gsm_tester/obj/pcu_oc2g.py<br>M src/osmo_gsm_tester/obj/pcu_osmo.py<br>M src/osmo_gsm_tester/obj/pcu_sysmo.py<br>M src/osmo_gsm_tester/obj/sgsn_osmo.py<br>M src/osmo_gsm_tester/obj/stp_osmo.py<br>M src/osmo_gsm_tester/testenv.py<br>M src/osmo_ms_driver/starter.py<br>39 files changed, 282 insertions(+), 288 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/45/18045/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/core/suite.py b/src/osmo_gsm_tester/core/suite.py</span><br><span>index 0995f8f..1bd6a63 100644</span><br><span>--- a/src/osmo_gsm_tester/core/suite.py</span><br><span>+++ b/src/osmo_gsm_tester/core/suite.py</span><br><span>@@ -72,13 +72,16 @@</span><br><span>         self._resource_modifiers = None</span><br><span>         self._config = None</span><br><span>         self._run_dir = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.trial = trial</span><br><span style="color: hsl(120, 100%, 40%);">+        self._trial = trial</span><br><span>         self.definition = suite_definition</span><br><span>         self.scenarios = scenarios</span><br><span>         self.resources_pool = resource.ResourcesPool()</span><br><span>         self.status = SuiteRun.UNKNOWN</span><br><span>         self.load_tests()</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def trial(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return self._trial</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def load_tests(self):</span><br><span>         self.tests = []</span><br><span>         for test_basename in self.definition.test_basenames:</span><br><span>@@ -109,7 +112,7 @@</span><br><span> </span><br><span>     def get_run_dir(self):</span><br><span>         if self._run_dir is None:</span><br><span style="color: hsl(0, 100%, 40%);">-            self._run_dir = util.Dir(self.trial.get_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+            self._run_dir = util.Dir(self._trial.get_run_dir().new_dir(self.name()))</span><br><span>         return self._run_dir</span><br><span> </span><br><span>     def resource_requirements(self):</span><br><span>@@ -142,7 +145,7 @@</span><br><span>     def run_tests(self, names=None):</span><br><span>         suite_libdir = os.path.join(self.definition.suite_dir, 'lib')</span><br><span>         try:</span><br><span style="color: hsl(0, 100%, 40%);">-            log.large_separator(self.trial.name(), self.name(), sublevel=2)</span><br><span style="color: hsl(120, 100%, 40%);">+            log.large_separator(self._trial.name(), self.name(), sublevel=2)</span><br><span>             self.mark_start()</span><br><span>             util.import_path_prepend(suite_libdir)</span><br><span>             if not self.reserved_resources:</span><br><span>@@ -171,7 +174,7 @@</span><br><span>             else:</span><br><span>                 self.status = SuiteRun.FAIL</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            log.large_separator(self.trial.name(), self.name(), self.status, sublevel=2, space_above=False)</span><br><span style="color: hsl(120, 100%, 40%);">+            log.large_separator(self._trial.name(), self.name(), self.status, sublevel=2, space_above=False)</span><br><span> </span><br><span>     def passed(self):</span><br><span>         return self.status == SuiteRun.PASS</span><br><span>diff --git a/src/osmo_gsm_tester/core/test.py b/src/osmo_gsm_tester/core/test.py</span><br><span>index 76c9ce9..8ab124b 100644</span><br><span>--- a/src/osmo_gsm_tester/core/test.py</span><br><span>+++ b/src/osmo_gsm_tester/core/test.py</span><br><span>@@ -58,7 +58,7 @@</span><br><span>         testenv_obj = None</span><br><span>         try:</span><br><span>             self.log_target = log.FileLogTarget(self.get_run_dir().new_child('log')).set_all_levels(log.L_DBG).style_change(trace=True)</span><br><span style="color: hsl(0, 100%, 40%);">-            log.large_separator(self.suite_run.trial.name(), self.suite_run.name(), self.name(), sublevel=3)</span><br><span style="color: hsl(120, 100%, 40%);">+            log.large_separator(self.suite_run.trial().name(), self.suite_run.name(), self.name(), sublevel=3)</span><br><span>             self.status = Test.UNKNOWN</span><br><span>             self.start_timestamp = time.time()</span><br><span>             testenv_obj = testenv.setup(self.suite_run, self)</span><br><span>diff --git a/src/osmo_gsm_tester/obj/bsc_osmo.py b/src/osmo_gsm_tester/obj/bsc_osmo.py</span><br><span>index 046ef94..22b2dad 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/bsc_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/bsc_osmo.py</span><br><span>@@ -34,7 +34,7 @@</span><br><span> </span><br><span> class OsmoBsc(log.Origin):</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, msc, mgw, stp, ip_address):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, msc, mgw, stp, ip_address):</span><br><span>         super().__init__(log.C_RUN, 'osmo-bsc_%s' % ip_address.get('addr'))</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>@@ -42,7 +42,7 @@</span><br><span>         self.encryption = None</span><br><span>         self.rsl_ip = None</span><br><span>         self.use_osmux = "off"</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.ip_address = ip_address</span><br><span>         self.bts = []</span><br><span>         self.msc = msc</span><br><span>@@ -51,10 +51,10 @@</span><br><span> </span><br><span>     def start(self):</span><br><span>         self.log('Starting osmo-bsc')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-bsc')))</span><br><span style="color: hsl(120, 100%, 40%);">+        inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-bsc')))</span><br><span> </span><br><span>         binary = inst.child('bin', 'osmo-bsc')</span><br><span>         if not os.path.isfile(binary):</span><br><span>@@ -67,7 +67,7 @@</span><br><span>             filter = 'host %s or host %s and port not 22' % (self.addr(), self.rsl_ip)</span><br><span>         else:</span><br><span>             filter = 'host %s and port not 22' % self.addr()</span><br><span style="color: hsl(0, 100%, 40%);">-        pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None, filter)</span><br><span style="color: hsl(120, 100%, 40%);">+        pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None, filter)</span><br><span> </span><br><span>         env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span> </span><br><span>@@ -76,7 +76,7 @@</span><br><span>                                        (binary, '-c',</span><br><span>                                         os.path.abspath(self.config_file)),</span><br><span>                                        env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def configure(self):</span><br><span>@@ -84,7 +84,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = dict(bsc=config.get_defaults('bsc'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, dict(bsc=dict(ip_address=self.ip_address)))</span><br><span>         config.overlay(values, self.mgw.conf_for_client())</span><br><span>         config.overlay(values, self.stp.conf_for_client())</span><br><span>diff --git a/src/osmo_gsm_tester/obj/bts.py b/src/osmo_gsm_tester/obj/bts.py</span><br><span>index e23b555..56e5aaa 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/bts.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/bts.py</span><br><span>@@ -50,7 +50,7 @@</span><br><span> ##############</span><br><span> # PROTECTED</span><br><span> ##############</span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf, name, defaults_cfg_name):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf, name, defaults_cfg_name):</span><br><span>         super().__init__(log.C_RUN, name)</span><br><span>         self.bsc = None</span><br><span>         self.sgsn = None</span><br><span>@@ -61,7 +61,7 @@</span><br><span>         self._num_trx = 1</span><br><span>         self._max_trx = None</span><br><span>         self.overlay_trx_list = []</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.conf = conf</span><br><span>         self.defaults_cfg_name = defaults_cfg_name</span><br><span>         self._init_num_trx()</span><br><span>@@ -162,7 +162,7 @@</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(0, 100%, 40%);">-    def get_instance_by_type(suite_run, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_instance_by_type(testenv, conf):</span><br><span>         """Allocate a BTS child class based on type. Opts are passed to the newly created object."""</span><br><span>         bts_type = conf.get('type')</span><br><span>         if bts_type is None:</span><br><span>@@ -188,7 +188,7 @@</span><br><span>             bts_class = NanoBts</span><br><span>         else:</span><br><span>             raise log.Error('BTS type not supported:', bts_type)</span><br><span style="color: hsl(0, 100%, 40%);">-        return bts_class(suite_run, conf)</span><br><span style="color: hsl(120, 100%, 40%);">+        return bts_class(testenv, conf)</span><br><span> </span><br><span> ###################</span><br><span> # PUBLIC (test API included)</span><br><span>diff --git a/src/osmo_gsm_tester/obj/bts_nanobts.py b/src/osmo_gsm_tester/obj/bts_nanobts.py</span><br><span>index 3e9b035..5c07bda 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/bts_nanobts.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/bts_nanobts.py</span><br><span>@@ -30,8 +30,8 @@</span><br><span> ##############</span><br><span> # PROTECTED</span><br><span> ##############</span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf, 'nanobts_%s' % conf.get('label', 'nolabel'), 'nanobts')</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf, 'nanobts_%s' % conf.get('label', 'nolabel'), 'nanobts')</span><br><span>         self.pwsup_list = []</span><br><span>         self._pcu = None</span><br><span> </span><br><span>@@ -94,7 +94,7 @@</span><br><span>     def start(self, keepalive=False):</span><br><span>         if self.conf.get('ipa_unit_id') is None:</span><br><span>             raise log.Error('No attribute ipa_unit_id provided in conf!')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self._configure()</span><br><span> </span><br><span>         unitid = int(self.conf.get('ipa_unit_id'))</span><br><span>@@ -104,7 +104,7 @@</span><br><span>             self.dbg('Powering cycling NanoBTS TRX')</span><br><span>             pwsup.power_cycle(1.0)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,</span><br><span style="color: hsl(120, 100%, 40%);">+        pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None,</span><br><span>                                    '%s and port not 22' % self.get_pcap_filter_all_trx_ip())</span><br><span> </span><br><span> </span><br><span>@@ -116,14 +116,14 @@</span><br><span>             local_bind_ip = util.dst_ip_get_local_bind(bts_trx_ip)</span><br><span> </span><br><span>             self.log('Finding nanobts %s, binding on %s...' % (bts_trx_ip, local_bind_ip))</span><br><span style="color: hsl(0, 100%, 40%);">-            ipfind = AbisIpFind(self.suite_run, self.run_dir, local_bind_ip, 'preconf')</span><br><span style="color: hsl(120, 100%, 40%);">+            ipfind = AbisIpFind(self.testenv, self.run_dir, local_bind_ip, 'preconf')</span><br><span>             ipfind.start()</span><br><span>             ipfind.wait_bts_ready(bts_trx_ip)</span><br><span>             running_unitid, running_trx = ipfind.get_unitid_by_ip(bts_trx_ip)</span><br><span>             self.log('Found nanobts %s with unit_id %d trx %d' % (bts_trx_ip, running_unitid, running_trx))</span><br><span>             ipfind.stop()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            ipconfig = IpAccessConfig(self.suite_run, self.run_dir, bts_trx_ip)</span><br><span style="color: hsl(120, 100%, 40%);">+            ipconfig = IpAccessConfig(self.testenv, self.run_dir, bts_trx_ip)</span><br><span>             running_oml_ip = ipconfig.get_oml_ip()</span><br><span> </span><br><span>             if running_unitid != unitid or running_trx != trx_i:</span><br><span>@@ -142,7 +142,7 @@</span><br><span>                 MainLoop.sleep(self, 20)</span><br><span> </span><br><span>                 self.dbg('Starting to connect id %d trx %d to' % (unitid, trx_i), self.bsc)</span><br><span style="color: hsl(0, 100%, 40%);">-                ipfind = AbisIpFind(self.suite_run, self.run_dir, local_bind_ip, 'postconf')</span><br><span style="color: hsl(120, 100%, 40%);">+                ipfind = AbisIpFind(self.testenv, self.run_dir, local_bind_ip, 'postconf')</span><br><span>                 ipfind.start()</span><br><span>                 ipfind.wait_bts_ready(bts_trx_ip)</span><br><span>                 self.log('nanoBTS id %d trx %d configured and running' % (unitid, trx_i))</span><br><span>@@ -171,12 +171,12 @@</span><br><span> </span><br><span>     def pcu(self):</span><br><span>         if not self._pcu:</span><br><span style="color: hsl(0, 100%, 40%);">-            self._pcu = pcu.PcuDummy(self.suite_run, self, self.conf)</span><br><span style="color: hsl(120, 100%, 40%);">+            self._pcu = pcu.PcuDummy(self.testenv, self, self.conf)</span><br><span>         return self._pcu</span><br><span> </span><br><span> </span><br><span> class AbisIpFind(log.Origin):</span><br><span style="color: hsl(0, 100%, 40%);">-    suite_run = None</span><br><span style="color: hsl(120, 100%, 40%);">+    testenv = None</span><br><span>     parent_run_dir = None</span><br><span>     run_dir = None</span><br><span>     inst = None</span><br><span>@@ -187,16 +187,16 @@</span><br><span>     BIN_ABISIP_FIND = 'abisip-find'</span><br><span>     BTS_UNIT_ID_RE = re.compile("Unit_ID='(?P<unit_id>\d+)/\d+/(?P<trx_id>\d+)'")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, parent_run_dir, bind_ip, name_suffix):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, parent_run_dir, bind_ip, name_suffix):</span><br><span>         super().__init__(log.C_RUN, AbisIpFind.BIN_ABISIP_FIND + '-' + name_suffix)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.parent_run_dir = parent_run_dir</span><br><span>         self.bind_ip = bind_ip</span><br><span>         self.env = {}</span><br><span> </span><br><span>     def start(self):</span><br><span>         self.run_dir = util.Dir(self.parent_run_dir.new_dir(self.name()))</span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-bsc')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-bsc')))</span><br><span> </span><br><span>         lib = self.inst.child('lib')</span><br><span>         if not os.path.isdir(lib):</span><br><span>@@ -209,11 +209,11 @@</span><br><span>         self.proc = process.Process(self.name(), self.run_dir,</span><br><span>                             (ipfind_path, '-i', '1', '-b', self.bind_ip),</span><br><span>                             env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.proc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.proc)</span><br><span>         self.proc.launch()</span><br><span> </span><br><span>     def stop(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.stop_process(self.proc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.stop_process(self.proc)</span><br><span> </span><br><span>     def get_line_by_ip(self, ipaddr):</span><br><span>         """Get latest line (more up to date) from abisip-find based on ip address."""</span><br><span>@@ -246,7 +246,7 @@</span><br><span>         MainLoop.sleep(self, 2)</span><br><span> </span><br><span> class IpAccessConfig(log.Origin):</span><br><span style="color: hsl(0, 100%, 40%);">-    suite_run = None</span><br><span style="color: hsl(120, 100%, 40%);">+    testenv = None</span><br><span>     parent_run_dir = None</span><br><span>     run_dir = None</span><br><span>     inst = None</span><br><span>@@ -255,9 +255,9 @@</span><br><span> </span><br><span>     BIN_IPACCESS_CONFIG = 'ipaccess-config'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, parent_run_dir, bts_ip):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, parent_run_dir, bts_ip):</span><br><span>         super().__init__(log.C_RUN, IpAccessConfig.BIN_IPACCESS_CONFIG)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.parent_run_dir = parent_run_dir</span><br><span>         self.bts_ip = bts_ip</span><br><span>         self.env = {}</span><br><span>@@ -274,7 +274,7 @@</span><br><span> </span><br><span>     def run(self, name_suffix, *args):</span><br><span>         self.run_dir = util.Dir(self.parent_run_dir.new_dir(self.name()+'-'+name_suffix))</span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-bsc')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-bsc')))</span><br><span>         lib = self.inst.child('lib')</span><br><span>         self.env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span>         self.proc = self.create_process(IpAccessConfig.BIN_IPACCESS_CONFIG, *args)</span><br><span>diff --git a/src/osmo_gsm_tester/obj/bts_oc2g.py b/src/osmo_gsm_tester/obj/bts_oc2g.py</span><br><span>index 4a59eee..ee86cc3 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/bts_oc2g.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/bts_oc2g.py</span><br><span>@@ -31,8 +31,8 @@</span><br><span>     BTS_OC2G_BIN = 'osmo-bts-oc2g'</span><br><span>     BTS_OC2G_CFG = 'osmo-bts-oc2g.cfg'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf, OsmoBtsOC2G.BTS_OC2G_BIN, 'osmo_bts_oc2g')</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf, OsmoBtsOC2G.BTS_OC2G_BIN, 'osmo_bts_oc2g')</span><br><span>         self.run_dir = None</span><br><span>         self.inst = None</span><br><span>         self.remote_inst = None</span><br><span>@@ -44,7 +44,7 @@</span><br><span>         return util.str2bool(self.conf.get('direct_pcu'))</span><br><span> </span><br><span>     def create_pcu(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return pcu_oc2g.OsmoPcuOC2G(self.suite_run, self, self.conf)</span><br><span style="color: hsl(120, 100%, 40%);">+        return pcu_oc2g.OsmoPcuOC2G(self.testenv, self, self.conf)</span><br><span> </span><br><span>     def configure(self):</span><br><span>         if self.bsc is None:</span><br><span>@@ -54,7 +54,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = { 'osmo_bts_oc2g': config.get_defaults('osmo_bts_oc2g') }</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, {</span><br><span>                         'osmo_bts_oc2g': {</span><br><span>                             'oml_remote_ip': self.bsc.addr(),</span><br><span>@@ -100,10 +100,10 @@</span><br><span>         if self.bsc is None:</span><br><span>             raise RuntimeError('BTS needs to be added to a BSC or NITB before it can be started')</span><br><span>         log.log('Starting OsmoBtsOC2G to connect to', self.bsc)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst(OsmoBtsOC2G.BTS_OC2G_BIN)))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst(OsmoBtsOC2G.BTS_OC2G_BIN)))</span><br><span>         lib = self.inst.child('lib')</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise log.Error('No lib/ in', self.inst)</span><br><span>@@ -131,6 +131,6 @@</span><br><span>             args += ('-M',)</span><br><span> </span><br><span>         self.proc_bts = rem_host.RemoteProcess(OsmoBtsOC2G.BTS_OC2G_BIN, args)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.proc_bts, keepalive)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.proc_bts, keepalive)</span><br><span>         self.proc_bts.launch()</span><br><span> # vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/obj/bts_octphy.py b/src/osmo_gsm_tester/obj/bts_octphy.py</span><br><span>index 11570e8..c4d3910 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/bts_octphy.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/bts_octphy.py</span><br><span>@@ -31,8 +31,8 @@</span><br><span>     BIN_BTS_OCTPHY = 'osmo-bts-octphy'</span><br><span>     CONF_BTS_OCTPHY = 'osmo-bts-octphy.cfg'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf, OsmoBtsOctphy.BIN_BTS_OCTPHY, 'osmo_bts_octphy')</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf, OsmoBtsOctphy.BIN_BTS_OCTPHY, 'osmo_bts_octphy')</span><br><span>         self.run_dir = None</span><br><span>         self.inst = None</span><br><span>         self.env = {}</span><br><span>@@ -46,7 +46,7 @@</span><br><span>         proc = process.Process(binary_name, run_dir,</span><br><span>                                (binary,) + args,</span><br><span>                                env=self.env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(proc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(proc)</span><br><span>         proc.launch()</span><br><span>         return proc</span><br><span> </span><br><span>@@ -85,7 +85,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = dict(osmo_bts_octphy=config.get_defaults('osmo_bts_octphy'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, {</span><br><span>                         'osmo_bts_octphy': {</span><br><span>                             'oml_remote_ip': self.bsc.addr(),</span><br><span>@@ -117,13 +117,13 @@</span><br><span>     def start(self):</span><br><span>         if self.bsc is None:</span><br><span>             raise RuntimeError('BTS needs to be added to a BSC or NITB before it can be started')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.poll()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.poll()</span><br><span> </span><br><span>         self.log('Starting to connect to', self.bsc)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-bts')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-bts')))</span><br><span>         btsoct_path = self.inst.child('bin', OsmoBtsOctphy.BIN_BTS_OCTPHY)</span><br><span>         lib = self.inst.child('lib')</span><br><span>         if not os.path.isdir(lib):</span><br><span>@@ -139,6 +139,6 @@</span><br><span>         self.proc_bts = self.launch_process(OsmoBtsOctphy.BIN_BTS_OCTPHY, '-r', '1',</span><br><span>                             '-c', os.path.abspath(self.config_file),</span><br><span>                             '-i', self.bsc.addr(), '-t', str(self.num_trx()))</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.poll()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.poll()</span><br><span> </span><br><span> # vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/obj/bts_osmo.py b/src/osmo_gsm_tester/obj/bts_osmo.py</span><br><span>index a182c47..c1a1f5c 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/bts_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/bts_osmo.py</span><br><span>@@ -38,8 +38,8 @@</span><br><span> ##############</span><br><span> # PROTECTED</span><br><span> ##############</span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf, name, defaults_cfg_name):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf, name, defaults_cfg_name)</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf, name, defaults_cfg_name):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf, name, defaults_cfg_name)</span><br><span>         self._pcu = None</span><br><span>         self.proc_bts = None</span><br><span>         if len(self.pcu_socket_path().encode()) > 107:</span><br><span>@@ -86,9 +86,9 @@</span><br><span> # PROTECTED</span><br><span> ##############</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf, name, defaults_cfg_name):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf, name, defaults_cfg_name):</span><br><span>         self.pcu_sk_tmp_dir = None</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf, name, defaults_cfg_name)</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf, name, defaults_cfg_name)</span><br><span> </span><br><span> ########################</span><br><span> # PUBLIC - INTERNAL API</span><br><span>@@ -107,7 +107,7 @@</span><br><span>             os.rmdir(self.pcu_sk_tmp_dir)</span><br><span> </span><br><span>     def create_pcu(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return pcu_osmo.OsmoPcu(self.suite_run, self, self.conf)</span><br><span style="color: hsl(120, 100%, 40%);">+        return pcu_osmo.OsmoPcu(self.testenv, self, self.conf)</span><br><span> </span><br><span>     def pcu_socket_path(self):</span><br><span>         if self.pcu_sk_tmp_dir is None:</span><br><span>diff --git a/src/osmo_gsm_tester/obj/bts_osmotrx.py b/src/osmo_gsm_tester/obj/bts_osmotrx.py</span><br><span>index 9234fc8..42ed3f8 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/bts_osmotrx.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/bts_osmotrx.py</span><br><span>@@ -50,8 +50,8 @@</span><br><span> </span><br><span>     CONF_BTS_TRX = 'osmo-bts-trx.cfg'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf, OsmoBtsTrx.BIN_BTS_TRX, 'osmo_bts_trx')</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf, OsmoBtsTrx.BIN_BTS_TRX, 'osmo_bts_trx')</span><br><span>         self.run_dir = None</span><br><span>         self.inst = None</span><br><span>         self.trx = None</span><br><span>@@ -74,7 +74,7 @@</span><br><span>         proc = process.Process(binary_name, run_dir,</span><br><span>                                (binary,) + args,</span><br><span>                                env=self.env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(proc, keepalive)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(proc, keepalive)</span><br><span>         proc.launch()</span><br><span>         return proc</span><br><span> </span><br><span>@@ -86,7 +86,7 @@</span><br><span> </span><br><span>         values = dict(osmo_bts_trx=config.get_defaults('osmo_bts_trx'))</span><br><span>         config.overlay(values, dict(osmo_bts_trx=dict(osmo_trx=config.get_defaults('osmo_trx'))))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, {</span><br><span>                         'osmo_bts_trx': {</span><br><span>                             'oml_remote_ip': self.bsc.addr(),</span><br><span>@@ -155,10 +155,10 @@</span><br><span>     def start(self, keepalive=False):</span><br><span>         if self.bsc is None:</span><br><span>             raise RuntimeError('BTS needs to be added to a BSC or NITB before it can be started')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.poll()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.poll()</span><br><span> </span><br><span>         self.log('Starting to connect to', self.bsc)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span>         # Power cycle all TRX if needed (right now only TRX0 for SC5):</span><br><span>@@ -170,12 +170,12 @@</span><br><span>             i = i + 1</span><br><span> </span><br><span>         if self.launch_trx_enabled():</span><br><span style="color: hsl(0, 100%, 40%);">-            self.trx = OsmoTrx.get_instance_by_type(self.get_osmo_trx_type(), self.suite_run, self.conf_for_osmotrx())</span><br><span style="color: hsl(120, 100%, 40%);">+            self.trx = OsmoTrx.get_instance_by_type(self.get_osmo_trx_type(), self.testenv, self.conf_for_osmotrx())</span><br><span>             self.trx.start(keepalive)</span><br><span>             self.log('Waiting for %s to start up...' % self.trx.name())</span><br><span>             MainLoop.wait(self, self.trx.trx_ready)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-bts')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-bts')))</span><br><span>         lib = self.inst.child('lib')</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise RuntimeError('No lib/ in %r' % self.inst)</span><br><span>@@ -184,7 +184,7 @@</span><br><span>         self.proc_bts = self.launch_process(keepalive, OsmoBtsTrx.BIN_BTS_TRX, '-r', '1',</span><br><span>                             '-c', os.path.abspath(self.config_file),</span><br><span>                             '-i', self.bsc.addr())</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.poll()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.poll()</span><br><span> </span><br><span> </span><br><span> ################################################################################</span><br><span>@@ -195,23 +195,23 @@</span><br><span> ##############</span><br><span> # PROTECTED</span><br><span> ##############</span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf, name):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf, name):</span><br><span>         super().__init__(log.C_RUN, name)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.conf = conf</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.listen_ip = conf.get('osmo_trx', {}).get('trx_ip')</span><br><span>         self.remote_user = conf.get('osmo_trx', {}).get('remote_user', None)</span><br><span> </span><br><span>     @classmethod</span><br><span style="color: hsl(0, 100%, 40%);">-    def get_instance_by_type(cls, type, suite_run, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_instance_by_type(cls, type, testenv, conf):</span><br><span>         KNOWN_OSMOTRX_TYPES = {</span><br><span>             'uhd': OsmoTrxUHD,</span><br><span>             'lms': OsmoTrxLMS,</span><br><span>             'sc5': TrxSC5</span><br><span>         }</span><br><span>         osmo_trx_class = KNOWN_OSMOTRX_TYPES.get(type)</span><br><span style="color: hsl(0, 100%, 40%);">-        return osmo_trx_class(suite_run, conf)</span><br><span style="color: hsl(120, 100%, 40%);">+        return osmo_trx_class(testenv, conf)</span><br><span> </span><br><span> ##############</span><br><span> # PUBLIC (test API included)</span><br><span>@@ -233,8 +233,8 @@</span><br><span> ##############</span><br><span> # PROTECTED</span><br><span> ##############</span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf, self.binary_name())</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf, self.binary_name())</span><br><span>         self.env = {}</span><br><span>         self.log("OSMOTRX CONF: %r" % conf)</span><br><span>         self.bts_ip = conf.get('osmo_trx', {}).get('bts_ip')</span><br><span>@@ -274,7 +274,7 @@</span><br><span>         proc = process.Process(binary_name, run_dir,</span><br><span>                                (binary,) + args,</span><br><span>                                env=self.env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(proc, keepalive)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(proc, keepalive)</span><br><span>         proc.launch()</span><br><span>         return proc</span><br><span> </span><br><span>@@ -292,7 +292,7 @@</span><br><span> </span><br><span>         have_inst = rem_host.inst_compatible_for_remote()</span><br><span>         if have_inst:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-trx')))</span><br><span style="color: hsl(120, 100%, 40%);">+            self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-trx')))</span><br><span> </span><br><span>         rem_host.recreate_remote_dir(remote_prefix_dir)</span><br><span>         if have_inst:</span><br><span>@@ -311,7 +311,7 @@</span><br><span>             remote_binary = self.binary_name()</span><br><span>         args = (remote_binary, '-C', remote_config_file)</span><br><span>         self.proc_trx = rem_host.RemoteProcessFixIgnoreSIGHUP(self.binary_name(), remote_run_dir, args, remote_env=remote_env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.proc_trx, keepalive)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.proc_trx, keepalive)</span><br><span>         self.proc_trx.launch()</span><br><span> </span><br><span> ##############</span><br><span>@@ -323,7 +323,7 @@</span><br><span>             self.start_remotely(keepalive)</span><br><span>             return</span><br><span>         # Run locally if ssh user is not set</span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-trx')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-trx')))</span><br><span>         lib = self.inst.child('lib')</span><br><span>         self.env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span>         self.proc_trx = self.launch_process_local(keepalive, self.binary_name(),</span><br><span>@@ -337,8 +337,8 @@</span><br><span> class OsmoTrxUHD(OsmoTrx):</span><br><span>     BIN_TRX = 'osmo-trx-uhd'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf)</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf)</span><br><span> </span><br><span>     def binary_name(self):</span><br><span>         return OsmoTrxUHD.BIN_TRX</span><br><span>@@ -346,16 +346,16 @@</span><br><span> class OsmoTrxLMS(OsmoTrx):</span><br><span>     BIN_TRX = 'osmo-trx-lms'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf)</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf)</span><br><span> </span><br><span>     def binary_name(self):</span><br><span>         return OsmoTrxLMS.BIN_TRX</span><br><span> </span><br><span> class TrxSC5(Trx):</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf, "sc5-trx")</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf, "sc5-trx")</span><br><span>         self.ready = False</span><br><span> </span><br><span>     def start(self, keepalive=False):</span><br><span>diff --git a/src/osmo_gsm_tester/obj/bts_osmovirtual.py b/src/osmo_gsm_tester/obj/bts_osmovirtual.py</span><br><span>index 495b2a8..b6470c1 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/bts_osmovirtual.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/bts_osmovirtual.py</span><br><span>@@ -33,9 +33,9 @@</span><br><span> </span><br><span>     CONF_BTS = 'osmo-bts-virtual.cfg'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span>         """Initializes the OsmoBtsVirtual."""</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf, OsmoBtsVirtual.BIN_BTS, 'osmo_bts_virtual')</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf, OsmoBtsVirtual.BIN_BTS, 'osmo_bts_virtual')</span><br><span>         self.run_dir = None</span><br><span>         self.inst = None</span><br><span>         self.env = {}</span><br><span>@@ -50,7 +50,7 @@</span><br><span>         proc = process.Process(binary_name, run_dir,</span><br><span>                                (binary,) + args,</span><br><span>                                env=self.env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(proc, keepalive)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(proc, keepalive)</span><br><span>         proc.launch()</span><br><span>         return proc</span><br><span> </span><br><span>@@ -63,7 +63,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = dict(osmo_bts_virtual=config.get_defaults('osmo_bts_virtual'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, {</span><br><span>                         'osmo_bts_virtual': {</span><br><span>                             'oml_remote_ip': self.bsc.addr(),</span><br><span>@@ -95,13 +95,13 @@</span><br><span>         """Handles starting/turning-up the osmo-bts-virtual process."""</span><br><span>         if self.bsc is None:</span><br><span>             raise RuntimeError('BTS needs to be added to a BSC or NITB before it can be started')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.poll()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.poll()</span><br><span> </span><br><span>         self.log('Starting to connect to', self.bsc)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-bts')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-bts')))</span><br><span>         lib = self.inst.child('lib')</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise RuntimeError('No lib/ in %r' % self.inst)</span><br><span>@@ -110,6 +110,6 @@</span><br><span>         self.proc_bts = self.launch_process(keepalive, OsmoBtsVirtual.BIN_BTS, '-r', '1',</span><br><span>                             '-c', os.path.abspath(self.config_file),</span><br><span>                             '-i', self.bsc.addr())</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.poll()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.poll()</span><br><span> </span><br><span> # vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/obj/bts_sysmo.py b/src/osmo_gsm_tester/obj/bts_sysmo.py</span><br><span>index aecf977..8f76ecb 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/bts_sysmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/bts_sysmo.py</span><br><span>@@ -31,8 +31,8 @@</span><br><span>     BTS_SYSMO_BIN = 'osmo-bts-sysmo'</span><br><span>     BTS_SYSMO_CFG = 'osmo-bts-sysmo.cfg'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf, SysmoBts.BTS_SYSMO_BIN, 'osmo_bts_sysmo')</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf, SysmoBts.BTS_SYSMO_BIN, 'osmo_bts_sysmo')</span><br><span>         self.run_dir = None</span><br><span>         self.inst = None</span><br><span>         self.remote_inst = None</span><br><span>@@ -44,7 +44,7 @@</span><br><span>         return util.str2bool(self.conf.get('direct_pcu'))</span><br><span> </span><br><span>     def create_pcu(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return pcu_sysmo.OsmoPcuSysmo(self.suite_run, self, self.conf)</span><br><span style="color: hsl(120, 100%, 40%);">+        return pcu_sysmo.OsmoPcuSysmo(self.testenv, self, self.conf)</span><br><span> </span><br><span>     def configure(self):</span><br><span>         if self.bsc is None:</span><br><span>@@ -54,7 +54,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = { 'osmo_bts_sysmo': config.get_defaults('osmo_bts_sysmo') }</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, {</span><br><span>                         'osmo_bts_sysmo': {</span><br><span>                             'oml_remote_ip': self.bsc.addr(),</span><br><span>@@ -94,10 +94,10 @@</span><br><span>         if self.bsc is None:</span><br><span>             raise RuntimeError('BTS needs to be added to a BSC or NITB before it can be started')</span><br><span>         log.log('Starting sysmoBTS to connect to', self.bsc)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst(SysmoBts.BTS_SYSMO_BIN)))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst(SysmoBts.BTS_SYSMO_BIN)))</span><br><span>         lib = self.inst.child('lib')</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise log.Error('No lib/ in', self.inst)</span><br><span>@@ -127,7 +127,7 @@</span><br><span>             args += ('-M',)</span><br><span> </span><br><span>         self.proc_bts = rem_host.RemoteProcess(SysmoBts.BTS_SYSMO_BIN, args)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.proc_bts, keepalive)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.proc_bts, keepalive)</span><br><span>         self.proc_bts.launch()</span><br><span> </span><br><span> # vim: expandtab tabstop=4 shiftwidth=4</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 7514604..4848ea4 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>@@ -66,7 +66,7 @@</span><br><span> ##############</span><br><span> # PROTECTED</span><br><span> ##############</span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf, name):</span><br><span style="color: hsl(120, 100%, 40%);">+    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>         self._addr = conf.get('addr', None)</span><br><span>@@ -86,9 +86,9 @@</span><br><span>         values = dict(enb=config.get_defaults('enb'))</span><br><span>         for config_specifics in config_specifics_li:</span><br><span>             config.overlay(values, dict(enb=config.get_defaults(config_specifics)))</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(120, 100%, 40%);">+        config.overlay(values, dict(enb=self.testenv.suite().config().get('enb', {})))</span><br><span>         for config_specifics in config_specifics_li:</span><br><span style="color: hsl(0, 100%, 40%);">-            config.overlay(values, dict(enb=self.suite_run.config().get(config_specifics, {})))</span><br><span style="color: hsl(120, 100%, 40%);">+            config.overlay(values, dict(enb=self.testenv.suite().config().get(config_specifics, {})))</span><br><span>         config.overlay(values, dict(enb=self._conf))</span><br><span>         self._id = int(values['enb'].get('id', None))</span><br><span>         assert self._id is not None</span><br><span>@@ -192,7 +192,7 @@</span><br><span> </span><br><span>         return rf_dev_args</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def get_instance_by_type(suite_run, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_instance_by_type(testenv, conf):</span><br><span>         """Allocate a ENB child class based on type. Opts are passed to the newly created object."""</span><br><span>         enb_type = conf.get('type')</span><br><span>         if enb_type is None:</span><br><span>@@ -206,7 +206,7 @@</span><br><span>             enb_class = srsENB</span><br><span>         else:</span><br><span>             raise log.Error('ENB type not supported:', enb_type)</span><br><span style="color: hsl(0, 100%, 40%);">-        return  enb_class(suite_run, conf)</span><br><span style="color: hsl(120, 100%, 40%);">+        return  enb_class(testenv, conf)</span><br><span> </span><br><span> ###################</span><br><span> # PUBLIC (test API included)</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 6f7080a..a534708 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>@@ -45,8 +45,8 @@</span><br><span>     CFGFILE_DRB = 'amarisoft_drb.cfg'</span><br><span>     LOGFILE = 'lteenb.log'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf, 'amarisoftenb')</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf, 'amarisoftenb')</span><br><span>         self.ue = None</span><br><span>         self.run_dir = None</span><br><span>         self.inst = None</span><br><span>@@ -68,7 +68,7 @@</span><br><span>         self.remote_config_drb_file = None</span><br><span>         self.remote_log_file = None</span><br><span>         self.enable_measurements = False</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</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>             raise log.Error('Invalid rf_dev_type=%s' % conf.get('rf_dev_type', None))</span><br><span>@@ -77,7 +77,7 @@</span><br><span>         if self._bin_prefix is None:</span><br><span>             self._bin_prefix = os.getenv('AMARISOFT_PATH_ENB', None)</span><br><span>             if self._bin_prefix == None:</span><br><span style="color: hsl(0, 100%, 40%);">-                self._bin_prefix  = self.suite_run.trial.get_inst('amarisoftenb')</span><br><span style="color: hsl(120, 100%, 40%);">+                self._bin_prefix  = self.testenv.suite().trial().get_inst('amarisoftenb')</span><br><span>         return self._bin_prefix</span><br><span> </span><br><span>     def cleanup(self):</span><br><span>@@ -98,7 +98,7 @@</span><br><span>     def start(self, epc):</span><br><span>         self.log('Starting AmarisoftENB')</span><br><span>         self._epc = epc</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span>         self._start()</span><br><span> </span><br><span>@@ -119,7 +119,7 @@</span><br><span>             args = (remote_binary, self.remote_config_file)</span><br><span>             self.process = self.rem_host.RemoteProcess(AmarisoftENB.BINFILE, args, remote_env=remote_env)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def gen_conf_file(self, path, filename, values):</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 0816ca6..70f2f35 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>@@ -46,8 +46,8 @@</span><br><span>     LOGFILE = 'srsenb.log'</span><br><span>     PCAPFILE = 'srsenb.pcap'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, conf, srsENB.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, conf, srsENB.BINFILE)</span><br><span>         self.ue = None</span><br><span>         self.run_dir = None</span><br><span>         self.gen_conf = None</span><br><span>@@ -66,7 +66,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(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         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>@@ -94,7 +94,7 @@</span><br><span>     def start(self, epc):</span><br><span>         self.log('Starting srsENB')</span><br><span>         self._epc = epc</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span>         if self.remote_user:</span><br><span>             self.start_remotely()</span><br><span>@@ -112,7 +112,7 @@</span><br><span>         args += tuple(self._additional_args)</span><br><span> </span><br><span>         self.process = self.rem_host.RemoteProcess(srsENB.BINFILE, args, remote_env=remote_env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def start_locally(self):</span><br><span>@@ -123,7 +123,7 @@</span><br><span>         args += tuple(self._additional_args)</span><br><span> </span><br><span>         self.process = process.Process(self.name(), self.run_dir, args, env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def gen_conf_file(self, path, filename, values):</span><br><span>@@ -135,7 +135,7 @@</span><br><span>             f.write(r)</span><br><span> </span><br><span>     def configure(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('srslte')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('srslte')))</span><br><span>         if not os.path.isdir(self.inst.child('lib')):</span><br><span>             raise log.Error('No lib/ in', self.inst)</span><br><span>         if not self.inst.isfile('bin', srsENB.BINFILE):</span><br><span>diff --git a/src/osmo_gsm_tester/obj/epc.py b/src/osmo_gsm_tester/obj/epc.py</span><br><span>index cbca0fb..177e662 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/epc.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/epc.py</span><br><span>@@ -33,20 +33,20 @@</span><br><span> ##############</span><br><span> # PROTECTED</span><br><span> ##############</span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, run_node, name):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, run_node, name):</span><br><span>         super().__init__(log.C_RUN, '%s' % name)</span><br><span>         self._addr = run_node.run_addr()</span><br><span>         self.set_name('%s_%s' % (name, self._addr))</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self._run_node = run_node</span><br><span> </span><br><span>     def configure(self, config_specifics_li):</span><br><span>         values = dict(epc=config.get_defaults('epc'))</span><br><span>         for config_specifics in config_specifics_li:</span><br><span>             config.overlay(values, dict(epc=config.get_defaults(config_specifics)))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(epc=self.suite_run.config().get('epc', {})))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(epc=self.testenv.suite().config().get('epc', {})))</span><br><span>         for config_specifics in config_specifics_li:</span><br><span style="color: hsl(0, 100%, 40%);">-            config.overlay(values, dict(epc=self.suite_run.config().get(config_specifics, {})))</span><br><span style="color: hsl(120, 100%, 40%);">+            config.overlay(values, dict(epc=self.testenv.suite().config().get(config_specifics, {})))</span><br><span>         config.overlay(values, dict(epc={'run_addr': self.addr()}))</span><br><span>         return values</span><br><span> </span><br><span>@@ -57,10 +57,10 @@</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(0, 100%, 40%);">-    def get_instance_by_type(suite_run, run_node):</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_instance_by_type(testenv, run_node):</span><br><span>         """Allocate a EPC child class based on type. Opts are passed to the newly created object."""</span><br><span>         values = dict(epc=config.get_defaults('epc'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(epc=suite_run.config().get('epc', {})))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(epc=testenv.suite().config().get('epc', {})))</span><br><span>         epc_type = values['epc'].get('type', None)</span><br><span>         if epc_type is None:</span><br><span>             raise RuntimeError('EPC type is not defined!')</span><br><span>@@ -74,7 +74,7 @@</span><br><span>         else:</span><br><span>             raise log.Error('EPC type not supported:', epc_type)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        return  epc_class(suite_run, run_node)</span><br><span style="color: hsl(120, 100%, 40%);">+        return  epc_class(testenv, run_node)</span><br><span> </span><br><span> ###################</span><br><span> # PUBLIC (test API included)</span><br><span>diff --git a/src/osmo_gsm_tester/obj/epc_amarisoft.py b/src/osmo_gsm_tester/obj/epc_amarisoft.py</span><br><span>index 8606e57..b5304bf 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/epc_amarisoft.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/epc_amarisoft.py</span><br><span>@@ -38,8 +38,8 @@</span><br><span>     LOGFILE = 'ltemme.log'</span><br><span>     IFUPFILE = 'mme-ifup'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, run_node):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, run_node, 'amarisoftepc')</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, run_node):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, run_node, 'amarisoftepc')</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>         self.log_file = None</span><br><span>@@ -58,7 +58,7 @@</span><br><span>         if self._bin_prefix is None:</span><br><span>             self._bin_prefix = os.getenv('AMARISOFT_PATH_EPC', None)</span><br><span>             if self._bin_prefix == None:</span><br><span style="color: hsl(0, 100%, 40%);">-                self._bin_prefix  = self.suite_run.trial.get_inst('amarisoftepc')</span><br><span style="color: hsl(120, 100%, 40%);">+                self._bin_prefix  = self.testenv.suite().trial().get_inst('amarisoftepc')</span><br><span>         return self._bin_prefix</span><br><span> </span><br><span>     def cleanup(self):</span><br><span>@@ -74,7 +74,7 @@</span><br><span> </span><br><span>     def start(self):</span><br><span>         self.log('Starting amarisoftepc')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span>         if self._run_node.is_local():</span><br><span>             self.start_locally()</span><br><span>@@ -94,7 +94,7 @@</span><br><span> </span><br><span>         self.process = self.rem_host.RemoteProcess(AmarisoftEPC.BINFILE, args)</span><br><span>         #self.process = self.rem_host.RemoteProcessFixIgnoreSIGHUP(AmarisoftEPC.BINFILE, remote_run_dir, args)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def start_locally(self):</span><br><span>@@ -112,7 +112,7 @@</span><br><span>         args = (binary, os.path.abspath(self.config_file))</span><br><span> </span><br><span>         self.process = process.Process(self.name(), self.run_dir, args, env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def configure(self):</span><br><span>@@ -168,7 +168,7 @@</span><br><span> </span><br><span>     def subscriber_add(self, modem, msisdn=None, algo_str=None):</span><br><span>         if msisdn is None:</span><br><span style="color: hsl(0, 100%, 40%);">-            msisdn = self.suite_run.resources_pool.next_msisdn(modem)</span><br><span style="color: hsl(120, 100%, 40%);">+            msisdn = self.testenv.msisdn()</span><br><span>         modem.set_msisdn(msisdn)</span><br><span> </span><br><span>         if algo_str is None:</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 f859df0..c5e762f 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>@@ -39,8 +39,8 @@</span><br><span>     PCAPFILE = 'srsepc.pcap'</span><br><span>     LOGFILE = 'srsepc.log'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, run_node):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, run_node, 'srsepc')</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, run_node):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, run_node, 'srsepc')</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>         self.db_file = None</span><br><span>@@ -74,7 +74,7 @@</span><br><span> </span><br><span>     def start(self):</span><br><span>         self.log('Starting srsepc')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span>         if self._run_node.is_local():</span><br><span>             self.start_locally()</span><br><span>@@ -95,7 +95,7 @@</span><br><span>         args = (remote_binary, self.remote_config_file)</span><br><span> </span><br><span>         self.process = self.rem_host.RemoteProcess(srsEPC.BINFILE, args)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def start_locally(self):</span><br><span>@@ -114,11 +114,11 @@</span><br><span>         args = (binary, os.path.abspath(self.config_file))</span><br><span> </span><br><span>         self.process = process.Process(self.name(), self.run_dir, args, env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def configure(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('srslte')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('srslte')))</span><br><span>         if not os.path.isdir(self.inst.child('lib')):</span><br><span>             raise log.Error('No lib/ in', self.inst)</span><br><span>         if not self.inst.isfile('bin', srsEPC.BINFILE):</span><br><span>@@ -180,7 +180,7 @@</span><br><span> </span><br><span>     def subscriber_add(self, modem, msisdn=None, algo_str=None):</span><br><span>         if msisdn is None:</span><br><span style="color: hsl(0, 100%, 40%);">-            msisdn = self.suite_run.resources_pool.next_msisdn(modem)</span><br><span style="color: hsl(120, 100%, 40%);">+            msisdn = self.testenv.msisdn()</span><br><span>         modem.set_msisdn(msisdn)</span><br><span> </span><br><span>         if algo_str is None:</span><br><span>diff --git a/src/osmo_gsm_tester/obj/ggsn_osmo.py b/src/osmo_gsm_tester/obj/ggsn_osmo.py</span><br><span>index 11745f6..1435fdb 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/ggsn_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/ggsn_osmo.py</span><br><span>@@ -25,20 +25,20 @@</span><br><span> </span><br><span> class OsmoGgsn(log.Origin):</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, ip_address):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, ip_address):</span><br><span>         super().__init__(log.C_RUN, 'osmo-ggsn_%s' % ip_address.get('addr'))</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>         self.process = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.ip_address = ip_address</span><br><span> </span><br><span>     def start(self):</span><br><span>         self.log('Starting osmo-ggsn')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-ggsn')))</span><br><span style="color: hsl(120, 100%, 40%);">+        inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-ggsn')))</span><br><span> </span><br><span>         binary = inst.child('bin', 'osmo-ggsn')</span><br><span>         if not os.path.isfile(binary):</span><br><span>@@ -47,7 +47,7 @@</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise log.Error('No lib/ in', inst)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,</span><br><span style="color: hsl(120, 100%, 40%);">+        pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None,</span><br><span>                                    'host %s' % self.addr())</span><br><span> </span><br><span>         env = {}</span><br><span>@@ -64,7 +64,7 @@</span><br><span>                                        (binary,</span><br><span>                                         '-c', os.path.abspath(self.config_file)),</span><br><span>                                        env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def configure(self):</span><br><span>@@ -72,7 +72,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = dict(ggsn=config.get_defaults('ggsn'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, dict(ggsn=dict(ip_address=self.ip_address)))</span><br><span>         config.overlay(values, dict(ggsn=dict(statedir=self.run_dir.new_dir('statedir'))))</span><br><span> </span><br><span>diff --git a/src/osmo_gsm_tester/obj/hlr_osmo.py b/src/osmo_gsm_tester/obj/hlr_osmo.py</span><br><span>index 93e5fff..79175f6 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/hlr_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/hlr_osmo.py</span><br><span>@@ -30,21 +30,21 @@</span><br><span>     process = None</span><br><span>     next_subscriber_id = 1</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, ip_address):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, ip_address):</span><br><span>         super().__init__(log.C_RUN, 'osmo-hlr_%s' % ip_address.get('addr'))</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>         self.process = None</span><br><span>         self.next_subscriber_id = 1</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.ip_address = ip_address</span><br><span> </span><br><span>     def start(self):</span><br><span>         self.log('Starting osmo-hlr')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-hlr')))</span><br><span style="color: hsl(120, 100%, 40%);">+        inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-hlr')))</span><br><span> </span><br><span>         binary = inst.child('bin', 'osmo-hlr')</span><br><span>         if not os.path.isfile(binary):</span><br><span>@@ -60,7 +60,7 @@</span><br><span>             raise log.Error('hlr.sql missing:', sql_input)</span><br><span>         self.run_local('create_hlr_db', ('/bin/sh', '-c', 'sqlite3 %r < %r' % (self.db_file, sql_input)))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,</span><br><span style="color: hsl(120, 100%, 40%);">+        pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None,</span><br><span>                                    'host %s' % self.addr())</span><br><span> </span><br><span>         env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span>@@ -71,7 +71,7 @@</span><br><span>                                         '-c', os.path.abspath(self.config_file),</span><br><span>                                         '--database', self.db_file),</span><br><span>                                        env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def configure(self):</span><br><span>@@ -79,7 +79,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = dict(hlr=config.get_defaults('hlr'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, dict(hlr=dict(ip_address=self.ip_address)))</span><br><span> </span><br><span>         self.dbg('HLR CONFIG:\n' + pprint.pformat(values))</span><br><span>@@ -106,7 +106,7 @@</span><br><span> </span><br><span>     def subscriber_add(self, modem, msisdn=None, algo_str=None):</span><br><span>         if msisdn is None:</span><br><span style="color: hsl(0, 100%, 40%);">-            msisdn = self.suite_run.resources_pool.next_msisdn(modem)</span><br><span style="color: hsl(120, 100%, 40%);">+            msisdn = self.testenv.msisdn()</span><br><span>         modem.set_msisdn(msisdn)</span><br><span>         subscriber_id = self.next_subscriber_id</span><br><span>         self.next_subscriber_id += 1</span><br><span>diff --git a/src/osmo_gsm_tester/obj/iperf3.py b/src/osmo_gsm_tester/obj/iperf3.py</span><br><span>index b9fdfe8..ff09f17 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/iperf3.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/iperf3.py</span><br><span>@@ -52,12 +52,12 @@</span><br><span>     LOGFILE = 'iperf3_srv.json'</span><br><span>     REMOTE_DIR = '/tmp'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, ip_address):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, ip_address):</span><br><span>         super().__init__(log.C_RUN, 'iperf3-srv_%s' % ip_address.get('addr'))</span><br><span>         self.run_dir = None</span><br><span>         self.process = None</span><br><span>         self._run_node = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.ip_address = ip_address</span><br><span>         self._port = IPerf3Server.DEFAULT_SRV_PORT</span><br><span>         self.log_file = None</span><br><span>@@ -84,7 +84,7 @@</span><br><span>     def start(self):</span><br><span>         self.log('Starting iperf3-srv')</span><br><span>         self.log_copied = False</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.log_file = self.run_dir.new_file(IPerf3Server.LOGFILE)</span><br><span>         if self.runs_locally():</span><br><span>             self.start_locally()</span><br><span>@@ -105,11 +105,11 @@</span><br><span>             args += ('--logfile', self.remote_log_file,)</span><br><span> </span><br><span>         self.process = self.rem_host.RemoteProcess(self.name(), args)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def start_locally(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,</span><br><span style="color: hsl(120, 100%, 40%);">+        pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None,</span><br><span>                                    'host %s and port not 22' % self.addr())</span><br><span> </span><br><span>         args = ('iperf3', '-s', '-B', self.addr(),</span><br><span>@@ -118,7 +118,7 @@</span><br><span>             args += ('--logfile', os.path.abspath(self.log_file),)</span><br><span> </span><br><span>         self.process = process.Process(self.name(), self.run_dir, args, env={})</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def set_run_node(self, run_node):</span><br><span>@@ -128,7 +128,7 @@</span><br><span>         self._port = port</span><br><span> </span><br><span>     def stop(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.stop_process(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.stop_process(self.process)</span><br><span> </span><br><span>     def get_results(self):</span><br><span>         if self.logfile_supported:</span><br><span>@@ -153,20 +153,20 @@</span><br><span>         return not self.process.terminated()</span><br><span> </span><br><span>     def create_client(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return IPerf3Client(self.suite_run, self)</span><br><span style="color: hsl(120, 100%, 40%);">+        return IPerf3Client(self.testenv, self)</span><br><span> </span><br><span> class IPerf3Client(log.Origin):</span><br><span> </span><br><span>     REMOTE_DIR = '/tmp'</span><br><span>     LOGFILE = 'iperf3_cli.json'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, iperf3srv):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, iperf3srv):</span><br><span>         super().__init__(log.C_RUN, 'iperf3-cli_%s' % iperf3srv.addr())</span><br><span>         self.run_dir = None</span><br><span>         self.process = None</span><br><span>         self._run_node = None</span><br><span>         self.server = iperf3srv</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.log_file = None</span><br><span>         self.rem_host = None</span><br><span>         self.remote_log_file = None</span><br><span>@@ -180,7 +180,7 @@</span><br><span>     def prepare_test_proc(self, downlink=False, netns=None, time_sec=None):</span><br><span>         if time_sec is None:</span><br><span>             values = config.get_defaults('iperf3cli')</span><br><span style="color: hsl(0, 100%, 40%);">-            config.overlay(values, self.suite_run.config().get('iperf3cli', {}))</span><br><span style="color: hsl(120, 100%, 40%);">+            config.overlay(values, self.testenv.suite().config().get('iperf3cli', {}))</span><br><span>             time_sec_str = values.get('time', time_sec)</span><br><span> </span><br><span>             # Convert duration to seconds</span><br><span>@@ -195,7 +195,7 @@</span><br><span> </span><br><span>         self.log('Preparing iperf3-client connecting to %s:%d (time=%ds)' % (self.server.addr(), self.server.port(), time_sec))</span><br><span>         self.log_copied = False</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.log_file = self.run_dir.new_file(IPerf3Client.LOGFILE)</span><br><span>         if self.runs_locally():</span><br><span>             return self.prepare_test_proc_locally(downlink, netns, time_sec)</span><br><span>@@ -226,7 +226,7 @@</span><br><span>         return self.process</span><br><span> </span><br><span>     def prepare_test_proc_locally(self, downlink, netns, time_sec):</span><br><span style="color: hsl(0, 100%, 40%);">-        pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,</span><br><span style="color: hsl(120, 100%, 40%);">+        pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None,</span><br><span>                                    'host %s and port not 22' % self.server.addr(), netns)</span><br><span> </span><br><span>         popen_args = ('iperf3', '-c',  self.server.addr(),</span><br><span>diff --git a/src/osmo_gsm_tester/obj/mgcpgw_osmo.py b/src/osmo_gsm_tester/obj/mgcpgw_osmo.py</span><br><span>index d31f439..3afa3f1 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/mgcpgw_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/mgcpgw_osmo.py</span><br><span>@@ -25,21 +25,21 @@</span><br><span> </span><br><span> class OsmoMgcpgw(log.Origin):</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, ip_address, bts_ip):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, ip_address, bts_ip):</span><br><span>         super().__init__(log.C_RUN, 'osmo-mgcpgw_%s' % ip_address.get('addr'))</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>         self.process = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.ip_address = ip_address</span><br><span>         # hack: so far mgcpgw needs one specific BTS IP.</span><br><span>         self.bts_ip = bts_ip</span><br><span> </span><br><span>     def start(self):</span><br><span>         self.log('Starting osmo-mgcpgw')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span style="color: hsl(0, 100%, 40%);">-        inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-nitb')))</span><br><span style="color: hsl(120, 100%, 40%);">+        inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-nitb')))</span><br><span>         binary = inst.child('bin', 'osmo-bsc_mgcp')</span><br><span>         if not os.path.isfile(binary):</span><br><span>             raise RuntimeError('Binary missing: %r' % binary)</span><br><span>@@ -47,7 +47,7 @@</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise RuntimeError('No lib/ in %r' % inst)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,</span><br><span style="color: hsl(120, 100%, 40%);">+        pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None,</span><br><span>                                    'host %s and port not 22' % self.addr())</span><br><span> </span><br><span>         env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span>@@ -57,7 +57,7 @@</span><br><span>                                        (binary, '-c',</span><br><span>                                         os.path.abspath(self.config_file)),</span><br><span>                                        env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def configure(self):</span><br><span>@@ -65,7 +65,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = dict(mgcpgw=config.get_defaults('mgcpgw'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, dict(mgcpgw=dict(ip_address=self.ip_address, bts_ip=self.bts_ip)))</span><br><span> </span><br><span>         self.dbg('MGCPGW CONFIG:\n' + pprint.pformat(values))</span><br><span>diff --git a/src/osmo_gsm_tester/obj/mgw_osmo.py b/src/osmo_gsm_tester/obj/mgw_osmo.py</span><br><span>index 3798b2d..70572a1 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/mgw_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/mgw_osmo.py</span><br><span>@@ -25,20 +25,20 @@</span><br><span> </span><br><span> class OsmoMgw(log.Origin):</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, ip_address):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, ip_address):</span><br><span>         super().__init__(log.C_RUN, 'osmo-mgw_%s' % ip_address.get('addr'))</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>         self.process = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.ip_address = ip_address</span><br><span>         self.use_osmux = "off"</span><br><span> </span><br><span>     def start(self):</span><br><span>         self.log('Starting osmo-mgw')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span style="color: hsl(0, 100%, 40%);">-        inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-mgw')))</span><br><span style="color: hsl(120, 100%, 40%);">+        inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-mgw')))</span><br><span>         binary = inst.child('bin', 'osmo-mgw')</span><br><span>         if not os.path.isfile(binary):</span><br><span>             raise RuntimeError('Binary missing: %r' % binary)</span><br><span>@@ -46,7 +46,7 @@</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise RuntimeError('No lib/ in %r' % inst)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,</span><br><span style="color: hsl(120, 100%, 40%);">+        pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None,</span><br><span>                                    'host %s and port not 22' % self.addr())</span><br><span> </span><br><span>         env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span>@@ -56,7 +56,7 @@</span><br><span>                                        (binary, '-c',</span><br><span>                                         os.path.abspath(self.config_file)),</span><br><span>                                        env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def configure(self):</span><br><span>@@ -64,7 +64,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = dict(mgw=config.get_defaults('mgw'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, { 'mgw': {</span><br><span>                                         'ip_address': self.ip_address,</span><br><span>                                         'use_osmux': self.use_osmux</span><br><span>diff --git a/src/osmo_gsm_tester/obj/ms.py b/src/osmo_gsm_tester/obj/ms.py</span><br><span>index a30a9c7..2774deb 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/ms.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/ms.py</span><br><span>@@ -54,7 +54,7 @@</span><br><span>         """Cleans up resources allocated."""</span><br><span>         pass</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def get_instance_by_type(suite_run, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_instance_by_type(testenv, conf):</span><br><span>         """Allocate a MS child class based on type. Opts are passed to the newly created object."""</span><br><span>         ms_type = conf.get('type')</span><br><span>         if ms_type is None:</span><br><span>@@ -75,7 +75,7 @@</span><br><span>             ms_class = AmarisoftUE</span><br><span>         else:</span><br><span>             raise log.Error('MS type not supported:', ms_type)</span><br><span style="color: hsl(0, 100%, 40%);">-        return ms_class(suite_run, conf)</span><br><span style="color: hsl(120, 100%, 40%);">+        return ms_class(testenv, conf)</span><br><span> </span><br><span> ###################</span><br><span> # PUBLIC (test API included)</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 46a92dc..451bbd0 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>@@ -78,7 +78,7 @@</span><br><span>     LOGFILE = 'lteue.log'</span><br><span>     IFUPFILE = 'ue-ifup'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span>         self._addr = conf.get('addr', None)</span><br><span>         if self._addr is None:</span><br><span>             raise log.Error('addr not set')</span><br><span>@@ -98,7 +98,7 @@</span><br><span>         self.remote_config_rf_file =  None</span><br><span>         self.remote_log_file = None</span><br><span>         self.remote_ifup_file = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</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>             raise log.Error('Invalid rf_dev_type=%s' % conf.get('rf_dev_type', None))</span><br><span>@@ -107,7 +107,7 @@</span><br><span>         if self._bin_prefix is None:</span><br><span>             self._bin_prefix = os.getenv('AMARISOFT_PATH_UE', None)</span><br><span>             if self._bin_prefix == None:</span><br><span style="color: hsl(0, 100%, 40%);">-                self._bin_prefix  = self.suite_run.trial.get_inst('amarisoftue')</span><br><span style="color: hsl(120, 100%, 40%);">+                self._bin_prefix  = self.testenv.suite().trial().get_inst('amarisoftue')</span><br><span>         return self._bin_prefix</span><br><span> </span><br><span>     def cleanup(self):</span><br><span>@@ -128,12 +128,12 @@</span><br><span>         return "amarisoftue1"</span><br><span> </span><br><span>     def stop(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.stop_process(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.stop_process(self.process)</span><br><span> </span><br><span>     def connect(self, enb):</span><br><span>         self.log('Starting amarisoftue')</span><br><span>         self.enb = enb</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span>         if self.setup_runs_locally():</span><br><span>             self.start_locally()</span><br><span>@@ -161,7 +161,7 @@</span><br><span> </span><br><span>         args = (remote_binary, self.remote_config_file)</span><br><span>         self.process = self.rem_host.RemoteProcess(AmarisoftUE.BINFILE, args)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def start_locally(self):</span><br><span>@@ -182,7 +182,7 @@</span><br><span>         args = (binary, os.path.abspath(self.config_file))</span><br><span>         self.dbg(run_dir=self.run_dir, binary=binary, env=env)</span><br><span>         self.process = process.Process(self.name(), self.run_dir, args, env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def gen_conf_file(self, path, filename, values):</span><br><span>@@ -232,8 +232,8 @@</span><br><span> </span><br><span>         values = dict(ue=config.get_defaults('amarisoft'))</span><br><span>         config.overlay(values, dict(ue=config.get_defaults('amarisoftue')))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(ue=self.suite_run.config().get('amarisoft', {})))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(ue=self.suite_run.config().get('modem', {})))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(ue=self.testenv.suite().config().get('amarisoft', {})))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(ue=self.testenv.suite().config().get('modem', {})))</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>diff --git a/src/osmo_gsm_tester/obj/ms_driver.py b/src/osmo_gsm_tester/obj/ms_driver.py</span><br><span>index 2c7bb8b..c7c1c24 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/ms_driver.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/ms_driver.py</span><br><span>@@ -30,9 +30,9 @@</span><br><span> </span><br><span> class MsDriver(log.Origin):</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv):</span><br><span>         super().__init__(log.C_RUN, 'ms-driver')</span><br><span style="color: hsl(0, 100%, 40%);">-        self._suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self._testenv = testenv</span><br><span> </span><br><span>         # TODO: take config out of the test scenario</span><br><span>         self._time_start = timedelta(seconds=60)</span><br><span>@@ -67,7 +67,7 @@</span><br><span>         """</span><br><span> </span><br><span>         # Get the base directory for the virtphy/mobile application</span><br><span style="color: hsl(0, 100%, 40%);">-        inst = util.Dir(os.path.abspath(self._suite_run.trial.get_inst('osmocom-bb')))</span><br><span style="color: hsl(120, 100%, 40%);">+        inst = util.Dir(os.path.abspath(self._testenv.trial.get_inst('osmocom-bb')))</span><br><span> </span><br><span>         # Assume these are dynamically linked and verify there is a lib dir.</span><br><span>         lib = inst.child('lib')</span><br><span>@@ -117,7 +117,7 @@</span><br><span>         self._starter = MobileTestStarter("mass", options, self._cdf,</span><br><span>                                           self._ev_server,</span><br><span>                                           util.Dir(self.event_server_sk_tmp_dir),</span><br><span style="color: hsl(0, 100%, 40%);">-                                          self._results, suite_run=self._suite_run)</span><br><span style="color: hsl(120, 100%, 40%);">+                                          self._results, testenv=self._testenv)</span><br><span> </span><br><span>         for sub in self._subscribers:</span><br><span>             self._starter.subscriber_add(sub)</span><br><span>diff --git a/src/osmo_gsm_tester/obj/ms_ofono.py b/src/osmo_gsm_tester/obj/ms_ofono.py</span><br><span>index a79f8fb..e03bab8 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/ms_ofono.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/ms_ofono.py</span><br><span>@@ -361,7 +361,7 @@</span><br><span>     CTX_PROT_IPv6 = 'ipv6'</span><br><span>     CTX_PROT_IPv46 = 'dual'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span>         self.syspath = conf.get('path')</span><br><span>         self.dbuspath = get_dbuspath_from_syspath(self.syspath)</span><br><span>         super().__init__(self.dbuspath, conf)</span><br><span>@@ -369,7 +369,7 @@</span><br><span>         self._ki = None</span><br><span>         self._imsi = None</span><br><span>         self._apn_ipaddr = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(suite_run.get_test_run_dir().new_dir(self.name().strip('/')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(testenv.suite().get_run_dir().new_dir(self.name().strip('/')))</span><br><span>         self.sms_received_list = []</span><br><span>         self.dbus = ModemDbusInteraction(self.dbuspath)</span><br><span>         self.register_attempts = 0</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 7d08b66..e5427f0 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>@@ -77,7 +77,7 @@</span><br><span>     LOGFILE = 'srsue.log'</span><br><span>     METRICSFILE = 'srsue_metrics.csv'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span>         self._addr = conf.get('addr', None)</span><br><span>         if self._addr is None:</span><br><span>             raise log.Error('addr not set')</span><br><span>@@ -97,7 +97,7 @@</span><br><span>         self.remote_metrics_file = None</span><br><span>         self.enable_pcap = False</span><br><span>         self.num_carriers = 1</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         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>@@ -132,12 +132,12 @@</span><br><span>         return "srsue1"</span><br><span> </span><br><span>     def stop(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.stop_process(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.stop_process(self.process)</span><br><span> </span><br><span>     def connect(self, enb):</span><br><span>         self.log('Starting srsue')</span><br><span>         self.enb = enb</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span>         if self.setup_runs_locally():</span><br><span>             self.start_locally()</span><br><span>@@ -170,7 +170,7 @@</span><br><span> </span><br><span>         self.process = self.rem_host.RemoteProcess(srsUE.BINFILE, args)</span><br><span>         #self.process = self.rem_host.RemoteProcessFixIgnoreSIGHUP(srsUE.BINFILE, remote_run_dir, args, remote_lib)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def start_locally(self):</span><br><span>@@ -194,11 +194,11 @@</span><br><span>         args += tuple(self._additional_args)</span><br><span> </span><br><span>         self.process = process.Process(self.name(), self.run_dir, args, env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def configure(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('srslte')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('srslte')))</span><br><span>         if not os.path.isdir(self.inst.child('lib')):</span><br><span>             raise log.Error('No lib/ in', self.inst)</span><br><span>         if not self.inst.isfile('bin', srsUE.BINFILE):</span><br><span>@@ -220,7 +220,7 @@</span><br><span>                 self.remote_metrics_file = remote_run_dir.child(srsUE.METRICSFILE)</span><br><span> </span><br><span>         values = dict(ue=config.get_defaults('srsue'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, dict(ue=self.suite_run.config().get('modem', {})))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(ue=self.testenv.suite().config().get('modem', {})))</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>diff --git a/src/osmo_gsm_tester/obj/msc_osmo.py b/src/osmo_gsm_tester/obj/msc_osmo.py</span><br><span>index 048934e..162614c 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/msc_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/msc_osmo.py</span><br><span>@@ -32,7 +32,7 @@</span><br><span> </span><br><span> class OsmoMsc(log.Origin):</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, hlr, mgw, stp, ip_address):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, hlr, mgw, stp, ip_address):</span><br><span>         super().__init__(log.C_RUN, 'osmo-msc_%s' % ip_address.get('addr'))</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>@@ -41,7 +41,7 @@</span><br><span>         self.encryption = None</span><br><span>         self.authentication = None</span><br><span>         self.use_osmux = "off"</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.ip_address = ip_address</span><br><span>         self.hlr = hlr</span><br><span>         self.mgw = mgw</span><br><span>@@ -50,9 +50,9 @@</span><br><span> </span><br><span>     def start(self):</span><br><span>         self.log('Starting osmo-msc')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span style="color: hsl(0, 100%, 40%);">-        inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-msc')))</span><br><span style="color: hsl(120, 100%, 40%);">+        inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-msc')))</span><br><span>         binary = inst.child('bin', 'osmo-msc')</span><br><span>         if not os.path.isfile(binary):</span><br><span>             raise RuntimeError('Binary missing: %r' % binary)</span><br><span>@@ -60,7 +60,7 @@</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise RuntimeError('No lib/ in %r' % inst)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,</span><br><span style="color: hsl(120, 100%, 40%);">+        pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None,</span><br><span>                                    'host %s and port not 22' % self.addr())</span><br><span> </span><br><span>         env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span>@@ -70,7 +70,7 @@</span><br><span>                                        (binary, '-c',</span><br><span>                                         os.path.abspath(self.config_file)),</span><br><span>                                        env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def configure(self):</span><br><span>@@ -78,7 +78,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = dict(msc=config.get_defaults('msc'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, dict(msc=dict(ip_address=self.ip_address)))</span><br><span>         config.overlay(values, self.mgw.conf_for_client())</span><br><span>         config.overlay(values, self.hlr.conf_for_client())</span><br><span>diff --git a/src/osmo_gsm_tester/obj/nitb_osmo.py b/src/osmo_gsm_tester/obj/nitb_osmo.py</span><br><span>index 64db425..88ff721 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/nitb_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/nitb_osmo.py</span><br><span>@@ -26,22 +26,22 @@</span><br><span> </span><br><span> class OsmoNitb(log.Origin):</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, ip_address):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, ip_address):</span><br><span>         super().__init__(log.C_RUN, 'osmo-nitb_%s' % ip_address.get('addr'))</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>         self.process = None</span><br><span>         self.encryption = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.ip_address = ip_address</span><br><span>         self.bts = []</span><br><span>         self.smsc = smsc.Smsc((ip_address.get('addr'), 2775))</span><br><span> </span><br><span>     def start(self):</span><br><span>         self.log('Starting osmo-nitb')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span style="color: hsl(0, 100%, 40%);">-        inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-nitb')))</span><br><span style="color: hsl(120, 100%, 40%);">+        inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-nitb')))</span><br><span>         binary = inst.child('bin', 'osmo-nitb')</span><br><span>         if not os.path.isfile(binary):</span><br><span>             raise RuntimeError('Binary missing: %r' % binary)</span><br><span>@@ -49,7 +49,7 @@</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise RuntimeError('No lib/ in %r' % inst)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,</span><br><span style="color: hsl(120, 100%, 40%);">+        pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None,</span><br><span>                                    'host %s and port not 22' % self.addr())</span><br><span> </span><br><span>         env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span>@@ -59,7 +59,7 @@</span><br><span>                                        (binary, '-c',</span><br><span>                                        os.path.abspath(self.config_file)),</span><br><span>                                        env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def configure(self):</span><br><span>@@ -67,7 +67,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = dict(nitb=config.get_defaults('nitb'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, dict(nitb=dict(ip_address=self.ip_address)))</span><br><span> </span><br><span>         bts_list = []</span><br><span>@@ -120,7 +120,7 @@</span><br><span> </span><br><span>     def subscriber_add(self, modem, msisdn=None, algo=None):</span><br><span>         if msisdn is None:</span><br><span style="color: hsl(0, 100%, 40%);">-            msisdn = self.suite_run.resources_pool.next_msisdn(modem)</span><br><span style="color: hsl(120, 100%, 40%);">+            msisdn = self.testenv.msisdn()</span><br><span>         modem.set_msisdn(msisdn)</span><br><span> </span><br><span>         if not algo:</span><br><span>diff --git a/src/osmo_gsm_tester/obj/osmocon.py b/src/osmo_gsm_tester/obj/osmocon.py</span><br><span>index 6f6ac2a..5d1e5ae 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/osmocon.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/osmocon.py</span><br><span>@@ -35,7 +35,7 @@</span><br><span> </span><br><span>     FIRMWARE_FILE="opt/osmocom-bb/target/firmware/board/compal_e88/layer1.compalram.bin"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, conf):</span><br><span>         serial_device = conf.get('serial_device')</span><br><span>         if serial_device is None:</span><br><span>             raise log.Error('osmocon_phone contains no attr "serial_device"')</span><br><span>@@ -43,7 +43,7 @@</span><br><span>         super().__init__(log.C_RUN, 'osmocon_%s' % os.path.basename(self.serial_device))</span><br><span>         self.run_dir = None</span><br><span>         self.process = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.conf = conf</span><br><span>         self.sk_tmp_dir = tempfile.mkdtemp('', 'ogtosmoconsk')</span><br><span>         if len(self.l2_socket_path().encode()) > 107:</span><br><span>@@ -62,9 +62,9 @@</span><br><span>         # TODO: make sure the pone is powered off before starting osmocon</span><br><span> </span><br><span>         self.log('Starting osmocon')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmocom-bb')))</span><br><span style="color: hsl(120, 100%, 40%);">+        inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmocom-bb')))</span><br><span> </span><br><span>         binary = inst.child('sbin', 'osmocon')</span><br><span>         if not os.path.isfile(binary):</span><br><span>@@ -86,7 +86,7 @@</span><br><span>                                        '-l', self.loader_socket_path(),</span><br><span>                                         firmware_path),</span><br><span>                                        env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span>         self.log('Waiting for osmocon to be up and running')</span><br><span>         MainLoop.wait(self, os.path.exists, self.l2_socket_path())</span><br><span>diff --git a/src/osmo_gsm_tester/obj/pcap_recorder.py b/src/osmo_gsm_tester/obj/pcap_recorder.py</span><br><span>index eb91420..30a3510 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/pcap_recorder.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/pcap_recorder.py</span><br><span>@@ -23,13 +23,13 @@</span><br><span> </span><br><span> class PcapRecorder(log.Origin):</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, run_dir, iface=None, filters='', netns=None):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, run_dir, iface=None, filters='', netns=None):</span><br><span>         self.iface = iface</span><br><span>         if not self.iface:</span><br><span>             self.iface = "any"</span><br><span>         self.filters = filters</span><br><span>         super().__init__(log.C_RUN, 'pcap-recorder_%s' % self.iface, filters=self.filters)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.run_dir = run_dir</span><br><span>         self.netns = netns</span><br><span>         self.start()</span><br><span>@@ -45,7 +45,7 @@</span><br><span>             self.process = process.NetNSProcess(self.name(), self.run_dir, self.netns, popen_args)</span><br><span>         else:</span><br><span>             self.process = process.Process(self.name(), self.run_dir, popen_args)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def running(self):</span><br><span>diff --git a/src/osmo_gsm_tester/obj/pcu.py b/src/osmo_gsm_tester/obj/pcu.py</span><br><span>index 6028f06..ed94d49 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/pcu.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/pcu.py</span><br><span>@@ -27,10 +27,10 @@</span><br><span> # PROTECTED</span><br><span> ##############</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, bts, conf, name):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, bts, conf, name):</span><br><span>         """Base constructor. Must be called by subclass."""</span><br><span>         super().__init__(log.C_RUN, name)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.bts = bts</span><br><span>         self.conf = conf</span><br><span> </span><br><span>@@ -55,8 +55,8 @@</span><br><span> class PcuDummy(Pcu):</span><br><span>     """PCU for BTS without proper PCU control"""</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, bts, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, bts, conf, 'PcuDummy')</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, bts, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, bts, conf, 'PcuDummy')</span><br><span> </span><br><span>     def start(self, keepalive=False):</span><br><span>         pass</span><br><span>diff --git a/src/osmo_gsm_tester/obj/pcu_oc2g.py b/src/osmo_gsm_tester/obj/pcu_oc2g.py</span><br><span>index 4b67441..cb5e6cb 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/pcu_oc2g.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/pcu_oc2g.py</span><br><span>@@ -28,8 +28,8 @@</span><br><span>     PCU_OC2G_BIN = 'osmo-pcu'</span><br><span>     PCU_OC2G_CFG = 'osmo-pcu-oc2g.cfg'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, btsoc2g, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, btsoc2g, conf, self.PCU_OC2G_BIN)</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, btsoc2g, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, btsoc2g, conf, self.PCU_OC2G_BIN)</span><br><span>         self.run_dir = None</span><br><span>         self.bsc = None</span><br><span>         self.inst = None</span><br><span>@@ -39,10 +39,10 @@</span><br><span>         self.remote_user = 'root'</span><br><span> </span><br><span>     def start(self, keepalive=False):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-pcu-oc2g')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-pcu-oc2g')))</span><br><span>         lib = self.inst.child('lib')</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise log.Error('No lib/ in', self.inst)</span><br><span>@@ -87,7 +87,7 @@</span><br><span> </span><br><span>     def launch_remote(self, name, popen_args, remote_cwd=None, keepalive=False):</span><br><span>         proc = self._process_remote(name, popen_args, remote_cwd)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(proc, keepalive)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(proc, keepalive)</span><br><span>         proc.launch()</span><br><span> </span><br><span>     def run_local(self, name, popen_args):</span><br><span>@@ -104,7 +104,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = { 'osmo_pcu_oc2g': config.get_defaults('osmo_pcu_oc2g') }</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, {</span><br><span>                         'osmo_pcu_oc2g': {</span><br><span>                             'bts_addr': self.bts.remote_addr(),</span><br><span>diff --git a/src/osmo_gsm_tester/obj/pcu_osmo.py b/src/osmo_gsm_tester/obj/pcu_osmo.py</span><br><span>index 4c79f5a..86e6bbe 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/pcu_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/pcu_osmo.py</span><br><span>@@ -27,18 +27,18 @@</span><br><span>     BIN_PCU = 'osmo-pcu'</span><br><span>     PCU_OSMO_CFG = 'osmo-pcu.cfg'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, bts, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, bts, conf, OsmoPcu.BIN_PCU)</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, bts, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, bts, conf, OsmoPcu.BIN_PCU)</span><br><span>         self.run_dir = None</span><br><span>         self.inst = None</span><br><span>         self.conf = conf</span><br><span>         self.env = {}</span><br><span> </span><br><span>     def start(self, keepalive=False):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-pcu')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-pcu')))</span><br><span>         lib = self.inst.child('lib')</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise RuntimeError('No lib/ in %r' % self.inst)</span><br><span>@@ -47,7 +47,7 @@</span><br><span>         self.launch_process(keepalive, OsmoPcu.BIN_PCU, '-r', '1',</span><br><span>                             '-c', os.path.abspath(self.config_file),</span><br><span>                             '-i', self.bts.bsc.addr())</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.poll()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.poll()</span><br><span> </span><br><span>     def launch_process(self, keepalive, binary_name, *args):</span><br><span>         binary = os.path.abspath(self.inst.child('bin', binary_name))</span><br><span>@@ -57,7 +57,7 @@</span><br><span>         proc = process.Process(binary_name, run_dir,</span><br><span>                                (binary,) + args,</span><br><span>                                env=self.env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(proc, keepalive)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(proc, keepalive)</span><br><span>         proc.launch()</span><br><span>         return proc</span><br><span> </span><br><span>@@ -66,7 +66,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = dict(osmo_pcu=config.get_defaults('osmo_pcu'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, {</span><br><span>                         'osmo_pcu': {</span><br><span>                             'bts_addr': self.bts.remote_addr(),</span><br><span>diff --git a/src/osmo_gsm_tester/obj/pcu_sysmo.py b/src/osmo_gsm_tester/obj/pcu_sysmo.py</span><br><span>index f7c480d..103ad00 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/pcu_sysmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/pcu_sysmo.py</span><br><span>@@ -28,8 +28,8 @@</span><br><span>     PCU_SYSMO_BIN = 'osmo-pcu'</span><br><span>     PCU_SYSMO_CFG = 'osmo-pcu-sysmo.cfg'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, sysmobts, conf):</span><br><span style="color: hsl(0, 100%, 40%);">-        super().__init__(suite_run, sysmobts, conf, self.PCU_SYSMO_BIN)</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, sysmobts, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, sysmobts, conf, self.PCU_SYSMO_BIN)</span><br><span>         self.run_dir = None</span><br><span>         self.bsc = None</span><br><span>         self.inst = None</span><br><span>@@ -39,10 +39,10 @@</span><br><span>         self.remote_user = 'root'</span><br><span> </span><br><span>     def start(self, keepalive=False):</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        self.inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-pcu-sysmo')))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-pcu-sysmo')))</span><br><span>         lib = self.inst.child('lib')</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise log.Error('No lib/ in', self.inst)</span><br><span>@@ -87,7 +87,7 @@</span><br><span> </span><br><span>     def launch_remote(self, name, popen_args, remote_cwd=None, keepalive=False):</span><br><span>         proc = self._process_remote(name, popen_args, remote_cwd)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(proc, keepalive)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(proc, keepalive)</span><br><span>         proc.launch()</span><br><span> </span><br><span>     def run_local(self, name, popen_args):</span><br><span>@@ -104,7 +104,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = { 'osmo_pcu_sysmo': config.get_defaults('osmo_pcu_sysmo') }</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, {</span><br><span>                         'osmo_pcu_sysmo': {</span><br><span>                             'bts_addr': self.bts.remote_addr(),</span><br><span>diff --git a/src/osmo_gsm_tester/obj/sgsn_osmo.py b/src/osmo_gsm_tester/obj/sgsn_osmo.py</span><br><span>index 6824d80..a7c7adb 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/sgsn_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/sgsn_osmo.py</span><br><span>@@ -25,22 +25,22 @@</span><br><span> </span><br><span> class OsmoSgsn(log.Origin):</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, hlr, ggsn, ip_address):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, hlr, ggsn, ip_address):</span><br><span>         super().__init__(log.C_RUN, 'osmo-sgsn_%s' % ip_address.get('addr'))</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>         self.process = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.hlr = hlr</span><br><span>         self.ggsn = ggsn</span><br><span>         self.ip_address = ip_address</span><br><span> </span><br><span>     def start(self):</span><br><span>         self.log('Starting osmo-sgsn')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-sgsn')))</span><br><span style="color: hsl(120, 100%, 40%);">+        inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-sgsn')))</span><br><span> </span><br><span>         binary = inst.child('bin', 'osmo-sgsn')</span><br><span>         if not os.path.isfile(binary):</span><br><span>@@ -49,7 +49,7 @@</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise log.Error('No lib/ in', inst)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,</span><br><span style="color: hsl(120, 100%, 40%);">+        pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None,</span><br><span>                                    'host %s' % self.addr())</span><br><span> </span><br><span>         env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span>@@ -59,7 +59,7 @@</span><br><span>                                        (binary,</span><br><span>                                         '-c', os.path.abspath(self.config_file)),</span><br><span>                                        env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def configure(self):</span><br><span>@@ -67,7 +67,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = dict(sgsn=config.get_defaults('sgsn'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, dict(sgsn=dict(ip_address=self.ip_address)))</span><br><span>         config.overlay(values, self.hlr.conf_for_client())</span><br><span>         config.overlay(values, self.ggsn.conf_for_client())</span><br><span>diff --git a/src/osmo_gsm_tester/obj/stp_osmo.py b/src/osmo_gsm_tester/obj/stp_osmo.py</span><br><span>index afb8a04..e8bb4e0 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/stp_osmo.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/stp_osmo.py</span><br><span>@@ -25,20 +25,20 @@</span><br><span> </span><br><span> class OsmoStp(log.Origin):</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, suite_run, ip_address):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, ip_address):</span><br><span>         super().__init__(log.C_RUN, 'osmo-stp_%s' % ip_address.get('addr'))</span><br><span>         self.run_dir = None</span><br><span>         self.config_file = None</span><br><span>         self.process = None</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span>         self.ip_address = ip_address</span><br><span> </span><br><span>     def start(self):</span><br><span>         self.log('Starting osmo-stp')</span><br><span style="color: hsl(0, 100%, 40%);">-        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         self.configure()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        inst = util.Dir(os.path.abspath(self.suite_run.trial.get_inst('osmo-stp')))</span><br><span style="color: hsl(120, 100%, 40%);">+        inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('osmo-stp')))</span><br><span> </span><br><span>         binary = inst.child('bin', 'osmo-stp')</span><br><span>         if not os.path.isfile(binary):</span><br><span>@@ -47,7 +47,7 @@</span><br><span>         if not os.path.isdir(lib):</span><br><span>             raise RuntimeError('No lib/ in %r' % inst)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        pcap_recorder.PcapRecorder(self.suite_run, self.run_dir.new_dir('pcap'), None,</span><br><span style="color: hsl(120, 100%, 40%);">+        pcap_recorder.PcapRecorder(self.testenv, self.run_dir.new_dir('pcap'), None,</span><br><span>                                    'host %s and port not 22' % self.addr())</span><br><span> </span><br><span>         env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span>@@ -57,7 +57,7 @@</span><br><span>                                        (binary, '-c',</span><br><span>                                         os.path.abspath(self.config_file)),</span><br><span>                                        env=env)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.suite_run.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span>         self.process.launch()</span><br><span> </span><br><span>     def configure(self):</span><br><span>@@ -65,7 +65,7 @@</span><br><span>         self.dbg(config_file=self.config_file)</span><br><span> </span><br><span>         values = dict(stp=config.get_defaults('stp'))</span><br><span style="color: hsl(0, 100%, 40%);">-        config.overlay(values, self.suite_run.config())</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, self.testenv.suite().config())</span><br><span>         config.overlay(values, dict(stp=dict(ip_address=self.ip_address)))</span><br><span> </span><br><span>         self.dbg('STP CONFIG:\n' + pprint.pformat(values))</span><br><span>diff --git a/src/osmo_gsm_tester/testenv.py b/src/osmo_gsm_tester/testenv.py</span><br><span>index aa94f3c..0e0860d 100644</span><br><span>--- a/src/osmo_gsm_tester/testenv.py</span><br><span>+++ b/src/osmo_gsm_tester/testenv.py</span><br><span>@@ -36,7 +36,6 @@</span><br><span> from .obj import bts</span><br><span> from .obj import ms</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-trial = None</span><br><span> suite = None</span><br><span> test = None</span><br><span> resources = None</span><br><span>@@ -59,24 +58,17 @@</span><br><span>         super().__init__(log_module.C_TST, test.name())</span><br><span>         self.suite_run = suite_run</span><br><span>         self._test = test</span><br><span style="color: hsl(0, 100%, 40%);">-        self.trial = suite_run.trial # backward compat with objects</span><br><span style="color: hsl(0, 100%, 40%);">-        self.resources_pool = suite_run.resource_pool() # backward compat with objects</span><br><span>         self._processes = []</span><br><span>         self.test_import_modules_to_clean_up = []</span><br><span>         self.objects_to_clean_up = None</span><br><span>         MainLoop.register_poll_func(self.poll)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def test(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return self._test</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def suite(self):</span><br><span>         return self.suite_run</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    # backward compat with objects</span><br><span style="color: hsl(0, 100%, 40%);">-    def get_test_run_dir(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self._test.get_run_dir()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    # backward compat with objects</span><br><span style="color: hsl(0, 100%, 40%);">-    def config(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        return self.suite_run.config()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     def remember_to_stop(self, process, respawn=False):</span><br><span>         '''Ask suite to monitor and manage lifecycle of the Process object. If a</span><br><span>         process managed by suite finishes before cleanup time, the current test</span><br><span>@@ -321,9 +313,8 @@</span><br><span>     from .core.event_loop import MainLoop</span><br><span>     from .obj.sms import Sms as Sms_class</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    global trial, suite, test, resources, log, dbg, err, wait, wait_no_raise, sleep, poll, prompt, Sms, process</span><br><span style="color: hsl(120, 100%, 40%);">+    global suite, test, resources, log, dbg, err, wait, wait_no_raise, sleep, poll, prompt, Sms, process</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    trial = suite_run.trial</span><br><span>     test = _test</span><br><span>     resources = suite_run.reserved_resources # TODO: remove this global, only used in selftest</span><br><span>     log = test.log</span><br><span>diff --git a/src/osmo_ms_driver/starter.py b/src/osmo_ms_driver/starter.py</span><br><span>index 702baf0..559e392 100644</span><br><span>--- a/src/osmo_ms_driver/starter.py</span><br><span>+++ b/src/osmo_ms_driver/starter.py</span><br><span>@@ -52,9 +52,9 @@</span><br><span>     def phy_filename(self):</span><br><span>         return self._phy_filename</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def start(self, loop, suite_run=None):</span><br><span style="color: hsl(0, 100%, 40%);">-        if suite_run is not None: # overwrite run_dir to store files if run from inside osmo-gsm-tester:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.run_dir = util.Dir(suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+    def start(self, loop, testenv=None):</span><br><span style="color: hsl(120, 100%, 40%);">+        if testenv is not None: # overwrite run_dir to store files if run from inside osmo-gsm-tester:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.run_dir = util.Dir(testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         if len(self._phy_filename.encode()) > 107:</span><br><span>             raise log.Error('Path for unix socket is longer than max allowed len for unix socket path (107):', self._phy_filename)</span><br><span> </span><br><span>@@ -62,8 +62,8 @@</span><br><span>         args = [self._binary, "--l1ctl-sock=" + self._phy_filename]</span><br><span>         self._vphy_proc = process.Process(self.name(), self.run_dir,</span><br><span>                                           args, env=self._env)</span><br><span style="color: hsl(0, 100%, 40%);">-        if suite_run is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-            suite_run.remember_to_stop(self._vphy_proc)</span><br><span style="color: hsl(120, 100%, 40%);">+        if testenv is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+            testenv.remember_to_stop(self._vphy_proc)</span><br><span>         self._vphy_proc.launch()</span><br><span> </span><br><span>     def verify_ready(self):</span><br><span>@@ -134,9 +134,9 @@</span><br><span>             w.write(mob_vty)</span><br><span>         return mob_cfg_file</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def start(self, loop, suite_run=None):</span><br><span style="color: hsl(0, 100%, 40%);">-        if suite_run is not None: # overwrite run_dir to store files if run from inside osmo-gsm-tester:</span><br><span style="color: hsl(0, 100%, 40%);">-            self.run_dir = util.Dir(suite_run.get_test_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+    def start(self, loop, testenv=None):</span><br><span style="color: hsl(120, 100%, 40%);">+        if testenv is not None: # overwrite run_dir to store files if run from inside osmo-gsm-tester:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.run_dir = util.Dir(testenv.suite().get_run_dir().new_dir(self.name()))</span><br><span>         lua_filename = self.write_lua_cfg()</span><br><span>         mob_filename = self.write_mob_cfg(lua_filename, self._phy_filename)</span><br><span> </span><br><span>@@ -145,8 +145,8 @@</span><br><span>         args = [self._binary, "-c", mob_filename]</span><br><span>         self._omob_proc = process.Process(self.name(), self.run_dir,</span><br><span>                                           args, env=self._env)</span><br><span style="color: hsl(0, 100%, 40%);">-        if suite_run is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-            suite_run.remember_to_stop(self._omob_proc)</span><br><span style="color: hsl(120, 100%, 40%);">+        if testenv is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+            testenv.remember_to_stop(self._omob_proc)</span><br><span>         self._omob_proc.launch()</span><br><span> </span><br><span>     def terminate(self):</span><br><span>@@ -168,11 +168,11 @@</span><br><span>     TEMPLATE_CFG = "osmo-mobile.cfg"</span><br><span> </span><br><span>     def __init__(self, name, options, cdf_function,</span><br><span style="color: hsl(0, 100%, 40%);">-                 event_server, tmp_dir, results, suite_run=None):</span><br><span style="color: hsl(120, 100%, 40%);">+                 event_server, tmp_dir, results, testenv=None):</span><br><span>         super().__init__(log.C_RUN, name)</span><br><span>         self._binary_options = options</span><br><span>         self._cdf = cdf_function</span><br><span style="color: hsl(0, 100%, 40%);">-        self._suite_run = suite_run</span><br><span style="color: hsl(120, 100%, 40%);">+        self._testenv = testenv</span><br><span>         self._tmp_dir = tmp_dir</span><br><span>         self._event_server = event_server</span><br><span>         self._results = results</span><br><span>@@ -225,7 +225,7 @@</span><br><span>         """</span><br><span>         self.log("Pre-launching all virtphy's")</span><br><span>         for phy in self._phys:</span><br><span style="color: hsl(0, 100%, 40%);">-            phy.start(loop, self._suite_run)</span><br><span style="color: hsl(120, 100%, 40%);">+            phy.start(loop, self._testenv)</span><br><span> </span><br><span>         self.log("Checking if sockets are in the filesystem")</span><br><span>         for phy in self._phys:</span><br><span>@@ -257,7 +257,7 @@</span><br><span>         # start pending MS</span><br><span>         while len(self._started) < self._cdf.current_scaled_value() and len(self._unstarted) > 0:</span><br><span>             ms = self._unstarted.pop(0)</span><br><span style="color: hsl(0, 100%, 40%);">-            ms.start(loop, self._suite_run)</span><br><span style="color: hsl(120, 100%, 40%);">+            ms.start(loop, self._testenv)</span><br><span>             launch_time = time.clock_gettime(time.CLOCK_MONOTONIC)</span><br><span>             self._results[ms.name_number()].set_launch_time(launch_time)</span><br><span>             self._started.append(ms)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18045">change 18045</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/+/18045"/><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: Idf41243a497de7bc507b9f1cd1b38640f456f815 </div>
<div style="display:none"> Gerrit-Change-Number: 18045 </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>