ms_driver: Switch to process.Process from subprocess
Use a single tmp/rundir for all these instances. In the next step
we can create separate directories.
Change-Id: Icf4d4e161ac4283a63ed4e0745b375e7e6a25004
diff --git a/src/osmo_gsm_tester/ms_driver.py b/src/osmo_gsm_tester/ms_driver.py
index 86186b7..36da921 100644
--- a/src/osmo_gsm_tester/ms_driver.py
+++ b/src/osmo_gsm_tester/ms_driver.py
@@ -63,7 +63,6 @@
self._test_duration = timedelta(seconds=120)
self._cdf = cdfs["ease_in_out"](self._time_start, self._time_step)
self._loop = SimpleLoop()
- self._suite_run.remember_to_stop(self)
self._test_case = None
self.event_server_sk_tmp_dir = None
@@ -86,7 +85,8 @@
self._ev_server.listen(self._loop)
options = BinaryOptions("virtphy", "mobile", None)
self._test_case = MassUpdateLocationTest("mass", options, self._num_ms, self._cdf,
- self._ev_server, self.event_server_sk_tmp_dir)
+ self._ev_server, self.event_server_sk_tmp_dir,
+ suite_run=self._suite_run)
# TODO: We should pass subscribers down to the test and not get it from
# there.
@@ -120,16 +120,11 @@
def cleanup(self):
"""
- Stops the testcase and all launched processes. Called by the
- suite.
+ Cleans up the driver (e.g. AF_UNIX files).
"""
# Clean-up the temporary directory.
if self.event_server_sk_tmp_dir:
shutil.rmtree(path=self.event_server_sk_tmp_dir)
- if not self._test_case:
- return
- self._test_case.stop_all()
-
# vim: expandtab tabstop=4 shiftwidth=4
diff --git a/src/osmo_ms_driver/__main__.py b/src/osmo_ms_driver/__main__.py
index 265ce47..0e3611b 100644
--- a/src/osmo_ms_driver/__main__.py
+++ b/src/osmo_ms_driver/__main__.py
@@ -83,7 +83,7 @@
ev_server.listen(loop)
# Just a single test for now.
- options = BinaryOptions("virtphy", "mobile", None)
+ options = BinaryOptions("virtphy", "mobile", os.environ)
test = MassUpdateLocationTest("lu_test", options, args.num_ms, cdf, ev_server, tmp_dir)
atexit.register(test.stop_all)
diff --git a/src/osmo_ms_driver/location_update_test.py b/src/osmo_ms_driver/location_update_test.py
index dee99fe..90e405e 100644
--- a/src/osmo_ms_driver/location_update_test.py
+++ b/src/osmo_ms_driver/location_update_test.py
@@ -56,12 +56,14 @@
TEMPLATE_LUA = "osmo-mobile-lu.lua"
TEMPLATE_CFG = "osmo-mobile.cfg"
- def __init__(self, name, options, number_of_ms, cdf_function, event_server, tmp_dir):
+ def __init__(self, name, options, number_of_ms, cdf_function,
+ event_server, tmp_dir, suite_run=None):
super().__init__(log.C_RUN, name)
self._binary_options = options
self._number_of_ms = number_of_ms
self._cdf = cdf_function
self._cdf.set_target(number_of_ms)
+ self._suite_run = suite_run
self._unstarted = []
self._mobiles = []
self._phys = []
@@ -100,7 +102,7 @@
"""
self.log("Pre-launching all virtphy's")
for phy in self._phys:
- phy.start(loop)
+ phy.start(loop, self._suite_run)
self.log("Checking if sockets are in the filesystem")
for phy in self._phys:
@@ -132,7 +134,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)
+ ms.start(loop, self._suite_run)
launch_time = time.clock_gettime(time.CLOCK_MONOTONIC)
self._results[ms.name_number()].set_launch_time(launch_time)
self._started.append(ms)
@@ -170,7 +172,7 @@
def stop_all(self):
for launcher in self._started:
- launcher.kill()
+ launcher.terminate()
def handle_msg(self, _data, addr, time):
import json
diff --git a/src/osmo_ms_driver/starter.py b/src/osmo_ms_driver/starter.py
index 2ffb33a..66027c6 100644
--- a/src/osmo_ms_driver/starter.py
+++ b/src/osmo_ms_driver/starter.py
@@ -16,17 +16,13 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from osmo_gsm_tester import log, template
+from osmo_gsm_tester import log, process, template
import collections
import os
import os.path
-import subprocess
import time
-_devnull = open(os.devnull, 'w')
-#_devnull = open('/dev/stdout', 'w')
-
BinaryOptions = collections.namedtuple("BinaryOptions", ["virtphy", "mobile", "env"])
class Launcher(log.Origin):
@@ -49,14 +45,17 @@
def phy_filename(self):
return self._phy_filename
- def start(self, loop):
+ def start(self, loop, suite_run=None):
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)
- self.log("Starting virtphy process")
+ self.log("Starting virtphy")
args = [self._binary, "--l1ctl-sock=" + self._phy_filename]
- self.log(' '.join(args))
- self._vphy_proc = subprocess.Popen(args, stderr=_devnull, stdout=_devnull, env=self._env)
+ self._vphy_proc = process.Process(self.name(), self._tmp_dir,
+ args, env=self._env)
+ if suite_run:
+ suite_run.remember_to_stop(self._vphy_proc)
+ self._vphy_proc.launch()
def verify_ready(self):
while True:
@@ -64,7 +63,7 @@
return
time.sleep(0.2)
- def kill(self):
+ def terminate(self):
"""Clean up things."""
if self._vphy_proc:
self._vphy_proc.terminate()
@@ -116,17 +115,20 @@
w.write(mob_vty)
return mob_cfg_file
- def start(self, loop):
+ def start(self, loop, suite_run=None):
lua_filename = self.write_lua_cfg()
mob_filename = self.write_mob_cfg(lua_filename, self._phy_filename)
- self.log("Starting process")
+ self.log("Starting mobile")
# Let the kernel pick an unused port for the VTY.
args = [self._binary, "-c", mob_filename, "--vty-port=0"]
- self.log(' '.join(args))
- self._omob_proc = subprocess.Popen(args, stderr=_devnull, stdout=_devnull, env=self._env)
+ self._omob_proc = process.Process(self.name(), self._tmp_dir,
+ args, env=self._env)
+ if suite_run:
+ suite_run.remember_to_stop(self._omob_proc)
+ self._omob_proc.launch()
- def kill(self):
+ def terminate(self):
"""Clean up things."""
if self._omob_proc:
self._omob_proc.terminate()