Change in osmo-gsm-tester[master]: Update obj classes in obj/ to use testenv instead of suite_run

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

pespin gerrit-no-reply at lists.osmocom.org
Tue May 5 12:04:39 UTC 2020


pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18045 )


Change subject: Update obj classes in obj/ to use testenv instead of suite_run
......................................................................

Update obj classes in obj/ to use testenv instead of suite_run

Change-Id: Idf41243a497de7bc507b9f1cd1b38640f456f815
---
M src/osmo_gsm_tester/core/suite.py
M src/osmo_gsm_tester/core/test.py
M src/osmo_gsm_tester/obj/bsc_osmo.py
M src/osmo_gsm_tester/obj/bts.py
M src/osmo_gsm_tester/obj/bts_nanobts.py
M src/osmo_gsm_tester/obj/bts_oc2g.py
M src/osmo_gsm_tester/obj/bts_octphy.py
M src/osmo_gsm_tester/obj/bts_osmo.py
M src/osmo_gsm_tester/obj/bts_osmotrx.py
M src/osmo_gsm_tester/obj/bts_osmovirtual.py
M src/osmo_gsm_tester/obj/bts_sysmo.py
M src/osmo_gsm_tester/obj/enb.py
M src/osmo_gsm_tester/obj/enb_amarisoft.py
M src/osmo_gsm_tester/obj/enb_srs.py
M src/osmo_gsm_tester/obj/epc.py
M src/osmo_gsm_tester/obj/epc_amarisoft.py
M src/osmo_gsm_tester/obj/epc_srs.py
M src/osmo_gsm_tester/obj/ggsn_osmo.py
M src/osmo_gsm_tester/obj/hlr_osmo.py
M src/osmo_gsm_tester/obj/iperf3.py
M src/osmo_gsm_tester/obj/mgcpgw_osmo.py
M src/osmo_gsm_tester/obj/mgw_osmo.py
M src/osmo_gsm_tester/obj/ms.py
M src/osmo_gsm_tester/obj/ms_amarisoft.py
M src/osmo_gsm_tester/obj/ms_driver.py
M src/osmo_gsm_tester/obj/ms_ofono.py
M src/osmo_gsm_tester/obj/ms_srs.py
M src/osmo_gsm_tester/obj/msc_osmo.py
M src/osmo_gsm_tester/obj/nitb_osmo.py
M src/osmo_gsm_tester/obj/osmocon.py
M src/osmo_gsm_tester/obj/pcap_recorder.py
M src/osmo_gsm_tester/obj/pcu.py
M src/osmo_gsm_tester/obj/pcu_oc2g.py
M src/osmo_gsm_tester/obj/pcu_osmo.py
M src/osmo_gsm_tester/obj/pcu_sysmo.py
M src/osmo_gsm_tester/obj/sgsn_osmo.py
M src/osmo_gsm_tester/obj/stp_osmo.py
M src/osmo_gsm_tester/testenv.py
M src/osmo_ms_driver/starter.py
39 files changed, 282 insertions(+), 288 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/45/18045/1

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

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18045
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-gsm-tester
Gerrit-Branch: master
Gerrit-Change-Id: Idf41243a497de7bc507b9f1cd1b38640f456f815
Gerrit-Change-Number: 18045
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200505/3c43952b/attachment.htm>


More information about the gerrit-log mailing list