blob: 66027c67fc9c4b152e112cbf4a6f2a75f899e7fc [file] [log] [blame]
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +00001# osmo_ms_driver: Starter for processes
2# Help to start processes over time.
3#
4# Copyright (C) 2018 by Holger Hans Peter Freyther
5#
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as
8# published by the Free Software Foundation, either version 3 of the
9# License, or (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +000019from osmo_gsm_tester import log, process, template
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000020
Holger Hans Peter Freytherf658b832018-11-05 05:05:43 +000021import collections
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000022import os
23import os.path
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000024import time
25
Holger Hans Peter Freytherf658b832018-11-05 05:05:43 +000026BinaryOptions = collections.namedtuple("BinaryOptions", ["virtphy", "mobile", "env"])
27
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000028class Launcher(log.Origin):
Holger Hans Peter Freytherf658b832018-11-05 05:05:43 +000029 def __init__(self, binary, env, base_name, name_number, tmp_dir):
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000030 super().__init__(log.C_RUN, "{}/{}".format(base_name, name_number))
Holger Hans Peter Freytherf658b832018-11-05 05:05:43 +000031 self._binary = binary
32 self._env = env
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000033 self._name_number = name_number
34 self._tmp_dir = tmp_dir
35
36 def name_number(self):
37 return self._name_number
38
39class OsmoVirtPhy(Launcher):
Holger Hans Peter Freytherf658b832018-11-05 05:05:43 +000040 def __init__(self, binary, env, name_number, tmp_dir):
41 super().__init__(binary, env, "osmo-ms-virt-phy", name_number, tmp_dir)
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000042 self._phy_filename = os.path.join(self._tmp_dir, "osmocom_l2_" + self._name_number)
Holger Hans Peter Freytherb5e86b72018-11-05 03:43:27 +000043 self._vphy_proc = None
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000044
45 def phy_filename(self):
46 return self._phy_filename
47
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +000048 def start(self, loop, suite_run=None):
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000049 if len(self._phy_filename.encode()) > 107:
50 raise log.Error('Path for unix socket is longer than max allowed len for unix socket path (107):', self._phy_filename)
51
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +000052 self.log("Starting virtphy")
Holger Hans Peter Freytherf658b832018-11-05 05:05:43 +000053 args = [self._binary, "--l1ctl-sock=" + self._phy_filename]
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +000054 self._vphy_proc = process.Process(self.name(), self._tmp_dir,
55 args, env=self._env)
56 if suite_run:
57 suite_run.remember_to_stop(self._vphy_proc)
58 self._vphy_proc.launch()
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000059
60 def verify_ready(self):
61 while True:
62 if os.path.exists(self._phy_filename):
63 return
64 time.sleep(0.2)
65
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +000066 def terminate(self):
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000067 """Clean up things."""
68 if self._vphy_proc:
Holger Hans Peter Freytherb5e86b72018-11-05 03:43:27 +000069 self._vphy_proc.terminate()
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000070
71class OsmoMobile(Launcher):
Holger Hans Peter Freytherf658b832018-11-05 05:05:43 +000072 def __init__(self, binary, env, name_number, tmp_dir, lua_tmpl, cfg_tmpl, imsi_ki_generator, phy_filename, ev_server_path):
73 super().__init__(binary, env, "osmo-ms-mob", name_number, tmp_dir)
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000074 self._lua_template = lua_tmpl
75 self._cfg_template = cfg_tmpl
76 self._imsi_ki_generator = imsi_ki_generator
77 self._phy_filename = phy_filename
78 self._ev_server_path = ev_server_path
Holger Hans Peter Freythera7b61f32018-08-28 11:00:11 +010079 self._imsi, self._ki = next(self._imsi_ki_generator)
Holger Hans Peter Freytherb5e86b72018-11-05 03:43:27 +000080 self._omob_proc = None
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000081
Holger Hans Peter Freyther8ae38a62018-08-29 04:25:30 +010082 def imsi(self):
83 return self._imsi
84
85 def ki(self):
86 return self._ki
87
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +000088 def write_lua_cfg(self):
89 lua_support = os.path.join(os.path.dirname(__file__), 'lua')
90 cfg = {
91 'test': {
92 'event_path': self._ev_server_path,
93 'lua_support': lua_support,
94 }
95 }
96 lua_cfg_file = os.path.join(self._tmp_dir, "lua_" + self._name_number + ".lua")
97 lua_script = template.render(self._lua_template, cfg)
98 with open(lua_cfg_file, 'w') as w:
99 w.write(lua_script)
100 return lua_cfg_file
101
102 def write_mob_cfg(self, lua_filename, phy_filename):
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +0000103 cfg = {
104 'test': {
105 'script': lua_filename,
106 'virt_phy': phy_filename,
Holger Hans Peter Freythera7b61f32018-08-28 11:00:11 +0100107 'imsi': self._imsi,
108 'ki_comp128': self._ki,
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +0000109 'ms_number': self._name_number,
110 }
111 }
112 mob_cfg_file = os.path.join(self._tmp_dir, "mob_" + self._name_number + ".cfg")
113 mob_vty = template.render(self._cfg_template, cfg)
114 with open(mob_cfg_file, 'w') as w:
115 w.write(mob_vty)
116 return mob_cfg_file
117
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +0000118 def start(self, loop, suite_run=None):
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +0000119 lua_filename = self.write_lua_cfg()
120 mob_filename = self.write_mob_cfg(lua_filename, self._phy_filename)
121
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +0000122 self.log("Starting mobile")
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +0000123 # Let the kernel pick an unused port for the VTY.
Holger Hans Peter Freytherf658b832018-11-05 05:05:43 +0000124 args = [self._binary, "-c", mob_filename, "--vty-port=0"]
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +0000125 self._omob_proc = process.Process(self.name(), self._tmp_dir,
126 args, env=self._env)
127 if suite_run:
128 suite_run.remember_to_stop(self._omob_proc)
129 self._omob_proc.launch()
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +0000130
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +0000131 def terminate(self):
Holger Hans Peter Freytherff19a5e2018-02-25 21:29:35 +0000132 """Clean up things."""
133 if self._omob_proc:
Holger Hans Peter Freytherb5e86b72018-11-05 03:43:27 +0000134 self._omob_proc.terminate()