blob: 32784bda1bee325e22f50203638913c3aac792ce [file] [log] [blame]
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +01001# osmo_gsm_tester: base classes to share code among BTS subclasses.
2#
3# Copyright (C) 2016-2017 by sysmocom - s.f.m.c. GmbH
4#
5# Author: Pau Espin Pedrol <pespin@sysmocom.de>
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19
20import os
21import pprint
22import tempfile
23from abc import ABCMeta, abstractmethod
Pau Espin Pedrol9a4631c2018-03-28 19:17:34 +020024from . import log, config, util, template, process, bts, pcu_osmo
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +010025
Pau Espin Pedrol52ad3a62018-03-08 17:50:14 +010026class OsmoBts(bts.Bts, metaclass=ABCMeta):
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +010027
28##############
29# PROTECTED
30##############
Pau Espin Pedrole5194622018-05-07 13:36:58 +020031 def __init__(self, suite_run, conf, name, defaults_cfg_name):
32 super().__init__(suite_run, conf, name, defaults_cfg_name)
Pau Espin Pedrol58603672018-08-09 13:45:55 +020033 self._pcu = None
34 self.proc_bts = None
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +010035 if len(self.pcu_socket_path().encode()) > 107:
36 raise log.Error('Path for pcu socket is longer than max allowed len for unix socket path (107):', self.pcu_socket_path())
37
38########################
39# PUBLIC - INTERNAL API
40########################
41 @abstractmethod
42 def conf_for_bsc(self):
Pau Espin Pedrol52ad3a62018-03-08 17:50:14 +010043 # coming from bts.Bts, we forward the implementation to children.
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +010044 pass
45
46 @abstractmethod
47 def pcu_socket_path(self):
48 'Used by pcu objects to get path to socket.'
49 pass
50
51 @abstractmethod
52 def create_pcu(self):
53 'Used by base class. Subclass can create different pcu implementations.'
54 pass
55
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +010056###################
57# PUBLIC (test API included)
58###################
59 @abstractmethod
Pau Espin Pedrolb1526b92018-05-22 20:32:30 +020060 def start(self, keepalive=False):
Pau Espin Pedrol52ad3a62018-03-08 17:50:14 +010061 # coming from bts.Bts, we forward the implementation to children.
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +010062 pass
63
Pau Espin Pedrol4fbdc352018-03-08 17:47:35 +010064 def ready_for_pcu(self):
65 if not self.proc_bts or not self.proc_bts.is_running:
66 return False
67 return 'BTS is up' in (self.proc_bts.get_stderr() or '')
68
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +010069 def pcu(self):
70 if self._pcu is None:
Pau Espin Pedrolc1b32782017-12-15 11:49:01 +010071 self._pcu = self.create_pcu()
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +010072 return self._pcu
73
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +010074class OsmoBtsMainUnit(OsmoBts, metaclass=ABCMeta):
75##############
76# PROTECTED
77##############
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +010078
Pau Espin Pedrole5194622018-05-07 13:36:58 +020079 def __init__(self, suite_run, conf, name, defaults_cfg_name):
Pau Espin Pedrol58603672018-08-09 13:45:55 +020080 self.pcu_sk_tmp_dir = None
Pau Espin Pedrole5194622018-05-07 13:36:58 +020081 super().__init__(suite_run, conf, name, defaults_cfg_name)
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +010082
83########################
84# PUBLIC - INTERNAL API
85########################
86 @abstractmethod
87 def conf_for_bsc(self):
Pau Espin Pedrol52ad3a62018-03-08 17:50:14 +010088 # coming from bts.Bts, we forward the implementation to children.
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +010089 pass
90
91 def cleanup(self):
92 if self.pcu_sk_tmp_dir:
93 try:
94 os.remove(self.pcu_socket_path())
95 except OSError:
96 pass
97 os.rmdir(self.pcu_sk_tmp_dir)
98
99 def create_pcu(self):
100 return pcu_osmo.OsmoPcu(self.suite_run, self, self.conf)
101
102 def pcu_socket_path(self):
103 if self.pcu_sk_tmp_dir is None:
104 self.pcu_sk_tmp_dir = tempfile.mkdtemp('', 'ogtpcusk')
105 return os.path.join(self.pcu_sk_tmp_dir, 'pcu_bts')
106
107###################
108# PUBLIC (test API included)
109###################
110 @abstractmethod
Pau Espin Pedrolb1526b92018-05-22 20:32:30 +0200111 def start(self, keepalive=False):
Pau Espin Pedrol52ad3a62018-03-08 17:50:14 +0100112 # coming from bts.Bts, we forward the implementation to children.
Pau Espin Pedrolc9817a52017-12-13 19:52:27 +0100113 pass