userver: /data/code/userver/testsuite/pytest_plugins/pytest_userver/utils/net.py Source File
Loading...
Searching...
No Matches
net.py
1# pylint: disable=no-member
2import asyncio
3import dataclasses
4import logging
5
6# @cond
7
8
9logger = logging.getLogger(__name__)
10
11
12# @endcond
13
14
15@dataclasses.dataclass(frozen=True)
17 """
18 Class that holds a host and port.
19
20 @ingroup userver_testsuite
21 """
22
23 host: str
24 port: int
25
26
27@dataclasses.dataclass(frozen=False)
29 """
30 Class that holds all the info for health checks.
31
32 @ingroup userver_testsuite
33 """
34
35 tcp: list[HostPort] = dataclasses.field(default_factory=list)
36
37
38async def _check_tcp_port_availability(tcp: HostPort) -> bool:
39 try:
40 _, writer = await asyncio.open_connection(tcp.host, tcp.port)
41 writer.close()
42 await writer.wait_closed()
43 except (OSError, asyncio.TimeoutError):
44 return False
45 return True
46
47
48async def check_availability(checks: HealthChecks) -> bool:
49 """
50 Checks availability for each provided entry.
51
52 @ingroup userver_testsuite
53 """
54 assert checks.tcp
55 done, pending = await asyncio.wait(
56 [asyncio.Task(_check_tcp_port_availability(val)) for val in checks.tcp],
57 timeout=25.0,
58 return_when=asyncio.ALL_COMPLETED,
59 )
60
61 for task in pending:
62 task.cancel()
63
64 for task in pending:
65 await task
66
67 return not pending and all(task.result() for task in done)
68
69
70def get_health_checks_info(service_config: dict) -> HealthChecks:
71 """
72 Returns a health checks info that for server.listener, grpc-server.port
73 and server.listener-monitor.
74
75 @see pytest_userver.plugins.base.service_non_http_health_checks()
76
77 @ingroup userver_testsuite
78 """
79 checks = HealthChecks()
80
81 components = service_config['components_manager']['components']
82 server = components.get('server')
83 if server:
84 for listener_name in ('listener-monitor', 'listener'):
85 listener_config = server.get(listener_name, {})
86 port = int(listener_config.get('port', 0))
87 if port:
88 host = listener_config.get('address', 'localhost')
89 if host == '::':
90 host = 'localhost'
91 checks.tcp.append(HostPort(host, port))
92
93 port = int(components.get('grpc-server', {}).get('port', 0))
94 if port:
95 checks.tcp.append(HostPort('localhost', port))
96
97 return checks