userver: en/testsuite/databases/mysql/service.py Source File
Loading...
Searching...
No Matches
service.py
1import pathlib
2import urllib.parse
3
4from testsuite.environment import service, utils
5
6from . import classes
7
8DEFAULT_HOSTNAME = 'localhost'
9DEFAULT_PORT = 13307
10
11PLUGIN_DIR = pathlib.Path(__file__).parent
12SCRIPTS_DIR = PLUGIN_DIR.joinpath('scripts')
13
14
15def create_service(
16 service_name: str,
17 working_dir: str,
18 settings: classes.ServiceSettings | None = None,
19 env: dict[str, str] | None = None,
20):
21 if settings is None:
22 settings = get_service_settings()
23 return service.ScriptService(
24 service_name=service_name,
25 script_path=str(SCRIPTS_DIR.joinpath('service-mysql')),
26 working_dir=working_dir,
27 environment={
28 'MYSQL_TMPDIR': working_dir,
29 'MYSQL_PORT': str(settings.port),
30 **(env or {}),
31 },
32 check_ports=[settings.port],
33 start_timeout=utils.getenv_float(
34 key='TESTSUITE_MYSQL_SERVER_START_TIMEOUT',
35 default=10.0,
36 ),
37 )
38
39
40def get_service_settings():
41 return classes.ServiceSettings(
42 port=utils.getenv_int(
43 key='TESTSUITE_MYSQL_PORT',
44 default=DEFAULT_PORT,
45 ),
46 )
47
48
49def parse_connection_url(url: str):
50 parts = urllib.parse.urlparse(url)
51 if parts.scheme != 'mysql':
52 raise RuntimeError(f'Unknown url scheme {parts.scheme}')
53 kwargs: dict = {
54 key: value
55 for value, key in (
56 (parts.hostname, 'hostname'),
57 (parts.port, 'port'),
58 (parts.username, 'user'),
59 (parts.password, 'password'),
60 )
61 if value is not None
62 }
63 return classes.ConnectionInfo(**kwargs)