ms_driver: Allow to specify env and binary name/path

For the proper trial/suite integration we can't assume that the
virtphy/mobile are in the PATH and that they can be executed
directly (e.g. need a LD_LIBRARY_PATH to be applied).

Introduce BinaryOptions to pass the name/path of the two executables
and the env to use. Default this to virtphy/mobile and an empty
environment.

Change-Id: I79a57e53bc20613ac061453c24fd29a6d05e1721
This commit is contained in:
Holger Hans Peter Freyther 2018-11-05 05:05:43 +00:00 committed by Holger Freyther
parent 9cf1c8afde
commit f658b83b07
4 changed files with 27 additions and 14 deletions

View File

@ -21,6 +21,7 @@ from osmo_ms_driver.cdf import cdfs
from osmo_ms_driver.event_server import EventServer
from osmo_ms_driver.simple_loop import SimpleLoop
from osmo_ms_driver.location_update_test import MassUpdateLocationTest
from osmo_ms_driver.starter import BinaryOptions
import os.path
import shutil
@ -83,7 +84,9 @@ class MsDriver(log.Origin):
self._ev_server = EventServer("ev_server", event_server_path)
self._ev_server.listen(self._loop)
self._test_case = MassUpdateLocationTest("mass", self._num_ms, self._cdf, self._ev_server, self.event_server_sk_tmp_dir)
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)
# TODO: We should pass subscribers down to the test and not get it from
# there.

View File

@ -20,6 +20,7 @@ from .event_server import EventServer
from .simple_loop import SimpleLoop
from .location_update_test import MassUpdateLocationTest
from .cdf import cdfs
from .starter import BinaryOptions
from osmo_gsm_tester import log
# System modules
@ -82,7 +83,8 @@ def main():
ev_server.listen(loop)
# Just a single test for now.
test = MassUpdateLocationTest("lu_test", args.num_ms, cdf, ev_server, tmp_dir)
options = BinaryOptions("virtphy", "mobile", None)
test = MassUpdateLocationTest("lu_test", options, args.num_ms, cdf, ev_server, tmp_dir)
atexit.register(test.stop_all)
# Run until everything has been launched

View File

@ -56,8 +56,9 @@ class MassUpdateLocationTest(log.Origin):
TEMPLATE_LUA = "osmo-mobile-lu.lua"
TEMPLATE_CFG = "osmo-mobile.cfg"
def __init__(self, name, number_of_ms, cdf_function, event_server, tmp_dir):
def __init__(self, name, options, number_of_ms, cdf_function, event_server, tmp_dir):
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)
@ -71,10 +72,12 @@ class MassUpdateLocationTest(log.Origin):
for i in range(0, number_of_ms):
ms_name = "%.5d" % i
phy = OsmoVirtPhy(ms_name, tmp_dir)
phy = OsmoVirtPhy(options.virtphy, options.env,
ms_name, tmp_dir)
self._phys.append(phy)
launcher = OsmoMobile(ms_name, tmp_dir, self.TEMPLATE_LUA,
launcher = OsmoMobile(options.mobile, options.env,
ms_name, tmp_dir, self.TEMPLATE_LUA,
self.TEMPLATE_CFG, imsi_gen,
phy.phy_filename(),
event_server.server_path())

View File

@ -18,6 +18,7 @@
from osmo_gsm_tester import log, template
import collections
import os
import os.path
import subprocess
@ -26,9 +27,13 @@ import time
_devnull = open(os.devnull, 'w')
#_devnull = open('/dev/stdout', 'w')
BinaryOptions = collections.namedtuple("BinaryOptions", ["virtphy", "mobile", "env"])
class Launcher(log.Origin):
def __init__(self, base_name, name_number, tmp_dir):
def __init__(self, binary, env, base_name, name_number, tmp_dir):
super().__init__(log.C_RUN, "{}/{}".format(base_name, name_number))
self._binary = binary
self._env = env
self._name_number = name_number
self._tmp_dir = tmp_dir
@ -36,8 +41,8 @@ class Launcher(log.Origin):
return self._name_number
class OsmoVirtPhy(Launcher):
def __init__(self, name_number, tmp_dir):
super().__init__("osmo-ms-virt-phy", name_number, tmp_dir)
def __init__(self, binary, env, name_number, tmp_dir):
super().__init__(binary, env, "osmo-ms-virt-phy", name_number, tmp_dir)
self._phy_filename = os.path.join(self._tmp_dir, "osmocom_l2_" + self._name_number)
self._vphy_proc = None
@ -49,9 +54,9 @@ class OsmoVirtPhy(Launcher):
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")
args = ["virtphy", "--l1ctl-sock=" + self._phy_filename]
args = [self._binary, "--l1ctl-sock=" + self._phy_filename]
self.log(' '.join(args))
self._vphy_proc = subprocess.Popen(args, stderr=_devnull, stdout=_devnull)
self._vphy_proc = subprocess.Popen(args, stderr=_devnull, stdout=_devnull, env=self._env)
def verify_ready(self):
while True:
@ -65,8 +70,8 @@ class OsmoVirtPhy(Launcher):
self._vphy_proc.terminate()
class OsmoMobile(Launcher):
def __init__(self, name_number, tmp_dir, lua_tmpl, cfg_tmpl, imsi_ki_generator, phy_filename, ev_server_path):
super().__init__("osmo-ms-mob", name_number, tmp_dir)
def __init__(self, binary, env, name_number, tmp_dir, lua_tmpl, cfg_tmpl, imsi_ki_generator, phy_filename, ev_server_path):
super().__init__(binary, env, "osmo-ms-mob", name_number, tmp_dir)
self._lua_template = lua_tmpl
self._cfg_template = cfg_tmpl
self._imsi_ki_generator = imsi_ki_generator
@ -117,9 +122,9 @@ class OsmoMobile(Launcher):
self.log("Starting process")
# Let the kernel pick an unused port for the VTY.
args = ["mobile", "-c", mob_filename, "--vty-port=0"]
args = [self._binary, "-c", mob_filename, "--vty-port=0"]
self.log(' '.join(args))
self._omob_proc = subprocess.Popen(args, stderr=_devnull, stdout=_devnull)
self._omob_proc = subprocess.Popen(args, stderr=_devnull, stdout=_devnull, env=self._env)
def kill(self):
"""Clean up things."""