2Plugin that waits for a ScyllaDB cluster to become reachable and adjusts
3the `scylla-*` components of the static config to point at it.
12from testsuite.environment
import utils
as env_utils
14pytest_plugins = [
'pytest_userver.plugins.core']
16USERVER_CONFIG_HOOKS = [
'userver_config_scylla']
18logger = logging.getLogger(__name__)
20DEFAULT_HOST =
'localhost'
21DEFAULT_CQL_PORT = 9042
22DEFAULT_WAIT_TIMEOUT = 60.0
24_SCYLLA_COMPONENT_PREFIX =
'scylla-'
27def pytest_addoption(parser) -> None:
28 group = parser.getgroup(
'scylla')
32 'Host of the ScyllaDB cluster used by functional tests. Defaults to $TESTSUITE_SCYLLA_HOST or "localhost".'
38 help=(
'CQL native transport port. Defaults to $TESTSUITE_SCYLLA_PORT or 9042.'),
41 '--scylla-wait-timeout',
44 'Seconds to wait for the CQL port to start accepting '
45 'connections before failing service start. '
46 'Defaults to $TESTSUITE_SCYLLA_WAIT_TIMEOUT or 60.'
51@dataclasses.dataclass(frozen=True)
56 def contact_points(self) -> str:
57 if self.
port == DEFAULT_CQL_PORT:
59 return f
'{self.host}:{self.port}'
62@pytest.fixture(scope='session')
65 Where the ScyllaDB cluster is expected to be running.
67 @ingroup userver_testsuite_fixtures
69 host = pytestconfig.option.scylla_host
or env_utils.getenv_str(
70 'TESTSUITE_SCYLLA_HOST',
73 port = pytestconfig.option.scylla_port
or env_utils.getenv_int(
74 'TESTSUITE_SCYLLA_PORT',
80@pytest.fixture(scope='session')
81def scylla_wait_timeout(pytestconfig) -> float:
82 """@ingroup userver_testsuite_fixtures"""
83 return pytestconfig.option.scylla_wait_timeout
or env_utils.getenv_float(
84 'TESTSUITE_SCYLLA_WAIT_TIMEOUT',
89@pytest.fixture(scope='session')
90def _scylla_tcp_ready(scylla_connection_info, scylla_wait_timeout) -> None:
91 info = scylla_connection_info
93 'Waiting up to %.1fs for ScyllaDB CQL port at %s:%d',
98 if not env_utils.wait_tcp_connection(
101 timeout=scylla_wait_timeout,
104 f
'ScyllaDB is not reachable at {info.host}:{info.port} after '
105 f
'{scylla_wait_timeout:.1f}s. Start the cluster or set '
106 '--scylla-host / TESTSUITE_SCYLLA_HOST to a reachable endpoint.',
111def scylla(_scylla_tcp_ready, scylla_connection_info) -> ConnectionInfo:
112 """@ingroup userver_testsuite_fixtures"""
113 return scylla_connection_info
116@pytest.fixture(scope='session')
117def userver_config_scylla(scylla_connection_info, _scylla_tcp_ready):
118 """@ingroup userver_testsuite_fixtures"""
119 contact_points = scylla_connection_info.contact_points()
121 def _patch(config_yaml, config_vars):
122 components = config_yaml[
'components_manager'][
'components']
123 for name, params
in components.items():
124 if not isinstance(params, dict):
126 if not name.startswith(_SCYLLA_COMPONENT_PREFIX):
128 if 'dbalias' in params
and params[
'dbalias']:
130 if 'dbconnection' not in params:
132 params[
'dbconnection'] = contact_points