Files
Alexey MilovidovandClaude Opus 4.8 295ced78d1 Enable more Ruff checks (F401/F403/F405/F541/F841) and clean up tests
Follow-up to #105171, which added `ruff` with a deliberately narrow,
bug-class-only rule set and left the unused-name and star-import rules
off pending a dedicated cleanup pass. This enables that second batch in
`pyproject.toml` and fixes every violation across the tree (the bulk in
integration tests):

- `F401` unused-import and `F841` unused-variable: removed, preserving
  any side-effecting right-hand side (e.g. `result = node.query(...)`
  becomes `node.query(...)`). Two `try: import ...` feature probes are
  kept with `# noqa: F401`.
- `F541` f-string-missing-placeholders: dropped the redundant `f` prefix.
- `F403`/`F405` star imports: every `from module import *` is expanded
  into explicit imports of the names actually used, taken from each
  name's real origin, so stdlib/third-party names import from their real
  source rather than through a test "convenience bundle". The now-empty
  `tests/integration/helpers/kafka/common_direct.py` bundle is removed and
  its three remaining consumers import `_VarintBytes`/`KafkaAdminClient`
  directly.

Eliminating the star imports surfaced a real bug the wildcard had masked
from `F821`: `generate_presets.py` in `test_prometheus_protocols` called
an undefined `execute_instant_query_with_http_api`; fixed to the existing
`execute_query_via_http_api`.

No `black`/`isort` reformatting was applied (neither is enforced in the
style check), so the diff is limited to the lint fixes themselves.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-18 23:22:25 +00:00

134 lines
3.8 KiB
Python

import logging
import os
import time
import pytest
from helpers.client import QueryRuntimeException
from helpers.cluster import ClickHouseCluster
SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
@pytest.fixture(scope="module")
def started_cluster():
try:
cluster = ClickHouseCluster(__file__)
cluster.add_instance(
"node",
main_configs=["configs/named_collections.xml"],
user_configs=["configs/users.xml"],
with_minio=True,
)
logging.info("Starting cluster...")
cluster.start()
logging.info("Cluster started")
run_gcs_mocks(cluster)
yield cluster
finally:
cluster.shutdown()
TOKEN_PATH = "computeMetadata/v1/instance/service-accounts"
SERVICE_ACCOUNT = "my-account"
def run_gcs_mocks(cluster):
logging.info("Starting gcs mocks")
mocks = (
("echo.py", "resolver", ["22234"]),
("auth.py", "resolver", ["80", TOKEN_PATH, SERVICE_ACCOUNT]),
)
for mock_filename, container, args in mocks:
container_id = cluster.get_container_id(container)
current_dir = os.path.dirname(__file__)
cluster.copy_file_to_container(
container_id,
os.path.join(current_dir, "gcs_mocks", mock_filename),
mock_filename,
)
cluster.exec_in_container(
container_id, ["python", mock_filename] + args, detach=True
)
# Wait for S3 mocks to start
for mock_filename, container, args in mocks:
port = args[0]
num_attempts = 100
for attempt in range(num_attempts):
ping_response = cluster.exec_in_container(
cluster.get_container_id(container),
["curl", "-s", f"http://localhost:{port}/ping"],
nothrow=True,
)
if ping_response != "OK":
if attempt == num_attempts - 1:
assert ping_response == "OK", 'Expected "OK", but got "{}"'.format(
ping_response
)
else:
time.sleep(1)
else:
logging.debug(
f"mock {mock_filename} ({port}) answered {ping_response} on attempt {attempt}"
)
break
logging.info("S3 mocks started")
def test_gcp_auth(started_cluster):
node = started_cluster.instances["node"]
# Reset mock counters so the test is repeatable
resolver_id = started_cluster.get_container_id("resolver")
for port in [80, 22234]:
started_cluster.exec_in_container(
resolver_id,
["curl", "-s", f"http://localhost:{port}/reset"],
nothrow=True,
)
def get_num_requests():
count_response = started_cluster.exec_in_container(
resolver_id,
["curl", "-s", "http://localhost/counter"],
nothrow=True,
)
return int(count_response)
node.query("DROP TABLE IF EXISTS s3_table")
node.query(
"CREATE TABLE s3_table (line String) ENGINE = S3(gcs_conn, filename='test.txt', format='LineAsString')"
)
assert get_num_requests() == 0
assert node.query("SELECT * FROM s3_table") == "OK\n"
# Wait to refresh token
time.sleep(4)
assert get_num_requests() == 2
assert node.query("SELECT * FROM s3_table") == "OK\n"
assert get_num_requests() == 4
assert (
node.query(
"SELECT * FROM s3(gcs_conn, filename='test.txt', format='LineAsString')"
)
== "OK\n"
)
with pytest.raises(QueryRuntimeException) as ei:
node.query(
"SELECT * FROM s3(gcs_conn_bad, filename='test.txt', format='LineAsString')"
)
assert "AUTHENTICATION_FAILED" in ei.value.stderr