Files
neon/test_runner/regress/test_compute_reconfigure.py
Tristan Partin ff5a527167 Consolidate compute_ctl configuration structures (#11514)
Previously, the structure of the spec file was just the compute spec.
However, the response from the control plane get spec request included
the compute spec and the compute_ctl config. This divergence was
hindering other work such as adding regression tests for compute_ctl
HTTP authorization.

Signed-off-by: Tristan Partin <tristan@neon.tech>
2025-04-11 15:06:29 +00:00

88 lines
2.8 KiB
Python

from __future__ import annotations
import os
from typing import TYPE_CHECKING
from fixtures.metrics import parse_metrics
from fixtures.utils import wait_until
if TYPE_CHECKING:
from fixtures.neon_fixtures import NeonEnv
def test_compute_reconfigure(neon_simple_env: NeonEnv):
"""
Test that we can change postgresql.conf settings even if
skip_pg_catalog_updates=True is set.
"""
env = neon_simple_env
TEST_LOG_LINE_PREFIX = "%m [%p] [test_compute_reconfigure]: "
endpoint = env.endpoints.create_start("main")
# Check that the log line prefix is not set
# or different from TEST_LOG_LINE_PREFIX
with endpoint.cursor() as cursor:
cursor.execute("SHOW log_line_prefix;")
row = cursor.fetchone()
assert row is not None
assert row[0] != TEST_LOG_LINE_PREFIX
endpoint.respec_deep(
**{
"spec": {
"skip_pg_catalog_updates": True,
"cluster": {
"settings": [
{
"name": "log_line_prefix",
"vartype": "string",
"value": TEST_LOG_LINE_PREFIX,
}
]
},
},
}
)
endpoint.reconfigure()
# Check that in logs we see that it was actually reconfigured,
# not restarted or something else.
endpoint.log_contains("INFO request{method=POST uri=/configure")
# In /configure we only send SIGHUP at the end, so in theory
# it doesn't necessarily mean that Postgres already reloaded
# the new config; and it may race in some envs.
# So we wait until we see the log line that the config was changed.
def check_logs():
endpoint.log_contains(
f'[test_compute_reconfigure]: LOG: parameter "log_line_prefix" changed to "{TEST_LOG_LINE_PREFIX}"'
)
wait_until(check_logs)
# Check that the log line prefix is set
with endpoint.cursor() as cursor:
cursor.execute("SHOW log_line_prefix;")
row = cursor.fetchone()
assert row is not None
assert row[0] == TEST_LOG_LINE_PREFIX
# Check that even after reconfigure and state transitions we still report
# only the current status.
client = endpoint.http_client()
raw_metrics = client.metrics()
metrics = parse_metrics(raw_metrics)
samples = metrics.query_all("compute_ctl_up")
assert len(samples) == 1
assert samples[0].value == 1
samples = metrics.query_all("compute_ctl_up", {"status": "running"})
assert len(samples) == 1
assert samples[0].value == 1
# Check that build tag is reported
build_tag = os.environ.get("BUILD_TAG", "latest")
samples = metrics.query_all("compute_ctl_up", {"build_tag": build_tag})
assert len(samples) == 1
assert samples[0].value == 1